SpyBara
Go Premium

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

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

124 124 

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 |

agent-view.md +2 −0

Details

256 256 

257Las sesiones adjuntas siempre se muestran en [modo de pantalla completa](/docs/es/fullscreen), independientemente de tu ajuste `tui`, porque una sesión en segundo plano no tiene historial de desplazamiento de terminal al que agregar contenido. Desplázate con `PgUp`, `PgDn` o la rueda del ratón, y presiona `Ctrl+O` para el modo de transcripción. El desplazamiento nativo de tu terminal y el modo de copia de tmux muestran solo la ventana visible actual, igual que cuando ejecutas cualquier aplicación de pantalla completa.257Las sesiones adjuntas siempre se muestran en [modo de pantalla completa](/docs/es/fullscreen), independientemente de tu ajuste `tui`, porque una sesión en segundo plano no tiene historial de desplazamiento de terminal al que agregar contenido. Desplázate con `PgUp`, `PgDn` o la rueda del ratón, y presiona `Ctrl+O` para el modo de transcripción. El desplazamiento nativo de tu terminal y el modo de copia de tmux muestran solo la ventana visible actual, igual que cuando ejecutas cualquier aplicación de pantalla completa.

258 258 

259Una sesión adjunta no [informa su estado a tu terminal](/docs/es/terminal-config#see-session-status-in-your-terminal).

260 

259Presiona `←` en un prompt vacío, o ejecuta `/exit`, para desconectarte y volver a la vista de agentes, ya sea que hayas abierto la sesión desde la vista de agentes o con `claude attach <id>` desde tu shell.261Presiona `←` en un prompt vacío, o ejecuta `/exit`, para desconectarte y volver a la vista de agentes, ya sea que hayas abierto la sesión desde la vista de agentes o con `claude attach <id>` desde tu shell.

260 262 

261`←` también te desconecta mientras la [superposición de `/btw`](/docs/es/interactive-mode#side-questions-with-%2Fbtw) está abierta. Requiere Claude Code v2.1.257 o posterior. Una pregunta secundaria que aún se está respondiendo sigue ejecutándose mientras no estás. La próxima vez que te adjuntes, la superposición se vuelve a abrir con ella o con su respuesta.263`←` también te desconecta mientras la [superposición de `/btw`](/docs/es/interactive-mode#side-questions-with-%2Fbtw) está abierta. Requiere Claude Code v2.1.257 o posterior. Una pregunta secundaria que aún se está respondiendo sigue ejecutándose mientras no estás. La próxima vez que te adjuntes, la superposición se vuelve a abrir con ella o con su respuesta.

Details

114 Los mensajes enviados a mitad de turno no se someten a checkpoint114 Los mensajes enviados a mitad de turno no se someten a checkpoint

115</h3>115</h3>

116 116 

117Cuando un mensaje que [pones en cola mientras Claude trabaja](/docs/es/interactive-mode#queue-messages-while-claude-works) llega a Claude dentro del turno en ejecución, se une a ese turno en lugar de iniciar uno nuevo. El mensaje aparece en la conversación, pero Claude Code no crea un checkpoint para él. Un mensaje en cola que Claude Code envía como parte de un nuevo turno obtiene un checkpoint como de costumbre, incluyendo cuando varios mensajes en cola [comparten ese turno](/docs/es/interactive-mode#when-claude-code-sends-what-you-queued).117En el menú de rewind, un mensaje que [escribiste mientras Claude todavía estaba trabajando](/docs/es/interactive-mode#queue-messages-while-claude-works) puede aparecer marcado como **No code restore**. Claude leyó ese mensaje antes de que terminara su turno. [Los checkpoints se crean para los prompts que inician un turno](#how-checkpoints-work), por lo que este mensaje no tiene uno propio. Las ediciones que Claude realizó después de leerlo cuentan para el prompt que inició el turno.

118 118 

119Para deshacer las ediciones que Claude realizó después de tal mensaje, retrocede al prompt que inició el turno. Eso retrocede todo el turno, incluido el trabajo que Claude realizó antes de que llegara tu mensaje.119No necesitas hacer nada con el mensaje en sí. Para deshacer los cambios de archivos de esa parte de la sesión, selecciona el prompt que inició el turno y elige **Restore code** o **Restore code and conversation**. Eso revierte las ediciones de archivos de Claude de todo el turno, incluidas las de antes de que llegara tu mensaje. Seleccionar el mensaje marcado sigue ofreciendo **Restore conversation**, que retrocede la conversación hasta ese mensaje y deja tus archivos como están.

120 120 

121<h3 id="symlinked-and-hard-linked-paths-not-restored">121<h3 id="symlinked-and-hard-linked-paths-not-restored">

122 Las rutas con enlaces simbólicos y enlaces duros no se restauran122 Las rutas con enlaces simbólicos y enlaces duros no se restauran

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

263 Conectar desarrolladores263 Conectar desarrolladores

264</h2>264</h2>

265 265 

266Los desarrolladores se conectan desde sus propias laptops con un único inicio de sesión en el navegador, usando su cuenta de trabajo corporativa. No necesitan una cuenta de claude.ai, una clave de API ni una suscripción, porque las solicitudes al modelo pasan por el gateway usando la credencial ascendente de la organización. La conexión se controla mediante la [configuración administrada del lado del cliente](/docs/es/claude-apps-gateway-config#client-side-managed-settings) que distribuyes a través de MDM, por lo que no hay configuración manual del lado del desarrollador; esta sección cubre lo que configura el administrador.266Los desarrolladores se conectan desde sus propias laptops con un único inicio de sesión en el navegador, usando su cuenta de trabajo corporativa. No necesitan una cuenta de claude.ai, una clave de API ni una suscripción, porque las solicitudes al modelo pasan por el gateway usando la credencial ascendente de la organización. La conexión se controla mediante la [configuración administrada del lado del cliente](/docs/es/claude-apps-gateway-config#client-side-managed-settings) que distribuyes a través de MDM, y esta sección cubre lo que configura el administrador.

267 267 

268La CLI toma la huella digital del certificado TLS hoja del gateway en la primera conexión y la fija por nombre de host. Vuelve a verificar esa fijación durante el inicio de sesión, en las actualizaciones silenciosas de la sesión y en las obtenciones de configuración administrada, mientras que las solicitudes de inferencia usan la validación TLS estándar sin la fijación. Las solicitudes enrutadas a través de un proxy HTTPS omiten la verificación de la fijación, así que agrega el host del gateway a `NO_PROXY` para mantenerlas directas.268La CLI toma la huella digital del certificado TLS hoja del gateway en la primera conexión y la fija por nombre de host. Vuelve a verificar esa fijación durante el inicio de sesión, en las actualizaciones silenciosas de la sesión y en las obtenciones de configuración administrada, mientras que las solicitudes de inferencia usan la validación TLS estándar sin la fijación. Las solicitudes enrutadas a través de un proxy HTTPS omiten la verificación de la fijación, así que agrega el host del gateway a `NO_PROXY` para mantenerlas directas.

269 269 


287 Establecer la URL del gateway287 Establecer la URL del gateway

288</h3>288</h3>

289 289 

290Tres claves van en el [archivo de configuración administrada](/docs/es/managed-settings#delivery-mechanisms) de cada sistema operativo que implementas a través de MDM o directamente en el disco. `forceLoginMethod` y `forceLoginGatewayUrl` abren `/login` directamente en la pantalla **Cloud gateway** con la URL ya completada, y `parentSettingsBehavior: "merge"` permite que Claude Desktop entregue la lista de permitidos de salida del gateway a las sesiones de Claude Code que inicia, como se explica en [Entregar la política a las sesiones de Claude Desktop](#deliver-policy-to-claude-desktop-sessions):290Tres claves van en el [archivo de configuración administrada](/docs/es/managed-settings#delivery-mechanisms) de cada sistema operativo que implementas a través de MDM o directamente en el disco. Para una máquina sin configuración administrada, consulta en su lugar [Establecer la URL del gateway en la configuración de usuario](#set-the-gateway-url-in-user-settings). `forceLoginMethod` y `forceLoginGatewayUrl` abren `/login` directamente en la pantalla **Cloud gateway** con la URL ya completada, y `parentSettingsBehavior: "merge"` permite que Claude Desktop entregue la lista de permitidos de salida del gateway a las sesiones de Claude Code que inicia, como se explica en [Entregar la política a las sesiones de Claude Desktop](#deliver-policy-to-claude-desktop-sessions):

291 291 

292```json theme={null}292```json theme={null}

293{293{


299 299 

300El desarrollador presiona Enter para conectarse. El [prompt de huella digital TLS de la primera conexión](#connect-developers) sigue apareciendo. Una vez que el archivo está en una máquina, un desarrollador que no ha completado el inicio de sesión en el gateway ve uno de los mensajes descritos en [Administrator policy requires a Cloud gateway sign-in](/docs/es/errors#administrator-policy-requires-a-cloud-gateway-sign-in). Los desarrolladores que seleccionan un proveedor de nube mediante una variable de entorno como `CLAUDE_CODE_USE_BEDROCK` no necesitan el inicio de sesión en el gateway.300El desarrollador presiona Enter para conectarse. El [prompt de huella digital TLS de la primera conexión](#connect-developers) sigue apareciendo. Una vez que el archivo está en una máquina, un desarrollador que no ha completado el inicio de sesión en el gateway ve uno de los mensajes descritos en [Administrator policy requires a Cloud gateway sign-in](/docs/es/errors#administrator-policy-requires-a-cloud-gateway-sign-in). Los desarrolladores que seleccionan un proveedor de nube mediante una variable de entorno como `CLAUDE_CODE_USE_BEDROCK` no necesitan el inicio de sesión en el gateway.

301 301 

302Un desarrollador no puede configurar esto manualmente. El selector de inicio de sesión no tiene una opción de gateway, y `forceLoginGatewayUrl` se ignora en los archivos de configuración propios de un desarrollador. `forceLoginMethod` por sí solo, sin una URL, deja al desarrollador ante un mensaje "Contact your IT administrator". Las claves de inicio de sesión van en el archivo que distribuyes a las máquinas, no en el bloque `managed.policies[].cli` del gateway, que solo llega a los clientes que ya están conectados.302El selector de inicio de sesión no tiene una opción de gateway, y en la configuración administrada `forceLoginMethod` por sí solo, sin una URL, deja al desarrollador ante un mensaje "Contact your IT administrator". Las claves de inicio de sesión van en el archivo que distribuyes a las máquinas, no en el bloque `managed.policies[].cli` del gateway, que solo llega a los clientes que ya están conectados.

303 

304<h4 id="set-the-gateway-url-in-user-settings">

305 Establecer la URL del gateway en la configuración de usuario

306</h4>

307 

308En las máquinas sin configuración administrada, pide a cada desarrollador que agregue `forceLoginMethod` y `forceLoginGatewayUrl` a su propio archivo de configuración de usuario, `~/.claude/settings.json`. Esto requiere Claude Code v2.1.295 o posterior en la máquina del desarrollador. Este ejemplo indica un gateway en `claude-gateway.internal.example.com`:

309 

310```json theme={null}

311{

312 "forceLoginMethod": "gateway",

313 "forceLoginGatewayUrl": "https://claude-gateway.internal.example.com"

314}

315```

316 

317Cuando el desarrollador ejecuta `/login` en el prompt de Claude Code, la pantalla **Cloud gateway** se abre con esa dirección y presiona Enter para conectarse. El [prompt de huella digital TLS de la primera conexión](#connect-developers) sigue apareciendo. Estos límites se aplican a las claves establecidas de esta forma:

318 

319* **Solo configuración de usuario**: Claude Code lee las dos claves de `~/.claude/settings.json`, no de `.claude/settings.json` ni de `.claude/settings.local.json` de un proyecto.

320* **La configuración administrada las desactiva**: una vez que la configuración de un administrador llega a la máquina mediante un archivo de configuración administrada, un plist de macOS o una política HKLM de Windows, o un [policy helper](/docs/es/settings-reference#policyhelper), Claude Code ignora un gateway indicado en la configuración de usuario.

303 321 

304<h3 id="allow-a-gateway-on-public-address-space-you-own">322<h3 id="allow-a-gateway-on-public-address-space-you-own">

305 Permitir un gateway en un espacio de direcciones público de tu propiedad323 Permitir un gateway en un espacio de direcciones público de tu propiedad

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 


1713 1713 

1714Para Claude Desktop, establezca la clave `bootstrapUrl` en la propia [configuración administrada](https://claude.com/docs/third-party/claude-desktop/configuration) de Claude Desktop en `<listen.public_url>/user/bootstrap`. El flujo de inicio de sesión y la política por grupo coinciden entonces con los del CLI una vez que una política se acepta del lado del servidor con una clave `desktop`; sin la aceptación, `/user/bootstrap` devuelve 404. Consulte [Superposición de Claude Desktop](#claude-desktop-overlay) para la mitad del lado del servidor.1714Para Claude Desktop, establezca la clave `bootstrapUrl` en la propia [configuración administrada](https://claude.com/docs/third-party/claude-desktop/configuration) de Claude Desktop en `<listen.public_url>/user/bootstrap`. El flujo de inicio de sesión y la política por grupo coinciden entonces con los del CLI una vez que una política se acepta del lado del servidor con una clave `desktop`; sin la aceptación, `/user/bootstrap` devuelve 404. Consulte [Superposición de Claude Desktop](#claude-desktop-overlay) para la mitad del lado del servidor.

1715 1715 

1716Claude Code honra [`forceLoginGatewayUrl`](/docs/es/settings-reference#forcelogingatewayurl), [`gatewayInternalNetworks`](/docs/es/settings-reference#gatewayinternalnetworks), y el valor `"gateway"` de [`forceLoginMethod`](/docs/es/settings-reference#forceloginmethod) solo desde una fuente administrada en la máquina: `managed-settings.json`, la plist de macOS o el registro HKLM de Windows, o un asistente de política. Establecerlos en el `~/.claude/settings.json` propio de un desarrollador no configura el inicio de sesión de la puerta de enlace, y tampoco lo hace establecerlos en la carga útil de la puerta de enlace.1716Claude Code respeta [`forceLoginGatewayUrl`](/docs/es/settings-reference#forcelogingatewayurl), [`gatewayInternalNetworks`](/docs/es/settings-reference#gatewayinternalnetworks) y el valor `"gateway"` de [`forceLoginMethod`](/docs/es/settings-reference#forceloginmethod) desde una fuente administrada en la máquina: `managed-settings.json`, la plist de macOS o el registro HKLM de Windows, o un asistente de política. Establecerlos en la carga útil del gateway no configura el inicio de sesión del gateway. Para el `~/.claude/settings.json` propio de un desarrollador, consulta [Establecer la URL del gateway en la configuración de usuario](/docs/es/claude-apps-gateway#set-the-gateway-url-in-user-settings).

1717 1717 

1718Deje `forceLoginMethod` y `forceLoginOrgUUID` fuera de la carga útil. Claude Code aún lee ambas claves de la carga útil para su verificación de credenciales de inicio, por lo que un desarrollador que mantenga una credencial emitida por Anthropic en la máquina obtiene la salida de inicio descrita en [La política del administrador requiere un inicio de sesión de puerta de enlace en la nube](/docs/es/errors#administrator-policy-requires-a-cloud-gateway-sign-in) incluso después de que inicie sesión.1718Deje `forceLoginMethod` y `forceLoginOrgUUID` fuera de la carga útil. Claude Code aún lee ambas claves de la carga útil para su verificación de credenciales de inicio, por lo que un desarrollador que mantenga una credencial emitida por Anthropic en la máquina obtiene la salida de inicio descrita en [La política del administrador requiere un inicio de sesión de puerta de enlace en la nube](/docs/es/errors#administrator-policy-requires-a-cloud-gateway-sign-in) incluso después de que inicie sesión.

1719 1719 

Details

135 Enviar la URL de la puerta de enlace a máquinas de desarrolladores135 Enviar la URL de la puerta de enlace a máquinas de desarrolladores

136</h3>136</h3>

137 137 

138Una vez que la puerta de enlace está sirviendo, envíe `forceLoginMethod`, `forceLoginGatewayUrl` y `parentSettingsBehavior: "merge"` a la máquina de cada desarrollador a través de configuraciones administradas, a través de MDM o escribiendo directamente el `managed-settings.json` específico del sistema operativo. Sin esto, `/login` muestra el selector de cuenta estándar sin opción de puerta de enlace.138Una vez que el gateway esté en servicio, envía `forceLoginMethod`, `forceLoginGatewayUrl` y `parentSettingsBehavior: "merge"` a la máquina de cada desarrollador a través de la configuración administrada, mediante MDM o escribiendo directamente el `managed-settings.json` correspondiente a cada sistema operativo.

139 139 

140Una vez que implemente las claves, Claude Code deja de usar una clave API sobrante o un inicio de sesión de claude.ai en la máquina, así que planifique el envío junto con sus instrucciones de inicio de sesión. [La política del administrador requiere un inicio de sesión de puerta de enlace en la nube](/docs/es/errors#administrator-policy-requires-a-cloud-gateway-sign-in) describe los mensajes que ven los desarrolladores.140Una vez que implemente las claves, Claude Code deja de usar una clave API sobrante o un inicio de sesión de claude.ai en la máquina, así que planifique el envío junto con sus instrucciones de inicio de sesión. [La política del administrador requiere un inicio de sesión de puerta de enlace en la nube](/docs/es/errors#administrator-policy-requires-a-cloud-gateway-sign-in) describe los mensajes que ven los desarrolladores.

141 141 

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 |

commands.md +1 −1

Details

77| `/compact [instructions]` | Libera contexto resumiendo la conversación hasta el momento. Opcionalmente, pasa instrucciones de enfoque para el resumen. Consulta [cómo la compactación maneja las reglas, los skills y los archivos de memoria](/docs/es/context-window#what-survives-compaction) |77| `/compact [instructions]` | Libera contexto resumiendo la conversación hasta el momento. Opcionalmente, pasa instrucciones de enfoque para el resumen. Consulta [cómo la compactación maneja las reglas, los skills y los archivos de memoria](/docs/es/context-window#what-survives-compaction) |

78| `/config [key=value ...]` | Abre la interfaz de [Configuración](/docs/es/settings) para ajustar el tema, el modelo, el [estilo de salida](/docs/es/output-styles) y otras preferencias. Pasa uno o más pares `key=value` para establecer un ajuste directamente sin abrir la interfaz, por ejemplo `/config thinking=false`, `/config theme=dark` o `/config model=sonnet`. La forma `key=value` también funciona en modo no interactivo (`-p`) y desde la app móvil de Claude a través de [Remote Control](/docs/es/remote-control). La forma `key=value` no puede activar un ajuste que necesite tu confirmación en el panel, como [`autoContinueAtUsageLimit`](/docs/es/interactive-mode#turn-automatic-continue-off), aunque sí puede desactivarlo. Ejecuta `/config --help` para enumerar las claves que acepta. Alias: `/settings` |78| `/config [key=value ...]` | Abre la interfaz de [Configuración](/docs/es/settings) para ajustar el tema, el modelo, el [estilo de salida](/docs/es/output-styles) y otras preferencias. Pasa uno o más pares `key=value` para establecer un ajuste directamente sin abrir la interfaz, por ejemplo `/config thinking=false`, `/config theme=dark` o `/config model=sonnet`. La forma `key=value` también funciona en modo no interactivo (`-p`) y desde la app móvil de Claude a través de [Remote Control](/docs/es/remote-control). La forma `key=value` no puede activar un ajuste que necesite tu confirmación en el panel, como [`autoContinueAtUsageLimit`](/docs/es/interactive-mode#turn-automatic-continue-off), aunque sí puede desactivarlo. Ejecuta `/config --help` para enumerar las claves que acepta. Alias: `/settings` |

79| `/context [all]` | Visualiza el uso actual del contexto como una cuadrícula de colores. Muestra sugerencias de optimización para herramientas que consumen mucho contexto, exceso de memoria y advertencias de capacidad. Cuando la conversación excede la ventana de contexto, la salida incluye una [advertencia](/docs/es/errors#context-exceeds-the-token-limit) que muestra por cuánto superas el límite y qué comando libera espacio. En [modo de pantalla completa](/docs/es/fullscreen), `/context` contrae el desglose por elemento para mantener visible la cuadrícula. Pasa `all` para expandirlo |79| `/context [all]` | Visualiza el uso actual del contexto como una cuadrícula de colores. Muestra sugerencias de optimización para herramientas que consumen mucho contexto, exceso de memoria y advertencias de capacidad. Cuando la conversación excede la ventana de contexto, la salida incluye una [advertencia](/docs/es/errors#context-exceeds-the-token-limit) que muestra por cuánto superas el límite y qué comando libera espacio. En [modo de pantalla completa](/docs/es/fullscreen), `/context` contrae el desglose por elemento para mantener visible la cuadrícula. Pasa `all` para expandirlo |

80| `/copy [N]` | Copia la última respuesta del asistente al portapapeles. Pasa un número `N` para copiar la N-ésima respuesta más reciente: `/copy 2` copia la penúltima. Cuando hay bloques de código, muestra un selector interactivo para elegir bloques individuales o la respuesta completa. Presiona `w` en el selector para escribir la selección en un archivo en lugar del portapapeles, lo que resulta útil a través de SSH |80| `/copy [N]` | Copia la última respuesta del asistente al portapapeles. Pasa un número `N` para copiar la N-ésima respuesta más reciente: `/copy 2` copia la penúltima. Cuando hay bloques de código o citas en bloque, muestra un selector interactivo para elegir bloques individuales o la respuesta completa. Presiona `w` en el selector para escribir la selección en un archivo en lugar del portapapeles, lo que resulta útil a través de SSH |

81| `/cost` | Alias de `/usage` |81| `/cost` | Alias de `/usage` |

82| `/dataviz [request]` | **[Skill](/docs/es/skills#bundled-skills).** Orientación de diseño para gráficos, diagramas y paneles. Claude elige la forma del gráfico según los datos, asigna el color por función, valida la paleta en cuanto a seguridad para daltónicos y contraste con un script incluido, y aplica reglas de marcas, interacción y accesibilidad. Usa una paleta de marcador de posición neutral respecto a la marca que reemplazas con la tuya |82| `/dataviz [request]` | **[Skill](/docs/es/skills#bundled-skills).** Orientación de diseño para gráficos, diagramas y paneles. Claude elige la forma del gráfico según los datos, asigna el color por función, valida la paleta en cuanto a seguridad para daltónicos y contraste con un script incluido, y aplica reglas de marcas, interacción y accesibilidad. Usa una paleta de marcador de posición neutral respecto a la marca que reemplazas con la tuya |

83| `/debug [description]` | **[Skill](/docs/es/skills#bundled-skills).** Habilita el registro de depuración para la sesión actual y soluciona problemas leyendo el registro de depuración de la sesión. El registro de depuración está desactivado de forma predeterminada a menos que hayas iniciado con `claude --debug`, por lo que ejecutar `/debug` a mitad de la sesión comienza a capturar registros desde ese momento. Opcionalmente, describe el problema para enfocar el análisis |83| `/debug [description]` | **[Skill](/docs/es/skills#bundled-skills).** Habilita el registro de depuración para la sesión actual y soluciona problemas leyendo el registro de depuración de la sesión. El registro de depuración está desactivado de forma predeterminada a menos que hayas iniciado con `claude --debug`, por lo que ejecutar `/debug` a mitad de la sesión comienza a capturar registros desde ese momento. Opcionalmente, describe el problema para enfocar el análisis |

env-vars.md +3 −3

Details

285| `CLAUDE_CODE_DISABLE_REFUSAL_FALLBACK` | Establécela en `1` para desactivar el [cambio automático de modelo cuando un clasificador de seguridad marca una solicitud](/docs/es/model-config#automatic-model-fallback), el comportamiento que controla el ajuste [`switchModelsOnFlag`](/docs/es/settings-reference#switchmodelsonflag) |285| `CLAUDE_CODE_DISABLE_REFUSAL_FALLBACK` | Establécela en `1` para desactivar el [cambio automático de modelo cuando un clasificador de seguridad marca una solicitud](/docs/es/model-config#automatic-model-fallback), el comportamiento que controla el ajuste [`switchModelsOnFlag`](/docs/es/settings-reference#switchmodelsonflag) |

286| `CLAUDE_CODE_DISABLE_STRUCTURED_OUTPUTS` | Establécela en `1` para que Claude Code deje de enviar el campo de salida estructurada `output_config.format` y el valor de `anthropic-beta` que lo acompaña, para un [gateway de LLM](/docs/es/llm-gateway-protocol#feature-pass-through) cuyo servicio ascendente los rechaza. Esto deja activadas las demás capacidades preliminares que [`CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS`](/docs/es/llm-gateway-protocol#disable-pre-release-capabilities) desactiva. Requiere Claude Code v2.1.288 o posterior |286| `CLAUDE_CODE_DISABLE_STRUCTURED_OUTPUTS` | Establécela en `1` para que Claude Code deje de enviar el campo de salida estructurada `output_config.format` y el valor de `anthropic-beta` que lo acompaña, para un [gateway de LLM](/docs/es/llm-gateway-protocol#feature-pass-through) cuyo servicio ascendente los rechaza. Esto deja activadas las demás capacidades preliminares que [`CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS`](/docs/es/llm-gateway-protocol#disable-pre-release-capabilities) desactiva. Requiere Claude Code v2.1.288 o posterior |

287| `CLAUDE_CODE_DISABLE_SUBSTITUTION_RM_PROMPT` | Establécela en `1` para desactivar la comprobación de [rutas críticas](/docs/es/permission-modes#critical-paths) para un `rm` recursivo cuyo destino es completamente la salida de una sustitución de comandos, como `rm -rf "$(pwd)"`. Las demás comprobaciones de rutas críticas se siguen ejecutando. Establécela en el entorno que inicia Claude Code, ya que Claude Code ignora una copia entregada mediante un bloque `env` de la configuración. Requiere Claude Code v2.1.281 o posterior |287| `CLAUDE_CODE_DISABLE_SUBSTITUTION_RM_PROMPT` | Establécela en `1` para desactivar la comprobación de [rutas críticas](/docs/es/permission-modes#critical-paths) para un `rm` recursivo cuyo destino es completamente la salida de una sustitución de comandos, como `rm -rf "$(pwd)"`. Las demás comprobaciones de rutas críticas se siguen ejecutando. Establécela en el entorno que inicia Claude Code, ya que Claude Code ignora una copia entregada mediante un bloque `env` de la configuración. Requiere Claude Code v2.1.281 o posterior |

288| `CLAUDE_CODE_DISABLE_TERMINAL_TITLE` | Establécela en `1` para desactivar las actualizaciones automáticas del título de la terminal según el contexto de la conversación. Esto también omite la solicitud en segundo plano al modelo pequeño/rápido que [genera un título para la sesión](/docs/es/sessions#name-your-sessions) |288| `CLAUDE_CODE_DISABLE_TERMINAL_TITLE` | Establécela en `1` para desactivar las actualizaciones automáticas del título de la terminal basadas en el contexto de la conversación. Esto también omite la solicitud en segundo plano al modelo pequeño/rápido que [genera un título de sesión](/docs/es/sessions#name-your-sessions), y desactiva los [informes de estado a tu terminal](/docs/es/terminal-config#see-session-status-in-your-terminal) |

289| `CLAUDE_CODE_DISABLE_THINKING` | Establécela en `1` para omitir por completo el parámetro `thinking` de las solicitudes a la API. Es una opción de compatibilidad para proxies y gateways que rechazan el parámetro. En los modelos que piensan de forma predeterminada, omitir el parámetro significa que el modelo puede seguir pensando. Para desactivar explícitamente el [pensamiento extendido](https://platform.claude.com/docs/en/build-with-claude/extended-thinking) en la API de Anthropic, usa `MAX_THINKING_TOKENS=0` en su lugar. Ninguna de las dos variables desactiva el pensamiento en Opus 5.5, Sonnet 5.5, Haiku 5.5 ni en los modelos Fable, en los que no se puede desactivar el pensamiento. En [proveedores de terceros](/docs/es/third-party-integrations), `MAX_THINKING_TOKENS=0` también omite el parámetro, por lo que allí ambas variables se comportan igual |289| `CLAUDE_CODE_DISABLE_THINKING` | Establécela en `1` para omitir por completo el parámetro `thinking` de las solicitudes a la API. Es una opción de compatibilidad para proxies y gateways que rechazan el parámetro. En los modelos que piensan de forma predeterminada, omitir el parámetro significa que el modelo puede seguir pensando. Para desactivar explícitamente el [pensamiento extendido](https://platform.claude.com/docs/en/build-with-claude/extended-thinking) en la API de Anthropic, usa `MAX_THINKING_TOKENS=0` en su lugar. Ninguna de las dos variables desactiva el pensamiento en Opus 5.5, Sonnet 5.5, Haiku 5.5 ni en los modelos Fable, en los que no se puede desactivar el pensamiento. En [proveedores de terceros](/docs/es/third-party-integrations), `MAX_THINKING_TOKENS=0` también omite el parámetro, por lo que allí ambas variables se comportan igual |

290| `CLAUDE_CODE_DISABLE_UNKNOWN_MODEL_WINDOW_ENFORCEMENT` | Establécela en `1` para omitir la [compactación automática](/docs/es/costs#reduce-token-usage) proactiva cuando Claude Code no reconoce el ID del modelo, como un alias de un [gateway de LLM](/docs/es/llm-gateway). Sin esta variable, Claude Code compacta según la ventana de contexto que asume para el ID. `CLAUDE_CODE_MAX_CONTEXT_TOKENS` puede corregir en su lugar la ventana asumida; consulta [Corregir la ventana para un gateway o un ID de modelo personalizado](/docs/es/model-config#correct-the-window-for-a-gateway-or-custom-model-id) para saber cuándo se aplica cada variable. Requiere Claude Code v2.1.223 o posterior |290| `CLAUDE_CODE_DISABLE_UNKNOWN_MODEL_WINDOW_ENFORCEMENT` | Establécela en `1` para omitir la [compactación automática](/docs/es/costs#reduce-token-usage) proactiva cuando Claude Code no reconoce el ID del modelo, como un alias de un [gateway de LLM](/docs/es/llm-gateway). Sin esta variable, Claude Code compacta según la ventana de contexto que asume para el ID. `CLAUDE_CODE_MAX_CONTEXT_TOKENS` puede corregir en su lugar la ventana asumida; consulta [Corregir la ventana para un gateway o un ID de modelo personalizado](/docs/es/model-config#correct-the-window-for-a-gateway-or-custom-model-id) para saber cuándo se aplica cada variable. Requiere Claude Code v2.1.223 o posterior |

291| `CLAUDE_CODE_DISABLE_VIRTUAL_SCROLL` | Establécela en `1` para desactivar el desplazamiento virtual en el [renderizado a pantalla completa](/docs/es/fullscreen) y renderizar todos los mensajes de la transcripción. Úsala si al desplazarte en el modo de pantalla completa aparecen regiones en blanco donde deberían aparecer mensajes |291| `CLAUDE_CODE_DISABLE_VIRTUAL_SCROLL` | Establécela en `1` para desactivar el desplazamiento virtual en el [renderizado a pantalla completa](/docs/es/fullscreen) y renderizar todos los mensajes de la transcripción. Úsala si al desplazarte en el modo de pantalla completa aparecen regiones en blanco donde deberían aparecer mensajes |


309| `CLAUDE_CODE_EXIT_AFTER_STOP_DELAY` | Tiempo en milisegundos que se espera después de que el bucle de consultas queda inactivo antes de salir automáticamente. Útil para flujos de trabajo automatizados y scripts que usan el modo SDK |309| `CLAUDE_CODE_EXIT_AFTER_STOP_DELAY` | Tiempo en milisegundos que se espera después de que el bucle de consultas queda inactivo antes de salir automáticamente. Útil para flujos de trabajo automatizados y scripts que usan el modo SDK |

310| `CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS` | Establécela en `1` para habilitar los [equipos de agentes](/docs/es/agent-teams). Los equipos de agentes son experimentales y están deshabilitados de forma predeterminada |310| `CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS` | Establécela en `1` para habilitar los [equipos de agentes](/docs/es/agent-teams). Los equipos de agentes son experimentales y están deshabilitados de forma predeterminada |

311| `CLAUDE_CODE_EXTRA_BODY` | Objeto JSON que se combina con el nivel superior del cuerpo de cada solicitud a la API. Útil para pasar parámetros específicos del proveedor que Claude Code no expone directamente. Un valor exportado en tu shell también se aplica a las [sesiones en segundo plano](/docs/es/agent-view) que lanzas con `claude agents` o `--bg`. Antes de la v2.1.206, las sesiones en segundo plano ignoraban un valor exportado en el shell y usaban la copia que hubiera heredado el proceso supervisor en segundo plano |311| `CLAUDE_CODE_EXTRA_BODY` | Objeto JSON que se combina con el nivel superior del cuerpo de cada solicitud a la API. Útil para pasar parámetros específicos del proveedor que Claude Code no expone directamente. Un valor exportado en tu shell también se aplica a las [sesiones en segundo plano](/docs/es/agent-view) que lanzas con `claude agents` o `--bg`. Antes de la v2.1.206, las sesiones en segundo plano ignoraban un valor exportado en el shell y usaban la copia que hubiera heredado el proceso supervisor en segundo plano |

312| `CLAUDE_CODE_FILE_READ_MAX_OUTPUT_TOKENS` | Sobrescribe el límite de tokens predeterminado para la lectura de archivos. Útil cuando necesitas leer archivos más grandes completos |312| `CLAUDE_CODE_FILE_READ_MAX_OUTPUT_TOKENS` | Sobrescribe el límite de tokens predeterminado para la [lectura de archivos](/docs/es/tools-reference#large-files), que es de 25,000 tokens. Útil cuando necesitas leer archivos más grandes completos. Una lectura que Claude hace con el parámetro `allow_large` puede superar este límite cuando la ventana de contexto tiene espacio |

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

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

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


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 +67 −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) |


308| `Your disk quota is full on the filesystem with Claude Code's temp directory <dir> (EDQUOT)` | [Errores de herramientas](#disk-quota-or-temp-filesystem-is-full) |309| `Your disk quota is full on the filesystem with Claude Code's temp directory <dir> (EDQUOT)` | [Errores de herramientas](#disk-quota-or-temp-filesystem-is-full) |

309| `The filesystem with Claude Code's temp directory <dir>, or your disk quota on it, is full (ENOSPC)` | [Errores de herramientas](#disk-quota-or-temp-filesystem-is-full) |310| `The filesystem with Claude Code's temp directory <dir>, or your disk quota on it, is full (ENOSPC)` | [Errores de herramientas](#disk-quota-or-temp-filesystem-is-full) |

310| `Command output was lost: the temp filesystem at <dir> is full` / `is out of inodes` | [Errores de herramientas](#disk-quota-or-temp-filesystem-is-full) |311| `Command output was lost: the temp filesystem at <dir> is full` / `is out of inodes` | [Errores de herramientas](#disk-quota-or-temp-filesystem-is-full) |

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

311| `the source file is not valid UTF-8 text` / `the source file is not valid UTF-16 text` | [Errores de herramientas](#the-source-file-is-not-valid-utf-8-text) |313| `the source file is not valid UTF-8 text` / `the source file is not valid UTF-16 text` | [Errores de herramientas](#the-source-file-is-not-valid-utf-8-text) |

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

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


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

339| `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) |340| `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) |341| `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) |342| `EACCES: permission denied, posix_spawn` | [Errores de sesión en segundo plano](#eacces-when-starting-a-background-session) |


439| :- | :- | :- |442| :- | :- | :- |

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. |443| [`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. |444| [`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. |

445| [`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. |446| [`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). |447| [`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. |448| [`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. |


1900 1904 

1901Claude Code omite esta verificación cuando un [archivo de configuración administrada, una política MDM o un asistente de políticas](/docs/es/managed-settings) establece [`forceLoginMethod`](/docs/es/settings-reference#forceloginmethod) en `"gateway"`, o establece [`forceLoginGatewayUrl`](/docs/es/settings-reference#forcelogingatewayurl) sin `forceLoginMethod`. Con cualquiera de estas configuraciones, Claude Code abre el paso de inicio de sesión en la pantalla **Cloud gateway** en lugar de un método de inicio de sesión de Anthropic. Claude Code también omite la verificación cuando existe una fuente de configuración administrada en la máquina pero no se puede leer, ya que esa fuente puede contener la configuración del gateway. Antes de v2.1.247, Claude Code ejecutaba la verificación también con esta configuración, y salía con este error cuando los endpoints de Anthropic eran inaccesibles.1905Claude Code omite esta verificación cuando un [archivo de configuración administrada, una política MDM o un asistente de políticas](/docs/es/managed-settings) establece [`forceLoginMethod`](/docs/es/settings-reference#forceloginmethod) en `"gateway"`, o establece [`forceLoginGatewayUrl`](/docs/es/settings-reference#forcelogingatewayurl) sin `forceLoginMethod`. Con cualquiera de estas configuraciones, Claude Code abre el paso de inicio de sesión en la pantalla **Cloud gateway** en lugar de un método de inicio de sesión de Anthropic. Claude Code también omite la verificación cuando existe una fuente de configuración administrada en la máquina pero no se puede leer, ya que esa fuente puede contener la configuración del gateway. Antes de v2.1.247, Claude Code ejecutaba la verificación también con esta configuración, y salía con este error cuando los endpoints de Anthropic eran inaccesibles.

1902 1906 

1907Claude Code también omite la verificación en una máquina sin configuración administrada cuando tu propio `~/.claude/settings.json` [nombra un gateway](/docs/es/claude-apps-gateway#set-the-gateway-url-in-user-settings) con `forceLoginMethod` y `forceLoginGatewayUrl`. Antes de v2.1.295, Claude Code ejecutaba la verificación en ese caso.

1908 

1903**Qué hacer:**1909**Qué hacer:**

1904 1910 

1905* Si el mensaje nombra una variable de proxy, verifica que su valor apunte al proxy correcto y pide a tu equipo de red que permita conexiones HTTPS a través de él hacia el host del mensaje. Consulta [Configuración de red](/docs/es/network-config).1911* Si el mensaje nombra una variable de proxy, verifica que su valor apunte al proxy correcto y pide a tu equipo de red que permita conexiones HTTPS a través de él hacia el host del mensaje. Consulta [Configuración de red](/docs/es/network-config).


3412 3418 

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:3419Claude 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 3420 

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`3421* `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)3422* ``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 3423 

3418**Qué hacer:**3424**Qué hacer:**


3562 3568 

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 anterior3569* **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>`)``3570* **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`.3571* **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 3572 

3567**Qué hacer:**3573**Qué hacer:**

3568 3574 


3816 3822 

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)3823* 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 3824 

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

3826 Claude Code couldn't restart

3827</h3>

3828 

3829Claude 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:

3830 

3831```text theme={null}

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

3833```

3834 

3835Cuando 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.`

3836 

3837**Qué hacer:**

3838 

3839* 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

3840* 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)

3841 

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

3820 No se pudo abrir Claude Desktop3843 No se pudo abrir Claude Desktop

3821</h3>3844</h3>


4593* O reinicia Claude Code con [`CLAUDE_CODE_TMPDIR`](/docs/es/env-vars) configurado en un directorio de un sistema de archivos con espacio4616* O reinicia Claude Code con [`CLAUDE_CODE_TMPDIR`](/docs/es/env-vars) configurado en un directorio de un sistema de archivos con espacio

4594* Luego pide a Claude que ejecute el comando de nuevo. La salida que imprimió se perdió, no se truncó4617* Luego pide a Claude que ejecute el comando de nuevo. La salida que imprimió se perdió, no se truncó

4595 4618 

4619<h3 id="file-is-not-valid-utf-8">

4620 File is not valid UTF-8

4621</h3>

4622 

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

4624 

4625```text wrap theme={null}

4626File is not valid UTF-8. It may use a legacy encoding such as Windows-1252, Shift-JIS or GBK, or be binary. This tool saves the whole file as UTF-8, which would replace every byte it cannot decode with U+FFFD. Nothing was written. Make the change with a shell command that reads and writes the file in its own encoding, or ask the user whether to convert the file to UTF-8 first.

4627```

4628 

4629Un archivo que debería estar en UTF-8 también recibe este mensaje cuando contiene aunque sea una sola secuencia de bytes no válida, porque la verificación cubre los bytes del archivo en su conjunto.

4630 

4631**Qué hacer:**

4632 

4633* Para mantener el archivo en su codificación actual, deja que Claude haga el cambio con un comando de shell que lea y escriba el archivo en esa codificación, como le indica el mensaje

4634* Para seguir editando el archivo con la herramienta Edit, conviértelo a UTF-8, o corrige los bytes no válidos en un archivo que debería estar en UTF-8, y luego pide a Claude que haga la edición de nuevo

4635 

4636Antes de v2.1.296, Edit y NotebookEdit aplicaban una edición así y guardaban cada byte que no podían decodificar como `U+FFFD`. En esas versiones, actualiza Claude Code.

4637 

4596<h3 id="the-source-file-is-not-valid-utf-8-text">4638<h3 id="the-source-file-is-not-valid-utf-8-text">

4597 The source file is not valid UTF-8 text4639 The source file is not valid UTF-8 text

4598</h3>4640</h3>


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

4753</h3>4795</h3>

4754 4796 

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:4797Claude 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 4798 

4757* El comando apunta git al checkout principal.4799* 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.4800* Un comando Bash o Monitor apunta git al checkout principal.

4801* 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 4802 

4760La parte central del mensaje nombra lo que no se pudo verificar:4803El 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 4804 

4762```text wrap theme={null}4805```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.4806This 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 4808 

4766**Qué hacer:**4809**Qué hacer:**

4767 4810 

4768* Generalmente nada: Claude lee el mensaje y reescribe el comando de la manera que su oración final solicita4811* **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ón4812* Para actuar en el checkout principal a propósito, ejecuta el comando tú mismo en una terminal fuera de la sesión

4771 4813 

4772<h3 id="this-session-has-no-saved-transcript">4814<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 lugar4988* 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 nuevamente4989* 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 4990 

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

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

4993</h3>

4994 

4995Un [`/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ó:

4996 

4997```text theme={null}

4998This 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.

4999```

5000 

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

5002 

5003**Qué hacer:**

5004 

5005* 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

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

5007 

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

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

4951</h3>5010</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

22 22 

23| Atajo | Descripción | Contexto |23| Atajo | Descripción | Contexto |

24| :- | :- | :- |24| :- | :- | :- |

25| `Ctrl+C` | Interrumpir o borrar entrada | Interrumpe una operación en ejecución. Si nada se está ejecutando, la primera pulsación borra la entrada del símbolo del sistema y una segunda pulsación cierra Claude Code |25| `Ctrl+C` | Interrumpir o borrar entrada | Interrumpe una operación en ejecución. Si nada se está ejecutando, la primera pulsación borra la entrada del prompt y una segunda pulsación cierra Claude Code. Presiona `Up` mientras el prompt sigue vacío para recuperar el borrador borrado, lo que requiere Claude Code v2.1.288 o posterior |

26| `Ctrl+X Ctrl+K` | Detener todos los [subagentes en segundo plano](/docs/es/sub-agents#run-subagents-in-foreground-or-background) en esta sesión y desactivar las [respuestas automáticas de artefactos](/docs/es/artifacts#let-claude-reply-to-comments-on-its-own) para el resto de ella. Presiona dos veces en 3 segundos para confirmar. Puedes presionarlo mientras la solicitud de permiso de un subagente en segundo plano está abierta | Control de subagentes |26| `Ctrl+X Ctrl+K` | Detener todos los [subagentes en segundo plano](/docs/es/sub-agents#run-subagents-in-foreground-or-background) en esta sesión y desactivar las [respuestas automáticas de artefactos](/docs/es/artifacts#let-claude-reply-to-comments-on-its-own) para el resto de ella. Presiona dos veces en 3 segundos para confirmar. Puedes presionarlo mientras la solicitud de permiso de un subagente en segundo plano está abierta | Control de subagentes |

27| `Ctrl+D` | Salir de la sesión de Claude Code | La primera pulsación muestra una sugerencia de confirmación y una segunda pulsación dentro de 800 ms cierra. Cuando el símbolo del sistema tiene texto, `Ctrl+D` elimina el carácter después del cursor en su lugar |27| `Ctrl+D` | Salir de la sesión de Claude Code | La primera pulsación muestra una sugerencia de confirmación y una segunda pulsación dentro de 800 ms cierra. Cuando el símbolo del sistema tiene texto, `Ctrl+D` elimina el carácter después del cursor en su lugar |

28| `Ctrl+G` o `Ctrl+X Ctrl+E` | Abrir en el editor de texto predeterminado | Edite su símbolo del sistema o respuesta personalizada en su editor de texto predeterminado. `Ctrl+X Ctrl+E` es el enlace nativo de readline. Active **Mostrar última respuesta en editor externo** en `/config` para anteponer la respuesta anterior de Claude como contexto comentado con `#` arriba de su símbolo del sistema; Claude Code elimina el bloque de comentarios cuando guarda |28| `Ctrl+G` o `Ctrl+X Ctrl+E` | Abrir en el editor de texto predeterminado | Edite su símbolo del sistema o respuesta personalizada en su editor de texto predeterminado. `Ctrl+X Ctrl+E` es el enlace nativo de readline. Active **Mostrar última respuesta en editor externo** en `/config` para anteponer la respuesta anterior de Claude como contexto comentado con `#` arriba de su símbolo del sistema; Claude Code elimina el bloque de comentarios cuando guarda |


36| `Ctrl+Z` | Suspender Claude Code | Solo Unix. Suspende el proceso a su shell; ejecute `fg` para reanudar |36| `Ctrl+Z` | Suspender Claude Code | Solo Unix. Suspende el proceso a su shell; ejecute `fg` para reanudar |

37| `Flechas izquierda/derecha` | Ciclar a través de pestañas de diálogo | Navegue entre pestañas en diálogos de permisos y menús. En un diálogo con pestañas, las teclas cambian de pestaña mientras la fila de pestañas tiene el foco. Consulte [Acciones de pestañas](/docs/es/keybindings#tabs-actions) para ver cómo se mueve el foco |37| `Flechas izquierda/derecha` | Ciclar a través de pestañas de diálogo | Navegue entre pestañas en diálogos de permisos y menús. En un diálogo con pestañas, las teclas cambian de pestaña mientras la fila de pestañas tiene el foco. Consulte [Acciones de pestañas](/docs/es/keybindings#tabs-actions) para ver cómo se mueve el foco |

38| `Tab` | Aceptar una sugerencia de autocompletado o agregar un comentario a una respuesta de permiso | Mientras se muestran sugerencias de autocompletado en la entrada del símbolo del sistema, acepta la sugerencia seleccionada. En la mayoría de los avisos de permiso, con **Sí** o **No** enfocado, abre un campo de comentario en esa opción, y presionarlo nuevamente cierra el campo. Consulte [agregar un comentario cuando responde a un aviso de permiso](/docs/es/permissions#add-a-comment-when-you-answer-a-permission-prompt) |38| `Tab` | Aceptar una sugerencia de autocompletado o agregar un comentario a una respuesta de permiso | Mientras se muestran sugerencias de autocompletado en la entrada del símbolo del sistema, acepta la sugerencia seleccionada. En la mayoría de los avisos de permiso, con **Sí** o **No** enfocado, abre un campo de comentario en esa opción, y presionarlo nuevamente cierra el campo. Consulte [agregar un comentario cuando responde a un aviso de permiso](/docs/es/permissions#add-a-comment-when-you-answer-a-permission-prompt) |

39| `Flechas arriba/abajo` o `Ctrl+P`/`Ctrl+N` | Mover cursor o navegar por el historial de comandos | Cuando la entrada abarca más de una fila visual, ya sea envuelta o multilínea, primero mueve el cursor dentro del símbolo del sistema. Una vez que el cursor está en la primera o última fila visual, presionar nuevamente navega por el historial de comandos. Mientras tiene mensajes en cola, `Arriba` desde la primera fila en su lugar [los retira](#take-back-what-you-queued) |39| `Flechas arriba/abajo` o `Ctrl+P`/`Ctrl+N` | Mover cursor o navegar por el historial de comandos | Cuando la entrada abarca más de una fila visual, ya sea ajustada o multilínea, primero mueve el cursor dentro del prompt. Una vez que el cursor está en la primera o última fila visual, presionar nuevamente navega por el historial de comandos. Mientras tienes mensajes en cola, `Up` desde la primera fila en su lugar [los retira](#take-back-what-you-queued) |

40| `Esc` | Interrumpir Claude o cerrar un diálogo | Detiene la respuesta actual o la llamada de herramienta a mitad de turno para que pueda redirigir. Claude mantiene el trabajo realizado hasta ahora. Si tiene [mensajes en cola](#queue-messages-while-claude-works), Claude Code los envía a continuación. Cuando un diálogo está abierto, `Esc` cierra el diálogo. Mientras un elemento de pie de página está seleccionado, como una fila en el [panel de subagentes](/docs/es/sub-agents#run-subagents-in-foreground-or-background) debajo del símbolo del sistema, `Esc` [lo deselecciona](/docs/es/keybindings#footer-actions) en lugar de interrumpir. En un aviso de permiso, `Esc` rechaza la acción, lo mismo que [**No** sin un comentario](/docs/es/permissions#add-a-comment-when-you-answer-a-permission-prompt) |40| `Esc` | Interrumpir Claude o cerrar un diálogo | Detiene la respuesta actual o la llamada de herramienta a mitad de turno para que pueda redirigir. Claude mantiene el trabajo realizado hasta ahora. Si tiene [mensajes en cola](#queue-messages-while-claude-works), Claude Code los envía a continuación. Cuando un diálogo está abierto, `Esc` cierra el diálogo. Mientras un elemento de pie de página está seleccionado, como una fila en el [panel de subagentes](/docs/es/sub-agents#run-subagents-in-foreground-or-background) debajo del símbolo del sistema, `Esc` [lo deselecciona](/docs/es/keybindings#footer-actions) en lugar de interrumpir. En un aviso de permiso, `Esc` rechaza la acción, lo mismo que [**No** sin un comentario](/docs/es/permissions#add-a-comment-when-you-answer-a-permission-prompt) |

41| `Esc` + `Esc` | Borrar borrador de entrada o rebobinar | Cuando la entrada del símbolo del sistema contiene texto, doble `Esc` lo borra y guarda el borrador en el historial para que `Arriba` lo recupere. Cuando la entrada está vacía, doble `Esc` abre el [menú de rebobinado](/docs/es/checkpointing) para restaurar o resumir código y conversación desde un punto anterior |41| `Esc` + `Esc` | Borrar borrador de entrada o rebobinar | Cuando la entrada del prompt contiene texto, doble `Esc` lo borra y guarda el borrador en el historial para que `Up` lo recupere. Cuando la entrada está vacía, doble `Esc` abre el [menú de rebobinado](/docs/es/checkpointing) para restaurar o resumir código y conversación desde un punto anterior |

42| `Ctrl+Enter` o `Ctrl+X Ctrl+S` | Enviar mensajes en cola ahora | Envía sus [mensajes en cola](#queue-messages-while-claude-works) y su borrador con ellos de inmediato. [Cuando Claude Code envía lo que puso en cola](#when-claude-code-sends-what-you-queued) cubre lo que sucede con el turno en el que Claude está trabajando. En [modo shell](#shell-mode-with-prefix), la tecla solo pone en cola su comando. En terminales que no reportan teclas extendidas, `Ctrl+Enter` llega como `Enter` simple; `Ctrl+X Ctrl+S` funciona en cualquier terminal. Requiere Claude Code v2.1.275 o posterior |42| `Ctrl+Enter` o `Ctrl+X Ctrl+S` | Enviar mensajes en cola ahora | Envía sus [mensajes en cola](#queue-messages-while-claude-works) y su borrador con ellos de inmediato. [Cuando Claude Code envía lo que puso en cola](#when-claude-code-sends-what-you-queued) cubre lo que sucede con el turno en el que Claude está trabajando. En [modo shell](#shell-mode-with-prefix), la tecla solo pone en cola su comando. En terminales que no reportan teclas extendidas, `Ctrl+Enter` llega como `Enter` simple; `Ctrl+X Ctrl+S` funciona en cualquier terminal. Requiere Claude Code v2.1.275 o posterior |

43| `Shift+Tab`, o `Alt+M` en Windows cuando el tiempo de ejecución de Node o Bun no habilita el modo de entrada VT | Ciclar modos de permiso | Cicle a través de `default` (etiquetado como Manual en el indicador de modo), `acceptEdits`, `plan` y, cuando esté disponible, `bypassPermissions` y luego `auto`. Desde `auto`, la primera pulsación cambia a `default`. Consulte [modos de permiso](/docs/es/permission-modes). En un aviso de permiso de archivo, la misma tecla cierra un [campo de comentario](/docs/es/permissions#add-a-comment-when-you-answer-a-permission-prompt) abierto. Sin campo abierto, selecciona la opción que permite la acción para el resto de la sesión, cuando el aviso ofrece esa opción |43| `Shift+Tab`, o `Alt+M` en Windows cuando el tiempo de ejecución de Node o Bun no habilita el modo de entrada VT | Ciclar modos de permiso | Cicle a través de `default` (etiquetado como Manual en el indicador de modo), `acceptEdits`, `plan` y, cuando esté disponible, `bypassPermissions` y luego `auto`. Desde `auto`, la primera pulsación cambia a `default`. Consulte [modos de permiso](/docs/es/permission-modes). En un aviso de permiso de archivo, la misma tecla cierra un [campo de comentario](/docs/es/permissions#add-a-comment-when-you-answer-a-permission-prompt) abierto. Sin campo abierto, selecciona la opción que permite la acción para el resto de la sesión, cuando el aviso ofrece esa opción |

44| `Option+P` (macOS) o `Alt+P` (Windows/Linux) | Cambiar modelo | Cambie modelos sin borrar su símbolo del sistema |44| `Option+P` (macOS) o `Alt+P` (Windows/Linux) | Cambiar modelo | Cambie modelos sin borrar su símbolo del sistema |

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; see the note below the script

179# la sesión no tenía, consulta la nota debajo del script.215# before you give this push a credential.

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 

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

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

230 

231Trata cualquier credencial que tu hook le dé a git como una que una sesión puede obtener, y genérala de modo que no pueda hacer más que este push. Git en tu hook lee archivos de configuración que una sesión puede escribir, y un ayudante de credenciales o un controlador de filtros nombrado en uno de ellos se ejecuta con los privilegios de tu hook. Los ajustes de esos archivos también pueden cambiar el destino de un push, sea cual sea el remoto que nombres. Para conocer los ajustes de git que el ejecutor fija en tu hook y los que deja en manos de esos archivos, consulta [Configuración de Git dentro de los hooks de ciclo de vida](#git-configuration-inside-lifecycle-hooks).

192 232 

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

194 Tiempo del hook cuando el ejecutor libera una sesión234 Tiempo del hook cuando el ejecutor libera una sesión


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. |304| `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. |305| `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. |306| `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. |307| `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. |308| `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_...` |309| `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. |310| `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. |311| `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. |312| `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. |313| `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. |314| `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. |315| `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`. |316| `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.322* **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.323* **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 324 

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

286 326 

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

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.3293. **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.330 

331 * **Salida 0**: enviado.

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

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

334 

335 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).

336 

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

3384. **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 339 

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

293 341 

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.342Una 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 343 

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

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

346</h4>

347 

348En 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.

349 

350Una 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.

351 

352Para 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:

353 

354```bash theme={null}

355set -e

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

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

358```

359 

360Estas 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:

361 

362* **`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.

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

364* **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:

365 

366 ```bash theme={null}

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

368 ```

369* **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.

370 

371Para 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.

372 

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

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

298</h2>375</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:458Una 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 459 

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.460* **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.

461* **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.462* **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.463* **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:

464 * **`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`.

465 * **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.466* **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).467* **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 468 


411 491 

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.492Las 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 493 

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

495 

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

497 Esperar a los servidores MCP antes del primer turno

498</h3>

499 

500Una 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:

501 

502* **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.

503* **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.

504 

505`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:

506 

507```dockerfile theme={null}

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

509```

510 

511Si 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).

512 

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

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

416</h3>515</h3>


571 670 

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.671Establezca `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 672 

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).673Las sesiones también leen estos archivos de configuración:

674 

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

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

677 

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

575 679 

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.680Cuando 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 681 


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.683* **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.684* **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 685 

686Cuando 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.

687 

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.688Fuera 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 689 

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.690La 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* **Credenciales solo para los repositorios de la sesión**: Anthropic proporciona credenciales de git para los repositorios que forman parte de la sesión, no para otros repositorios en el mismo host de git. Un submódulo privado, una dependencia que tu gestor de paquetes obtiene con git o un marketplace de plugins en otro repositorio no reciben ninguna credencial de Anthropic. Pide a las personas que crean sesiones que [agreguen cada repositorio](/docs/es/web-quickstart#start-a-task) que una sesión necesita al crearla.

214* **Solo push de ramas**: un push que elimina una rama falla, y también falla un push a cualquier otro tipo de ref, como una etiqueta. Para saber qué ramas puede actualizar un push, consulta [Proxy de GitHub](/docs/es/cloud-environments#github-proxy).

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

216* **`--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.

217* **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.

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

219* **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.

220 

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

222 

223<Warning>

224 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.

225</Warning>

226 

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

228 

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

230 Activa el proxy de git de Anthropic

231</h4>

232 

233Antes 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 234 

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.235* **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.

236* **`--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.

237* **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 238 

193<Warning>239<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.240 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>241</Warning>

196 242 

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í.243Para 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:

244 

245```bash theme={null}

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

247```

248 

249Al 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).

250 

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

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

253</h4>

254 

255Para 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:

256 

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

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

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

260 

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

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

263</h4>

264 

265En 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/`.

266 

267Para 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:

268 

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

270* **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.

271 * **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.

272 * **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.

273* **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.

274* <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.

275 

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

277 

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

279 Desactiva el proxy de git de Anthropic

280</h4>

281 

282Si 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.

283 

284<Steps>

285 <Step title="Quita el flag">

286 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:

287 

288 ```bash theme={null}

289 unset CLAUDE_RUNNER_USE_GIT_PROXY

290 ```

291 </Step>

292 

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

294 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).

295 </Step>

296 

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

298 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).

299 </Step>

300 

301 <Step title="Reinicia los runners">

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

303 </Step>

304</Steps>

198 305 

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

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


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

267FROM debian:bookworm-slim374FROM debian:bookworm-slim

268ARG CLAUDE_CODE_VERSION375ARG CLAUDE_CODE_VERSION

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

270 && rm -rf /var/lib/apt/lists/*377 && 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" \378RUN 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/claude379 -o /usr/local/bin/claude && chmod +x /usr/local/bin/claude


382kubectl create namespace claude-runners489kubectl create namespace claude-runners

383```490```

384 491 

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:492Crea 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 493 

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

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


500 Reutilice un checkout precalentado607 Reutilice un checkout precalentado

501</h2>608</h2>

502 609 

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:610Para 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:

611 

612* **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.

613* **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.

614 

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

504 616 

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.617* **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.618* **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:620Lo que la ruta de reutilización hace y no garantiza:

509 621 

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.622* **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.623* **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.624* **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 625 

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).626 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 634 

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.635El 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 636 

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.637Elige qué versión ejecutan tus sesiones y cuándo cambia:

526 638 

639* **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)640* **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 runners641* **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

642* **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 fijado643* **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 644 

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


580</h3>694</h3>

581 695 

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

698 * **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.699 * **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.700* **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.701* **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.721* **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.722* **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).723* **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.724* **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.

725* **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.726* **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.727* **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.728* **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 732 

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.733 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.734* **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.735* **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 736 

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.737 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 738 


637 753 

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.754* **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.755* **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.

756* **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 757 

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.758Configure 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 759 

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 

Details

638| [`claudeMdExcludes`](#claudemdexcludes) | Omite archivos [CLAUDE.md](/docs/es/memory#exclude-specific-claude-md-files) específicos cuando se carga la memoria | Memoria y contexto | Any file |638| [`claudeMdExcludes`](#claudemdexcludes) | Omite archivos [CLAUDE.md](/docs/es/memory#exclude-specific-claude-md-files) específicos cuando se carga la memoria | Memoria y contexto | Any file |

639| [`cleanupPeriodDays`](#cleanupperioddays) | Elige cuántos días conserva Claude Code las [transcripciones](/docs/es/data-usage#data-retention) antes de eliminarlas | Privacidad y telemetría | Any file |639| [`cleanupPeriodDays`](#cleanupperioddays) | Elige cuántos días conserva Claude Code las [transcripciones](/docs/es/data-usage#data-retention) antes de eliminarlas | Privacidad y telemetría | Any file |

640| [`companyAnnouncements`](#companyannouncements) | Muestra los anuncios de tu organización al iniciar | Interfaz y terminal | Any file |640| [`companyAnnouncements`](#companyannouncements) | Muestra los anuncios de tu organización al iniciar | Interfaz y terminal | Any file |

641| [`copyFullResponse`](#copyfullresponse) | Haz que [`/copy`](/docs/es/commands) copie la respuesta completa sin mostrar el selector de bloques de código | Configuración de configuración global | Global config |641| [`copyFullResponse`](#copyfullresponse) | Haz que [`/copy`](/docs/es/commands) copie la respuesta completa sin mostrar el selector | Configuración de configuración global | Global config |

642| [`copyOnSelect`](#copyonselect) | Desactiva la copia automática del texto que seleccionas con el mouse en el [renderizado de pantalla completa](/docs/es/fullscreen#use-the-mouse) y en la vista de agentes | Configuración de configuración global | Global config |642| [`copyOnSelect`](#copyonselect) | Desactiva la copia automática del texto que seleccionas con el mouse en el [renderizado de pantalla completa](/docs/es/fullscreen#use-the-mouse) y en la vista de agentes | Configuración de configuración global | Global config |

643| [`crossSessionInbound`](#crosssessioninbound) | Elige si Claude Code entrega los [mensajes de tus otras sesiones](/docs/es/cross-session-messaging#control-inbound-messages), muestra un aviso sin entregarlos o los rechaza | Agentes, sesiones y worktrees | Any file |643| [`crossSessionInbound`](#crosssessioninbound) | Elige si Claude Code entrega los [mensajes de tus otras sesiones](/docs/es/cross-session-messaging#control-inbound-messages), muestra un aviso sin entregarlos o los rechaza | Agentes, sesiones y worktrees | Any file |

644| [`defaultShell`](#defaultshell) | Elige si Bash o PowerShell ejecuta los comandos de shell que escribes con el [prefijo `!`](/docs/es/interactive-mode#shell-mode-with-prefix) | Interfaz y terminal | Any file |644| [`defaultShell`](#defaultshell) | Elige si Bash o PowerShell ejecuta los comandos de shell que escribes con el [prefijo `!`](/docs/es/interactive-mode#shell-mode-with-prefix) | Interfaz y terminal | Any file |


684| [`fileCheckpointingEnabled`](#filecheckpointingenabled) | Desactiva o activa las instantáneas de archivos que restaura [`/rewind`](/docs/es/checkpointing) | Memoria y contexto | Any file |684| [`fileCheckpointingEnabled`](#filecheckpointingenabled) | Desactiva o activa las instantáneas de archivos que restaura [`/rewind`](/docs/es/checkpointing) | Memoria y contexto | Any file |

685| [`fileSuggestion`](#filesuggestion) | Proporciona el [autocompletado de archivos `@`](/docs/es/interactive-mode#quick-commands) desde tu propio comando | Interfaz y terminal | Any file |685| [`fileSuggestion`](#filesuggestion) | Proporciona el [autocompletado de archivos `@`](/docs/es/interactive-mode#quick-commands) desde tu propio comando | Interfaz y terminal | Any file |

686| [`footerLinksRegexes`](#footerlinksregexes) | Convierte los ID de issues o revisiones de la salida en [enlaces en los que se puede hacer clic](/docs/es/statusline#clickable-links) debajo del cuadro de entrada | Interfaz y terminal | User or managed |686| [`footerLinksRegexes`](#footerlinksregexes) | Convierte los ID de issues o revisiones de la salida en [enlaces en los que se puede hacer clic](/docs/es/statusline#clickable-links) debajo del cuadro de entrada | Interfaz y terminal | User or managed |

687| [`forceLoginGatewayUrl`](#forcelogingatewayurl) | Establece la [URL del gateway](/docs/es/claude-apps-gateway#set-the-gateway-url) a la que se conecta la pantalla de inicio de sesión | Autenticación y proveedores | Managed |687| [`forceLoginGatewayUrl`](#forcelogingatewayurl) | Establece la [URL del gateway](/docs/es/claude-apps-gateway#set-the-gateway-url) a la que se conecta la pantalla de inicio de sesión | Autenticación y proveedores | User or managed |

688| [`forceLoginMethod`](#forceloginmethod) | [Restringe el inicio de sesión](/docs/es/authentication#restrict-login-to-your-organization) a claude.ai, Claude Console o un [gateway en la nube](/docs/es/claude-apps-gateway) | Autenticación y proveedores | Any file |688| [`forceLoginMethod`](#forceloginmethod) | [Restringe el inicio de sesión](/docs/es/authentication#restrict-login-to-your-organization) a claude.ai, Claude Console o un [gateway en la nube](/docs/es/claude-apps-gateway) | Autenticación y proveedores | Any file |

689| [`forceLoginOrgUUID`](#forceloginorguuid) | [Fija los inicios de sesión de claude.ai a tu organización](/docs/es/authentication#restrict-login-to-your-organization); solo una fuente administrada lo aplica | Autenticación y proveedores | Any file |689| [`forceLoginOrgUUID`](#forceloginorguuid) | [Fija los inicios de sesión de claude.ai a tu organización](/docs/es/authentication#restrict-login-to-your-organization); solo una fuente administrada lo aplica | Autenticación y proveedores | Any file |

690| [`forceRemoteSettingsRefresh`](#forceremotesettingsrefresh) | Bloquea el inicio hasta que la [configuración administrada por el servidor](/docs/es/server-managed-settings) se haya obtenido de nuevo | Configuración empresarial y administrada | Managed |690| [`forceRemoteSettingsRefresh`](#forceremotesettingsrefresh) | Bloquea el inicio hasta que la [configuración administrada por el servidor](/docs/es/server-managed-settings) se haya obtenido de nuevo | Configuración empresarial y administrada | Managed |


6085 6085 

6086Restringe el tipo de cuenta con el que las personas pueden iniciar sesión. Establece `"claudeai"` para permitir solo cuentas de claude.ai, `"console"` para permitir solo cuentas de Claude Console, o `"gateway"` para enviar a las personas a un [cloud gateway](/docs/es/claude-apps-gateway) en lugar de un inicio de sesión propio de Anthropic. Los administradores lo establecen en la configuración administrada y lo combinan con [`forceLoginOrgUUID`](#forceloginorguuid) para mantener los inicios de sesión de claude.ai de los desarrolladores dentro de una organización. Si lo estableces en `"claudeai"` o `"console"` en cualquier archivo de configuración, Claude Code también deja de ofrecer el [inicio de sesión en Console sin clave](/docs/es/authentication#sign-in-without-an-api-key) en las sesiones a las que se aplica ese archivo.6086Restringe el tipo de cuenta con el que las personas pueden iniciar sesión. Establece `"claudeai"` para permitir solo cuentas de claude.ai, `"console"` para permitir solo cuentas de Claude Console, o `"gateway"` para enviar a las personas a un [cloud gateway](/docs/es/claude-apps-gateway) en lugar de un inicio de sesión propio de Anthropic. Los administradores lo establecen en la configuración administrada y lo combinan con [`forceLoginOrgUUID`](#forceloginorguuid) para mantener los inicios de sesión de claude.ai de los desarrolladores dentro de una organización. Si lo estableces en `"claudeai"` o `"console"` en cualquier archivo de configuración, Claude Code también deja de ofrecer el [inicio de sesión en Console sin clave](/docs/es/authentication#sign-in-without-an-api-key) en las sesiones a las que se aplica ese archivo.

6087 6087 

6088* **Scope**: [`Any file`](#scopes). Claude Code respeta `"gateway"` solo desde una fuente administrada en la máquina: `managed-settings.json`, el plist de macOS o el registro HKLM de Windows, o un auxiliar de políticas. Trata `"gateway"` como sin establecer en la configuración de usuario, de proyecto, local, HKCU y administrada por servidor, la misma regla que [`forceLoginGatewayUrl`](#forcelogingatewayurl).6088* **Scope**: [`Any file`](#scopes). Claude Code respeta `"gateway"` desde las mismas fuentes que [`forceLoginGatewayUrl`](#forcelogingatewayurl) y lo trata como sin establecer en cualquier otro lugar.

6089* **Type**: string, uno de:6089* **Type**: string, uno de:

6090 * `"claudeai"`: solo las cuentas de claude.ai pueden iniciar sesión6090 * `"claudeai"`: solo las cuentas de claude.ai pueden iniciar sesión

6091 * `"console"`: solo las cuentas de Claude Console pueden iniciar sesión6091 * `"console"`: solo las cuentas de Claude Console pueden iniciar sesión


6108 6108 

6109Establece la URL del gateway a la que se conecta la pantalla Cloud gateway de `/login`, para que las personas lleguen a tu [cloud gateway](/docs/es/claude-apps-gateway) sin escribir su dirección. La pantalla no tiene un campo de URL: con esta clave establecida, muestra la URL de tu gateway y se conecta cuando la persona presiona Intro; sin ella, le indica que se comunique con su administrador de TI.6109Establece la URL del gateway a la que se conecta la pantalla Cloud gateway de `/login`, para que las personas lleguen a tu [cloud gateway](/docs/es/claude-apps-gateway) sin escribir su dirección. La pantalla no tiene un campo de URL: con esta clave establecida, muestra la URL de tu gateway y se conecta cuando la persona presiona Intro; sin ella, le indica que se comunique con su administrador de TI.

6110 6110 

6111Esta clave o `forceLoginMethod: "gateway"` hace que la máquina sea solo de gateway, excepto para las sesiones que seleccionen un proveedor en la nube con `CLAUDE_CODE_USE_*`. `/login` entonces se abre en la pantalla Cloud gateway sin selector de método de inicio de sesión. Consulta [La política del administrador requiere un inicio de sesión en Cloud gateway](/docs/es/errors#administrator-policy-requires-a-cloud-gateway-sign-in) para ver qué sucede con un inicio de sesión propio de Anthropic que haya quedado o con una clave de API. Establece ambas claves para que la pantalla se conecte en lugar de mostrar un error.6111En la configuración administrada, esta clave o `forceLoginMethod: "gateway"` hace que la máquina sea solo de gateway, excepto para las sesiones que seleccionen un proveedor en la nube con `CLAUDE_CODE_USE_*`. `/login` entonces se abre en la pantalla Cloud gateway sin selector de método de inicio de sesión. Consulta [La política del administrador requiere un inicio de sesión en Cloud gateway](/docs/es/errors#administrator-policy-requires-a-cloud-gateway-sign-in) para ver qué sucede con un inicio de sesión propio de Anthropic que haya quedado o con una clave de API. Establece ambas claves para que la pantalla se conecte en lugar de mostrar un error.

6112 6112 

6113* **Scope**: [`Managed`](#scopes). Se lee solo desde una fuente en la máquina: `managed-settings.json`, el plist de macOS o el registro HKLM de Windows, o un auxiliar de políticas. Claude Code lo ignora en la configuración HKCU y en la administrada por servidor.6113* **Scope**: [`User or managed`](#scopes). Se lee desde una fuente administrada en la máquina: `managed-settings.json`, el plist de macOS o el registro HKLM de Windows, o un auxiliar de políticas. En una máquina sin ninguna de ellas, Claude Code v2.1.295 o posterior también lo lee desde la [configuración de usuario](/docs/es/claude-apps-gateway#set-the-gateway-url-in-user-settings). Claude Code lo ignora en la configuración HKCU y en la administrada por servidor.

6114* **Type**: string, una URL completa que incluya el esquema6114* **Type**: string, una URL completa que incluya el esquema

6115* **Default**: sin establecer, por lo que la pantalla Cloud gateway muestra un error que indica a las personas que se comuniquen con su administrador de TI6115* **Default**: sin establecer, por lo que la pantalla Cloud gateway muestra un error que indica a las personas que se comuniquen con su administrador de TI

6116 6116 


6806 `copyFullResponse`6806 `copyFullResponse`

6807</h3>6807</h3>

6808 6808 

6809Haga que [`/copy`](/docs/es/commands) copie la respuesta completa cada vez, sin el selector que de otro modo muestra cuando la respuesta contiene bloques de código. Seleccionar **Siempre copiar respuesta completa** en ese selector establece esta clave en `true`. Aparece en `/config` como **Omitir el selector /copy**.6809Haz que [`/copy`](/docs/es/commands) copie la respuesta completa cada vez, sin mostrar el selector. Seleccionar **Siempre copiar respuesta completa** en ese selector establece esta clave en `true`. Aparece en `/config` como **Omitir el selector /copy**.

6810 6810 

6811* **Alcance**: [`Configuración global`](#scopes)6811* **Alcance**: [`Configuración global`](#scopes)

6812* **Tipo**: Booleano6812* **Tipo**: Booleano

6813 * `true`: `/copy` copia la respuesta completa sin mostrar el selector6813 * `true`: `/copy` copia la respuesta completa sin mostrar el selector

6814 * `false`: cuando la respuesta contiene bloques de código, `/copy` muestra un selector donde elige un bloque de código o la respuesta completa6814 * `false`: cuando la respuesta contiene bloques de código o citas en bloque, `/copy` muestra un selector donde eliges un bloque o la respuesta completa

6815* **Predeterminado**: `false`6815* **Predeterminado**: `false`

6816 6816 

6817```json ~/.claude.json theme={null}6817```json ~/.claude.json theme={null}


6903Con esta opción activada, el búfer que Claude Code abre se ve así, y solo el texto debajo de la línea del marcador se envía como su mensaje:6903Con esta opción activada, el búfer que Claude Code abre se ve así, y solo el texto debajo de la línea del marcador se envía como su mensaje:

6904 6904 

6905```text theme={null}6905```text theme={null}

6906# ─── Última respuesta de Claude (para referencia; eliminada al guardar) ───6906# ─── Claude's last response (for reference; removed on save) ───

6907# Agregué el bucle de reintentos a fetchUser en src/api.ts y una prueba6907# I added the retry loop to fetchUser in src/api.ts and a test

6908# para el caso de tiempo de espera. ¿Quiere que conecte el mismo reintento en6908# for the timeout case. Want me to wire the same retry into

6909# fetchOrders?6909# fetchOrders?

6910# ─── Escriba su respuesta debajo de esta línea ──────────────────────────6910# ─── Write your reply below this line ──────────────────────────

6911 6911 

6912Sí, y límitelo a tres intentos.6912Yes, and cap it at three attempts.

6913```6913```

6914 6914 

6915Claude Code mantiene las últimas 50 líneas de la respuesta y marca el corte con `# … (salida anterior truncada)`.6915Claude Code mantiene las últimas 50 líneas de la respuesta y marca el corte con `# … (earlier output truncated)`.

6916 6916 

6917Claude Code ignora esta clave en `settings.json`.6917Claude Code ignora esta clave en `settings.json`.

6918 6918 

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

Details

122}122}

123```123```

124 124 

125<h2 id="see-session-status-in-your-terminal">

126 Ver el estado de la sesión en tu terminal

127</h2>

128 

129Si tu terminal implementa el OSC 7501 Program Status Protocol, puede mostrar si cada sesión interactiva de Claude Code está trabajando, esperándote o terminada, lo que ayuda cuando ejecutas tareas largas o varias sesiones a la vez. No hay nada que activar en Claude Code. Para saber si tu terminal implementa el protocolo y dónde muestra el estado, consulta su documentación.

130 

131Si la terminal sí implementa el protocolo y no ves ningún estado para una sesión, revisa cada una de estas causas:

132 

133* **Versión de Claude Code**: el reporte de estado requiere Claude Code v2.1.295 o posterior. Ejecuta `claude --version` en tu shell para comprobarlo.

134* **tmux**: dentro de tmux, Claude Code comprueba la compatibilidad en tmux en lugar de en tu terminal, y [`allow-passthrough`](#configure-tmux) no tiene efecto en eso. Inicia la sesión fuera de tmux.

135* **Sesión en segundo plano**: una [sesión en segundo plano](/docs/es/agent-view) no reporta su estado a tu terminal, incluso mientras estás conectado a ella. La vista de agentes muestra su estado en su lugar.

136* **[`CLAUDE_CODE_DISABLE_TERMINAL_TITLE`](/docs/es/env-vars#variables)**: si estableces esta variable en `1`, Claude Code no comprueba la compatibilidad ni reporta el estado. Elimínala.

137 

125<h2 id="configure-tmux">138<h2 id="configure-tmux">

126 Configurar tmux139 Configurar tmux

127</h2>140</h2>

tools-reference.md +27 −10

Details

279 279 

280La herramienta Edit realiza reemplazo exacto de cadenas. Toma un `old_string` y un `new_string` y reemplaza el primero con el segundo. No utiliza expresiones regulares ni coincidencia aproximada.280La herramienta Edit realiza reemplazo exacto de cadenas. Toma un `old_string` y un `new_string` y reemplaza el primero con el segundo. No utiliza expresiones regulares ni coincidencia aproximada.

281 281 

282Deben pasar tres comprobaciones para que se aplique una edición. Antes de cualquiera de ellas, se rechaza una ruta coincidente con una [regla de denegación `Read`](/docs/es/permissions#tool-specific-permission-rules), incluida la creación de un archivo nuevo allí. El rechazo requiere Claude Code v2.1.208 o posterior.282Estas comprobaciones deben pasar para que se aplique una edición. Antes de cualquiera de ellas, se rechaza una ruta coincidente con una [regla de denegación `Read`](/docs/es/permissions#tool-specific-permission-rules), incluida la creación de un archivo nuevo allí. El rechazo requiere Claude Code v2.1.208 o posterior.

283 283 

284* **Read-before-edit**: Claude lee el archivo en la conversación actual antes de editarlo, y una lectura interrumpida con un aviso [`PARTIAL view`](#read-tool-behavior) no cuenta. Claude Opus 4.6, Claude Haiku 4.5 y modelos más antiguos siempre requieren la lectura. Los modelos más nuevos pueden editar un archivo no leído cuando leerlo no requeriría un aviso de permiso y la herramienta Read está disponible.284* **Read-before-edit**: Claude lee el archivo en la conversación actual antes de editarlo, y una lectura interrumpida con un aviso [`PARTIAL view`](#large-files) no cuenta. Claude Opus 4.6, Claude Haiku 4.5 y modelos más antiguos siempre requieren la lectura. Los modelos más nuevos pueden editar un archivo no leído cuando leerlo no requeriría una solicitud de permiso y la herramienta Read está disponible.

285* **Match**: `old_string` debe aparecer en el archivo exactamente como está escrito. Una sola diferencia de carácter de espacio en blanco o indentación es suficiente para no coincidir.285* **Match**: `old_string` debe aparecer en el archivo exactamente como está escrito. Una sola diferencia de carácter de espacio en blanco o indentación es suficiente para no coincidir.

286* **Uniqueness**: `old_string` debe aparecer exactamente una vez. Cuando aparece más de una vez, Claude proporciona una cadena más larga con suficiente contexto circundante para identificar una ocurrencia, o establece `replace_all: true` para reemplazarlas todas.286* **Uniqueness**: `old_string` debe aparecer exactamente una vez. Cuando aparece más de una vez, Claude proporciona una cadena más larga con suficiente contexto circundante para identificar una ocurrencia, o establece `replace_all: true` para reemplazarlas todas.

287 287 

288Un archivo que cambió en el disco después de que Claude lo leyó por última vez aún puede editarse cuando `old_string` coincide exactamente con el contenido actual de forma inequívoca y Claude Code puede leer el archivo sin solicitar permiso. La coincidencia con el contenido actual del archivo mantiene esto seguro, y el resultado indica que el archivo contiene otros cambios para que Claude lo vuelva a leer antes de ediciones que dependan del contenido circundante. En cualquier otro caso, como un `old_string` obsoleto o uno que coincida más de una vez sin `replace_all`, Claude lee el archivo nuevamente antes de editar. El manejo relajado de archivos no leídos y modificados requiere Claude Code v2.1.208 o posterior; antes de eso, Claude Code rechazaba cualquier edición a un archivo que no hubiera leído en la conversación o que hubiera cambiado en el disco después de la lectura.288Un archivo que cambió en el disco después de que Claude lo leyó por última vez aún puede editarse cuando `old_string` coincide exactamente con el contenido actual de forma inequívoca y Claude Code puede leer el archivo sin solicitar permiso. La coincidencia con el contenido actual del archivo mantiene esto seguro, y el resultado indica que el archivo contiene otros cambios para que Claude lo vuelva a leer antes de ediciones que dependan del contenido circundante. En cualquier otro caso, como un `old_string` obsoleto o uno que coincida más de una vez sin `replace_all`, Claude lee el archivo nuevamente antes de editar. El manejo relajado de archivos no leídos y modificados requiere Claude Code v2.1.208 o posterior; antes de eso, Claude Code rechazaba cualquier edición a un archivo que no hubiera leído en la conversación o que hubiera cambiado en el disco después de la lectura.

289 289 

290Ver un archivo con Bash también satisface el requisito de read-before-edit cuando el comando es `cat`, `nl`, `bat`, `batcat`, `head`, `tail`, `sed -n 'X,Yp'`, `grep`, `egrep`, `fgrep`, o `rg` en un único archivo sin tuberías o redirecciones. La salida canalizada y otros comandos Bash no cuentan hacia la comprobación de read-before-edit.290Ver un archivo con Bash también satisface el requisito de read-before-edit cuando el comando es `cat`, `nl`, `bat`, `batcat`, `head`, `tail`, `sed -n 'X,Yp'`, `grep`, `egrep`, `fgrep`, o `rg` en un único archivo sin tuberías o redirecciones. Una búsqueda que no encuentra coincidencias deja el archivo sin leer. La salida canalizada y otros comandos Bash no cuentan hacia la comprobación de read-before-edit.

291 291 

292Cuando Claude ve un archivo de esta manera, Claude Code también carga cualquier [`CLAUDE.md` de subdirectorio](/docs/es/memory#how-claude-md-files-load) y las [reglas con alcance de ruta](/docs/es/memory#path-specific-rules) que se apliquen a ese archivo. Consulta [Reglas de permisos Read y Edit](/docs/es/permissions#read-and-edit) para saber qué comandos Bash cubren tus reglas de denegación `Read` y `Edit`.292Cuando Claude ve un archivo de esta manera, Claude Code también carga cualquier [`CLAUDE.md` de subdirectorio](/docs/es/memory#how-claude-md-files-load) y las [reglas con alcance de ruta](/docs/es/memory#path-specific-rules) que se apliquen a ese archivo. Consulta [Reglas de permisos Read y Edit](/docs/es/permissions#read-and-edit) para saber qué comandos Bash cubren tus reglas de denegación `Read` y `Edit`.

293 293 

294<h3 id="non-utf-8-files">

295 Archivos que no son UTF-8

296</h3>

297 

298Edit y [NotebookEdit](#notebookedit-tool-behavior) se niegan a modificar un archivo cuyos bytes no se decodifican como UTF-8, y no escriben nada, porque guardarlo de nuevo como UTF-8 convertiría cada byte que no pudieron decodificar en el carácter de reemplazo `U+FFFD`. Eso abarca, por ejemplo, un archivo con texto no ASCII en una codificación heredada como Windows-1252 o Shift-JIS, un archivo binario y un archivo UTF-8 con una secuencia de bytes no válida. El [error que recibe Claude](/docs/es/errors#file-is-not-valid-utf-8) le indica que realice el cambio con un comando de shell que lea y escriba el archivo en su propia codificación, o que te pregunte si debe convertir primero el archivo a UTF-8. Edit lee como UTF-16 un archivo que comienza con una marca de orden de bytes UTF-16 little-endian, de modo que ese archivo sigue siendo editable.

299 

300Write no comparte este rechazo. En un archivo que Edit rechazaría, Write reemplaza todo el archivo con el contenido nuevo y lo guarda como UTF-8, por lo que se pierde la codificación original del archivo. Write se niega, y no escribe nada, cuando el archivo en el disco no se decodifica y el contenido nuevo contiene `U+FFFD`, el carácter que Read muestra para los bytes que no puede decodificar.

301 

294<h2 id="endconversation-tool-behavior">302<h2 id="endconversation-tool-behavior">

295 Comportamiento de la herramienta EndConversation303 Comportamiento de la herramienta EndConversation

296</h2>304</h2>


455* `insert`: agrega una nueva celda después de la objetivo. Sin `cell_id`, la nueva celda va al inicio del cuaderno. Requiere `cell_type` establecido a `code` o `markdown`.463* `insert`: agrega una nueva celda después de la objetivo. Sin `cell_id`, la nueva celda va al inicio del cuaderno. Requiere `cell_type` establecido a `code` o `markdown`.

456* `delete`: elimina la celda objetivo.464* `delete`: elimina la celda objetivo.

457 465 

466NotebookEdit rechaza un archivo de cuaderno que no se decodifica como UTF-8, según la [misma regla que Edit](#non-utf-8-files), y no escribe nada.

467 

458Las reglas de permisos utilizan el formato de ruta `Edit(...)`. Una regla como `Edit(notebooks/**)` cubre llamadas de NotebookEdit en archivos en ese directorio.468Las reglas de permisos utilizan el formato de ruta `Edit(...)`. Una regla como `Edit(notebooks/**)` cubre llamadas de NotebookEdit en archivos en ese directorio.

459 469 

460<h2 id="powershell-tool">470<h2 id="powershell-tool">


547 557 

548La herramienta Read toma una ruta de archivo y devuelve el contenido con números de línea. Claude recibe instrucciones para pasar siempre rutas absolutas.558La herramienta Read toma una ruta de archivo y devuelve el contenido con números de línea. Claude recibe instrucciones para pasar siempre rutas absolutas.

549 559 

550De forma predeterminada, Read devuelve el archivo desde el inicio. Cuando una lectura de archivo completo excede el límite de tokens, Read devuelve la primera página con un aviso de `PARTIAL view` que le indica a Claude cuánto del archivo recibió y cómo leer más con `offset` y `limit`. Una lectura que pasa un `offset` o `limit` explícito y aún así excede el límite de tokens devuelve un error.

551 

552Una lectura con un `limit` explícito se detiene tan pronto como las líneas seleccionadas excedan lo que el límite de tokens podría caber y devuelve un error sin cargar el resto del rango. El error le indica a Claude que use un `limit` más pequeño, o que busque contenido específico con [Grep](#grep-tool-behavior) en su lugar cuando una sola línea sea tan grande. Antes de v2.1.208, Claude Code cargaba todo el rango en memoria antes de rechazarlo, por lo que leer un archivo con una sola línea extremadamente larga podría agotar la memoria.

553 

554Leer un archivo vacío devuelve un aviso de que el archivo existe pero su contenido está vacío, y un `offset` más allá de la última línea devuelve un aviso que proporciona el recuento de líneas del archivo. Antes de v2.1.208, leer un archivo vacío devolvía el aviso de fin de archivo en su lugar.560Leer un archivo vacío devuelve un aviso de que el archivo existe pero su contenido está vacío, y un `offset` más allá de la última línea devuelve un aviso que proporciona el recuento de líneas del archivo. Antes de v2.1.208, leer un archivo vacío devolvía el aviso de fin de archivo en su lugar.

555 561 

556Read maneja varios tipos de archivo más allá del texto sin formato:562Read maneja varios tipos de archivo más allá del texto sin formato:

557 563 

558* **Imágenes**: PNG, JPG y otros formatos de imagen se devuelven como contenido visual que Claude puede ver, no como bytes sin procesar. Claude Code redimensiona y recomprime imágenes grandes para que se ajusten a los límites de tamaño de imagen del modelo antes de enviarlas, por lo que Claude puede ver una versión reducida de una captura de pantalla grande. Una imagen que sigue siendo más grande que 500KB después de ese redimensionamiento se recodifica como JPEG con calidad reducida con sus dimensiones de píxeles sin cambios. Si Claude pierde detalles a nivel de píxel fino en una imagen grande, pídele que primero recorte la región de interés, por ejemplo con ImageMagick a través de Bash.564* **Imágenes**: PNG, JPG y otros formatos de imagen se devuelven como contenido visual que Claude puede ver, no como bytes sin procesar. Claude Code redimensiona y recomprime imágenes grandes para que se ajusten a los límites de tamaño de imagen del modelo antes de enviarlas, por lo que Claude puede ver una versión reducida de una captura de pantalla grande. Una imagen que sigue siendo más grande que 500KB después de ese redimensionamiento se recodifica como JPEG con calidad reducida con sus dimensiones de píxeles sin cambios. Si Claude pierde detalles a nivel de píxel fino en una imagen grande, pídele que primero recorte la región de interés, por ejemplo con ImageMagick a través de Bash.

559* **PDFs**: Claude lee archivos `.pdf` cortos completos. Para PDFs más largos que 10 páginas, lee en rangos con un parámetro `pages`, como `"1-5"`, hasta 20 páginas a la vez. Las lecturas de rango de páginas renderizan páginas con `pdftoppm` de poppler-utils, así que instálelo con `brew install poppler` en macOS o `apt-get install poppler-utils` en Debian y Ubuntu. En Windows y otras plataformas, instale una compilación de poppler que ponga `pdftoppm` en su `PATH`. Sin él, una lectura de rango de páginas falla con `pdftoppm is not installed`.565* **PDFs**: Claude lee archivos `.pdf` cortos completos. Para PDFs más largos que 10 páginas, lee en rangos con un parámetro `pages`, como `"1-5"`, hasta 20 páginas a la vez. Las lecturas de rango de páginas renderizan páginas con `pdftoppm` de poppler-utils, así que instálelo con `brew install poppler` en macOS o `apt-get install poppler-utils` en Debian y Ubuntu. En Windows y otras plataformas, instale una compilación de poppler que ponga `pdftoppm` en su `PATH`. Sin él, una lectura de rango de páginas falla con `pdftoppm is not installed`.

560* **Cuadernos Jupyter**: Los archivos `.ipynb` devuelven todas las celdas con sus salidas, incluido código, markdown y visualizaciones. Claude Code se niega a leer un archivo de cuaderno de más de 100 MB; el error le indica a Claude cómo leer una porción del cuaderno en su lugar, como un segmento de celdas, con un comando de shell.566* **Cuadernos Jupyter**: Los archivos `.ipynb` devuelven todas las celdas con sus salidas, incluido código, markdown y visualizaciones. Un cuaderno cuyas celdas suman más de 256 KB, o más del [límite de tokens](#large-files), devuelve un error en su lugar. Claude Code se niega a leer un archivo de cuaderno de más de 100 MB; el error le indica a Claude cómo leer una porción del cuaderno en su lugar, como un segmento de celdas, con un comando de shell.

561 567 

562Read solo lee archivos, no directorios. Claude enumera el contenido del directorio con un comando de shell como `ls`.568Read solo lee archivos, no directorios. Claude enumera el contenido del directorio con un comando de shell como `ls`.

563 569 

570<h3 id="large-files">

571 Archivos grandes

572</h3>

573 

574Claude puede leer un archivo de texto más grande de lo que devuelve una sola llamada a Read. De forma predeterminada, una llamada devuelve como máximo 25,000 tokens, o el valor que establezcas en [`CLAUDE_CODE_FILE_READ_MAX_OUTPUT_TOKENS`](/docs/es/env-vars), y rechaza un archivo completo de más de 256 KB, por lo que Claude lee un archivo más grande por páginas con `offset` y `limit`. En Claude Code v2.1.296 o posterior, en su lugar puede leer el archivo completo, o un rango de líneas largo, en una sola llamada estableciendo `allow_large: true` cuando lo necesite, por ejemplo porque pediste el archivo completo. Esa lectura se dimensiona según el espacio que queda en la [ventana de contexto](/docs/es/context-window) de la sesión en lugar de los límites predeterminados. Las imágenes, los PDFs y los cuadernos mantienen sus límites.

575 

576Lo que Claude recibe cuando una lectura supera los límites predeterminados:

577 

578* **Archivo completo que supera el límite de tokens**: la primera página del archivo, con un aviso de `PARTIAL view` que indica cuánto del archivo recibió y cómo leer más con `offset` y `limit`

579* **Archivo completo de más de 256 KB, o una lectura con `offset` o `limit` que supera el límite de tokens**: un error que le indica que lea una porción con `offset` y `limit`, o que busque contenido específico con [Grep](#grep-tool-behavior) en su lugar

580 

564<h2 id="sendfeedback-tool-behavior">581<h2 id="sendfeedback-tool-behavior">

565 Comportamiento de la herramienta SendFeedback582 Comportamiento de la herramienta SendFeedback

566</h2>583</h2>


734 Comportamiento de la herramienta Write751 Comportamiento de la herramienta Write

735</h2>752</h2>

736 753 

737La herramienta Write crea un archivo nuevo o sobrescribe uno existente con el contenido completo proporcionado. No añade ni fusiona.754La herramienta Write crea un archivo nuevo o sobrescribe uno existente con el contenido completo proporcionado. No añade ni fusiona. Write también sobrescribe un archivo existente cuyos bytes no se pueden decodificar y guarda el nuevo contenido como UTF-8, como se describe en [archivos que no son UTF-8](#non-utf-8-files).

738 755 

739Si Claude debe leer un archivo existente en la conversación actual antes de sobrescribirlo depende del modelo y del archivo:756Si Claude debe leer un archivo existente en la conversación actual antes de sobrescribirlo depende del modelo y del archivo:

740 757 

741* Claude Opus 4.6, Claude Haiku 4.5 y modelos más antiguos siempre requieren la lectura, por lo que una operación Write en un archivo existente no leído falla con un error.758* Claude Opus 4.6, Claude Haiku 4.5 y modelos más antiguos siempre requieren la lectura, por lo que una operación Write en un archivo existente no leído falla con un error.

742* Los modelos más nuevos pueden sobrescribir un archivo que nunca leyeron en esta sesión bajo las mismas condiciones que [read-before-edit](#edit-tool-behavior): leerlo no necesitaría un aviso de permiso y la herramienta Read está disponible.759* Los modelos más nuevos pueden sobrescribir un archivo que nunca leyeron en esta sesión bajo las mismas condiciones que [read-before-edit](#edit-tool-behavior): leerlo no necesitaría un aviso de permiso y la herramienta Read está disponible.

743* Los notebooks de Jupyter y los archivos que Claude ha leído solo parcialmente con un aviso [`PARTIAL view`](#read-tool-behavior) requieren la lectura en todos los modelos.760* Los notebooks de Jupyter y los archivos que Claude ha leído solo parcialmente con un [aviso `PARTIAL view`](#large-files) requieren la lectura en todos los modelos.

744 761 

745Esta restricción no se aplica a archivos nuevos. Antes de v2.1.228, todos los modelos requerían la lectura antes de sobrescribir un archivo existente.762Esta restricción no se aplica a archivos nuevos. Antes de v2.1.228, todos los modelos requerían la lectura antes de sobrescribir un archivo existente.

746 763 

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