SpyBara
Go Premium

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

19 files changed +466 −118. View all changes and history on the product overview
2026
Sat 10 02: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 

125Sans les messages partiels activés, vous recevez tous les types de messages sauf `StreamEvent`. Les types courants incluent `SystemMessage` (initialisation de session), `AssistantMessage` (blocs de contenu complets), `ResultMessage` (résultat final), et un message de limite compact indiquant quand l'historique de conversation a été compacté (`SDKCompactBoundaryMessage` en TypeScript ; `SystemMessage` avec le sous-type `"compact_boundary"` en Python).125Sans les messages partiels activés, vous recevez tous les types de messages sauf `StreamEvent`. Les types courants incluent `SystemMessage` (initialisation de session), `AssistantMessage` (blocs de contenu complets), `ResultMessage` (résultat final), et un message de limite compact indiquant quand l'historique de conversation a été compacté (`SDKCompactBoundaryMessage` en TypeScript ; `SystemMessage` avec le sous-type `"compact_boundary"` en Python).

126 126 

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

128 Gérer un flux interrompu

129</h3>

130 

131Si un flux est interrompu au milieu d'un message, par exemple lorsque vous interrompez le tour ou que la connexion est coupée, vous recevez tout de même le `message_stop` de ce message avant la fin du tour. Un bloc de texte ou de réflexion interrompu reçoit également son `content_block_stop`. Ce n'est pas le cas d'un appel d'outil interrompu : si `message_stop` arrive alors que le bloc d'un appel d'outil est encore ouvert, considérez l'entrée de cet appel comme incomplète.

132 

133Avant Claude Code v2.1.290, un flux interrompu pouvait terminer le tour sans `message_stop`, de sorte qu'une réponse que vous affichez à partir des événements du flux pouvait rester affichée comme en cours. Le SDK Agent TypeScript intègre Claude Code v2.1.290 ou ultérieur à partir de la v0.3.290, et le SDK Agent Python à partir de la v0.2.164. Si une réponse reste affichée comme en cours après la fin du tour, mettez à jour le SDK.

134 

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

128 Diffuser les appels d'outils136 Diffuser les appels d'outils

129</h2>137</h2>

Details

1588 1588 

1589Associez les messages d'un sous-agent à ses événements de tâche via `agent_id` plutôt qu'en appariant le `parent_tool_use_id` d'un message au `tool_use_id` d'un événement de tâche. Lorsqu'un appel d'outil reprend le sous-agent, les événements de tâche portent le `tool_use_id` de cet appel, tandis que les messages conservent le `parent_tool_use_id` de l'appel d'outil qui a démarré le sous-agent à l'origine, de sorte que les deux ne correspondent plus.1589Associez les messages d'un sous-agent à ses événements de tâche via `agent_id` plutôt qu'en appariant le `parent_tool_use_id` d'un message au `tool_use_id` d'un événement de tâche. Lorsqu'un appel d'outil reprend le sous-agent, les événements de tâche portent le `tool_use_id` de cet appel, tandis que les messages conservent le `parent_tool_use_id` de l'appel d'outil qui a démarré le sous-agent à l'origine, de sorte que les deux ne correspondent plus.

1590 1590 

1591Claude Code définit `user_message_uuid` et `user_message_uuids` sur le premier message de l'assistant du tour, selon les conditions dans [`user_message_uuid`](#user_message_uuid). Quand Claude Code réexécute un tour qu'un redémarrage a interrompu, les messages d'assistant de la réexécution qui portent ces champs portent aussi [`resume_reason`](#resume_reason).1591Claude Code définit `user_message_uuid` et `user_message_uuids` sur le premier message de l'assistant du tour, dans les conditions décrites dans [`user_message_uuid`](#user_message_uuid). Lorsque le tour poursuit un tour qu'un redémarrage a interrompu, les messages de l'assistant qui portent ces champs portent également [`resume_reason`](#resume_reason).

1592 1592 

1593`timestamp` est l'heure ISO 8601 à laquelle le contenu du message a fini de générer sur le processus qui l'a produit. La valeur provient de l'horloge de cette machine, donc utilisez-la uniquement pour l'affichage et ne triez pas les messages par elle. Un tour API peut produire plusieurs messages d'assistant qui partagent un `message.id`, chacun avec son propre `timestamp`. Quand le champ est absent, revenez à l'heure à laquelle vous avez reçu le message.1593`timestamp` est l'heure ISO 8601 à laquelle le contenu du message a fini de générer sur le processus qui l'a produit. La valeur provient de l'horloge de cette machine, donc utilisez-la uniquement pour l'affichage et ne triez pas les messages par elle. Un tour API peut produire plusieurs messages d'assistant qui partagent un `message.id`, chacun avec son propre `timestamp`. Quand le champ est absent, revenez à l'heure à laquelle vous avez reçu le message.

1594 1594 


1631 1631 

1632Définissez `inline_pastes` pour indiquer à Claude Code quelles parties de `message.content` l'utilisateur a collées plutôt que tapées, avec une chaîne par collage. Le texte du prompt reste là où l'utilisateur l'a placé. Claude Code peut encadrer chaque collage listé de balises `<pasted_content>` à l'endroit où il se trouve, afin que Claude puisse distinguer le contenu collé des propres mots de l'utilisateur. Seuls les collages situés dans le dernier bloc de texte du prompt sont encadrés. Nécessite TypeScript Agent SDK v0.3.280 ou version ultérieure.1632Définissez `inline_pastes` pour indiquer à Claude Code quelles parties de `message.content` l'utilisateur a collées plutôt que tapées, avec une chaîne par collage. Le texte du prompt reste là où l'utilisateur l'a placé. Claude Code peut encadrer chaque collage listé de balises `<pasted_content>` à l'endroit où il se trouve, afin que Claude puisse distinguer le contenu collé des propres mots de l'utilisateur. Seuls les collages situés dans le dernier bloc de texte du prompt sont encadrés. Nécessite TypeScript Agent SDK v0.3.280 ou version ultérieure.

1633 1633 

1634Chaque champ de collage a une limite de taille :

1635 

1636* `pasted_content` : si les entrées et les blocs de contenu qu'elles contiennent dépassent 1 000 au total, Claude Code ignore l'ensemble du champ.

1637* `inline_pastes` : Claude Code utilise les 100 premières entrées non vides et ignore le reste.

1638 

1634Définissez `shouldQuery`, `client_composed` ou `priority` pour modifier la façon dont Claude Code traite un message que vous envoyez :1639Définissez `shouldQuery`, `client_composed` ou `priority` pour modifier la façon dont Claude Code traite un message que vous envoyez :

1635 1640 

1636* `shouldQuery` : définissez-le à `false` pour ajouter le message à la transcription sans déclencher un tour d'assistant. Le message est conservé et fusionné dans le prochain message utilisateur qui déclenche un tour. Utilisez ceci pour injecter du contexte, comme la sortie d'une commande que vous avez exécutée hors bande, sans dépenser un appel de modèle pour cela.1641* `shouldQuery` : définissez-le à `false` pour ajouter le message à la transcription sans déclencher un tour d'assistant. Le message est conservé et fusionné dans le prochain message utilisateur qui déclenche un tour. Utilisez ceci pour injecter du contexte, comme la sortie d'une commande que vous avez exécutée hors bande, sans dépenser un appel de modèle pour cela.


1775* `ttft_stream_ms` : temps en millisecondes jusqu'au premier événement de flux `message_start`, quand le flux de réponse s'ouvre. Inférieur à `ttft_ms` ; l'écart entre les deux est le temps passé à diffuser en streaming le premier message. Présent sur le bras de succès uniquement.1780* `ttft_stream_ms` : temps en millisecondes jusqu'au premier événement de flux `message_start`, quand le flux de réponse s'ouvre. Inférieur à `ttft_ms` ; l'écart entre les deux est le temps passé à diffuser en streaming le premier message. Présent sur le bras de succès uniquement.

1776* `user_message_uuid` : l'`uuid` du message que vous avez envoyé auquel ce tour a répondu. Voir [`user_message_uuid`](#user_message_uuid) pour savoir quels résultats le portent.1781* `user_message_uuid` : l'`uuid` du message que vous avez envoyé auquel ce tour a répondu. Voir [`user_message_uuid`](#user_message_uuid) pour savoir quels résultats le portent.

1777* `user_message_uuids` : les `uuid`s de chaque message que vous avez envoyé auquel Claude Code a répondu dans ce tour. Voir [`user_message_uuids`](#user_message_uuids).1782* `user_message_uuids` : les `uuid`s de chaque message que vous avez envoyé auquel Claude Code a répondu dans ce tour. Voir [`user_message_uuids`](#user_message_uuids).

1778* `resume_reason` : la raison pour laquelle Claude Code a réexécuté ce tour après qu'un redémarrage l'a interrompu. Présent sur les deux branches. Consultez [`resume_reason`](#resume_reason).1783* `resume_reason` : la raison pour laquelle ce tour poursuit un tour qu'un redémarrage a interrompu. Présent dans les deux branches. Consultez [`resume_reason`](#resume_reason).

1779* `local_command` : le nom de la commande que le tour a envoyée, sur le résultat de succès d'un tour qu'une commande a complété sans entrer dans la boucle d'agent, comme `/compact`. Le nom est converti en lettres minuscules et traits de soulignement, donc `/reload-plugins` rapporte `reload_plugins`. Une commande qu'un serveur MCP fournit, et le `/mcp` intégré, rapportent `mcp`. Une commande que vous avez définie vous-même rapporte `custom`. Les arguments ne sont jamais inclus. Absent sur chaque tour qui est entré dans la boucle d'agent et sur les envois qui n'ont exécuté aucune commande. Nécessite Agent SDK v0.3.268 ou ultérieur.1784* `local_command` : le nom de la commande que le tour a envoyée, sur le résultat de succès d'un tour qu'une commande a complété sans entrer dans la boucle d'agent, comme `/compact`. Le nom est converti en lettres minuscules et traits de soulignement, donc `/reload-plugins` rapporte `reload_plugins`. Une commande qu'un serveur MCP fournit, et le `/mcp` intégré, rapportent `mcp`. Une commande que vous avez définie vous-même rapporte `custom`. Les arguments ne sont jamais inclus. Absent sur chaque tour qui est entré dans la boucle d'agent et sur les envois qui n'ont exécuté aucune commande. Nécessite Agent SDK v0.3.268 ou ultérieur.

1780* `request_sent_wall_ms` : millisecondes d'époque auxquelles Claude Code a envoyé la requête API, pour les jointures avec les horodatages côté serveur. Présent uniquement avec [`user_message_uuid`](#user_message_uuid), sur un résultat de succès avec `is_error` false dont le tour a envoyé une requête API.1785* `request_sent_wall_ms` : millisecondes d'époque auxquelles Claude Code a envoyé la requête API, pour les jointures avec les horodatages côté serveur. Présent uniquement avec [`user_message_uuid`](#user_message_uuid), sur un résultat de succès avec `is_error` false dont le tour a envoyé une requête API.

1781* `first_content_frame_ms` : temps en millisecondes jusqu'au premier événement de flux `content_block_start` ou `content_block_delta`, en comptant les blocs de réflexion comme du contenu. Présent sur le bras de succès uniquement, quand `is_error` est false. Nécessite Agent SDK v0.3.260 ou ultérieur.1786* `first_content_frame_ms` : temps en millisecondes jusqu'au premier événement de flux `content_block_start` ou `content_block_delta`, en comptant les blocs de réflexion comme du contenu. Présent sur le bras de succès uniquement, quand `is_error` est false. Nécessite Agent SDK v0.3.260 ou ultérieur.


1825 1830 

1826* **Un message régulier que vous avez envoyé**, c'est-à-dire sans `isSynthetic: true` : le tour répond à ce message pour toute sa durée. Quand vous envoyez plusieurs messages rapprochés, Claude Code peut les fusionner en un seul tour, et le champ porte alors uniquement l'`uuid` du dernier message. Pour faire correspondre la réponse à l'un des messages fusionnés, utilisez [`user_message_uuids`](#user_message_uuids).1831* **Un message régulier que vous avez envoyé**, c'est-à-dire sans `isSynthetic: true` : le tour répond à ce message pour toute sa durée. Quand vous envoyez plusieurs messages rapprochés, Claude Code peut les fusionner en un seul tour, et le champ porte alors uniquement l'`uuid` du dernier message. Pour faire correspondre la réponse à l'un des messages fusionnés, utilisez [`user_message_uuids`](#user_message_uuids).

1827* **Un message que vous avez envoyé avec `isSynthetic: true`** : le tour répond d'abord à ce message. Si Claude Code prend en compte un message régulier de votre part entre les appels d'outils, le tour répond à ce message à partir de là. Renvoyer l'`uuid` d'un message synthétique nécessite Agent SDK v0.3.265 ou ultérieur ; les versions antérieures ne renvoient rien sur les tours synthétiques.1832* **Un message que vous avez envoyé avec `isSynthetic: true`** : le tour répond d'abord à ce message. Si Claude Code prend en compte un message régulier de votre part entre les appels d'outils, le tour répond à ce message à partir de là. Renvoyer l'`uuid` d'un message synthétique nécessite Agent SDK v0.3.265 ou ultérieur ; les versions antérieures ne renvoient rien sur les tours synthétiques.

1828* **Le prompt que Claude Code génère pour réexécuter un tour interrompu sous [`CLAUDE_CODE_RESUME_INTERRUPTED_TURN`](/docs/fr/env-vars)** : quand le dernier prompt du tour interrompu est un message régulier que vous avez envoyé, qu'il ait ouvert le tour ou que Claude Code l'ait pris en compte pendant le tour, la réexécution répond d'abord à ce message. [`resume_reason`](#resume_reason) permet de distinguer les cadres de la réexécution de ceux de la tentative interrompue. Quand le dernier prompt n'est pas un message régulier de votre part, la réexécution ne répond d'abord à aucun message de votre part. Si Claude Code prend en compte un message régulier de votre part entre les appels d'outils, le tour répond à ce message à partir de là. Renvoyer le prompt du tour interrompu nécessite Agent SDK v0.3.268 ou ultérieur.1833* **Le prompt que Claude Code génère pour poursuivre un tour interrompu sous [`CLAUDE_CODE_RESUME_INTERRUPTED_TURN`](/docs/fr/env-vars)** : lorsque le dernier prompt du tour interrompu est un message ordinaire que vous avez envoyé, qu'il ait ouvert le tour ou que Claude Code l'ait pris en compte pendant le tour, le tour poursuivi répond d'abord à ce message. [`resume_reason`](#resume_reason) distingue les trames du tour poursuivi de celles de la tentative interrompue. Lorsque le dernier prompt n'est pas l'un de vos messages ordinaires, le tour poursuivi ne répond d'abord à aucun de vos messages. Si Claude Code prend en compte un de vos messages ordinaires entre deux appels d'outils, le tour répond dès lors au message pris en compte. Le renvoi du prompt du tour interrompu nécessite le SDK Agent v0.3.268 ou ultérieur.

1829* **Tout autre prompt que Claude Code a généré lui-même** : le tour ne répond d'abord à aucun message de votre part et ses cadres ne portent aucun écho. Si Claude Code prend en compte un message régulier de votre part entre les appels d'outils, le tour répond à ce message à partir de là. L'écho de prise en compte nécessite Agent SDK v0.3.265 ou ultérieur ; les versions antérieures ne renvoient rien sur ces tours.1834* **Tout autre prompt que Claude Code a généré lui-même** : le tour ne répond d'abord à aucun message de votre part et ses cadres ne portent aucun écho. Si Claude Code prend en compte un message régulier de votre part entre les appels d'outils, le tour répond à ce message à partir de là. L'écho de prise en compte nécessite Agent SDK v0.3.265 ou ultérieur ; les versions antérieures ne renvoient rien sur ces tours.

1830 1835 

1831Claude Code renvoie l'`uuid` du message auquel il répond sur trois types de cadre :1836Claude Code renvoie l'`uuid` du message auquel il répond sur trois types de cadre :


1857 `resume_reason`1862 `resume_reason`

1858</h4>1863</h4>

1859 1864 

1860Pourquoi Claude Code a réexécuté ce tour après un redémarrage. Claude Code définit ce champ sur un tour qu'il a réexécuté sous [`CLAUDE_CODE_RESUME_INTERRUPTED_TURN`](/docs/fr/env-vars), pour que vous puissiez distinguer la réponse et le résultat de la réexécution de ceux de la tentative interrompue. Nécessite Agent SDK v0.3.268 ou ultérieur.1865La raison pour laquelle ce tour poursuit un tour qu'un redémarrage a interrompu. Claude Code définit ce champ sur un tour qui poursuit un tour interrompu sous [`CLAUDE_CODE_RESUME_INTERRUPTED_TURN`](/docs/fr/env-vars), afin que vous puissiez distinguer la réponse et le résultat du tour poursuivi de ceux de la tentative interrompue. Nécessite le SDK Agent v0.3.268 ou ultérieur.

1861 1866 

1862Claude Code définit le champ sur deux types de cadre :1867Claude Code définit le champ sur deux types de cadre :

1863 1868 

1864* **Le résultat de la réexécution** : sur les bras de succès et d'erreur, que le résultat porte ou non `user_message_uuid`.1869* **Le résultat du tour poursuivi** : dans la branche de succès comme dans la branche d'erreur, que le résultat porte ou non `user_message_uuid`.

1865* **Les cadres de réponse de la réexécution** : ceux qui portent [`user_message_uuid`](#user_message_uuid).1870* **Les trames de réponse du tour poursuivi** : celles qui portent [`user_message_uuid`](#user_message_uuid).

1866 1871 

1867La valeur est un court identifiant en minuscules indiquant pourquoi le tour a été réexécuté, comme `interrupted_turn`.1872La valeur est un court token en minuscules, tel que `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 définit `user_message_uuid` et `user_message_uuids` sur le premier événement de flux non-ping du tour, et à nouveau quand le message auquel le tour répond change, selon les conditions dans [`user_message_uuid`](#user_message_uuid). Quand Claude Code réexécute un tour qu'un redémarrage a interrompu, les événements de flux de la réexécution qui portent ces champs portent aussi [`resume_reason`](#resume_reason).2037Claude Code définit `user_message_uuid` et `user_message_uuids` sur le premier événement de flux du tour qui n'est pas un ping, puis de nouveau lorsque le message auquel le tour répond change, dans les conditions décrites dans [`user_message_uuid`](#user_message_uuid). Lorsque le tour poursuit un tour qu'un redémarrage a interrompu, les événements de flux qui portent ces champs portent également [`resume_reason`](#resume_reason).

2033 2038 

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

2035 `SDKCompactBoundaryMessage`2040 `SDKCompactBoundaryMessage`


3560| - | - | - |3565| - | - | - |

3561| `script` | `string` | Script de workflow en ligne. Doit commencer par `export const meta = { name, description }` comme littéral, suivi du corps du script utilisant `agent()`, `parallel()`, `pipeline()` et `phase()`. Un tableau `phases` optionnel dans `meta` regroupe les agents sous des étapes nommées dans la vue de progression |3566| `script` | `string` | Script de workflow en ligne. Doit commencer par `export const meta = { name, description }` comme littéral, suivi du corps du script utilisant `agent()`, `parallel()`, `pipeline()` et `phase()`. Un tableau `phases` optionnel dans `meta` regroupe les agents sous des étapes nommées dans la vue de progression |

3562| `name` | `string` | Nom d'un workflow intégré ou d'un workflow enregistré dans `.claude/workflows/`. Résolu en script |3567| `name` | `string` | Nom d'un workflow intégré ou d'un workflow enregistré dans `.claude/workflows/`. Résolu en script |

3563| `scriptPath` | `string` | Chemin vers un fichier de script de workflow sur le disque. A priorité sur `script` et `name`. Claude Code persiste chaque invocation du script et retourne le chemin dans le résultat, afin que vous puissiez éditer ce fichier et réinvoquer avec le même `scriptPath` pour itérer |3568| `scriptPath` | `string` | Chemin vers un fichier de script de workflow sur le disque, tel que le `scriptPath` retourné par une exécution précédente. A priorité sur `script` et `name`. Claude Code rejette `scriptPath` avec une erreur lorsque les outils de la session n'incluent pas `Read` |

3564| `args` | `unknown` | Valeur d'entrée exposée au script en tant que `args` global, pour les workflows nommés paramétrés tels qu'une question de recherche ou une liste de chemins de fichiers. Passez les tableaux et les objets comme des valeurs JSON réelles, pas comme une chaîne codée en JSON |3569| `args` | `unknown` | Valeur d'entrée exposée au script en tant que `args` global, pour les workflows nommés paramétrés tels qu'une question de recherche ou une liste de chemins de fichiers. Passez les tableaux et les objets comme des valeurs JSON réelles, pas comme une chaîne codée en JSON |

3565| `resumeFromRunId` | `string` | ID d'exécution d'une invocation `Workflow` antérieure à reprendre. Les appels `agent()` complétés avec des entrées inchangées retournent généralement les résultats en cache ; le reste s'exécute en direct. [Reprendre après une pause](/docs/fr/workflows#resume-after-a-pause) couvre les appels complétés qui se réexécutent. Même session uniquement |3570| `resumeFromRunId` | `string` | ID d'exécution d'une invocation `Workflow` antérieure à reprendre. Les appels `agent()` complétés avec des entrées inchangées retournent généralement les résultats en cache ; le reste s'exécute en direct. [Reprendre après une pause](/docs/fr/workflows#resume-after-a-pause) couvre les appels complétés qui se réexécutent. Même session uniquement |

3566| `title` | `string` | Ignoré ; le bloc `meta` du script définit le titre |3571| `title` | `string` | Ignoré ; le bloc `meta` du script définit le titre |

chrome.md +3 −4

Details

129 Demandes de permission dans les sessions VS Code129 Demandes de permission dans les sessions VS Code

130</h3>130</h3>

131 131 

132Dans une session VS Code, le fait que Claude Code vous demande votre accord avant une action du navigateur dépend de la façon dont la session s'est connectée à votre navigateur :132Dans une session VS Code, lorsque Claude Code vous demande votre accord avant une action du navigateur, la demande apparaît sous forme de carte dans le panneau de chat. Lorsque l'action cible un site que vous n'avez pas autorisé, la carte propose également d'autoriser ce site.

133 133 

134* **Vous avez tapé `@browser`** : l'extension approuve chaque action du navigateur pour laquelle Claude Code vous aurait autrement sollicité.134Dans une session qui s'est connectée à votre navigateur au démarrage parce que le paramètre [Enabled by default](#enable-chrome-by-default) est activé, Claude Code vous demande votre accord avant les actions du navigateur sur un site que vous n'avez pas autorisé, dans les modes de permission Manual, Edit automatically, Auto et Bypass permissions. Dans les modes de permission Auto et Bypass permissions, cela s'applique jusqu'à ce que vous tapiez `@browser` dans cette session.

135* **Le paramètre [Enabled by default](#enable-chrome-by-default) l'a connectée au démarrage** : Claude Code vous demande votre accord avant les actions du navigateur sur un site que vous n'avez pas autorisé, dans les modes de permission Manual, Edit automatically, Auto et Bypass permissions, jusqu'à ce que vous tapiez `@browser` dans cette session.

136 135 

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

138 Outils du navigateur en mode plan137 Outils du navigateur en mode plan

139</h3>138</h3>

140 139 

141En [mode plan](/docs/fr/permission-modes#analyze-before-you-edit-with-plan-mode), une demande de permission apparaît avant que Claude n'enregistre un GIF, n'ouvre un nouvel onglet ou n'exécute un raccourci, sauf dans une session VS Code où vous avez tapé [`@browser`](#permission-prompts-in-vs-code-sessions). Dans une session CLI interactive, si le [mode de contournement des permissions est disponible](/docs/fr/permission-modes#skip-all-checks-with-bypasspermissions-mode) et que la [récupération des feature flags](/docs/fr/env-vars#features-that-need-feature-flag-fetching) est désactivée, ces appels s'exécutent sans demande.140En [mode plan](/docs/fr/permission-modes#analyze-before-you-edit-with-plan-mode), une demande de permission apparaît avant que Claude n'enregistre un GIF, n'ouvre un nouvel onglet ou n'exécute un raccourci. Dans une session CLI interactive, si le [mode de contournement des permissions est disponible](/docs/fr/permission-modes#skip-all-checks-with-bypasspermissions-mode) et que la [récupération des feature flags](/docs/fr/env-vars#features-that-need-feature-flag-fetching) est désactivée, ces appels s'exécutent sans demande.

142 141 

143Un appel `tabs_context_mcp` demande également une invite lorsqu'il définit `createIfEmpty`, et il en va de même pour un appel `browser_batch` qui inclut l'une de ces actions.142Un appel `tabs_context_mcp` demande également une invite lorsqu'il définit `createIfEmpty`, et il en va de même pour un appel `browser_batch` qui inclut l'une de ces actions.

144 143 

Details

981 * **Clés mélangées** : un fichier contenant à la fois `code` et `cli`, ou son ancienne graphie `settings`, empêche la passerelle de démarrer. Placez tous les blocs sous une seule clé, en une seule modification.981 * **Clés mélangées** : un fichier contenant à la fois `code` et `cli`, ou son ancienne graphie `settings`, empêche la passerelle de démarrer. Placez tous les blocs sous une seule clé, en une seule modification.

982</Warning>982</Warning>

983 983 

984Les paramètres Claude Code d'une politique, comme une règle qui refuse la lecture des fichiers `.env`, se placent dans un bloc sous la clé `cli` ou `code`. Les deux clés acceptent le même contenu. La clé détermine où les paramètres sont appliqués :984Les paramètres Claude Code d'une politique, comme une règle qui refuse la lecture des fichiers `.env`, se placent dans un bloc sous la clé `cli` ou `code`. `code` est la clé recommandée, et `cli` la clé héritée. Les deux clés acceptent le même contenu. La clé détermine où les paramètres sont appliqués :

985 985 

986* **`cli`** : le terminal, les extensions VS Code et JetBrains, et l'Agent SDK. Sous `cli`, l'onglet Code de Claude Desktop reçoit les [paramètres dérivés](#claude-desktop-overlay), de sorte qu'une règle ciblée telle que `Read(./.env)` n'y bloque pas l'utilisateur.986* **`cli`** : le terminal, les extensions VS Code et JetBrains, et l'Agent SDK. Sous `cli`, l'onglet Code de Claude Desktop reçoit les [paramètres dérivés](#claude-desktop-overlay), de sorte qu'une règle ciblée telle que `Read(./.env)` n'y bloque pas l'utilisateur.

987* **`code`** : les mêmes emplacements, et l'onglet Code de Claude Desktop peut également être couvert.987* **`code`** : les mêmes emplacements, et l'onglet Code de Claude Desktop peut également être couvert.

988 988 

989Le choix consiste à décider si ces paramètres doivent aussi couvrir l'onglet Code. Si ce n'est pas le cas, ne changez rien. Un fichier qui utilise `cli` fonctionne comme avant, et une passerelle qui trouve `cli` dans une politique comportant une clé [`desktop`](#claude-desktop-overlay) émet un avertissement au démarrage et démarre malgré tout. Pour couvrir l'onglet Code, passez à `code`, la clé recommandée.989Un fichier qui utilise `cli` fonctionne comme avant, et une passerelle qui trouve `cli` dans une politique dotée d'une clé [`desktop`](#claude-desktop-overlay) émet un avertissement au démarrage et démarre quand même. Passez à `code` pour que les paramètres puissent aussi couvrir l'onglet Code.

990 990 

991Avant de basculer, lisez [Appliquer les paramètres `code` dans l'onglet Code](#apply-code-settings-in-the-code-tab). La politique a besoin d'une clé `desktop` et les machines des utilisateurs doivent être configurées avant que les paramètres s'y appliquent, et la recherche web est désactivée dans Claude Desktop.991Avant de basculer, lisez [Appliquer les paramètres `code` dans l'onglet Code](#apply-code-settings-in-the-code-tab). La politique a besoin d'une clé `desktop` et les machines des utilisateurs doivent être configurées avant que les paramètres s'y appliquent, et la recherche web est désactivée dans Claude Desktop.

992 992 

Details

277 277 

278Les threads s'exécutent en [mode auto](/docs/fr/permission-modes#eliminate-prompts-with-auto-mode) quand le modèle du thread le supporte, donc la plupart des appels d'outils s'exécutent sans vous demander. Quand un thread a besoin de votre approbation, l'invite est à l'intérieur de ce thread et le thread attend jusqu'à ce que vous y répondiez. Dire à Claude dans la conversation du projet d'aller de l'avant ne l'atteint pas.278Les threads s'exécutent en [mode auto](/docs/fr/permission-modes#eliminate-prompts-with-auto-mode) quand le modèle du thread le supporte, donc la plupart des appels d'outils s'exécutent sans vous demander. Quand un thread a besoin de votre approbation, l'invite est à l'intérieur de ce thread et le thread attend jusqu'à ce que vous y répondiez. Dire à Claude dans la conversation du projet d'aller de l'avant ne l'atteint pas.

279 279 

280Chaque approbation couvre cette invite, ou le reste de ce thread si vous choisissez l'option plus large. Pour laisser chaque thread exécuter certaines commandes sans demander, ou pour en bloquer certaines, ajoutez des [règles de permission](/docs/fr/permissions) au `.claude/settings.json` du référentiel. Les threads cloud ne les appliquent que dans un projet avec un référentiel ; voir [Ce que les threads récupèrent de vos référentiels](#what-threads-pick-up-from-your-repositories). Dans un projet avec plusieurs référentiels, aucune règle de permission du référentiel n'atteint un thread cloud, donc vous comptez sur le mode auto et sur les approbations que vous donnez à l'intérieur de chaque thread.280Chaque approbation couvre cette demande, ou le reste de ce thread si vous choisissez l'option plus large.

281 

282Pour laisser chaque thread exécuter certaines commandes sans demander, ou pour en bloquer certaines, ajoutez des [règles de permission](/docs/fr/permissions) au `.claude/settings.json` du dépôt. Vérifiez que les threads cloud de votre projet les appliquent :

283 

284* **Un dépôt** : les threads cloud appliquent les règles. Voir [Ce que les threads récupèrent de vos dépôts](#what-threads-pick-up-from-your-repositories).

285* **Plusieurs dépôts, environnement hébergé par Anthropic** : aucune règle de permission d'un dépôt n'atteint un thread cloud, donc vous comptez sur le mode auto et sur les approbations que vous donnez à l'intérieur de chaque thread.

286* **Plusieurs dépôts, environnement auto-hébergé** : voir [quels paramètres de dépôt s'appliquent](/docs/fr/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 Exécuter un thread sur votre propre ordinateur289 Exécuter un thread sur votre propre ordinateur


381 Ce que les threads reprennent de vos dépôts387 Ce que les threads reprennent de vos dépôts

382</h3>388</h3>

383 389 

384Chaque thread cloud clone chaque dépôt du projet et charge `CLAUDE.md` et les skills de tous. Les règles de permission, les hooks et `env` viennent seulement du `.claude/settings.json` dans le répertoire où le thread commence : à l'intérieur du dépôt quand le projet en a un, et au-dessus des clones quand il en a plusieurs, où aucun fichier de dépôt n'est lu pour eux.390Chaque thread cloud clone chaque dépôt du projet et charge `CLAUDE.md` et les skills de tous. Les règles de permission, les hooks et `env` viennent seulement du `.claude/settings.json` dans le répertoire où le thread commence.

385 391 

386| Dans chaque dépôt | Un dépôt | Plusieurs dépôts |392| Dans chaque dépôt | Un dépôt | Plusieurs dépôts |

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

388| `CLAUDE.md` | Chargé au démarrage du thread | Chargé à partir de chaque dépôt au démarrage du thread |394| `CLAUDE.md` | Chargé au démarrage du thread | Chargé à partir de chaque dépôt au démarrage du thread |

389| Skills, agents et commandes sous `.claude/` | Chargés | Chargés à partir de chaque dépôt |395| Skills, agents et commandes sous `.claude/` | Chargés | Chargés à partir de chaque dépôt |

390| Plugins activés dans `.claude/settings.json` | Non chargés. Ajoutez le plugin dans **Project settings > Plugins** à la place | Non chargés. Ajoutez le plugin dans **Project settings > Plugins** à la place |396| Plugins activés dans `.claude/settings.json` | Non chargés. Ajoutez le plugin dans **Project settings > Plugins** à la place | Non chargés. Ajoutez le plugin dans **Project settings > Plugins** à la place |

391| Règles de permission, hooks et `env` définis dans `.claude/settings.json` | S'appliquent au thread, sauf les clés `env` que [aucune session cloud n'honore](/docs/fr/cloud-environments#what-carries-over-from-your-setup) | Ne s'appliquent pas |397| Règles de permission, hooks et `env` définis dans `.claude/settings.json` | S'appliquent au thread, sauf les clés `env` que [aucune session cloud n'honore](/docs/fr/cloud-environments#what-carries-over-from-your-setup) | Ne s'appliquent pas dans un environnement hébergé par Anthropic. Pour un environnement auto-hébergé, voir [quels paramètres de dépôt s'appliquent](/docs/fr/self-hosted-environments-configuration#repository-settings-in-sessions-with-several-repositories) |

392 398 

393Dans un projet avec plusieurs dépôts, chaque clone est attaché au thread en tant que [répertoire supplémentaire](/docs/fr/memory#load-from-additional-directories) avec le chargement de `CLAUDE.md` activé, c'est pourquoi le `CLAUDE.md` et les skills de chaque dépôt se chargent au démarrage même si le thread commence au-dessus d'eux. Dans un tel projet, mettez les règles permanentes dans les instructions du projet et donnez aux threads les variables d'environnement via l'[environnement cloud](#choose-an-environment-for-threads).399Dans un projet avec plusieurs dépôts, mettez les règles permanentes dans les instructions du projet et donnez aux threads les variables d'environnement via l'[environnement cloud](#choose-an-environment-for-threads).

394 400 

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

396 Choisir un environnement pour les threads402 Choisir un environnement pour les threads


406 412 

407Les threads cloud n'ont pas les skills, les serveurs MCP, les plugins et les outils installés seulement sur votre machine. Un thread que Claude exécute sur votre machine via [Remote Control](/docs/fr/remote-control) utilise ce qui y est installé. Pour rendre chacun de ceux-ci disponible aux threads cloud :413Les threads cloud n'ont pas les skills, les serveurs MCP, les plugins et les outils installés seulement sur votre machine. Un thread que Claude exécute sur votre machine via [Remote Control](/docs/fr/remote-control) utilise ce qui y est installé. Pour rendre chacun de ceux-ci disponible aux threads cloud :

408 414 

409* Skills, sous-agents et commandes : commitez-les dans un dépôt que vous avez ajouté au projet, par exemple un skill à `.claude/skills/<skill-name>/SKILL.md`. Chaque thread cloud clone chaque dépôt du projet et charge `.claude/skills/`, `.claude/agents/` et `.claude/commands/` à partir de chacun d'eux, donc un skill commité dans un dépôt est disponible dans chaque thread cloud. Les threads cloud chargent également les skills que vous activez pour votre compte claude.ai.415* Skills, sous-agents et commandes : commitez-les dans un dépôt que vous avez ajouté au projet, par exemple un skill à `.claude/skills/<skill-name>/SKILL.md`. Chaque thread cloud clone chaque dépôt du projet et charge `.claude/skills/`, `.claude/agents/` et `.claude/commands/` à partir de chacun d'eux, donc un skill commité dans un dépôt est disponible dans chaque thread cloud. Les threads cloud chargent également les [skills que vous activez pour votre compte claude.ai](/docs/fr/skills#skills-in-cowork-and-cloud-sessions).

410* Plugins : ajoutez-les dans **Project settings > Plugins** ; ils se chargent dans chaque nouveau thread cloud. Les plugins qu'un dépôt déclare dans son `.claude/settings.json` [ne se chargent pas dans les threads cloud](/docs/fr/cloud-environments#what-carries-over-from-your-setup).416* Plugins : ajoutez-les dans **Project settings > Plugins** ; ils se chargent dans chaque nouveau thread cloud. Les plugins qu'un dépôt déclare dans son `.claude/settings.json` [ne se chargent pas dans les threads cloud](/docs/fr/cloud-environments#what-carries-over-from-your-setup).

411* Serveurs MCP : les threads cloud obtiennent leurs outils MCP à partir des connecteurs sur votre compte claude.ai, qui sont des serveurs MCP que vous connectez une fois à [claude.ai/customize/connectors](https://claude.ai/customize/connectors) ou via le lien **Manage connectors** dans **Project settings > Environment**. Chaque thread cloud peut tous les utiliser sans configuration par projet. La conversation du projet elle-même n'a pas de connecteurs, donc envoyez le travail qui en a besoin en tant que tâche pour un thread cloud. Dans un projet avec un dépôt, les threads cloud chargent également les serveurs MCP à partir du [`.mcp.json`](/docs/fr/cloud-environments#what-carries-over-from-your-setup) de ce dépôt. [Comment les connecteurs atteignent Claude Code](/docs/fr/mcp#how-connectors-reach-claude-code) énumère les règles pour les sessions cloud et les paramètres qui désactivent les connecteurs.417* Serveurs MCP : les threads cloud obtiennent leurs outils MCP à partir des connecteurs sur votre compte claude.ai, qui sont des serveurs MCP que vous connectez une fois à [claude.ai/customize/connectors](https://claude.ai/customize/connectors) ou via le lien **Manage connectors** dans **Project settings > Environment**. Chaque thread cloud peut tous les utiliser sans configuration par projet. La conversation du projet elle-même n'a pas de connecteurs, donc envoyez le travail qui en a besoin en tant que tâche pour un thread cloud. Dans un projet avec un dépôt, les threads cloud chargent également les serveurs MCP à partir du [`.mcp.json`](/docs/fr/cloud-environments#what-carries-over-from-your-setup) de ce dépôt. [Comment les connecteurs atteignent Claude Code](/docs/fr/mcp#how-connectors-reach-claude-code) énumère les règles pour les sessions cloud et les paramètres qui désactivent les connecteurs.

412* Outils en ligne de commande et packages : installez-les dans le [script de configuration](/docs/fr/cloud-environments#setup-scripts) de l'environnement.418* Outils en ligne de commande et packages : installez-les dans le [script de configuration](/docs/fr/cloud-environments#setup-scripts) de l'environnement.

Details

108| `--maintenance` | Exécuter les hooks d'[initialisation](/docs/fr/hooks#setup) avec le matcher `maintenance` avant la session (mode impression uniquement) | `claude -p --maintenance "query"` |108| `--maintenance` | Exécuter les hooks d'[initialisation](/docs/fr/hooks#setup) avec le matcher `maintenance` avant la session (mode impression uniquement) | `claude -p --maintenance "query"` |

109| `--max-budget-usd` | Arrêter l'exécution une fois que les dépenses estimées en appels API atteignent ce montant (mode impression uniquement). Claude Code compare le plafond à son [estimation des coûts côté client](/docs/fr/agent-sdk/cost-tracking#estimates-not-billing), qui peut différer de votre facture. Les dépenses des [sous-agents](/docs/fr/sub-agents) comptent dans le plafond. Les dépenses peuvent dépasser le plafond, donc [prévoyez une marge](/docs/fr/agent-sdk/agent-loop#budget-headroom). Lorsque vous revenez à une conversation avec `--continue` ou `--resume`, les totaux [restaurés à partir des exécutions antérieures](/docs/fr/agent-sdk/cost-tracking#accumulate-costs-across-multiple-calls) n'y comptent pas. Une fois que les dépenses atteignent le plafond, le lancement d'un autre sous-agent échoue avec `Budget limit reached`, et Claude Code arrête les sous-agents en arrière-plan qui s'exécutent encore ; les comportements d'application du plafond nécessitent Claude Code v2.1.217 ou ultérieur | `claude -p --max-budget-usd 5.00 "query"` |109| `--max-budget-usd` | Arrêter l'exécution une fois que les dépenses estimées en appels API atteignent ce montant (mode impression uniquement). Claude Code compare le plafond à son [estimation des coûts côté client](/docs/fr/agent-sdk/cost-tracking#estimates-not-billing), qui peut différer de votre facture. Les dépenses des [sous-agents](/docs/fr/sub-agents) comptent dans le plafond. Les dépenses peuvent dépasser le plafond, donc [prévoyez une marge](/docs/fr/agent-sdk/agent-loop#budget-headroom). Lorsque vous revenez à une conversation avec `--continue` ou `--resume`, les totaux [restaurés à partir des exécutions antérieures](/docs/fr/agent-sdk/cost-tracking#accumulate-costs-across-multiple-calls) n'y comptent pas. Une fois que les dépenses atteignent le plafond, le lancement d'un autre sous-agent échoue avec `Budget limit reached`, et Claude Code arrête les sous-agents en arrière-plan qui s'exécutent encore ; les comportements d'application du plafond nécessitent Claude Code v2.1.217 ou ultérieur | `claude -p --max-budget-usd 5.00 "query"` |

110| `--max-turns` | Limiter le nombre de tours d'agent (mode impression uniquement). Quitte avec une erreur lorsque la limite est atteinte. Pas de limite par défaut. Avec `--input-format stream-json`, un message toujours en file d'attente lorsque la limite termine un tour reste en file d'attente et démarre un nouveau tour avec sa propre limite | `claude -p --max-turns 3 "query"` |110| `--max-turns` | Limiter le nombre de tours d'agent (mode impression uniquement). Quitte avec une erreur lorsque la limite est atteinte. Pas de limite par défaut. Avec `--input-format stream-json`, un message toujours en file d'attente lorsque la limite termine un tour reste en file d'attente et démarre un nouveau tour avec sa propre limite | `claude -p --max-turns 3 "query"` |

111| `--mcp-config` | Charger les serveurs MCP à partir de fichiers ou de chaînes JSON (séparés par des espaces). Lorsque vous transmettez ce drapeau avec `-p`, Claude Code attend que les serveurs toujours en attente se connectent avant d'exécuter le premier tour, jusqu'au délai d'expiration de démarrage [`MCP_TIMEOUT`](/docs/fr/env-vars), 30 secondes par défaut ; un serveur avec une [liste d'outils mise en cache](/docs/fr/mcp#managing-your-servers) ignore l'attente et se connecte à la première utilisation. L'attente nécessite Claude Code v2.1.221 ou ultérieur | `claude --mcp-config ./mcp.json` |111| `--mcp-config` | Charger les serveurs MCP à partir de fichiers ou de chaînes JSON (séparés par des espaces). Lorsque vous transmettez ce flag avec `-p`, Claude Code attend que les serveurs encore en attente se connectent avant d'exécuter le premier tour, jusqu'au délai d'expiration de démarrage [`MCP_TIMEOUT`](/docs/fr/env-vars), 30 secondes par défaut ; un serveur avec une [liste d'outils mise en cache](/docs/fr/mcp#managing-your-servers) ignore l'attente et se connecte à la première utilisation. Dans un [environnement auto-hébergé](/docs/fr/self-hosted-environments-configuration#connection-timing), une attente plus courte s'applique à la place. L'attente nécessite Claude Code v2.1.221 ou ultérieur | `claude --mcp-config ./mcp.json` |

112| `--model` | Définit le modèle pour la session actuelle avec un [alias de modèle](/docs/fr/model-config#model-aliases) tel que `sonnet`, `opus`, `haiku`, ou `fable`, ou le nom complet d'un modèle. Remplace le paramètre [`model`](/docs/fr/settings-reference#model) et [`ANTHROPIC_MODEL`](/docs/fr/model-config#environment-variables) | `claude --model claude-sonnet-5` |112| `--model` | Définit le modèle pour la session actuelle avec un [alias de modèle](/docs/fr/model-config#model-aliases) tel que `sonnet`, `opus`, `haiku`, ou `fable`, ou le nom complet d'un modèle. Remplace le paramètre [`model`](/docs/fr/settings-reference#model) et [`ANTHROPIC_MODEL`](/docs/fr/model-config#environment-variables) | `claude --model claude-sonnet-5` |

113| `--name`, `-n` | Définir un nom d'affichage pour la session, affiché dans `/resume` et le titre du terminal. Vous pouvez reprendre une session nommée avec `claude --resume <name>`. Dans une session interactive, si une autre session en direct sur cette machine utilise déjà le nom, Claude Code applique [une variante de celui-ci](/docs/fr/sessions#name-your-sessions) à la place. <br /><br />[`/rename`](/docs/fr/commands) change le nom en cours de session et l'affiche également dans la barre d'invite | `claude -n "my-feature-work"` |113| `--name`, `-n` | Définir un nom d'affichage pour la session, affiché dans `/resume` et le titre du terminal. Vous pouvez reprendre une session nommée avec `claude --resume <name>`. Dans une session interactive, si une autre session en direct sur cette machine utilise déjà le nom, Claude Code applique [une variante de celui-ci](/docs/fr/sessions#name-your-sessions) à la place. <br /><br />[`/rename`](/docs/fr/commands) change le nom en cours de session et l'affiche également dans la barre d'invite | `claude -n "my-feature-work"` |

114| `--no-chrome` | Désactiver l'[intégration du navigateur Chrome](/docs/fr/chrome) pour cette session | `claude --no-chrome` |114| `--no-chrome` | Désactiver l'[intégration du navigateur Chrome](/docs/fr/chrome) pour cette session | `claude --no-chrome` |

Details

314| Plugins et marketplaces déclarés dans le `.claude/settings.json` de votre dépôt | Non | Une session cloud n'installe pas les plugins qu'un dépôt active sous [`enabledPlugins`](/docs/fr/settings-reference#enabledplugins), y compris ceux des marketplaces qu'il liste sous [`extraKnownMarketplaces`](/docs/fr/settings-reference#extraknownmarketplaces) |314| Plugins et marketplaces déclarés dans le `.claude/settings.json` de votre dépôt | Non | Une session cloud n'installe pas les plugins qu'un dépôt active sous [`enabledPlugins`](/docs/fr/settings-reference#enabledplugins), y compris ceux des marketplaces qu'il liste sous [`extraKnownMarketplaces`](/docs/fr/settings-reference#extraknownmarketplaces) |

315| Les [paramètres gérés par le serveur](/docs/fr/server-managed-settings) de votre organisation | Oui, sauf dans les sessions [Claude Tag](https://claude.com/docs/claude-tag/overview) | Récupérés des serveurs d'Anthropic quand la session démarre. Consultez [Couverture de surface](/docs/fr/model-config#surface-coverage) pour savoir comment `availableModels` est appliqué dans les sessions cloud. Les paramètres déployés sur votre appareil via MDM ou des fichiers de paramètres gérés ne s'appliquent pas, car la session s'exécute sur une VM gérée par Anthropic ; dans un [environnement auto-hébergé](/docs/fr/self-hosted-environments), les sessions lisent également le fichier de paramètres gérés dans l'image d'exécuteur, selon [comment Claude Code combine les sources gérées](/docs/fr/managed-settings#how-claude-code-combines-managed-sources) |315| Les [paramètres gérés par le serveur](/docs/fr/server-managed-settings) de votre organisation | Oui, sauf dans les sessions [Claude Tag](https://claude.com/docs/claude-tag/overview) | Récupérés des serveurs d'Anthropic quand la session démarre. Consultez [Couverture de surface](/docs/fr/model-config#surface-coverage) pour savoir comment `availableModels` est appliqué dans les sessions cloud. Les paramètres déployés sur votre appareil via MDM ou des fichiers de paramètres gérés ne s'appliquent pas, car la session s'exécute sur une VM gérée par Anthropic ; dans un [environnement auto-hébergé](/docs/fr/self-hosted-environments), les sessions lisent également le fichier de paramètres gérés dans l'image d'exécuteur, selon [comment Claude Code combine les sources gérées](/docs/fr/managed-settings#how-claude-code-combines-managed-sources) |

316| Votre `~/.claude/CLAUDE.md` utilisateur | Non | Vit sur votre machine, pas dans le dépôt. Consultez [Ajouter des préférences personnelles sans les commiter dans le dépôt](#add-personal-preferences-without-committing-to-the-repo) |316| Votre `~/.claude/CLAUDE.md` utilisateur | Non | Vit sur votre machine, pas dans le dépôt. Consultez [Ajouter des préférences personnelles sans les commiter dans le dépôt](#add-personal-preferences-without-committing-to-the-repo) |

317| Vos `~/.claude/skills/`, `~/.claude/agents/`, `~/.claude/commands/` utilisateur | Non | Vivent sur votre machine, pas dans le dépôt. Commitez-les dans le répertoire `.claude/` du dépôt à la place. Les sessions cloud chargent automatiquement les skills que vous activez sur claude.ai |317| Vos `~/.claude/skills/`, `~/.claude/agents/`, `~/.claude/commands/` utilisateur | Non | Vivent sur votre machine, pas dans le dépôt. Commitez-les dans le répertoire `.claude/` du dépôt à la place. Les sessions cloud chargent automatiquement les [skills que vous activez sur claude.ai](/docs/fr/skills#skills-in-cowork-and-cloud-sessions) |

318| Plugins activés seulement dans vos paramètres utilisateur | Non | L'`enabledPlugins` de portée utilisateur vit dans `~/.claude/settings.json` sur votre machine |318| Plugins activés seulement dans vos paramètres utilisateur | Non | L'`enabledPlugins` de portée utilisateur vit dans `~/.claude/settings.json` sur votre machine |

319| Serveurs MCP que vous avez ajoutés avec `claude mcp add` à la portée locale par défaut ou à la portée utilisateur | Non | Ceux-ci écrivent dans `~/.claude.json` sur votre machine, pas le dépôt. Ajoutez le serveur avec `claude mcp add --scope project`, qui écrit le [`.mcp.json`](/docs/fr/mcp#project-scope) du dépôt, et commitez ce fichier. Une session avec un seul dépôt le charge |319| Serveurs MCP que vous avez ajoutés avec `claude mcp add` à la portée locale par défaut ou à la portée utilisateur | Non | Ceux-ci écrivent dans `~/.claude.json` sur votre machine, pas le dépôt. Ajoutez le serveur avec `claude mcp add --scope project`, qui écrit le [`.mcp.json`](/docs/fr/mcp#project-scope) du dépôt, et commitez ce fichier. Une session avec un seul dépôt le charge |

320| Variables de transport dans le bloc `env` de `.claude/settings.json` de votre dépôt, comme `NODE_EXTRA_CA_CERTS` et les [variables de certificat client mTLS](/docs/fr/network-config#mtls-authentication) | Non | L'environnement d'hébergement gère la connexion API de la session, donc Claude Code ignore ces clés et note chaque clé ignorée dans le journal de débogage de la session |320| Variables de transport dans le bloc `env` de `.claude/settings.json` de votre dépôt, comme `NODE_EXTRA_CA_CERTS` et les [variables de certificat client mTLS](/docs/fr/network-config#mtls-authentication) | Non | L'environnement d'hébergement gère la connexion API de la session, donc Claude Code ignore ces clés et note chaque clé ignorée dans le journal de débogage de la session |

env-vars.md +1 −1

Details

340| `CLAUDE_CODE_MAX_WEB_SEARCHES_PER_SESSION` | Plafond des appels [WebSearch](/docs/fr/tools-reference#session-search-limit) (par défaut : 200). Lorsque Claude atteint le plafond, les appels WebSearch suivants renvoient un avis lui indiquant de continuer avec les informations déjà recueillies. Accepte un nombre entier positif sans borne supérieure. Toute autre valeur est ignorée et la valeur par défaut s'applique ; le plafond peut donc être relevé mais pas désactivé. Nécessite Claude Code v2.1.212 ou ultérieur |340| `CLAUDE_CODE_MAX_WEB_SEARCHES_PER_SESSION` | Plafond des appels [WebSearch](/docs/fr/tools-reference#session-search-limit) (par défaut : 200). Lorsque Claude atteint le plafond, les appels WebSearch suivants renvoient un avis lui indiquant de continuer avec les informations déjà recueillies. Accepte un nombre entier positif sans borne supérieure. Toute autre valeur est ignorée et la valeur par défaut s'applique ; le plafond peut donc être relevé mais pas désactivé. Nécessite Claude Code v2.1.212 ou ultérieur |

341| `CLAUDE_CODE_MCP_ALLOWLIST_ENV` | Définir sur `1` pour lancer les serveurs MCP stdio avec uniquement un environnement de base sûr plus l'`env` configuré du serveur, au lieu d'hériter de l'environnement de votre shell |341| `CLAUDE_CODE_MCP_ALLOWLIST_ENV` | Définir sur `1` pour lancer les serveurs MCP stdio avec uniquement un environnement de base sûr plus l'`env` configuré du serveur, au lieu d'hériter de l'environnement de votre shell |

342| `CLAUDE_CODE_MCP_AUTO_BACKGROUND_MS` | Temps écoulé en millisecondes avant qu'un appel d'outil MCP toujours en cours [soit déplacé vers une tâche en arrière-plan](/docs/fr/mcp#automatic-backgrounding-of-long-tool-calls) (par défaut : 120000, soit 2 minutes). Définir sur `0` pour désactiver la mise en arrière-plan automatique. Nécessite Claude Code v2.1.212 ou ultérieur |342| `CLAUDE_CODE_MCP_AUTO_BACKGROUND_MS` | Temps écoulé en millisecondes avant qu'un appel d'outil MCP toujours en cours [soit déplacé vers une tâche en arrière-plan](/docs/fr/mcp#automatic-backgrounding-of-long-tool-calls) (par défaut : 120000, soit 2 minutes). Définir sur `0` pour désactiver la mise en arrière-plan automatique. Nécessite Claude Code v2.1.212 ou ultérieur |

343| `CLAUDE_CODE_MCP_STARTUP_WAIT_MS` | Durée en millisecondes pendant laquelle le premier tour d'une session [non interactive](/docs/fr/headless) attend les serveurs MCP encore en cours de connexion, à la place de l'[attente du premier tour](/docs/fr/agent-sdk/mcp#connection-timing) par défaut. Lorsqu'elle est définie, l'attente couvre tous les serveurs en attente. Définir sur `0` pour ignorer l'attente. Un serveur [`--permission-prompt-tool`](/docs/fr/cli-reference#cli-flags) conserve sa propre attente `MCP_TIMEOUT` quelle que soit la valeur. Nécessite Claude Code v2.1.274 ou ultérieur |343| `CLAUDE_CODE_MCP_STARTUP_WAIT_MS` | Durée en millisecondes pendant laquelle le premier tour d'une session [non interactive](/docs/fr/headless) attend les serveurs MCP encore en cours de connexion, à la place de l'[attente du premier tour](/docs/fr/agent-sdk/mcp#connection-timing) par défaut. Lorsqu'elle est définie, l'attente couvre tous les serveurs en attente ; dans un [environnement auto-hébergé](/docs/fr/self-hosted-environments-configuration#connection-timing), elle ne modifie que la durée de l'attente. Définissez sur `0` pour ignorer l'attente. Un serveur [`--permission-prompt-tool`](/docs/fr/cli-reference#cli-flags) conserve sa propre attente `MCP_TIMEOUT`, quelle que soit la valeur. Nécessite Claude Code v2.1.274 ou ultérieur |

344| `CLAUDE_CODE_MCP_TOOL_IDLE_TIMEOUT` | Délai d'inactivité en millisecondes pour les appels d'outils MCP. Lorsqu'un serveur MCP stdio, HTTP, SSE, WebSocket ou [connecteur claude.ai](/docs/fr/mcp#use-mcp-servers-from-claude-ai) n'envoie ni réponse ni notification de progression pendant cette durée, l'appel d'outil s'interrompt avec une erreur au lieu d'attendre le `MCP_TOOL_TIMEOUT` global. Remplace les valeurs par défaut propres à chaque transport, à savoir 300000 (5 minutes) pour les serveurs réseau et 1800000 (30 minutes) pour les serveurs stdio. Définir sur `0` pour désactiver la vérification d'inactivité. Les valeurs inférieures à 1000 sont portées à une seconde, et la valeur est plafonnée au `MCP_TOOL_TIMEOUT` effectif. Un `timeout` par serveur d'au moins 1000 dans `.mcp.json` porte la fenêtre d'inactivité de ce serveur à au moins la valeur de `timeout`. Ne s'applique pas aux serveurs IDE ni aux serveurs SDK in-process. Nécessite Claude Code v2.1.187 ou ultérieur. Avant la v2.1.203, les serveurs stdio étaient exemptés du délai d'inactivité |344| `CLAUDE_CODE_MCP_TOOL_IDLE_TIMEOUT` | Délai d'inactivité en millisecondes pour les appels d'outils MCP. Lorsqu'un serveur MCP stdio, HTTP, SSE, WebSocket ou [connecteur claude.ai](/docs/fr/mcp#use-mcp-servers-from-claude-ai) n'envoie ni réponse ni notification de progression pendant cette durée, l'appel d'outil s'interrompt avec une erreur au lieu d'attendre le `MCP_TOOL_TIMEOUT` global. Remplace les valeurs par défaut propres à chaque transport, à savoir 300000 (5 minutes) pour les serveurs réseau et 1800000 (30 minutes) pour les serveurs stdio. Définir sur `0` pour désactiver la vérification d'inactivité. Les valeurs inférieures à 1000 sont portées à une seconde, et la valeur est plafonnée au `MCP_TOOL_TIMEOUT` effectif. Un `timeout` par serveur d'au moins 1000 dans `.mcp.json` porte la fenêtre d'inactivité de ce serveur à au moins la valeur de `timeout`. Ne s'applique pas aux serveurs IDE ni aux serveurs SDK in-process. Nécessite Claude Code v2.1.187 ou ultérieur. Avant la v2.1.203, les serveurs stdio étaient exemptés du délai d'inactivité |

345| `CLAUDE_CODE_MESSAGING_SOCKET` | Définie par Claude Code, pas par vous : dans les sessions qui lient un [socket de boîte de réception](/docs/fr/cross-session-messaging#the-sessions-inbox-socket), Claude Code exporte le chemin de ce socket vers les hooks et les commandes Bash au moment où il lie le socket. Dans une session qui démarre avec la messagerie activée, Claude Code lie le socket avant l'exécution de tout hook. Les autres sessions de la machine livrent les messages à ce chemin. Chaque session exporte son propre socket plutôt qu'un socket hérité d'un parent, et les messages qui y arrivent passent par les [contrôles entrants](/docs/fr/cross-session-messaging#control-inbound-messages) de la session. Les blocs `env` des paramètres ne peuvent pas la définir. Nécessite Claude Code v2.1.224 ou ultérieur |345| `CLAUDE_CODE_MESSAGING_SOCKET` | Définie par Claude Code, pas par vous : dans les sessions qui lient un [socket de boîte de réception](/docs/fr/cross-session-messaging#the-sessions-inbox-socket), Claude Code exporte le chemin de ce socket vers les hooks et les commandes Bash au moment où il lie le socket. Dans une session qui démarre avec la messagerie activée, Claude Code lie le socket avant l'exécution de tout hook. Les autres sessions de la machine livrent les messages à ce chemin. Chaque session exporte son propre socket plutôt qu'un socket hérité d'un parent, et les messages qui y arrivent passent par les [contrôles entrants](/docs/fr/cross-session-messaging#control-inbound-messages) de la session. Les blocs `env` des paramètres ne peuvent pas la définir. Nécessite Claude Code v2.1.224 ou ultérieur |

346| `CLAUDE_CODE_MESSAGING_TOKEN` | Définie par Claude Code, pas par vous : dans les sessions qui lient un [socket de boîte de réception](/docs/fr/cross-session-messaging#the-sessions-inbox-socket), Claude Code exporte ce jeton propre à la session vers les hooks et les commandes Bash, en plus de `CLAUDE_CODE_MESSAGING_SOCKET`. Un script qui publie sur le socket peut envoyer `{"type":"auth","token":"<token>"}` comme première ligne pour prouver qu'il appartient à la session. Sous Windows natif, Claude Code exige cette ligne et ferme toute connexion qui ne commence pas par une ligne valide. Les [règles relatives aux processus enfants propres](/docs/fr/cross-session-messaging#the-sessions-inbox-socket) indiquent quand Claude Code consulte le jeton. Chaque session exporte son propre jeton, jamais un jeton hérité d'une session parente. Les blocs `env` des paramètres ne peuvent pas la définir. Nécessite Claude Code v2.1.228 ou ultérieur |346| `CLAUDE_CODE_MESSAGING_TOKEN` | Définie par Claude Code, pas par vous : dans les sessions qui lient un [socket de boîte de réception](/docs/fr/cross-session-messaging#the-sessions-inbox-socket), Claude Code exporte ce jeton propre à la session vers les hooks et les commandes Bash, en plus de `CLAUDE_CODE_MESSAGING_SOCKET`. Un script qui publie sur le socket peut envoyer `{"type":"auth","token":"<token>"}` comme première ligne pour prouver qu'il appartient à la session. Sous Windows natif, Claude Code exige cette ligne et ferme toute connexion qui ne commence pas par une ligne valide. Les [règles relatives aux processus enfants propres](/docs/fr/cross-session-messaging#the-sessions-inbox-socket) indiquent quand Claude Code consulte le jeton. Chaque session exporte son propre jeton, jamais un jeton hérité d'une session parente. Les blocs `env` des paramètres ne peuvent pas la définir. Nécessite Claude Code v2.1.228 ou ultérieur |

errors.md +46 −9

Details

247| `Windows reported an error (EBADF) when Claude Code read this session's transcript file` | [Erreurs de ligne de commande](#windows-reported-an-error-ebadf) |247| `Windows reported an error (EBADF) when Claude Code read this session's transcript file` | [Erreurs de ligne de commande](#windows-reported-an-error-ebadf) |

248| `Cannot switch renderers in this session` | [Erreurs de ligne de commande](#cannot-switch-renderers-in-this-session) |248| `Cannot switch renderers in this session` | [Erreurs de ligne de commande](#cannot-switch-renderers-in-this-session) |

249| `Cannot switch renderers while work is running in the background` | [Erreurs de ligne de commande](#cannot-switch-renderers-in-this-session) |249| `Cannot switch renderers while work is running in the background` | [Erreurs de ligne de commande](#cannot-switch-renderers-in-this-session) |

250| `Claude Code couldn't restart` | [Erreurs de ligne de commande](#claude-code-couldnt-restart) |

250| `Couldn't open Claude Desktop` | [Erreurs de ligne de commande](#couldnt-open-claude-desktop) |251| `Couldn't open Claude Desktop` | [Erreurs de ligne de commande](#couldnt-open-claude-desktop) |

251| `Failed to open Claude Desktop. Please try opening it manually.` | [Erreurs de ligne de commande](#couldnt-open-claude-desktop) |252| `Failed to open Claude Desktop. Please try opening it manually.` | [Erreurs de ligne de commande](#couldnt-open-claude-desktop) |

252| `Couldn't read your Zed keymap` / `Couldn't back up your Zed keymap` / `Couldn't update your Zed keymap` | [Erreurs de ligne de commande](#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` | [Erreurs de ligne de commande](#terminal-setup-left-your-zed-keymap-unchanged) |


334| `Session isn't responding` / `Press enter again to restart this session — it isn't responding` | [Erreurs de session en arrière-plan](#session-isnt-responding) |335| `Session isn't responding` / `Press enter again to restart this session — it isn't responding` | [Erreurs de session en arrière-plan](#session-isnt-responding) |

335| `Session <id> was stopped while the respawn was in flight` | [Erreurs de session en arrière-plan](#session-was-stopped-while-the-respawn-was-in-flight) |336| `Session <id> was stopped while the respawn was in flight` | [Erreurs de session en arrière-plan](#session-was-stopped-while-the-respawn-was-in-flight) |

336| `This session was running agent '<name>', which is no longer available` | [Erreurs de session en arrière-plan](#session-agent-no-longer-available) |337| `This session was running agent '<name>', which is no longer available` | [Erreurs de session en arrière-plan](#session-agent-no-longer-available) |

338| `This session restarted <time> after its next /loop wakeup was due, so that wakeup will not fire` | [Erreurs de session en arrière-plan](#restarted-after-its-next-loop-wakeup-was-due) |

337| `CLAUDE_CODE_PROCESS_WRAPPER: launcher ...` | [Erreurs de session en arrière-plan](#claude_code_process_wrapper-launcher-errors) |339| `CLAUDE_CODE_PROCESS_WRAPPER: launcher ...` | [Erreurs de session en arrière-plan](#claude_code_process_wrapper-launcher-errors) |

338| `EUNKNOWN: unknown error, uv_spawn` | [Erreurs de session en arrière-plan](#eunknown-when-starting-a-background-session) |340| `EUNKNOWN: unknown error, uv_spawn` | [Erreurs de session en arrière-plan](#eunknown-when-starting-a-background-session) |

339| `EACCES: permission denied, posix_spawn` | [Erreurs de session en arrière-plan](#eacces-when-starting-a-background-session) |341| `EACCES: permission denied, posix_spawn` | [Erreurs de session en arrière-plan](#eacces-when-starting-a-background-session) |


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

440| [`CLAUDE_CODE_MAX_RETRIES`](/docs/fr/env-vars) | 10 | Nombre de nouvelles tentatives. Plafonné à 15 à partir de v2.1.186 ; à partir de v2.1.199 `CLAUDE_CODE_RETRY_WATCHDOG` augmente la valeur par défaut et supprime le plafond. Réduisez-le pour afficher les défaillances plus rapidement dans les scripts. |442| [`CLAUDE_CODE_MAX_RETRIES`](/docs/fr/env-vars) | 10 | Nombre de nouvelles tentatives. Plafonné à 15 à partir de v2.1.186 ; à partir de v2.1.199 `CLAUDE_CODE_RETRY_WATCHDOG` augmente la valeur par défaut et supprime le plafond. Réduisez-le pour afficher les défaillances plus rapidement dans les scripts. |

441| [`CLAUDE_CODE_RETRY_WATCHDOG`](/docs/fr/env-vars) | non défini | Définissez sur `1` dans les sessions sans surveillance telles que les travaux CI pour réessayer les erreurs de capacité `429` et `529` indéfiniment au lieu d'échouer après `CLAUDE_CODE_MAX_RETRIES` tentatives. Claude Code échoue immédiatement lorsqu'une requête à vitesse standard obtient un `429` qui signale une limite de dépenses ou des crédits d'utilisation épuisés, même un provenant d'un [plafond de dépenses de passerelle](#spend-limit-reached) qui se réinitialise selon un calendrier. Avant v2.1.239, le watchdog réessayait ceux-ci indéfiniment. Pour les requêtes en mode rapide, voir [Handle rate limits](/docs/fr/fast-mode#handle-rate-limits). Sur v2.1.199 ou ultérieur, il augmente également le nombre de tentatives par défaut pour les autres erreurs transitoires, telles que les erreurs serveur, les délais d'attente et les connexions interrompues, à 300, environ trois heures de backoff, et supprime le plafond de 15 sur `CLAUDE_CODE_MAX_RETRIES` si vous définissez explicitement cette variable. |443| [`CLAUDE_CODE_RETRY_WATCHDOG`](/docs/fr/env-vars) | non défini | Définissez sur `1` dans les sessions sans surveillance telles que les travaux CI pour réessayer les erreurs de capacité `429` et `529` indéfiniment au lieu d'échouer après `CLAUDE_CODE_MAX_RETRIES` tentatives. Claude Code échoue immédiatement lorsqu'une requête à vitesse standard obtient un `429` qui signale une limite de dépenses ou des crédits d'utilisation épuisés, même un provenant d'un [plafond de dépenses de passerelle](#spend-limit-reached) qui se réinitialise selon un calendrier. Avant v2.1.239, le watchdog réessayait ceux-ci indéfiniment. Pour les requêtes en mode rapide, voir [Handle rate limits](/docs/fr/fast-mode#handle-rate-limits). Sur v2.1.199 ou ultérieur, il augmente également le nombre de tentatives par défaut pour les autres erreurs transitoires, telles que les erreurs serveur, les délais d'attente et les connexions interrompues, à 300, environ trois heures de backoff, et supprime le plafond de 15 sur `CLAUDE_CODE_MAX_RETRIES` si vous définissez explicitement cette variable. |

444| [`CLAUDE_CODE_RETRY_WATCHDOG_MAX_WAIT_MS`](/docs/fr/env-vars) | non défini | Durée maximale en millisecondes pendant laquelle chaque requête API attend la fin des erreurs `429` et `529` lorsque `CLAUDE_CODE_RETRY_WATCHDOG` est défini. Lorsqu'elle n'est pas définie, l'attente n'a pas de limite. Nécessite Claude Code v2.1.295 ou ultérieur. |

442| [`CLAUDE_CODE_OVERLOADED_RETRY_BASE_DELAY_MS`](/docs/fr/env-vars) | 500 | Délai initial en millisecondes du backoff entre les nouvelles tentatives d'une requête que l'API rejette avec une erreur de surcharge `529`. Augmentez-le, jusqu'à 32000, pour répartir les nouvelles tentatives sur une période plus longue lorsque l'API est à pleine capacité. Sans effet lorsque `CLAUDE_CODE_RETRY_WATCHDOG` est défini sur `1`, ou lorsque la requête rejetée a été envoyée en [mode rapide](/docs/fr/fast-mode#handle-rate-limits). Nécessite Claude Code v2.1.292 ou ultérieur. |445| [`CLAUDE_CODE_OVERLOADED_RETRY_BASE_DELAY_MS`](/docs/fr/env-vars) | 500 | Délai initial en millisecondes du backoff entre les nouvelles tentatives d'une requête que l'API rejette avec une erreur de surcharge `529`. Augmentez-le, jusqu'à 32000, pour répartir les nouvelles tentatives sur une période plus longue lorsque l'API est à pleine capacité. Sans effet lorsque `CLAUDE_CODE_RETRY_WATCHDOG` est défini sur `1`, ou lorsque la requête rejetée a été envoyée en [mode rapide](/docs/fr/fast-mode#handle-rate-limits). Nécessite Claude Code v2.1.292 ou ultérieur. |

443| [`API_TIMEOUT_MS`](/docs/fr/env-vars) | 600000 | Délai d'attente par requête en millisecondes. Augmentez-le pour les réseaux lents ou les proxys. Il plafonne également la durée pendant laquelle Claude Code attend les en-têtes de réponse, décrite dans [No response from API](#no-response-from-api). |446| [`API_TIMEOUT_MS`](/docs/fr/env-vars) | 600000 | Délai d'attente par requête en millisecondes. Augmentez-le pour les réseaux lents ou les proxys. Il plafonne également la durée pendant laquelle Claude Code attend les en-têtes de réponse, décrite dans [No response from API](#no-response-from-api). |

444| [`CLAUDE_CODE_NONSTREAMING_TIMEOUT_RETRIES`](/docs/fr/env-vars) | non défini | Limite du nombre de renvois d'une [requête sans streaming](#streaming-response-ended-before-any-complete-data-was-received) qui expire. Une fois la limite atteinte, la requête échoue. Une réponse de Claude dont la génération dure plus longtemps que le délai d'expiration expire de nouveau à chaque renvoi ; définissez donc un nombre faible tel que `0` pour échouer plus tôt. Chaque tentative sans streaming expire après 300 secondes dans une session locale, ou après `API_TIMEOUT_MS` lorsque vous définissez une valeur positive. Nécessite Claude Code v2.1.285 ou ultérieur. |447| [`CLAUDE_CODE_NONSTREAMING_TIMEOUT_RETRIES`](/docs/fr/env-vars) | non défini | Limite du nombre de renvois d'une [requête sans streaming](#streaming-response-ended-before-any-complete-data-was-received) qui expire. Une fois la limite atteinte, la requête échoue. Une réponse de Claude dont la génération dure plus longtemps que le délai d'expiration expire de nouveau à chaque renvoi ; définissez donc un nombre faible tel que `0` pour échouer plus tôt. Chaque tentative sans streaming expire après 300 secondes dans une session locale, ou après `API_TIMEOUT_MS` lorsque vous définissez une valeur positive. Nécessite Claude Code v2.1.285 ou ultérieur. |


3412 3415 

3413Claude Code affiche la même erreur pour tout skill qui [injecte du contexte dynamique](/docs/fr/skills#when-an-injected-command-fails), et une commande injectée en échec interrompt l'invocation de ce skill. Deux messages apparentés se déclenchent avant même l'exécution de la commande :3416Claude Code affiche la même erreur pour tout skill qui [injecte du contexte dynamique](/docs/fr/skills#when-an-injected-command-fails), et une commande injectée en échec interrompt l'invocation de ce skill. Deux messages apparentés se déclenchent avant même l'exécution de la commande :

3414 3417 

3415* `Shell command permission check failed for pattern "..."` : la vérification de permission de la commande ne l'a pas autorisée. [Vérifications de permission sur les commandes injectées](/docs/fr/skills#permission-checks-on-injected-commands) explique quels résultats provoquent une interruption dans chaque mode de permission et comment pré-approuver une commande avec `allowed-tools`3418* `Shell command permission check failed for pattern "..."` : la vérification des permissions de la commande ne l'a pas autorisée. [Vérifications des permissions sur les commandes injectées](/docs/fr/skills#permission-checks-on-injected-commands) décrit quels résultats provoquent l'interruption dans chaque mode de permission et comment pré-approuver une commande avec `allowed-tools`

3416* ``Skill <name> requires bash (`shell: bash` in frontmatter) but Git Bash was not found`` : le frontmatter du skill exige bash sur une machine qui ne l'a pas. Installez Git for Windows ou modifiez le frontmatter en `shell: powershell`. Consultez [Comment s'exécutent les commandes injectées](/docs/fr/skills#how-injected-commands-run)3419* ``Skill <name> requires bash (`shell: bash` in frontmatter) but Git Bash was not found`` : le frontmatter du skill exige bash sur une machine qui n'en dispose pas. Installez Git for Windows ou modifiez le frontmatter en `shell: powershell`. Consultez [Comment les commandes injectées s'exécutent](/docs/fr/skills#how-injected-commands-run)

3417 3420 

3418**Que faire :**3421**Que faire :**

3419 3422 


3562 3565 

3563* **Vous n'avez pas passé de branche de base** : Claude Code a effectué la comparaison avec la branche par défaut du dépôt et suggère de passer explicitement votre branche de base, comme dans l'exemple ci-dessus3566* **Vous n'avez pas passé de branche de base** : Claude Code a effectué la comparaison avec la branche par défaut du dépôt et suggère de passer explicitement votre branche de base, comme dans l'exemple ci-dessus

3564* **Vous avez passé une branche de base déjà présente dans votre clone** : l'indication est ``Make sure <branch> exists locally or on origin (try `git fetch origin <branch>`)``3567* **Vous avez passé une branche de base déjà présente dans votre clone** : l'indication est ``Make sure <branch> exists locally or on origin (try `git fetch origin <branch>`)``

3565* **Vous avez passé une branche de base absente de votre clone** : Claude Code l'a récupérée depuis origin avant la comparaison. L'indication est ``<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>`)`` ; lorsque Claude Code ne peut pas déterminer si votre clone est superficiel, il suggère plutôt `git fetch --unshallow origin`. Avant la v2.1.221, l'indication suggérait `git fetch --unshallow origin` pour chaque branche de base récupérée, et sur un clone complet cette commande échoue avec `fatal: --unshallow on a complete repository does not make sense`.3568* **Vous avez passé une branche de base qui ne se trouvait pas dans votre clone** : Claude Code l'a récupérée depuis origin avant la comparaison. L'indication est ``<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>`)`` ; lorsque Claude Code ne peut pas déterminer si votre clone est superficiel, il suggère `git fetch --unshallow origin` à la place. Avant la v2.1.221, l'indication suggérait `git fetch --unshallow origin` pour toute branche de base récupérée, et sur un clone complet cette commande échoue avec `fatal: --unshallow on a complete repository does not make sense`.

3566 3569 

3567**Que faire :**3570**Que faire :**

3568 3571 


3816 3819 

3817* Dans une session démarrée sans ces restrictions, exécutez `/tui fullscreen`, ou `/tui default` pour revenir en arrière. Claude Code y enregistre le [paramètre `tui`](/docs/fr/settings-reference#tui)3820* Dans une session démarrée sans ces restrictions, exécutez `/tui fullscreen`, ou `/tui default` pour revenir en arrière. Claude Code y enregistre le [paramètre `tui`](/docs/fr/settings-reference#tui)

3818 3821 

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

3823 Claude Code couldn't restart

3824</h3>

3825 

3826Claude Code était en train de redémarrer, par exemple pour activer ou désactiver le rendu plein écran après que vous avez exécuté [`/tui`](/docs/fr/fullscreen#enable-fullscreen-rendering). Il a fermé la session mais n'a pas pu démarrer le nouveau processus ; il a donc affiché ce message et s'est terminé avec le statut 1 :

3827 

3828```text theme={null}

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

3830```

3831 

3832Lorsque le redémarrage n'avait aucune conversation à rouvrir, par exemple parce que `/tui` était votre première saisie dans une nouvelle session, le message est `Claude Code couldn't restart. Start Claude Code again.`

3833 

3834**Que faire :**

3835 

3836* Exécutez à nouveau `claude` dans votre shell depuis le même répertoire. Si le message indiquait que votre conversation est enregistrée, exécutez [`/resume`](/docs/fr/sessions#resume-a-session) dans la nouvelle session et sélectionnez-la

3837* Si les redémarrages continuent d'échouer, démarrez Claude Code depuis votre shell avec [`claude --debug-file claude-debug.log`](/docs/fr/cli-reference#cli-flags). Si un redémarrage depuis cette session échoue, le fichier `claude-debug.log` situé dans le répertoire de démarrage consigne une ligne `Failed to relaunch:` contenant l'erreur du système d'exploitation. Incluez cette ligne lorsque vous [signalez le problème](#report-an-error)

3838 

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

3820 Impossible d'ouvrir Claude Desktop3840 Impossible d'ouvrir Claude Desktop

3821</h3>3841</h3>


4752 Commande bloquée par les vérifications d'isolation worktree4772 Commande bloquée par les vérifications d'isolation worktree

4753</h3>4773</h3>

4754 4774 

4755Claude a exécuté une commande Bash ou Monitor dans une [session isolée dans un worktree](/docs/fr/worktrees#how-claude-code-enforces-isolation), et Claude Code l'a refusée pour l'une de deux raisons :4775Claude a exécuté une commande Bash, [PowerShell](/docs/fr/tools-reference#powershell-tool) ou [Monitor](/docs/fr/tools-reference#monitor-tool) dans une [session isolée dans un worktree](/docs/fr/worktrees#how-claude-code-enforces-isolation), et Claude Code l'a refusée pour l'une de ces raisons :

4756 4776 

4757* La commande pointe git vers le checkout principal.4777* La commande s'exécuterait dans le checkout principal ou dans un autre worktree. Le message indique que son répertoire de travail `resolved to the shared checkout` ou `is in a different worktree`.

4758* Claude Code ne peut pas vérifier à partir du texte de la commande que tout git que la commande exécute reste à l'intérieur du worktree. Une commande qui ne nomme jamais git peut toujours être refusée pour cette raison, car l'expansion d'une indirection de variable telle que `${!name}` ou l'exécution d'une substitution de fonction Bash telle que `${ command; }` produit une valeur à l'exécution qui peut elle-même être une commande.4778* Une commande Bash ou Monitor pointe git vers le checkout principal.

4779* Claude Code ne peut pas vérifier à partir du texte d'une commande Bash ou Monitor que tout git que la commande exécute reste à l'intérieur du worktree. Une commande qui ne nomme jamais git peut toujours être refusée pour cette raison, car l'expansion d'une indirection de variable telle que `${!name}` ou l'exécution d'une substitution de fonction Bash telle que `${ command; }` produit une valeur à l'exécution qui peut elle-même être une commande.

4759 4780 

4760Le milieu du message nomme ce qui n'a pas pu être vérifié :4781Le message indique `is isolated in the worktree <path>, but this command`, suivi de la raison, par exemple une commande dont Claude Code n'a pas pu vérifier le texte :

4761 4782 

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

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


4765 4786 

4766**Ce qu'il faut faire :**4787**Ce qu'il faut faire :**

4767 4788 

4768* Généralement rien : Claude lit le message et réécrit la commande de la manière que sa phrase finale demande4789* **Git pointé vers le checkout principal, ou texte de commande impossible à vérifier** : rien. Claude lit le message et réécrit la commande de la manière que sa phrase finale demande. Si une commande que vous avez demandée continue d'être refusée à cause d'une expansion dans son texte, orthographiez la valeur signalée littéralement et exécutez git comme sa propre commande simple à partir de l'intérieur du worktree

4769* Si une commande que vous avez demandée continue d'être refusée, orthographiez la valeur signalée littéralement : remplacez l'indirection ou la substitution par sa valeur, et exécutez git comme sa propre commande simple à partir de l'intérieur du worktree

4770* Pour agir sur le checkout principal à dessein, exécutez la commande vous-même dans un terminal en dehors de la session4790* Pour agir sur le checkout principal à dessein, exécutez la commande vous-même dans un terminal en dehors de la session

4771 4791 

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


4946* Ou reprenez avec `--agent <name>` nommant un agent qui existe, pour exécuter la session en tant que cet agent à la place4966* Ou reprenez avec `--agent <name>` nommant un agent qui existe, pour exécuter la session en tant que cet agent à la place

4947* Si l'agent est limité au projet et vous n'avez pas approuvé le répertoire original de la session, exécutez Claude Code là une fois, acceptez le dialogue de confiance, puis reprenez à nouveau4967* Si l'agent est limité au projet et vous n'avez pas approuvé le répertoire original de la session, exécutez Claude Code là une fois, acceptez le dialogue de confiance, puis reprenez à nouveau

4948 4968 

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

4970 Cette session a redémarré après l'échéance de son prochain réveil /loop

4971</h3>

4972 

4973Une [boucle `/loop` à rythme autonome](/docs/fr/scheduled-tasks#let-claude-choose-the-interval) dans une [session en arrière-plan](/docs/fr/agent-view) s'est arrêtée. Le processus de la session s'est terminé pendant que la boucle attendait son prochain réveil, et ce réveil est arrivé à échéance avant le démarrage du [processus suivant](/docs/fr/agent-view#the-supervisor-process) de la session. Le réveil manqué ne se déclenche pas en retard. La notification indique le retard du réveil au moment où la session a redémarré :

4974 

4975```text theme={null}

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

4977```

4978 

4979Avant v2.1.295, la boucle s'arrêtait dans cette situation sans notification.

4980 

4981**Ce qu'il faut faire :**

4982 

4983* Pour continuer la boucle, [répondez à la session](/docs/fr/agent-view#peek-and-reply) en le précisant, par exemple `keep the loop running`. Claude lit la notification avec votre réponse et peut planifier le prochain réveil

4984* Si vous en avez terminé avec la boucle, ne faites rien. Elle s'est déjà arrêtée

4985 

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

4950 Erreurs du lanceur CLAUDE\_CODE\_PROCESS\_WRAPPER4987 Erreurs du lanceur CLAUDE\_CODE\_PROCESS\_WRAPPER

4951</h3>4988</h3>

headless.md +21 −19

Details

89* **Surveillances [Monitor](/docs/fr/tools-reference#monitor-tool)** : l'exécution attend jusqu'à ce que la surveillance expire ou que la limite de 10 minutes mette fin à l'attente, selon ce qui arrive en premier. Pendant l'attente, Claude continue de répondre à ce que la surveillance signale. Par défaut, une surveillance expire cinq minutes après que Claude l'a démarrée.89* **Surveillances [Monitor](/docs/fr/tools-reference#monitor-tool)** : l'exécution attend jusqu'à ce que la surveillance expire ou que la limite de 10 minutes mette fin à l'attente, selon ce qui arrive en premier. Pendant l'attente, Claude continue de répondre à ce que la surveillance signale. Par défaut, une surveillance expire cinq minutes après que Claude l'a démarrée.

90* **Réveils en attente** : dans une exécution dont vous avez passé le prompt sous forme de texte plutôt qu'avec `--input-format stream-json`, lorsque Claude a planifié un [réveil `/loop` à son propre rythme](/docs/fr/scheduled-tasks#let-claude-choose-the-interval), l'exécution attend que chaque réveil se déclenche et exécute son itération jusqu'à la [fin de la boucle](/docs/fr/scheduled-tasks#stop-a-loop), même au-delà de la limite de 10 minutes.90* **Réveils en attente** : dans une exécution dont vous avez passé le prompt sous forme de texte plutôt qu'avec `--input-format stream-json`, lorsque Claude a planifié un [réveil `/loop` à son propre rythme](/docs/fr/scheduled-tasks#let-claude-choose-the-interval), l'exécution attend que chaque réveil se déclenche et exécute son itération jusqu'à la [fin de la boucle](/docs/fr/scheduled-tasks#stop-a-loop), même au-delà de la limite de 10 minutes.

91 91 

92Lorsque stderr est un terminal et que l'exécution a attendu cinq secondes, Claude Code affiche sur stderr une ligne qui commence par `Waiting for background work to finish` et nomme le travail concerné. Avec une [sortie `json` ou `stream-json`](#get-structured-output), la ligne ne s'affiche que lorsque stdout n'est pas un terminal, de sorte que le JSON lu par votre script ne la contient jamais.

93 

92Si l'exécution atteint sa limite [`--max-budget-usd`](/docs/fr/cli-reference#cli-flags), Claude Code arrête le travail en arrière-plan restant au lieu d'attendre.94Si l'exécution atteint sa limite [`--max-budget-usd`](/docs/fr/cli-reference#cli-flags), Claude Code arrête le travail en arrière-plan restant au lieu d'attendre.

93 95 

94Lorsque le travail en arrière-plan démarre un autre tour, l'exécution affiche le résultat de chaque tour avec la sortie `text` par défaut, et le résultat du dernier tour avec la sortie `json`. Avant la v2.1.295, l'exécution n'affichait également que le résultat du dernier tour avec la sortie `text`.96Lorsque le travail en arrière-plan démarre un autre tour, l'exécution affiche le résultat de chaque tour avec la sortie `text` par défaut, et le résultat du dernier tour avec la sortie `json`. Avant la v2.1.295, l'exécution n'affichait également que le résultat du dernier tour avec la sortie `text`.


133Avec `--output-format json`, la charge utile de réponse inclut `total_cost_usd` et une ventilation des coûts par modèle, afin que les appelants scriptés puissent suivre les dépenses sans consulter le [tableau de bord d'utilisation](/docs/fr/costs). Lorsque vous continuez une conversation antérieure avec `--continue` ou `--resume`, l'exécution rapporte le total de la conversation, [les dépenses des exécutions antérieures incluses](/docs/fr/agent-sdk/cost-tracking#accumulate-costs-across-multiple-calls). Les deux chiffres sont des [estimations côté client](/docs/fr/agent-sdk/cost-tracking) et peuvent différer de votre facture réelle.135Avec `--output-format json`, la charge utile de réponse inclut `total_cost_usd` et une ventilation des coûts par modèle, afin que les appelants scriptés puissent suivre les dépenses sans consulter le [tableau de bord d'utilisation](/docs/fr/costs). Lorsque vous continuez une conversation antérieure avec `--continue` ou `--resume`, l'exécution rapporte le total de la conversation, [les dépenses des exécutions antérieures incluses](/docs/fr/agent-sdk/cost-tracking#accumulate-costs-across-multiple-calls). Les deux chiffres sont des [estimations côté client](/docs/fr/agent-sdk/cost-tracking) et peuvent différer de votre facture réelle.

134 136 

135<Note>137<Note>

136 L'entrée stdin transmise est limitée à 10 Mo. Si vous dépassez la limite, Claude Code se ferme avec une erreur claire et un statut non nul. Pour travailler avec des entrées plus volumineuses, écrivez le contenu dans un fichier et référencez le chemin du fichier dans votre invite au lieu de le transmettre.138 L'entrée stdin transmise est limitée à 10 Mo. Si vous dépassez la limite, Claude Code se ferme avec une erreur claire et un statut non nul. Pour travailler avec des entrées plus volumineuses, écrivez le contenu dans un fichier et référencez le chemin du fichier dans votre prompt au lieu de le transmettre.

137</Note>139</Note>

138 140 

139Si Claude Code ne peut pas lire stdin, par exemple parce que le processus qui l'a démarré a déconnecté son extrémité, Claude Code imprime un avertissement sur stderr et continue avec l'invite de la ligne de commande. Avant la v2.1.211, une stdin illisible sur Windows plantait la session ou la fermait silencieusement sans sortie.141Si Claude Code ne peut pas lire stdin, par exemple parce que le processus qui l'a démarré a déconnecté son extrémité, Claude Code imprime un avertissement sur stderr et continue avec le prompt de la ligne de commande. Avant la v2.1.211, une stdin illisible sur Windows plantait la session ou la fermait silencieusement sans sortie.

140 142 

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

142 Ajouter Claude à un script de compilation144 Ajouter Claude à un script de compilation


203 Réponses en streaming205 Réponses en streaming

204</h3>206</h3>

205 207 

206Utilisez `--output-format stream-json` avec `--verbose` et `--include-partial-messages` pour recevoir les jetons au fur et à mesure qu'ils sont générés. Chaque ligne est un objet JSON représentant un événement :208Utilisez `--output-format stream-json` avec `--verbose` et `--include-partial-messages` pour recevoir les tokens au fur et à mesure qu'ils sont générés. Chaque ligne est un objet JSON représentant un événement :

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


257 Gérer les tentatives d'API259 Gérer les tentatives d'API

258</h4>260</h4>

259 261 

260Lorsqu'une requête API échoue avec une erreur réessayable, Claude Code émet un événement `system/api_retry` avant de réessayer. Sur la v2.1.246 ou ultérieur, lorsqu'un `401` ou `403` rejette une credential [`apiKeyHelper`](/docs/fr/settings-reference#apikeyhelper), Claude Code effectue les deux premières tentatives silencieusement sans événement, puis émet l'événement comme d'habitude à partir de la troisième tentative consécutive. Les tentatives silencieuses comptent toujours vers `attempt`. Vous pouvez utiliser l'événement pour afficher la progression des tentatives dans votre propre interface.262Lorsqu'une requête API échoue avec une erreur réessayable, Claude Code émet un événement `system/api_retry` avant de réessayer. Sur la v2.1.246 ou ultérieur, lorsqu'un `401` ou `403` rejette des identifiants [`apiKeyHelper`](/docs/fr/settings-reference#apikeyhelper), Claude Code effectue les deux premières tentatives silencieusement sans événement, puis émet l'événement comme d'habitude à partir de la troisième tentative consécutive. Les tentatives silencieuses comptent toujours vers `attempt`. Vous pouvez utiliser l'événement pour afficher la progression des tentatives dans votre propre interface.

261 263 

262| Champ | Type | Description |264| Champ | Type | Description |

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


296 298 

297Lorsqu'un répertoire ou une archive `--plugin-dir` lui-même échoue à se charger, son entrée `plugin_errors` inclut le chemin absolu résolu en tant que `path`. Utilisez-le pour déterminer lequel de plusieurs valeurs `--plugin-dir` a échoué. Le champ `path` nécessite Claude Code v2.1.283 ou ultérieur.299Lorsqu'un répertoire ou une archive `--plugin-dir` lui-même échoue à se charger, son entrée `plugin_errors` inclut le chemin absolu résolu en tant que `path`. Utilisez-le pour déterminer lequel de plusieurs valeurs `--plugin-dir` a échoué. Le champ `path` nécessite Claude Code v2.1.283 ou ultérieur.

298 300 

299Utilisez les champs du serveur MCP de la même manière. Lorsque vous passez [`--mcp-config`](/docs/fr/cli-reference#cli-flags) avec `-p`, Claude Code attend les serveurs toujours en attente avant d'exécuter le premier tour, jusqu'au délai d'expiration de démarrage [`MCP_TIMEOUT`](/docs/fr/env-vars), 30 secondes par défaut. Un serveur distant avec une [liste d'outils mise en cache](/docs/fr/agent-sdk/mcp#connection-timing) ignore l'attente, affiche `pending` dans `system/init` et se connecte lors de son premier appel d'outil. L'attente nécessite Claude Code v2.1.221 ou ultérieur.301Utilisez les champs du serveur MCP de la même manière. Lorsque vous passez [`--mcp-config`](/docs/fr/cli-reference#cli-flags) avec `-p`, Claude Code attend les serveurs toujours en attente avant d'exécuter le premier tour, jusqu'au délai d'expiration de démarrage [`MCP_TIMEOUT`](/docs/fr/env-vars), 30 secondes par défaut. Un serveur distant avec une [liste d'outils mise en cache](/docs/fr/agent-sdk/mcp#connection-timing) ignore l'attente, affiche `pending` dans `system/init` et se connecte lors de son premier appel d'outil. Dans un [environnement auto-hébergé](/docs/fr/self-hosted-environments-configuration#connection-timing), une attente plus courte s'applique à la place. L'attente nécessite Claude Code v2.1.221 ou ultérieur.

300 302 

301Claude Code valide chaque entrée `--mcp-config` au démarrage et ignore les entrées qui échouent la validation, par exemple une entrée `url` sans `type`. L'exécution continue et se ferme correctement, vérifiez donc ces champs pour détecter un serveur qui ne s'est jamais chargé :303Claude Code valide chaque entrée `--mcp-config` au démarrage et ignore les entrées qui échouent la validation, par exemple une entrée `url` sans `type`. L'exécution continue et se ferme correctement, vérifiez donc ces champs pour détecter un serveur qui ne s'est jamais chargé :

302 304 


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

318| `type` | `"system"` | type de message |320| `type` | `"system"` | type de message |

319| `subtype` | `"plugin_install"` | identifie ceci comme un événement d'installation de plugin |321| `subtype` | `"plugin_install"` | identifie ceci comme un événement d'installation de plugin |

320| `status` | `"started"`, `"installed"`, `"failed"` ou `"completed"` | `started` et `completed` encadrent l'installation globale ; `installed` et `failed` rapportent les marketplaces individuels |322| `status` | `"started"`, `"installed"`, `"failed"` ou `"completed"` | `started` et `completed` encadrent l'installation globale ; `installed` et `failed` rapportent les marketplaces individuelles |

321| `name` | chaîne, optionnel | nom du marketplace, présent sur `installed` et `failed` |323| `name` | chaîne, optionnel | nom de la marketplace, présent sur `installed` et `failed` |

322| `error` | chaîne, optionnel | message d'échec, présent sur `failed` |324| `error` | chaîne, optionnel | message d'échec, présent sur `failed` |

323| `uuid` | chaîne | identifiant d'événement unique |325| `uuid` | chaîne | identifiant d'événement unique |

324| `session_id` | chaîne | session à laquelle appartient l'événement |326| `session_id` | chaîne | session à laquelle appartient l'événement |


338 340 

339* **`auto`** : passez `--permission-mode auto` pour qu'un classificateur examine la plupart des actions au lieu de vous341* **`auto`** : passez `--permission-mode auto` pour qu'un classificateur examine la plupart des actions au lieu de vous

340* **`dontAsk`** : Claude Code refuse chaque appel qui demanderait autrement, ce qui est utile pour les exécutions CI verrouillées. Les actions qui n'ont pas besoin d'approbation en mode Manual s'exécutent toujours, telles que les lectures de fichiers dans vos répertoires de travail et l'[ensemble de commandes en lecture seule](/docs/fr/permissions#read-only-commands), ainsi que les actions que vos entrées `--allowedTools` ou les règles `permissions.allow` couvrent. `AskUserQuestion`, les outils de connecteur [que votre organisation a définis sur `ask`](/docs/fr/mcp#organization-controls-on-connector-tools), et les outils MCP marqués [`requiresUserInteraction`](/docs/fr/mcp#require-approval-for-a-specific-tool) sont refusés même lorsqu'une règle d'autorisation correspond342* **`dontAsk`** : Claude Code refuse chaque appel qui demanderait autrement, ce qui est utile pour les exécutions CI verrouillées. Les actions qui n'ont pas besoin d'approbation en mode Manual s'exécutent toujours, telles que les lectures de fichiers dans vos répertoires de travail et l'[ensemble de commandes en lecture seule](/docs/fr/permissions#read-only-commands), ainsi que les actions que vos entrées `--allowedTools` ou les règles `permissions.allow` couvrent. `AskUserQuestion`, les outils de connecteur [que votre organisation a définis sur `ask`](/docs/fr/mcp#organization-controls-on-connector-tools), et les outils MCP marqués [`requiresUserInteraction`](/docs/fr/mcp#require-approval-for-a-specific-tool) sont refusés même lorsqu'une règle d'autorisation correspond

341* **`acceptEdits`** : Claude écrit les fichiers sans demander, et Claude Code approuve automatiquement les commandes de système de fichiers courants telles que `mkdir`, `touch`, `mv` et `cp`. Les [actions qu'aucun mode n'approuve automatiquement](/docs/fr/permission-modes#actions-no-mode-auto-approves) s'appliquent toujours. Hormis l'ensemble de commandes en lecture seule, les autres commandes shell et requêtes réseau ont toujours besoin d'une entrée `--allowedTools` ou d'une règle `permissions.allow`. Consultez [ce que `acceptEdits` approuve automatiquement](/docs/fr/permission-modes#auto-approve-file-edits-with-acceptedits-mode) pour la liste complète343* **`acceptEdits`** : Claude écrit les fichiers sans demander, et Claude Code approuve automatiquement les commandes de système de fichiers courantes telles que `mkdir`, `touch`, `mv` et `cp`. Les [actions qu'aucun mode n'approuve automatiquement](/docs/fr/permission-modes#actions-no-mode-auto-approves) s'appliquent toujours. Hormis l'ensemble de commandes en lecture seule, les autres commandes shell et requêtes réseau ont toujours besoin d'une entrée `--allowedTools` ou d'une règle `permissions.allow`. Consultez [ce que `acceptEdits` approuve automatiquement](/docs/fr/permission-modes#auto-approve-file-edits-with-acceptedits-mode) pour la liste complète

342 344 

343Cet exemple applique les corrections de lint avec `acceptEdits` comme base de référence :345Cet exemple applique les corrections de lint avec `acceptEdits` comme base de référence :

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 Désactiver les invites de permission dans les exécutions sans surveillance352 Désactiver les demandes de permission dans les exécutions sans surveillance

351</h3>353</h3>

352 354 

353Passez `--permission-prompts none` lorsque personne n'est disponible pour répondre aux invites de permission, par exemple dans une tâche planifiée. L'indicateur est plus important lorsque votre exécution a un hôte de permission : une application Agent SDK avec un rappel [`canUseTool`](/docs/fr/agent-sdk/user-input), ou un outil MCP que vous passez avec [`--permission-prompt-tool`](/docs/fr/cli-reference#cli-flags). Sans l'indicateur, votre exécution attend que cet hôte réponde à chaque demande de permission.355Passez `--permission-prompts none` lorsque personne n'est disponible pour répondre aux demandes de permission, par exemple dans une tâche planifiée. Le flag est plus important lorsque votre exécution a un hôte de permission : une application Agent SDK avec un rappel [`canUseTool`](/docs/fr/agent-sdk/user-input), ou un outil MCP que vous passez avec [`--permission-prompt-tool`](/docs/fr/cli-reference#cli-flags). Sans le flag, votre exécution attend que cet hôte réponde à chaque demande de permission.

354 356 

355Avec l'indicateur, votre exécution ne consulte pas l'hôte et n'attend pas. Tout ce qui demanderait est refusé sauf si un hook `PermissionRequest` l'autorise, Claude est informé que personne ne peut approuver la demande et ne pas la réessayer, et l'exécution continue. Dans une exécution `-p` sans hôte, ces demandes sont refusées de toute façon, et l'indicateur indique également à Claude de ne pas les réessayer. Les règles de permission, les hooks [`PermissionRequest`](/docs/fr/hooks#permissionrequest) et le mode de permission que vous définissez décident toujours de chaque appel en premier ; Claude Code refuse uniquement les demandes que rien d'autre ne résout.357Avec le flag, votre exécution ne consulte pas l'hôte et n'attend pas. Tout ce qui demanderait est refusé sauf si un hook `PermissionRequest` l'autorise, Claude est informé que personne ne peut approuver la demande et ne pas la réessayer, et l'exécution continue. Dans une exécution `-p` sans hôte, ces demandes sont refusées de toute façon, et le flag indique également à Claude de ne pas les réessayer. Les règles de permission, les hooks [`PermissionRequest`](/docs/fr/hooks#permissionrequest) et le mode de permission que vous définissez décident toujours de chaque appel en premier ; Claude Code refuse uniquement les demandes que rien d'autre ne résout.

356 358 

357Cet exemple exécute une tâche sans surveillance en [mode auto](/docs/fr/permission-modes#eliminate-prompts-with-auto-mode). Le classificateur examine chaque action comme d'habitude, et Claude Code refuse tout ce qui aurait autrement entraîné une invite :359Cet exemple exécute une tâche sans surveillance en [mode auto](/docs/fr/permission-modes#eliminate-prompts-with-auto-mode). Le classificateur examine chaque action comme d'habitude, et Claude Code refuse tout ce qui aurait autrement entraîné une demande de permission :

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


365Avec `--output-format stream-json`, les refus apparaissent sous forme de messages système `permission_denied`, et le message de résultat final les énumère dans `permission_denials`.367Avec `--output-format stream-json`, les refus apparaissent sous forme de messages système `permission_denied`, et le message de résultat final les énumère dans `permission_denials`.

366 368 

367<Note>369<Note>

368 L'indicateur `--permission-prompts` nécessite Claude Code v2.1.259 ou ultérieur. Les versions antérieures le rejettent avec une erreur d'option inconnue.370 Le flag `--permission-prompts` nécessite Claude Code v2.1.259 ou ultérieur. Les versions antérieures le rejettent avec une erreur d'option inconnue.

369</Note>371</Note>

370 372 

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

372 Créer un commit374 Créer un commit

373</h3>375</h3>

374 376 

375Cet exemple examine les modifications mises en scène et crée un commit avec un message approprié :377Cet exemple examine les modifications indexées et crée un commit avec un message approprié :

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 

382L'indicateur `--allowedTools` utilise la [syntaxe de règle de permission](/docs/fr/settings-reference#permission-rule-syntax). Le ` *` de fin active la correspondance de préfixe, donc `Bash(git diff *)` autorise toute commande commençant par `git diff`. L'espace avant `*` est important : sans lui, `Bash(git diff*)` correspondrait également à `git diff-index`.384Le flag `--allowedTools` utilise la [syntaxe de règle de permission](/docs/fr/settings-reference#permission-rule-syntax). Le ` *` de fin active la correspondance de préfixe, donc `Bash(git diff *)` autorise toute commande commençant par `git diff`. L'espace avant `*` est important : sans lui, `Bash(git diff*)` correspondrait également à `git diff-index`.

383 385 

384<Note>386<Note>

385 Le support des commandes diffère en mode `-p` :387 Le support des commandes diffère en mode `-p` :

386 388 

387 * Les [compétences](/docs/fr/skills) invoquées par l'utilisateur et les commandes personnalisées fonctionnent. Incluez `/skill-name` dans la chaîne d'invite et Claude Code l'étend avant d'exécuter.389 * Les [skills](/docs/fr/skills) invoqués par l'utilisateur et les commandes personnalisées fonctionnent. Incluez `/skill-name` dans la chaîne du prompt et Claude Code l'étend avant d'exécuter.

388 * Les commandes intégrées qui ne s'exécutent que dans l'interface du terminal, telles que `/login`, ne sont pas disponibles.390 * Les commandes intégrées qui ne s'exécutent que dans l'interface du terminal, telles que `/login`, ne sont pas disponibles.

389 * `/model`, `/effort`, `/fast`, `/color` et `/rename` acceptent la valeur comme argument, par exemple `/model sonnet`, et `/mcp` sans argument imprime un résumé textuel du statut du serveur. Ces formes nécessitent Claude Code v2.1.205 ou ultérieur et suivent les [notes de disponibilité de chaque commande](/docs/fr/commands#all-commands).391 * `/model`, `/effort`, `/fast`, `/color` et `/rename` acceptent la valeur comme argument, par exemple `/model sonnet`, et `/mcp` sans argument imprime un résumé textuel du statut du serveur. Ces formes nécessitent Claude Code v2.1.205 ou ultérieur et suivent les [notes de disponibilité de chaque commande](/docs/fr/commands#all-commands).

390 * Pour modifier un paramètre, passez `key=value` à `/config`, par exemple `/config thinking=false`.392 * Pour modifier un paramètre, passez `key=value` à `/config`, par exemple `/config thinking=false`.


392</Note>394</Note>

393 395 

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

395 Personnaliser l'invite système397 Personnaliser le prompt système

396</h3>398</h3>

397 399 

398Utilisez `--append-system-prompt` pour ajouter des instructions tout en conservant le comportement par défaut de Claude Code. Cet exemple transmet un diff PR à Claude et lui demande de vérifier les vulnérabilités de sécurité. Enregistrez-le en tant que script shell, par exemple `review.sh` :400Utilisez `--append-system-prompt` pour ajouter des instructions tout en conservant le comportement par défaut de Claude Code. Cet exemple transmet un diff PR à Claude et lui demande de vérifier les vulnérabilités de sécurité. Enregistrez-le en tant que script shell, par exemple `review.sh` :


405 407 

406Dans le script, `"$1"` représente le premier argument que vous passez sur la ligne de commande. Exécutez `bash review.sh 123` et le shell remplace `"$1"` par `123`, donc le script récupère le diff pour la PR 123. Claude Code imprime l'examen en JSON, avec le texte dans le champ `result`.408Dans le script, `"$1"` représente le premier argument que vous passez sur la ligne de commande. Exécutez `bash review.sh 123` et le shell remplace `"$1"` par `123`, donc le script récupère le diff pour la PR 123. Claude Code imprime l'examen en JSON, avec le texte dans le champ `result`.

407 409 

408Consultez les [indicateurs d'invite système](/docs/fr/cli-reference#system-prompt-flags) pour plus d'options, y compris `--system-prompt` pour remplacer complètement l'invite par défaut.410Consultez les [flags de prompt système](/docs/fr/cli-reference#system-prompt-flags) pour plus d'options, y compris `--system-prompt` pour remplacer complètement le prompt par défaut.

409 411 

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

411 Continuer les conversations413 Continuer les conversations

412</h3>414</h3>

413 415 

414Utilisez `--continue` pour continuer la conversation la plus récente, ou `--resume` avec un ID de session pour continuer une conversation spécifique. Sur Claude Code v2.1.257 ou ultérieur, lorsque vous passez `--continue`, Claude Code ouvre une [session en arrière-plan](/docs/fr/sessions#resume-a-session) qui a terminé, mais pas une qui s'exécute toujours. Cet exemple exécute un examen, puis envoie des invites de suivi :416Utilisez `--continue` pour continuer la conversation la plus récente, ou `--resume` avec un ID de session pour continuer une conversation spécifique. Sur Claude Code v2.1.257 ou ultérieur, lorsque vous passez `--continue`, Claude Code ouvre une [session en arrière-plan](/docs/fr/sessions#resume-a-session) qui a terminé, mais pas une qui s'exécute toujours. Cet exemple exécute un examen, puis envoie des prompts de suivi :

415 417 

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

417# First request419# First request

Details

132Le runner et ses sessions établissent plusieurs types de connexion sortante, et aucune connectivité entrante d'Anthropic n'est requise :132Le runner et ses sessions établissent plusieurs types de connexion sortante, et aucune connectivité entrante d'Anthropic n'est requise :

133 133 

134* **Plan de contrôle** : le runner interroge `api.anthropic.com` pour le travail et publie les événements de progression de configuration et d'échec, tous HTTPS sortants. L'interrogation sert également de battement cardiaque du runner.134* **Plan de contrôle** : le runner interroge `api.anthropic.com` pour le travail et publie les événements de progression de configuration et d'échec, tous HTTPS sortants. L'interrogation sert également de battement cardiaque du runner.

135* **Connecteur SCM** : l'orchestrateur optionnel [connecteur SCM](/docs/fr/self-hosted-environments-reference#scm-connector-flags) tunnel est la seule connexion WebSocket.135* **Git** : le runner clone à partir de votre hôte git et y pousse sur HTTPS ou SSH, authentifié avec les identifiants que votre déploiement fournit. Consultez [Configurer git](/docs/fr/self-hosted-environments-deploy#configure-git) pour les options, y compris les identifiants générés par session. Avec le [proxy git Anthropic](/docs/fr/self-hosted-environments-deploy#use-the-anthropic-git-proxy), le trafic git pour les dépôts sur github.com passe plutôt par `api.anthropic.com`.

136* **Git** : le runner clone à partir de et pousse vers votre hôte git sur HTTPS ou SSH, authentifié avec les identifiants que votre déploiement fournit ; [Configurer git](/docs/fr/self-hosted-environments-deploy#configure-git) couvre les options, y compris les identifiants frappés par session et la [passerelle git Anthropic](/docs/fr/self-hosted-environments-deploy#use-the-anthropic-git-proxy), qui route git via `api.anthropic.com` à la place.136* **Enfant de session** : le processus Claude Code enfant maintient le flux d'événements de la session à `api.anthropic.com`, et fait ses propres appels sortants pour l'inférence du modèle et pour les commandes git exécutées pendant la session. Dans une session qui utilise [git géré par Anthropic](/docs/fr/self-hosted-environments-deploy#use-the-anthropic-git-proxy), l'enfant envoie son trafic `git` et `gh` pour github.com via une connexion WebSocket qu'il ouvre vers `api.anthropic.com`.

137* **Enfant de session** : le processus Claude Code enfant maintient le flux d'événements de la session à `api.anthropic.com`, et fait ses propres appels sortants pour l'inférence du modèle et pour les commandes git exécutées pendant la session. Consultez [Exigences réseau](/docs/fr/self-hosted-environments-deploy#network-requirements) pour la liste complète des sorties. Le [diagramme ci-dessus](#how-self-hosted-environments-work) montre ces chemins, à part le connecteur SCM optionnel.137* **Connecteur SCM** : le [connecteur SCM](/docs/fr/self-hosted-environments-reference#scm-connector-flags) optionnel de l'orchestrateur n'est pas disponible, donc son tunnel ne s'ouvre pas. Le tunnel est une connexion WebSocket vers `api.anthropic.com`.

138 

139Consultez [Exigences réseau](/docs/fr/self-hosted-environments-deploy#network-requirements) pour la liste complète des sorties. Le [diagramme ci-dessus](#how-self-hosted-environments-work) montre ces chemins, à part le connecteur SCM optionnel et la connexion git gérée par Anthropic.

138 140 

139Par défaut, l'inférence du modèle utilise l'API Anthropic. Le plan de contrôle livre l'endpoint de l'API à chaque session, et la session s'authentifie avec un jeton OAuth émis par Anthropic et limité à la session. Pour envoyer plutôt les requêtes de modèle vers votre propre compte cloud, consultez [Envoyer les requêtes de modèle vers Bedrock ou Agent Platform](/docs/fr/self-hosted-environments-configuration#send-model-requests-to-bedrock-or-agent-platform).141Par défaut, l'inférence du modèle utilise l'API Anthropic. Le plan de contrôle livre l'endpoint de l'API à chaque session, et la session s'authentifie avec un jeton OAuth émis par Anthropic et limité à la session. Pour envoyer plutôt les requêtes de modèle vers votre propre compte cloud, consultez [Envoyer les requêtes de modèle vers Bedrock ou Agent Platform](/docs/fr/self-hosted-environments-configuration#send-model-requests-to-bedrock-or-agent-platform).

140 142 

Details

31| Variable | Description |31| Variable | Description |

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

33| `CLAUDE_CODE_SESSION_ACCESS_TOKEN` | Le JWT de session, préfixé `sk-ant-cc-`. Sa revendication `act` identifie le créateur de la session, avec l'email du créateur quand la surface de création l'a enregistré. La valeur est le token au moment du spawn ; les actualisations arrivent sur stdin de l'enfant, donc un wrapper ne voit que la valeur initiale. Voir [Vérifier l'identité de la session](/docs/fr/self-hosted-environments-identity). |33| `CLAUDE_CODE_SESSION_ACCESS_TOKEN` | Le JWT de session, préfixé `sk-ant-cc-`. Sa revendication `act` identifie le créateur de la session, avec l'email du créateur quand la surface de création l'a enregistré. La valeur est le token au moment du spawn ; les actualisations arrivent sur stdin de l'enfant, donc un wrapper ne voit que la valeur initiale. Voir [Vérifier l'identité de la session](/docs/fr/self-hosted-environments-identity). |

34| `CCR_SESSION_ACCOUNT_EMAIL` | L'email du créateur de la session, pré-extrait par le runner de la revendication `act.email` du token sans vérification de signature. Approprié pour l'étiquetage, comme les trailers de commit. Quand l'email contrôle l'émission d'identifiants, vérifiez le token et lisez la revendication à partir de celui-ci à la place ; voir [Provisionner les identifiants limités au créateur de la session](#provision-credentials-scoped-to-the-session-creator). Non défini quand le token ne porte pas d'email de créateur. Traiter comme des informations d'identification personnelle. |34| `CCR_SESSION_ACCOUNT_EMAIL` | L'email du créateur de la session, pré-extrait par le runner de la revendication `act.email` du token sans vérification de signature. Approprié pour l'étiquetage, comme les trailers de commit. Quand l'email contrôle l'émission d'identifiants, vérifiez le token et lisez la revendication à partir de celui-ci à la place. Voir [Provisionner les identifiants limités au créateur de la session](#provision-credentials-scoped-to-the-session-creator). Non défini quand le token ne porte pas d'email de créateur, par exemple dans les sessions créées par l'identité de service de votre organisation. Traiter comme des données personnelles identifiables. |

35| `CLAUDE_RUNNER_CLIENT_PLATFORM` | La surface client qui a créé la session, comme `web_claude_ai`, `desktop_app`, `ios`, `claude_code_cli` ou `scheduled_trigger`. Anthropic enregistre la valeur une fois à la création de la session, donc le wrapper et chaque hook de cycle de vie voient la même valeur. Utilisez-la pour l'analyse d'adoption et l'étiquetage uniquement, pas comme signal d'autorisation. Non défini quand la session n'a pas de surface enregistrée ou reconnue, donc référencez-la comme `${CLAUDE_RUNNER_CLIENT_PLATFORM:-}` sous `set -u`. Nécessite Claude Code v2.1.229 ou ultérieur. |35| `CLAUDE_RUNNER_CLIENT_PLATFORM` | La surface client qui a créé la session, comme `web_claude_ai`, `desktop_app`, `ios`, `claude_code_cli` ou `scheduled_trigger`. Anthropic enregistre la valeur une fois à la création de la session, donc le wrapper et chaque hook de cycle de vie voient la même valeur. Utilisez-la pour l'analyse d'adoption et l'étiquetage uniquement, pas comme signal d'autorisation. Non défini quand la session n'a pas de surface enregistrée ou reconnue. Nécessite Claude Code v2.1.229 ou ultérieur. |

36| `CLAUDE_RUNNER_CLAUDE_BIN` | Chemin absolu vers le binaire Claude Code du runner lui-même. Terminez votre wrapper avec `exec "$CLAUDE_RUNNER_CLAUDE_BIN" "$@"` pour passer au binaire épinglé sans coder en dur un chemin d'installation. |36| `CLAUDE_RUNNER_CLAUDE_BIN` | Chemin absolu vers le binaire Claude Code du runner lui-même. Terminez votre wrapper avec `exec "$CLAUDE_RUNNER_CLAUDE_BIN" "$@"` pour passer au binaire épinglé sans coder en dur un chemin d'installation. |

37| `CLAUDE_CODE_REMOTE_SESSION_ID` | ID de session sous la forme balisée `cse_...`. C'est la même session que les [hooks de cycle de vie](#lifecycle-hooks) voient comme `CLAUDE_RUNNER_SESSION_ID` sous la forme `session_...` ; les variables UUID correspondent entre les deux, et remplacer le préfixe `cse_` par `session_` donne l'ID affiché dans l'URL de la session. |37| `CLAUDE_CODE_REMOTE_SESSION_ID` | ID de session sous la forme balisée `cse_...`. C'est la même session que les [hooks de cycle de vie](#lifecycle-hooks) voient comme `CLAUDE_RUNNER_SESSION_ID` sous la forme `session_...` ; les variables UUID correspondent entre les deux, et remplacer le préfixe `cse_` par `session_` donne l'ID affiché dans l'URL de la session. |

38| `CLAUDE_CODE_REMOTE_SESSION_UUID` | Le même ID de session sous la forme UUID canonique, pour les systèmes qui utilisent des UUIDs comme clé. |38| `CLAUDE_CODE_REMOTE_SESSION_UUID` | Le même ID de session sous la forme UUID canonique, pour les systèmes qui utilisent des UUIDs comme clé. |

39| `CLAUDE_CODE_REMOTE_SLACK_THREAD_URL` | Pour une session [Claude Tag](https://claude.com/docs/claude-tag/overview) qui appartient à un fil Slack, le lien vers ce fil. Non défini pour les autres sessions, et peut aussi être non défini pour une session de fil. |

40| `CLAUDE_CODE_REMOTE_SLACK_THREAD_TS` | Pour une session Claude Tag qui appartient à un fil Slack, l'horodatage Slack de ce fil, comme `1700000000.000100`. Peut être non défini, et peut être défini lorsque `CLAUDE_CODE_REMOTE_SLACK_THREAD_URL` ne l'est pas, donc vérifiez chaque variable séparément. |

39| `CLAUDE_SESSION_INGRESS_TOKEN_FILE` | Chemin absolu vers un fichier par session contenant le JWT de session actuel, maintenu à jour lors des actualisations de token. Les sous-processus shell le lisent pour leur en-tête `Authorization` lors du téléchargement des pièces jointes que l'utilisateur a ajoutées à la session. `exec` préserve la variable automatiquement ; un wrapper qui reconstruit l'environnement de l'enfant doit transporter la variable, ou les téléchargements de pièces jointes s'arrêtent silencieusement. |41| `CLAUDE_SESSION_INGRESS_TOKEN_FILE` | Chemin absolu vers un fichier par session contenant le JWT de session actuel, maintenu à jour lors des actualisations de token. Les sous-processus shell le lisent pour leur en-tête `Authorization` lors du téléchargement des pièces jointes que l'utilisateur a ajoutées à la session. `exec` préserve la variable automatiquement ; un wrapper qui reconstruit l'environnement de l'enfant doit transporter la variable, ou les téléchargements de pièces jointes s'arrêtent silencieusement. |

40| `CLAUDE_CONFIG_DIR` | Répertoire de configuration Claude par session, écrit au démarrage de la session à partir de l'instantané de la configuration de l'hôte runner que le runner capture au démarrage ; voir [Permissions et approbation d'outils](#permissions-and-tool-approval). Les écritures ici sont isolées à cette session. Le répertoire reste sous `<base-dir>/_sessions/` après la fin de la session sauf si vous démarrez le runner avec [`--remove-session-state`](/docs/fr/self-hosted-environments-reference#runner-cli-flags) ; voir [Réutiliser un checkout pré-chauffé](/docs/fr/self-hosted-environments-deploy#reuse-a-pre-warmed-checkout). |42| `CLAUDE_CONFIG_DIR` | Répertoire de configuration Claude par session, écrit au démarrage de la session à partir de l'instantané de la configuration de l'hôte runner que le runner capture au démarrage ; voir [Permissions et approbation d'outils](#permissions-and-tool-approval). Les écritures ici sont isolées à cette session. Le répertoire reste sous `<base-dir>/_sessions/` après la fin de la session sauf si vous démarrez le runner avec [`--remove-session-state`](/docs/fr/self-hosted-environments-reference#runner-cli-flags) ; voir [Réutiliser un checkout pré-chauffé](/docs/fr/self-hosted-environments-deploy#reuse-a-pre-warmed-checkout). |

41| `ANTHROPIC_BASE_URL` | L'URL de base de l'API que l'enfant utilisera, livrée par le plan de contrôle par session et normalement `https://api.anthropic.com`. Ne la remplacez pas : l'identifiant d'inférence de la session est un token OAuth émis par Anthropic que les autres fournisseurs n'acceptent pas. |43| `ANTHROPIC_BASE_URL` | L'URL de base de l'API que l'enfant utilisera, livrée par le plan de contrôle par session et normalement `https://api.anthropic.com`. Ne la remplacez pas : l'identifiant d'inférence de la session est un token OAuth émis par Anthropic que les autres fournisseurs n'acceptent pas. |


43 45 

44Le wrapper hérite également du reste de l'environnement géré de l'enfant, y compris toutes les variables d'environnement fournies par le serveur. `exec` propage tout automatiquement ; si votre wrapper lance l'enfant d'une autre manière, transmettez l'environnement complet.46Le wrapper hérite également du reste de l'environnement géré de l'enfant, y compris toutes les variables d'environnement fournies par le serveur. `exec` propage tout automatiquement ; si votre wrapper lance l'enfant d'une autre manière, transmettez l'environnement complet.

45 47 

48`CLAUDE_CODE_REMOTE_SLACK_THREAD_URL` et `CLAUDE_CODE_REMOTE_SLACK_THREAD_TS` parviennent à votre wrapper ou à votre [hook `command`](#command). Elles parviennent aussi à ce que la session exécute, comme les commandes shell, les hooks git et les hooks Claude Code. Les hooks `checkout`, `post-session` et `spawn-runner` ne les reçoivent pas.

49 

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

51 Donner une valeur par défaut aux variables qui peuvent être non définies

52</h3>

53 

54`CCR_SESSION_ACCOUNT_EMAIL`, `CLAUDE_RUNNER_CLIENT_PLATFORM`, `CLAUDE_CODE_REMOTE_SLACK_THREAD_URL` et `CLAUDE_CODE_REMOTE_SLACK_THREAD_TS` peuvent chacune être non définies. Si votre script utilise `set -u`, Bash s'arrête avec `unbound variable` lorsqu'il développe l'une d'elles qui n'est pas définie ; développez-les donc avec une valeur par défaut, comme `${CCR_SESSION_ACCOUNT_EMAIL:-}`.

55 

56Partout où un shell développe le lien du fil Slack, prenez ces précautions :

57 

58* **Mettez-le entre guillemets** : le lien peut contenir des caractères qu'un shell interprète, comme `?` et `&`, donc mettez la variable entre guillemets, comme dans `"${CLAUDE_CODE_REMOTE_SLACK_THREAD_URL:-}"`.

59* **Gardez sa valeur hors des chaînes `eval` et `sh -c`** : ne substituez pas sa valeur dans une chaîne que `eval` ou `sh -c` exécute, même entre guillemets. Faites plutôt référencer la variable par cette chaîne.

60 

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

47 Garder stdin et le descripteur de fichier 3 attachés62 Garder stdin et le descripteur de fichier 3 attachés

48</h3>63</h3>

49 64 

50stdin de l'enfant est le canal de contrôle du runner. Les rotations de token et les signaux de fin de session arrivent dessus. Le runner ouvre également un tuyau sur le descripteur de fichier 3 et lit les signaux d'activité de l'enfant à partir de celui-ci pour piloter les délais d'inactivité et de démarrage. Un simple `exec "$CLAUDE_RUNNER_CLAUDE_BIN" "$@"` préserve les deux automatiquement.65stdin de l'enfant est le canal de contrôle du runner. Les rotations de token et les signaux de fin de session arrivent dessus. Le runner ouvre également un tuyau sur le descripteur de fichier 3 et lit les signaux d'activité de l'enfant à partir de celui-ci pour piloter les délais d'inactivité et de démarrage. Un simple `exec "$CLAUDE_RUNNER_CLAUDE_BIN" "$@"` préserve les deux automatiquement.

51 66 

52Si votre wrapper met l'enfant en arrière-plan avec un simple `&`, il coupe stdin de l'enfant : la session semble saine jusqu'à ce que la durée de vie du token OAuth initial d'environ 30 minutes expire, puis chaque appel API échoue avec `401 authentication_error`. Si votre wrapper doit mettre l'enfant en arrière-plan, par exemple pour garder un trap de démontage actif, enregistrez stdin sur le descripteur de fichier 4 ou supérieur et réattachez-le explicitement :67Si votre wrapper met l'enfant en arrière-plan avec un simple `&`, il coupe stdin de l'enfant. La session semble saine jusqu'à ce que la durée de vie du token OAuth initial d'environ 30 minutes expire, puis chaque appel API qui utilise le token échoue avec `401 authentication_error`. Si votre wrapper doit mettre l'enfant en arrière-plan, par exemple pour garder un trap de démontage actif, enregistrez stdin sur le descripteur de fichier 4 ou supérieur et réattachez-le explicitement :

53 68 

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

55exec 4<&070exec 4<&0


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

60```75```

61 76 

62Ne fermez pas ou ne réutilisez pas le descripteur de fichier 3 dans le wrapper. Rediriger stdout et stderr de l'enfant est correct.77Vous pouvez rediriger stdout de l'enfant. Gardez le descripteur de fichier 3 et stderr attachés au runner :

78 

79* **Descripteur de fichier 3** : transporte les signaux d'activité de l'enfant vers le runner. Ne le fermez pas et ne le réutilisez pas dans le wrapper.

80* **stderr** : lorsque le wrapper ou l'enfant se termine avec un code non nul, le runner publie les dernières lignes de stderr dans la session et les affiche dans son propre log. L'utilisateur de la session voit ces lignes, donc n'affichez pas de secrets sur stderr, et retirez `set -x` avant de déployer le wrapper. Si vous redirigez stderr, les sessions s'exécutent toujours, mais le runner signale un échec avec le seul code de sortie.

63 81 

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

65 Transmettre les flags de prompt système83 Transmettre les flags de prompt système


108 checkout126 checkout

109</h3>127</h3>

110 128 

111S'exécute une fois par dépôt, à la place du clone et de la récupération intégrés du runner. Utilisez le hook pour cloner à partir d'un miroir de lecture directe, amorcer un arbre de travail à partir d'une archive ou appliquer une authentification git par session. Le runner définit ces variables, et peut définir d'autres variables `CLAUDE_RUNNER_` que le tableau ne répertorie pas :129S'exécute une fois par dépôt, à la place du clone et de la récupération intégrés du runner. Utilisez le hook pour cloner à partir d'un miroir de lecture directe accessible via HTTPS ou SSH, amorcer un arbre de travail à partir d'une archive ou appliquer une authentification git par session. Le runner définit ces variables, et peut définir d'autres variables `CLAUDE_RUNNER_` que le tableau ne répertorie pas :

112 130 

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

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

115| `CLAUDE_RUNNER_REPO_URL` | URL du référentiel à cloner, après que tout `--git-host-rewrite` et `--git-ssh-rewrite` aient été appliqués |133| `CLAUDE_RUNNER_REPO_URL` | URL du référentiel à cloner, après que tout `--git-host-rewrite` et `--git-ssh-rewrite` aient été appliqués |

116| `CLAUDE_RUNNER_REPO_REF` | Révision à vérifier : branche, tag ou SHA de commit comme la session l'a demandé. Vide signifie la branche par défaut du référentiel. |134| `CLAUDE_RUNNER_REPO_REF` | Révision à extraire, telle que la session l'a demandée : une branche, un tag, un SHA de commit ou un nom de référence complet comme `refs/pull/<number>/head`. Vide signifie la branche par défaut du dépôt. |

117| `CLAUDE_RUNNER_CHECKOUT_PATH` | Chemin absolu où l'arbre de travail doit être laissé |135| `CLAUDE_RUNNER_CHECKOUT_PATH` | Chemin absolu où l'arbre de travail doit être laissé |

118| `CLAUDE_RUNNER_SESSION_ID` | ID de session sous la forme balisée `session_...`, pour la journalisation et la corrélation |136| `CLAUDE_RUNNER_SESSION_ID` | ID de session sous la forme balisée `session_...`, pour la journalisation et la corrélation |

119| `CLAUDE_RUNNER_SESSION_UUID` | Le même ID de session sous la forme UUID canonique |137| `CLAUDE_RUNNER_SESSION_UUID` | Le même ID de session sous la forme UUID canonique |

120| `CLAUDE_RUNNER_API_BASE_URL` | URL de base de l'API Anthropic pour les appels limités à la session |138| `CLAUDE_RUNNER_API_BASE_URL` | URL de base de l'API Anthropic pour les appels limités à la session |

121| `CLAUDE_RUNNER_CLIENT_PLATFORM` | La surface client qui a créé la session, comme `web_claude_ai`, `desktop_app` ou `ios`. Non défini quand la session n'a pas de surface enregistrée ou reconnue. |139| `CLAUDE_RUNNER_CLIENT_PLATFORM` | La surface client qui a créé la session, comme `web_claude_ai`, `desktop_app` ou `ios`. Non défini quand la session n'a pas de surface enregistrée ou reconnue, donc référencez-la sous la forme `${CLAUDE_RUNNER_CLIENT_PLATFORM:-}` sous `set -u`. Nécessite Claude Code v2.1.229 ou ultérieur. |

122| `CLAUDE_CODE_SESSION_ACCESS_TOKEN` | Le token d'accès de session, pour les appels API limités à la session |140| `CLAUDE_CODE_SESSION_ACCESS_TOKEN` | Le token d'accès de session, pour les appels API limités à la session |

123| `GIT_CONFIG_COUNT`, `GIT_CONFIG_KEY_n`, `GIT_CONFIG_VALUE_n` | Paramètres git que le runner fixe pour le git que votre hook exécute. [Configuration git dans les hooks de cycle de vie](#git-configuration-inside-lifecycle-hooks) les décrit. Nécessite Claude Code v2.1.280 ou ultérieur. |141| `GIT_CONFIG_COUNT`, `GIT_CONFIG_KEY_n`, `GIT_CONFIG_VALUE_n` | Paramètres git que le runner fixe pour le git que votre hook exécute. [Configuration git dans les hooks de cycle de vie](#git-configuration-inside-lifecycle-hooks) les décrit. Nécessite Claude Code v2.1.280 ou ultérieur. |

124 142 

125Le script doit laisser un arbre de travail à `CLAUDE_RUNNER_CHECKOUT_PATH` vérifié à la révision demandée. HEAD détaché est correct ; le runner crée la branche de travail de la session par-dessus. Le runner vérifie que le chemin contient un `.git` après ; si votre hook matérialise une source non-git comme Perforce ou une archive dépaquetée, définissez `CLAUDE_RUNNER_SKIP_GIT_VERIFY=1` dans l'environnement du runner pour ignorer cette vérification. Les flux basés sur git comme la création de branche de travail et l'envoi de résultats nécessitent un checkout git, donc exportez les résultats à partir d'arbres non-git avec un hook [`post-session`](#post-session).143Le script doit laisser un arbre de travail à `CLAUDE_RUNNER_CHECKOUT_PATH` extrait à la révision demandée. Un HEAD détaché convient, car le runner crée la branche de travail de la session par-dessus.

126 144 

127Le runner ne transmet pas un identifiant git au hook. À la place, frappez un identifiant de clone par session à partir de l'identité de la session : vérifiez `CLAUDE_CODE_SESSION_ACCESS_TOKEN` avec une bibliothèque JWT standard par rapport au point de terminaison JWKS sous `CLAUDE_RUNNER_API_BASE_URL`, comme décrit dans [Vérifier le token à partir de votre service](/docs/fr/self-hosted-environments-identity#verify-the-token-from-your-service), puis faites en sorte que votre service d'identifiants émette un identifiant de clone de courte durée pour l'identité dans la revendication `act` du token. `CLAUDE_RUNNER_CLAUDE_BIN` n'est pas défini dans l'environnement du hook de checkout, donc la sous-commande `decode-token` n'est pas disponible ici. Revenir à tout ce que l'authentification git de l'hôte a déjà, comme un agent SSH, un helper d'identifiants ou `.netrc`, est aussi une option.145Après le retour de votre hook, le runner vérifie que `CLAUDE_RUNNER_CHECKOUT_PATH` contient un `.git`. Si votre hook matérialise une source non-git comme Perforce ou une archive tarball dépaquetée, définissez `CLAUDE_RUNNER_SKIP_GIT_VERIFY=1` dans l'environnement du runner pour ignorer cette vérification. Les flux basés sur git comme la création de branche de travail et l'envoi des résultats nécessitent un checkout git, donc exportez les résultats des arbres non-git avec un [hook `post-session`](#post-session).

128 146 

129Quand le hook se termine avec un code non-zéro, ou se termine avec 0 sans laisser un checkout utilisable derrière, ce que le runner fait dépend du référentiel :147<h4 id="get-git-credentials-in-the-hook">

148 Obtenir des identifiants git dans le hook

149</h4>

130 150 

131* **Un référentiel vers lequel la session envoie les résultats** : le runner échoue la session, et sur une sortie non-zéro affiche la queue du stderr du script à l'utilisateur.151Le runner ne transmet pas d'identifiants git au hook. La sous-commande `decode-token` n'est pas non plus disponible ici, car `CLAUDE_RUNNER_CLAUDE_BIN` n'est pas défini dans l'environnement du hook de checkout. Générez plutôt des identifiants de clone par session à partir de l'identité de la session, ou revenez à l'authentification git propre à l'hôte :

132* **Un référentiel que la session lit uniquement**, comme un référentiel ajouté à une session en cours d'exécution : le runner enregistre une ligne `[runner:warn]` avec le détail de l'échec, affiche une étape `Skipped` à la session, supprime ce que le hook a laissé au chemin de checkout et continue avec les référentiels restants. Quand le runner ne peut pas supprimer le chemin immédiatement, il réessaie la suppression à la fin de la session. Si ignorer laisse la session sans aucun référentiel du tout, le runner échoue la session de toute façon.

133 152 

134Avant v2.1.228, le runner échouait la session sur un échec de hook pour tout référentiel, donc un référentiel en lecture seule que le hook ne pouvait pas servir échouait la session à nouveau sur chaque nouveau runner sur lequel la session reprenait.153* **Identifiants de clone par session** : vérifiez `CLAUDE_CODE_SESSION_ACCESS_TOKEN` avec une bibliothèque JWT standard par rapport à l'endpoint JWKS sous `CLAUDE_RUNNER_API_BASE_URL`, comme décrit dans [Vérifier le token à partir de votre service](/docs/fr/self-hosted-environments-identity#verify-the-token-from-your-service). Faites ensuite émettre par votre service d'identifiants des identifiants de clone de courte durée pour l'identité figurant dans la revendication `act` du jeton. Associez ces identifiants à `act.sub`, et n'exigez pas `act.email`.

154* **Authentification git de l'hôte** : utilisez l'authentification git dont l'hôte dispose déjà, comme un agent SSH, un helper d'identifiants ou `.netrc`.

135 155 

136Le runner supprime le chemin de checkout après la fin de la session.156<h4 id="when-the-hook-fails">

157 Quand le hook échoue

158</h4>

159 

160Le hook échoue lorsqu'il se termine avec un code non nul, ou se termine avec 0 sans laisser de checkout utilisable :

161 

162* **Un référentiel vers lequel la session envoie les résultats** : le runner échoue la session, et sur une sortie non-zéro affiche la queue du stderr du script à l'utilisateur.

163* **Un dépôt que la session lit uniquement**, comme un dépôt ajouté à une session en cours d'exécution : le runner consigne une ligne `[runner:warn]` avec le détail de l'échec, publie une étape `Skipped` dans la session, supprime ce que le hook a laissé au chemin de checkout et continue avec les dépôts restants. Si l'omission laisse la session sans aucun dépôt, le runner fait quand même échouer la session.

164 

165Lorsque le hook réussit, le runner supprime le chemin de checkout après la fin de la session.

137 166 

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

139 post-session168 post-session


151| `CLAUDE_RUNNER_WORKSPACE_PATHS` | Chemins absolus séparés par des deux-points des arbres de travail de la session. Vide pour les sessions sans référentiel. |180| `CLAUDE_RUNNER_WORKSPACE_PATHS` | Chemins absolus séparés par des deux-points des arbres de travail de la session. Vide pour les sessions sans référentiel. |

152| `CLAUDE_RUNNER_DEBUG_LOG_PATH` | Chemin vers le journal de débogage de la session, toujours sur le disque pendant que le hook s'exécute |181| `CLAUDE_RUNNER_DEBUG_LOG_PATH` | Chemin vers le journal de débogage de la session, toujours sur le disque pendant que le hook s'exécute |

153| `CLAUDE_RUNNER_API_BASE_URL` | URL de base de l'API Anthropic pour les appels limités à la session |182| `CLAUDE_RUNNER_API_BASE_URL` | URL de base de l'API Anthropic pour les appels limités à la session |

154| `CLAUDE_RUNNER_CLIENT_PLATFORM` | La surface client qui a créé la session, comme `web_claude_ai`, `desktop_app` ou `ios`. Non défini quand la session n'a pas de surface enregistrée ou reconnue. Nécessite Claude Code v2.1.229 ou ultérieur. |183| `CLAUDE_RUNNER_CLIENT_PLATFORM` | La surface client qui a créé la session, comme `web_claude_ai`, `desktop_app` ou `ios`. Non défini quand la session n'a pas de surface enregistrée ou reconnue, donc référencez-la sous la forme `${CLAUDE_RUNNER_CLIENT_PLATFORM:-}` sous `set -u`. Nécessite Claude Code v2.1.229 ou ultérieur. |

155| `CLAUDE_CODE_SESSION_ACCESS_TOKEN` | Le token d'accès de session, pour les appels API limités à la session |184| `CLAUDE_CODE_SESSION_ACCESS_TOKEN` | Le token d'accès de session, pour les appels API limités à la session |

156| `GIT_CONFIG_COUNT`, `GIT_CONFIG_KEY_n`, `GIT_CONFIG_VALUE_n` | Paramètres git que le runner fixe pour le git que votre hook exécute. [Configuration git dans les hooks de cycle de vie](#git-configuration-inside-lifecycle-hooks) les décrit. Nécessite Claude Code v2.1.280 ou ultérieur. |185| `GIT_CONFIG_COUNT`, `GIT_CONFIG_KEY_n`, `GIT_CONFIG_VALUE_n` | Paramètres git que le runner fixe pour le git que votre hook exécute. [Configuration git dans les hooks de cycle de vie](#git-configuration-inside-lifecycle-hooks) les décrit. Nécessite Claude Code v2.1.280 ou ultérieur. |

157 186 

158`CLAUDE_RUNNER_EXIT_REASON` prend l'une des quatre valeurs :187`CLAUDE_RUNNER_EXIT_REASON` prend l'une des quatre valeurs :

159 188 

160* `completed` : la session s'est terminée proprement. Le processus Claude Code s'est terminé normalement, ou la session a été archivée ou supprimée pendant qu'elle était toujours en cours d'exécution.189* `completed` : la session s'est terminée proprement. Le processus Claude Code s'est terminé normalement, ou s'est terminé de lui-même après l'archivage ou la suppression de la session.

161* `failed` : le processus Claude Code s'est écrasé, ou la configuration a échoué après son démarrage.190* `failed` : le processus Claude Code s'est écrasé, ou la configuration a échoué après son démarrage.

162* `interrupted` : le runner a arrêté la session. Il a libéré la session pour libérer l'emplacement, la session a expiré au démarrage, le serveur a déplacé la session hors de ce runner, le runner était en drainage, ou la session a dépassé sa limite [`--kill-session-after-min`](/docs/fr/self-hosted-environments-reference#runner-cli-flags).191* `interrupted` : le runner a arrêté la session, dans l'un des cas suivants :

192 * Le runner a libéré la session pour libérer l'emplacement.

193 * La session a expiré au démarrage.

194 * Le serveur a déplacé la session hors de ce runner.

195 * L'interrogation du runner a détecté un archivage ou une suppression avant la sortie du processus.

196 * Le runner était en drainage.

197 * La session a dépassé sa limite [`--kill-session-after-min`](/docs/fr/self-hosted-environments-reference#runner-cli-flags).

163* `abandoned` : réservé à une session qu'un autre runner a revendiquée. Le hook ne se déclenche actuellement pas dans ce cas.198* `abandoned` : réservé à une session qu'un autre runner a revendiquée. Le hook ne se déclenche actuellement pas dans ce cas.

164 199 

165Les [compteurs de cycle de vie de la session](/docs/fr/self-hosted-environments-reference#session-lifecycle-counter-semantics) comptent une libération, un délai d'expiration au démarrage et un déplacement du serveur comme `completed` plutôt que `interrupted`, car le runner a remis l'emplacement proprement. Attendez-vous à cette différence si vous comparez les reçus de hook avec les compteurs.200Si vous comparez les reçus de hook avec les [compteurs de cycle de vie de la session](/docs/fr/self-hosted-environments-reference#session-lifecycle-counter-semantics), attendez-vous à ce que certains reçus `interrupted` y soient comptés comme `completed`. Les compteurs comptent comme `completed` une libération, un délai d'expiration au démarrage, un déplacement du serveur, ainsi qu'un archivage ou une suppression détectés en premier par l'interrogation du runner, car le runner a remis l'emplacement proprement.

166 201 

167Le statut de sortie du hook n'affecte jamais le résultat de la session ; un échec est enregistré et ignoré. Le runner attend jusqu'à `--post-session-hook-timeout-sec`, 60 secondes par défaut, à chaque fin de session y compris l'arrêt du runner. Cet exemple sauvegarde le travail non commis dans une branche de secours :202Le statut de sortie du hook n'affecte jamais le résultat de la session ; un échec est enregistré et ignoré. Le runner attend jusqu'à `--post-session-hook-timeout-sec`, 60 secondes par défaut, à chaque fin de session y compris l'arrêt du runner. Cet exemple sauvegarde le travail non commis dans une branche de secours :

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# Les remplacements -c l'emportent sur les paramètres locaux au dépôt, empêchant la configuration209# Les remplacements -c l'emportent sur les paramètres locaux au dépôt, empêchant la configuration

174# fsmonitor, hook-path et gpg-program écrite par la session d'exécuter du code avec les210# fsmonitor, hook-path et gpg-program écrite par la session d'exécuter du code avec les


188done224done

189```225```

190 226 

227La ligne `GIT_ALLOW_PROTOCOL` du script limite git aux remotes HTTPS, HTTP et SSH. Si l'environnement du runner définit déjà sa propre liste `GIT_ALLOW_PROTOCOL` non vide, le script conserve cette liste.

228 

191Le hook envoie avec les identifiants git disponibles dans son propre environnement sur l'hôte du runner. Sous la [posture sans identifiants dans l'image](/docs/fr/self-hosted-environments-deploy#configure-git), y compris quand le clone intégré passe par le proxy git Anthropic, il n'y en a pas, donc générez des identifiants de push de courte durée à l'intérieur du hook avant d'envoyer : échangez le jeton de session que le hook reçoit dans `CLAUDE_CODE_SESSION_ACCESS_TOKEN` avec votre propre service de jetons, en le vérifiant comme [Vérifier l'identité de la session](/docs/fr/self-hosted-environments-identity) le décrit. Quand le hook détient des identifiants que la session n'avait pas, remplacez `origin` par une URL fournie par l'opérateur et passez `-c credential.helper=` plus votre propre helper. [Configuration git dans les hooks de cycle de vie](#git-configuration-inside-lifecycle-hooks) décrit ce que la configuration écrite par la session peut encore affecter.229Le hook envoie avec les identifiants git disponibles dans son propre environnement sur l'hôte du runner. Sous la [posture sans identifiants dans l'image](/docs/fr/self-hosted-environments-deploy#configure-git), y compris quand le clone intégré passe par le proxy git Anthropic, il n'y en a pas, donc générez des identifiants de push de courte durée à l'intérieur du hook avant d'envoyer : échangez le jeton de session que le hook reçoit dans `CLAUDE_CODE_SESSION_ACCESS_TOKEN` avec votre propre service de jetons, en le vérifiant comme [Vérifier l'identité de la session](/docs/fr/self-hosted-environments-identity) le décrit. Quand le hook détient des identifiants que la session n'avait pas, remplacez `origin` par une URL fournie par l'opérateur et passez `-c credential.helper=` plus votre propre helper. [Configuration git dans les hooks de cycle de vie](#git-configuration-inside-lifecycle-hooks) décrit ce que la configuration écrite par la session peut encore affecter.

192 230 

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


264| `CLAUDE_RUNNER_ORDER_ID` | Clé d'idempotence opaque, unique par demande de spawn et sûre pour les noms de ressources Kubernetes. Utilisez-la comme clé de déduplication de votre approvisionneur. |302| `CLAUDE_RUNNER_ORDER_ID` | Clé d'idempotence opaque, unique par demande de spawn et sûre pour les noms de ressources Kubernetes. Utilisez-la comme clé de déduplication de votre approvisionneur. |

265| `CLAUDE_RUNNER_SESSION_ID` | La session pour laquelle cette demande est. Elle se répète à chaque re-demande pour la session, donc utilisez-la pour la journalisation et l'acheminement, pas comme clé de déduplication. Vide pour les demandes de pré-réchauffage, qui démarrent un runner de secours avant toute session spécifique quand [`--min-idle`](/docs/fr/self-hosted-environments-reference#orchestrator-cli-flags) est défini, donc ne supposez pas que la variable est définie. |303| `CLAUDE_RUNNER_SESSION_ID` | La session pour laquelle cette demande est. Elle se répète à chaque re-demande pour la session, donc utilisez-la pour la journalisation et l'acheminement, pas comme clé de déduplication. Vide pour les demandes de pré-réchauffage, qui démarrent un runner de secours avant toute session spécifique quand [`--min-idle`](/docs/fr/self-hosted-environments-reference#orchestrator-cli-flags) est défini, donc ne supposez pas que la variable est définie. |

266| `CLAUDE_RUNNER_SESSION_UUID` | Le même ID de session sous la forme UUID canonique. Vide pour les demandes de pré-réchauffage. |304| `CLAUDE_RUNNER_SESSION_UUID` | Le même ID de session sous la forme UUID canonique. Vide pour les demandes de pré-réchauffage. |

267| `CLAUDE_RUNNER_ATTEMPT` | Combien de demandes de spawn cette session a eues. `0` pour les demandes de pré-réchauffage. |305| `CLAUDE_RUNNER_ATTEMPT` | Un compteur par session à utiliser pour la journalisation. Ce n'est ni un nombre de nouvelles tentatives ni un nombre de demandes. `0` pour les demandes de pré-réchauffage, bien qu'une demande pour une session puisse aussi porter `0`. |

268| `CLAUDE_RUNNER_ORDER_SERVER_TIME` | Heure du serveur à partir de l'en-tête HTTP `Date` de la réponse du sondage. Quand le hook vérifie le `exp` du JWT du bon de travail, comparez par rapport à cette valeur au lieu de l'horloge locale pour tolérer l'asymétrie. Vide quand la passerelle a omis l'en-tête. |306| `CLAUDE_RUNNER_ORDER_SERVER_TIME` | Heure du serveur à partir de l'en-tête HTTP `Date` de la réponse du sondage. Quand le hook vérifie le `exp` du JWT du bon de travail, comparez par rapport à cette valeur au lieu de l'horloge locale pour tolérer l'asymétrie. Vide quand la passerelle a omis l'en-tête. |

269| `CLAUDE_RUNNER_POOL_ID` | L'ID de l'environnement auquel le nouveau runner doit se joindre, sous la forme `ccpool_...` |307| `CLAUDE_RUNNER_POOL_ID` | L'ID de l'environnement auquel le nouveau runner doit se joindre, sous la forme `ccpool_...` |

270| `CLAUDE_RUNNER_ACCOUNT_ID` | ID balisé du compte qui a mis en attente la session, pour l'acheminement par compte, le quota ou la rétrofacturation. Vide quand indisponible, et toujours vide pour les sessions du canal Claude Tag, qu'aucun compte ne met en attente. |308| `CLAUDE_RUNNER_ACCOUNT_ID` | ID balisé du compte qui a mis en attente la session, pour l'acheminement par compte, le quota ou la rétrofacturation. Vide quand indisponible, et toujours vide pour les sessions du canal Claude Tag, qu'aucun compte ne met en attente. |

271| `CLAUDE_RUNNER_ACCOUNT_EMAIL` | Email du compte qui a mis en attente la session. Vide quand indisponible. Traitez l'email comme des informations d'identification personnelle et ne le consignez pas. |309| `CLAUDE_RUNNER_ACCOUNT_EMAIL` | Email du compte qui a mis en attente la session. Vide quand indisponible. Traitez l'email comme des informations d'identification personnelle et ne le consignez pas. |

272| `CLAUDE_RUNNER_PRIMARY_REPO_URL` | URL de la première source git de la session, pour l'acheminement vers un runner avec ce référentiel pré-réchauffé. Vide quand la session n'a pas de sources git. |310| `CLAUDE_RUNNER_PRIMARY_REPO_URL` | URL de la première source git de la session, pour l'acheminement vers un runner avec ce référentiel pré-réchauffé. Vide quand la session n'a pas de sources git. |

273| `CLAUDE_RUNNER_PRIMARY_REPO_REVISION` | Révision de la première source git de la session : branche, SHA ou tag. Vide quand non spécifié. |311| `CLAUDE_RUNNER_PRIMARY_REPO_REVISION` | Révision de la première source git de la session : branche, SHA, tag ou nom de référence complet. Vide quand non spécifié. |

274| `CLAUDE_RUNNER_REPO_SOURCES` | Tableau JSON de `{url, revision}` pour toutes les sources git de la session, pour les hooks qui acheminent sur un référentiel secondaire. Vide quand il n'y a pas de sources. |312| `CLAUDE_RUNNER_REPO_SOURCES` | Tableau JSON de `{url, revision}` pour toutes les sources git de la session, pour les hooks qui acheminent sur un référentiel secondaire. Vide quand il n'y a pas de sources. |

275| `CLAUDE_RUNNER_CORRELATION_ID` | L'ID de corrélation fourni à la création de la session, renvoyé afin que le hook puisse mapper ce bon de travail à la demande qui a créé la session. Vide quand la session n'en a pas. |313| `CLAUDE_RUNNER_CORRELATION_ID` | L'ID de corrélation fourni à la création de la session, renvoyé afin que le hook puisse mapper ce bon de travail à la demande qui a créé la session. Vide quand la session n'en a pas. |

276| `CLAUDE_RUNNER_CLIENT_PLATFORM` | La surface client qui a créé la session, comme `web_claude_ai`, `desktop_app`, `ios` ou `scheduled_trigger`, pour l'analyse d'adoption. Non défini quand la session n'a pas de surface enregistrée ou reconnue, et pour les demandes de pré-réchauffage ; vérifiez-le avec `[ -n "${CLAUDE_RUNNER_CLIENT_PLATFORM:-}" ]`, qui reste sûr sous `set -u`. |314| `CLAUDE_RUNNER_CLIENT_PLATFORM` | La surface client qui a créé la session, comme `web_claude_ai`, `desktop_app`, `ios` ou `scheduled_trigger`, pour l'analyse d'adoption. Non défini quand la session n'a pas de surface enregistrée ou reconnue, et pour les demandes de pré-réchauffage ; vérifiez-le avec `[ -n "${CLAUDE_RUNNER_CLIENT_PLATFORM:-}" ]`, qui reste sûr sous `set -u`. |


282* **Utilisez `--capacity 1` sur les runners générés** : un bon de travail lié à une session enregistre exactement un runner lié à cette session, donc une capacité plus élevée ajoute des emplacements qui ne reçoivent jamais de travail, et le runner enregistre un avertissement au démarrage.320* **Utilisez `--capacity 1` sur les runners générés** : un bon de travail lié à une session enregistre exactement un runner lié à cette session, donc une capacité plus élevée ajoute des emplacements qui ne reçoivent jamais de travail, et le runner enregistre un avertissement au démarrage.

283* **Les bons de travail de pré-réchauffage s'enregistrent sans liaison** : le runner de secours n'est pas lié à une session et revendique le travail en attente comme un runner de flotte fixe.321* **Les bons de travail de pré-réchauffage s'enregistrent sans liaison** : le runner de secours n'est pas lié à une session et revendique le travail en attente comme un runner de flotte fixe.

284 322 

285Le contrat a quatre règles agnostiques de l'approvisionneur :323Le contrat a quatre règles, quelle que soit la plateforme sur laquelle votre hook effectue l'approvisionnement :

286 324 

2871. **Soyez idempotent sur `CLAUDE_RUNNER_ORDER_ID`.** La redélivraison de la même demande doit générer au maximum un runner. Dérivez un nom de ressource déterministe à partir de l'ID et laissez votre plateforme rejeter le doublon. Ne clé pas sur `CLAUDE_RUNNER_SESSION_ID` à la place. Chaque re-demande pour une session porte le même ID de session avec un nouvel ID de commande, donc une charge de travail nommée ou dédupliquée par l'ID de session est créée une fois et jamais à nouveau pour cette session.3251. **Soyez idempotent sur `CLAUDE_RUNNER_ORDER_ID`.** La redélivraison de la même demande doit générer au maximum un runner. Dérivez un nom de ressource déterministe à partir de l'ID et laissez votre plateforme rejeter le doublon. Ne clé pas sur `CLAUDE_RUNNER_SESSION_ID` à la place. Chaque re-demande pour une session porte le même ID de session avec un nouvel ID de commande, donc une charge de travail nommée ou dédupliquée par l'ID de session est créée une fois et jamais à nouveau pour cette session.

2882. **Ne réessayez pas la charge de travail.** Un ID de commande signifie au maximum une charge de travail créée. Si le runner ne s'enregistre jamais, Anthropic re-demande avec un ID de commande frais après `--expected-spawn-seconds`.3262. **Ne réessayez pas la charge de travail.** Un ID de commande signifie au maximum une charge de travail créée. Si le runner ne s'enregistre jamais, Anthropic re-demande avec un ID de commande frais après `--expected-spawn-seconds`.

2893. **Utilisez le contrat du code de sortie.** Sortie 0 signifie soumis. Sortie 1 signifie échec réessayable ; la session recule et est re-proposée. Sortie 2 ou supérieure signifie non-réessayable ; la session est bloquée du spawning à nouveau jusqu'à ce qu'un [Owner](/docs/fr/cloud-environments#organization-shared-environments) sélectionne **Retry** sur elle dans l'onglet **Activity** de l'environnement. Sur une sortie non-zéro, la queue du stderr du hook apparaît là comme la raison de l'échec, donc écrivez l'erreur exploitable sur stderr et jamais les secrets. Pour une demande de pré-réchauffage il n'y a pas de session à échouer : l'orchestrateur enregistre une sortie non-zéro localement uniquement, et le serveur re-demande le spawn après le bail.3273. **Utilisez le contrat du code de sortie.** Sortez avec le statut qui correspond au résultat :

2904. **Définissez `--expected-spawn-seconds` à au moins votre temps de démarrage p99.** C'est le bail côté serveur. Toutes les répliques d'orchestrateur doivent utiliser la même valeur.328 

329 * **Sortie 0** : soumis.

330 * **Sortie 1** : échec pouvant être réessayé. La session recule et est re-proposée.

331 * **Sortie 2 ou supérieure** : échec ne pouvant pas être réessayé. La session est empêchée de générer un nouveau spawn jusqu'à ce qu'un utilisateur lui envoie un nouveau message ou qu'un [Owner](/docs/fr/cloud-environments#organization-shared-environments) sélectionne **Retry** sur elle dans l'onglet **Activity** de l'environnement.

332 

333 Sur une sortie non nulle, la fin du stderr du hook apparaît dans l'onglet **Activity** comme raison de l'échec, donc écrivez l'erreur exploitable sur stderr et n'y écrivez jamais de secrets. Dans un hook shell, [gardez les échecs transitoires réessayables](#keep-transient-failures-retryable-in-a-shell-hook).

334 

335 Une demande de pré-réchauffage n'a pas de session à faire échouer : l'orchestrateur consigne une sortie non nulle localement uniquement, et le serveur re-demande le spawn après l'expiration du bail `--expected-spawn-seconds`.

3364. **Définissez `--expected-spawn-seconds` à au moins votre temps p99 entre la demande de spawn et l'enregistrement du runner.** Mesurez à partir du moment où l'orchestrateur reçoit la demande de spawn, et incluez toute attente de capacité sur votre plateforme ainsi que le temps de démarrage. Cette valeur est le bail côté serveur, et le bon de travail expire avec lui, donc un runner dont la charge de travail prend plus de temps ne peut pas s'enregistrer. Toutes les répliques d'orchestrateur doivent utiliser la même valeur.

291 337 

292Tout ce que le hook écrit sur stdout ou stderr apparaît dans le journal de l'orchestrateur avec les identifiants automatiquement supprimés. Si les sessions restent en attente, vérifiez le corps `/healthz` de l'orchestrateur pour les compteurs de file d'attente, puis ouvrez l'onglet **Activity** de votre environnement sur la [page d'administration **Cloud environments**](https://claude.ai/admin-settings/cloud-environments) : développez une session échouée là pour son erreur de spawn, et sélectionnez **Retry** pour la re-demander.338Tout ce que le hook écrit sur stdout ou stderr apparaît dans le journal de l'orchestrateur avec les identifiants automatiquement supprimés. Si les sessions restent en attente, vérifiez le corps `/healthz` de l'orchestrateur pour les compteurs de file d'attente, puis ouvrez l'onglet **Activity** de votre environnement sur la [page d'administration **Cloud environments**](https://claude.ai/admin-settings/cloud-environments) : développez une session échouée là pour son erreur de spawn, et sélectionnez **Retry** pour la re-demander.

293 339 

294Une session qui reste en attente sans erreur de spawn dans l'onglet **Activity** peut signifier que le hook est clé sur l'ID de session. Pour confirmer, vérifiez si votre plateforme a une charge de travail pour la première demande de spawn de cette session et aucune pour les re-demandes. Si c'est le cas, clé la charge de travail sur `CLAUDE_RUNNER_ORDER_ID` à la place.340Une session qui reste en attente sans erreur de spawn dans l'onglet **Activity** peut signifier que le hook est clé sur l'ID de session. Pour confirmer, vérifiez si votre plateforme a une charge de travail pour la première demande de spawn de cette session et aucune pour les re-demandes. Si c'est le cas, clé la charge de travail sur `CLAUDE_RUNNER_ORDER_ID` à la place.

295 341 

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

343 Garder les échecs transitoires réessayables dans un hook shell

344</h4>

345 

346Dans un hook shell qui utilise `set -e`, un échec qu'une nouvelle tentative aurait pu résoudre peut bloquer la session. Le hook s'arrête à la commande en échec et sort avec le statut propre à cette commande, et l'orchestrateur applique le contrat du code de sortie à ce statut. De nombreux échecs renvoient un statut de 2 ou plus, comme `127` quand une commande n'est pas installée et `22` de `curl --fail` sur une erreur HTTP, de sorte qu'ils bloquent la session dès son premier échec.

347 

348Une session que le hook a déjà bloquée reste bloquée jusqu'à ce qu'un utilisateur lui envoie un nouveau message ou qu'un [Owner](/docs/fr/cloud-environments#organization-shared-environments) sélectionne **Retry** sur elle dans l'onglet **Activity** de l'environnement.

349 

350Pour transformer un tel échec en sortie 1, placez ces lignes directement sous la ligne `#!` du hook, au-dessus de tout ce qui peut échouer :

351 

352```bash theme={null}

353set -e

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

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

356```

357 

358Ces lignes modifient le comportement du reste du hook, donc vérifiez-le pour chacun de ces motifs après les avoir ajoutées :

359 

360* **`exit 2` ou supérieur isolé** : avec le trap défini, il devient une sortie 1. Pour une erreur qu'aucune nouvelle tentative ne peut corriger, appelez plutôt `permanent` avec la raison, comme `permanent "namespace claude-runners does not exist"`. Appelez-le dans le shell principal, pas à l'intérieur de `$( )`, `( )` ou d'un pipe.

361* **`exec`** : ne commencez pas la dernière commande du hook par `exec`, car `exec` remplace le shell et le trap ne s'exécute pas.

362* **Second trap `EXIT`** : un second `trap ... EXIT` remplace le premier, donc fusionnez les deux en un seul trap. Placez vos commandes de nettoyage directement après `rc=$?;` et terminez chacune par `|| true;`. Le nettoyage s'exécute alors en cas d'échec comme en cas de succès, et une commande de nettoyage en échec ne définit pas le statut de sortie du hook. Ce trap fusionné illustre la forme, `your-cleanup-command` représentant votre propre commande :

363 

364 ```bash theme={null}

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

366 ```

367* **Commandes autorisées à échouer** : si le hook n'utilisait pas `set -e` auparavant, il s'arrête désormais à la première commande qui renvoie une valeur non nulle, comme une recherche qui ne trouve rien ou une soumission en double que votre plateforme rejette. Si le hook agit sur le résultat, faites de cette commande la condition d'un `if`. S'il ignore le résultat, faites suivre la commande de `|| true`.

368 

369Pour confirmer que le trap fonctionne, ajoutez directement sous la ligne `trap` une ligne qui appelle une commande inexistante, comme `no-such-command`. Exécutez le fichier du hook depuis votre shell et vérifiez que `echo $?` affiche `1`, puis supprimez la ligne.

370 

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

297 Envoyer les requêtes de modèle vers Bedrock ou Agent Platform372 Envoyer les requêtes de modèle vers Bedrock ou Agent Platform

298</h2>373</h2>


381Une session qui envoie des requêtes de modèle à Amazon Bedrock ou à Agent Platform de Google Cloud diffère d'une session sur l'API Anthropic sur les points suivants :456Une session qui envoie des requêtes de modèle à Amazon Bedrock ou à Agent Platform de Google Cloud diffère d'une session sur l'API Anthropic sur les points suivants :

382 457 

383* **Stratégie depuis claude.ai** : les [paramètres gérés par le serveur](/docs/fr/server-managed-settings) n'atteignent pas ces sessions. Les stratégies d'organisation qu'un Owner définit dans les paramètres d'administration de Claude Code ne les atteignent pas non plus ; Claude Code ne les applique donc pas à l'intérieur de la session. Placez les règles sur lesquelles vous comptez dans le [fichier de paramètres gérés](/docs/fr/managed-settings#delivery-mechanisms) de l'image du runner.458* **Stratégie depuis claude.ai** : les [paramètres gérés par le serveur](/docs/fr/server-managed-settings) n'atteignent pas ces sessions. Les stratégies d'organisation qu'un Owner définit dans les paramètres d'administration de Claude Code ne les atteignent pas non plus ; Claude Code ne les applique donc pas à l'intérieur de la session. Placez les règles sur lesquelles vous comptez dans le [fichier de paramètres gérés](/docs/fr/managed-settings#delivery-mechanisms) de l'image du runner.

459* **Skills du compte** : ces sessions ne téléchargent pas les skills activés pour le compte claude.ai d'une personne. Consultez [Comment la configuration de chaque session est assemblée](#how-each-session’s-config-is-assembled).

384* **Fichiers** : les fichiers que les utilisateurs joignent à une session dans claude.ai ou dans l'application mobile ou de bureau ne l'atteignent pas, et Claude ne peut pas renvoyer de fichiers avec l'[outil `SendUserFile`](/docs/fr/tools-reference). Placez plutôt les fichiers d'entrée dans le dépôt ou sur le runner.460* **Fichiers** : les fichiers que les utilisateurs joignent à une session dans claude.ai ou dans l'application mobile ou de bureau ne l'atteignent pas, et Claude ne peut pas renvoyer de fichiers avec l'[outil `SendUserFile`](/docs/fr/tools-reference). Placez plutôt les fichiers d'entrée dans le dépôt ou sur le runner.

385* **Sélection du modèle** : le plan de contrôle d'Anthropic envoie le modèle de chaque session, et lorsqu'une session démarre sans modèle, Claude Code utilise son modèle par défaut pour le fournisseur. Le runner supprime `ANTHROPIC_MODEL` et `ANTHROPIC_DEFAULT_MODEL` de l'environnement qu'il transmet aux sessions. Les exemples des pages des fournisseurs définissent `ANTHROPIC_MODEL`, mais dans l'environnement du runner, aucune de ces variables n'a d'effet. Les variables par famille décrites dans Épingler les versions de modèle pour [Amazon Bedrock](/docs/fr/amazon-bedrock#4-pin-model-versions) et [Agent Platform](/docs/fr/google-vertex-ai#5-pin-model-versions) atteignent bien les sessions. Elles déterminent ce vers quoi un alias comme `opus` est résolu, et non ce vers quoi un ID de modèle complet est résolu.461* **Sélection du modèle** : le plan de contrôle d'Anthropic envoie le modèle de chaque session, et lorsqu'une session démarre sans modèle, Claude Code utilise son modèle par défaut pour le fournisseur. Vous ne pouvez pas choisir le modèle avec `ANTHROPIC_MODEL` ou `ANTHROPIC_DEFAULT_MODEL` dans l'environnement du runner, mais vous pouvez épingler ce vers quoi un alias est résolu :

462 * **`ANTHROPIC_MODEL` et `ANTHROPIC_DEFAULT_MODEL`** : le runner les supprime de l'environnement qu'il transmet aux sessions, même si les exemples des pages des fournisseurs définissent `ANTHROPIC_MODEL`.

463 * **Variables d'épinglage par famille** : les variables décrites dans Épingler les versions de modèle pour [Amazon Bedrock](/docs/fr/amazon-bedrock#4-pin-model-versions) et [Agent Platform](/docs/fr/google-vertex-ai#5-pin-model-versions) atteignent bien les sessions. Elles déterminent ce vers quoi un alias comme `opus` est résolu, et non ce vers quoi un ID de modèle complet est résolu.

386* **Modèles que votre compte ne fournit pas** : une session peut échouer sur un message avec une erreur qui nomme le modèle. Activez les modèles que vos développeurs peuvent choisir, le modèle d'arrière-plan décrit dans Épingler les versions de modèle, ainsi que le modèle de classifieur utilisé par le [mode auto](/docs/fr/permission-modes#enable-auto-mode-on-bedrock-agent-platform-or-foundry). Sur Amazon Bedrock, autorisez chacun d'eux dans votre stratégie.464* **Modèles que votre compte ne fournit pas** : une session peut échouer sur un message avec une erreur qui nomme le modèle. Activez les modèles que vos développeurs peuvent choisir, le modèle d'arrière-plan décrit dans Épingler les versions de modèle, ainsi que le modèle de classifieur utilisé par le [mode auto](/docs/fr/permission-modes#enable-auto-mode-on-bedrock-agent-platform-or-foundry). Sur Amazon Bedrock, autorisez chacun d'eux dans votre stratégie.

387* **Recherche web et mode rapide** : la [recherche web](/docs/fr/tools-reference#websearch-tool-behavior) n'est pas disponible sur Amazon Bedrock, et le [mode rapide](/docs/fr/fast-mode) n'est disponible sur aucun des deux fournisseurs. Pour les autres fonctionnalités qui varient selon le fournisseur, consultez [Fonctionnalités de la CLI qui varient selon le fournisseur](/docs/fr/feature-availability#cli-capabilities-that-vary-by-provider).465* **Recherche web et mode rapide** : la [recherche web](/docs/fr/tools-reference#websearch-tool-behavior) n'est pas disponible sur Amazon Bedrock, et le [mode rapide](/docs/fr/fast-mode) n'est disponible sur aucun des deux fournisseurs. Pour les autres fonctionnalités qui varient selon le fournisseur, consultez [Fonctionnalités de la CLI qui varient selon le fournisseur](/docs/fr/feature-availability#cli-capabilities-that-vary-by-provider).

388 466 


411 489 

412Les sessions héritent de l'environnement du runner ; définissez donc [`ENABLE_TOOL_SEARCH`](/docs/fr/mcp#scale-with-mcp-tool-search) à ce niveau pour contrôler la recherche d'outils MCP pour chaque session lancée par un runner ; la page MCP décrit les valeurs possibles.490Les sessions héritent de l'environnement du runner ; définissez donc [`ENABLE_TOOL_SEARCH`](/docs/fr/mcp#scale-with-mcp-tool-search) à ce niveau pour contrôler la recherche d'outils MCP pour chaque session lancée par un runner ; la page MCP décrit les valeurs possibles.

413 491 

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

493 

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

495 Attendre les serveurs MCP avant le premier tour

496</h3>

497 

498Une session auto-hébergée attend brièvement les serveurs MCP qui sont encore en cours de connexion, à deux moments distincts. Un serveur qui manque une attente voit ses outils absents au début du premier tour ; ils deviennent disponibles plus tard sans aucune action de votre part. Les deux attentes sont les suivantes :

499 

500* **Démarrage de la session** : avant que la liste des outils ne soit établie pour la première fois, la session attend par défaut jusqu'à 5 secondes un serveur HTTP ou SSE dont l'entrée définit [`alwaysLoad: true`](/docs/fr/mcp#exempt-a-server-from-deferral), ou tous les serveurs lorsque vous définissez [`MCP_CONNECTION_NONBLOCKING=0`](/docs/fr/env-vars) dans l'environnement du runner. Sinon, les serveurs HTTP et SSE se connectent en arrière-plan. Pendant cette attente, la session s'initialise plus lentement. [`MCP_CONNECT_TIMEOUT_MS`](/docs/fr/env-vars) modifie la valeur par défaut de 5 secondes.

501* **Premier tour** : après l'arrivée du message, le premier tour attend jusqu'à 2 secondes les serveurs stdio qui sont encore en cours de connexion. Pendant cette attente, la première réponse est plus lente. Pour modifier la durée de cette attente, définissez [`CLAUDE_CODE_MCP_STARTUP_WAIT_MS`](/docs/fr/env-vars) dans l'environnement du runner. Cela ne modifie pas les serveurs couverts par l'attente. Nécessite Claude Code v2.1.274 ou une version ultérieure.

502 

503`claude mcp add` n'a pas de flag `alwaysLoad`. Pour définir cette clé, ajoutez plutôt le serveur avec `claude mcp add-json`, qui la reçoit dans le JSON du serveur et l'écrit dans `.claude.json`. Dans votre Dockerfile :

504 

505```dockerfile theme={null}

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

507```

508 

509Si les outils d'un serveur n'apparaissent pas non plus lors des tours suivants, vérifiez si le serveur a bien atteint la session, comme décrit dans [Serveurs MCP](#mcp-servers).

510 

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

415 Désactiver les outils de session intégrés512 Désactiver les outils de session intégrés

416</h3>513</h3>


578 675 

579Définissez `SELF_HOSTED_RUNNER_HOST_CONFIG_DIR` pour semer à partir d'un chemin différent, ou pointez-le vers un répertoire vide pour désactiver le semis.676Définissez `SELF_HOSTED_RUNNER_HOST_CONFIG_DIR` pour semer à partir d'un chemin différent, ou pointez-le vers un répertoire vide pour désactiver le semis.

580 677 

581Le `.claude/settings.json` commité dans le dépôt se superpose comme paramètres du projet. Dans une session avec plusieurs dépôts, [le fichier d'au plus un dépôt prend effet](#repository-settings-in-sessions-with-several-repositories). Les sessions lisent également [`managed-settings.json`](/docs/fr/settings#where-settings-live) à partir du chemin système standard dans votre image runner. Que ses clés s'appliquent aux côtés des [paramètres gérés par le serveur](/docs/fr/server-managed-settings) suit [comment Claude Code combine les sources gérées](/docs/fr/managed-settings#how-claude-code-combines-managed-sources) : par défaut, quand votre organisation livre des clés gérées par le serveur, les sessions ignorent le fichier de l'image runner à part les [clés que Claude Code lit à partir de chaque source d'administration](/docs/fr/managed-settings#keys-read-from-every-admin-source), comme le bloc `env`, les verrous de sandbox, les chemins binaires de sandbox et `forceRemoteSettingsRefresh`. Voir [priorité des paramètres](/docs/fr/settings#settings-precedence).678Les sessions lisent également ces fichiers de paramètres :

679 

680* **Paramètres du projet** : un `.claude/settings.json` commité dans le dépôt se superpose à la ligne de base au niveau utilisateur. Dans une session avec plusieurs dépôts, [le fichier d'au plus un dépôt prend effet](#repository-settings-in-sessions-with-several-repositories).

681* **Paramètres gérés** : les sessions lisent [`managed-settings.json`](/docs/fr/settings#where-settings-live) à partir du chemin système standard dans votre image runner. Pour savoir si ses clés s'appliquent aux côtés des [paramètres gérés par le serveur](/docs/fr/server-managed-settings), voir [comment Claude Code combine les sources gérées](/docs/fr/managed-settings#how-claude-code-combines-managed-sources).

682 

683Pour l'ordre dans lequel ces sources s'appliquent, voir [priorité des paramètres](/docs/fr/settings#settings-precedence).

582 684 

583Quand le plan de contrôle d'Anthropic fournit une session avec des [hooks Claude Code](/docs/fr/hooks), le runner les installe aux côtés, pas par-dessus, votre propre configuration. Nécessite Claude Code v2.1.229 ou ultérieur.685Quand le plan de contrôle d'Anthropic fournit une session avec des [hooks Claude Code](/docs/fr/hooks), le runner les installe aux côtés, pas par-dessus, votre propre configuration. Nécessite Claude Code v2.1.229 ou ultérieur.

584 686 


586* **Qui les crée** : le plan de contrôle remplit les scripts à partir de constantes fixes dans son propre déploiement, jamais à partir d'entrées par session ou tierces.688* **Qui les crée** : le plan de contrôle remplit les scripts à partir de constantes fixes dans son propre déploiement, jamais à partir d'entrées par session ou tierces.

587* **Ce qui les gouverne toujours** : les hooks livrés via `--settings` entrent dans la configuration de hook fusionnée ordinaire, pas le niveau géré, donc vos paramètres gérés s'appliquent toujours. `disableAllHooks` les désactive, et ils ne font pas partie des catégories que [`allowManagedHooksOnly`](/docs/fr/settings-reference#allowmanagedhooksonly) garde chargées.689* **Ce qui les gouverne toujours** : les hooks livrés via `--settings` entrent dans la configuration de hook fusionnée ordinaire, pas le niveau géré, donc vos paramètres gérés s'appliquent toujours. `disableAllHooks` les désactive, et ils ne font pas partie des catégories que [`allowManagedHooksOnly`](/docs/fr/settings-reference#allowmanagedhooksonly) garde chargées.

588 690 

691Quand une personne démarre sa propre session, Claude Code télécharge aussi les [skills activés pour son compte claude.ai](/docs/fr/skills#skills-in-cowork-and-cloud-sessions) dans le répertoire de configuration de cette session. Une exécution de [routine](/docs/fr/routines) ne reçoit pas les skills de son propriétaire, et une session qui [envoie des requêtes de modèle à Bedrock ou Agent Platform](#send-model-requests-to-bedrock-or-agent-platform) n'en télécharge aucun. Pour un skill dont ces sessions ont besoin, commitez-le dans le `.claude/skills/` du dépôt ou ajoutez-le à votre image runner.

692 

589En dehors des sessions [Claude Tag](https://claude.com/docs/claude-tag/overview), une session dans un environnement auto-hébergé s'exécute avec la [mémoire automatique](/docs/fr/memory#auto-memory) désactivée par défaut. Pour les instructions qui doivent persister d'une session à l'autre, utilisez le `CLAUDE.md` de votre image runner ou du dépôt.693En dehors des sessions [Claude Tag](https://claude.com/docs/claude-tag/overview), une session dans un environnement auto-hébergé s'exécute avec la [mémoire automatique](/docs/fr/memory#auto-memory) désactivée par défaut. Pour les instructions qui doivent persister d'une session à l'autre, utilisez le `CLAUDE.md` de votre image runner ou du dépôt.

590 694 

591L'instantané du `~/.claude/` de l'hôte pris par le runner exclut le répertoire `projects/`. L'emplacement de stockage par défaut de la mémoire automatique se trouve sous ce répertoire. Si vous y placez des fichiers de mémoire, le runner ne les sème pas dans les sessions, et ils n'activent pas la mémoire automatique.695L'instantané du `~/.claude/` de l'hôte pris par le runner exclut le répertoire `projects/`. L'emplacement de stockage par défaut de la mémoire automatique se trouve sous ce répertoire. Si vous y placez des fichiers de mémoire, le runner ne les sème pas dans les sessions, et ils n'activent pas la mémoire automatique.

Details

20 20 

21* **Conteneurs éphémères, par session** : exécutez chaque processus runner dans un conteneur ou une VM fraîche qui est détruite lorsque le processus se termine, avec `--capacity 1` et la valeur par défaut `--drain-grace-sec 0` afin que chaque conteneur serve exactement une session. À une capacité plus élevée, ou avec une période de drainage positive, un conteneur sert plusieurs sessions du même [propriétaire verrouillé](/docs/fr/self-hosted-environments#key-concepts) ; voir [Cycle de vie du runner](/docs/fr/self-hosted-environments#runner-lifecycle). Ne réutilisez pas un système de fichiers entre les redémarrages du runner, sauf dans la configuration délibérée [checkout pré-chauffé](#reuse-a-pre-warmed-checkout), et jamais entre les propriétaires.21* **Conteneurs éphémères, par session** : exécutez chaque processus runner dans un conteneur ou une VM fraîche qui est détruite lorsque le processus se termine, avec `--capacity 1` et la valeur par défaut `--drain-grace-sec 0` afin que chaque conteneur serve exactement une session. À une capacité plus élevée, ou avec une période de drainage positive, un conteneur sert plusieurs sessions du même [propriétaire verrouillé](/docs/fr/self-hosted-environments#key-concepts) ; voir [Cycle de vie du runner](/docs/fr/self-hosted-environments#runner-lifecycle). Ne réutilisez pas un système de fichiers entre les redémarrages du runner, sauf dans la configuration délibérée [checkout pré-chauffé](#reuse-a-pre-warmed-checkout), et jamais entre les propriétaires.

22 * <span id="processes-a-stopped-session-leaves" />Lorsque le runner arrête une session, il n'envoie aucun signal à un processus encore en cours d'exécution après la fin de sa commande shell, comme un service passé en mode daemon. La destruction du conteneur ou de la VM met fin à ce processus.22 * <span id="processes-a-stopped-session-leaves" />Lorsque le runner arrête une session, il n'envoie aucun signal à un processus encore en cours d'exécution après la fin de sa commande shell, comme un service passé en mode daemon. La destruction du conteneur ou de la VM met fin à ce processus.

23* **Pas de larges identifiants dans l'image** : n'incluez pas de clés SSH de longue durée, d'identifiants de fournisseur cloud, ou de jetons d'accès personnel qui accordent plus que ce qu'une session a besoin. Générez les identifiants utilisés pendant une session, tels que les jetons push ou API, par session à partir de votre [script wrapper](/docs/fr/self-hosted-environments-configuration#wrapper-scripts). Pour le clone initial, qui se produit avant l'exécution du wrapper, utilisez un [hook de cycle de vie `checkout`](/docs/fr/self-hosted-environments-configuration#checkout) ou [`--use-anthropic-git-proxy`](#use-the-anthropic-git-proxy) ; voir [Configurer git](#configure-git).23* **Pas de larges identifiants dans l'image** : n'incluez pas de clés SSH de longue durée, d'identifiants de fournisseur cloud, ou de jetons d'accès personnel qui accordent plus que ce qu'une session a besoin. Générez les identifiants utilisés pendant une session, tels que les jetons push ou API, par session à partir de votre [script wrapper](/docs/fr/self-hosted-environments-configuration#wrapper-scripts). Le clone initial se produit avant l'exécution du wrapper ; gérez-le donc avec un [hook de cycle de vie `checkout`](/docs/fr/self-hosted-environments-configuration#checkout), ou avec [`--use-anthropic-git-proxy`](#use-the-anthropic-git-proxy) lorsque tous les dépôts d'une session se trouvent sur github.com. Pour ces deux options, voir [Configurer git](#configure-git).

24* **Tenez les identifiants GitHub de l'hôte à l'écart des sessions** : Claude peut utiliser tout identifiant GitHub qu'une session peut lire, avec l'accès que cet identifiant accorde. Tenez les identifiants GitHub à portée étendue propres à l'hôte runner hors de tout ce qu'une session peut lire. Un tel identifiant peut être un jeton d'accès personnel, le jeton que `gh auth login` enregistre pour votre compte, ou un `GH_TOKEN` dans l'environnement du runner.

25 * **Avec [git géré par Anthropic](#use-the-anthropic-git-proxy)** : avec un tel identifiant, Claude atteint GitHub directement au lieu de passer par git géré par Anthropic.

26 * **Sans git géré par Anthropic** : un identifiant de clone peut rester dans l'image si vous limitez sa portée aussi strictement que le décrit [Intégrer la configuration git dans votre image](#ship-git-config-in-your-image).

24* **Gardez le secret de l'environnement loin des hôtes exécutant les sessions** : le secret de l'environnement peut enregistrer des runners et récupérer toute session mise en file d'attente sur l'environnement. Sur une flotte fixe, il réside sur chaque hôte runner, où le code de toute session peut lire le fichier secret. Préférez les [runners à la demande](/docs/fr/self-hosted-environments-configuration#on-demand-runners), où le secret reste sur l'hôte orchestrateur, qui n'exécute jamais de code utilisateur, et chaque runner reçoit un bon de travail à usage unique qui enregistre exactement un runner. Sur une flotte fixe, traitez le fichier secret-environnement comme lisible par toute session et faites tourner le secret après tout compromis de session suspecté.27* **Gardez le secret de l'environnement loin des hôtes exécutant les sessions** : le secret de l'environnement peut enregistrer des runners et récupérer toute session mise en file d'attente sur l'environnement. Sur une flotte fixe, il réside sur chaque hôte runner, où le code de toute session peut lire le fichier secret. Préférez les [runners à la demande](/docs/fr/self-hosted-environments-configuration#on-demand-runners), où le secret reste sur l'hôte orchestrateur, qui n'exécute jamais de code utilisateur, et chaque runner reçoit un bon de travail à usage unique qui enregistre exactement un runner. Sur une flotte fixe, traitez le fichier secret-environnement comme lisible par toute session et faites tourner le secret après tout compromis de session suspecté.

25* **Sortie réseau par défaut-refuser** : limitez le trafic sortant du conteneur runner et session à votre propre limite réseau sur chaque environnement ; [Sortie par défaut-refuser](#default-deny-egress) couvre ce qu'il faut autoriser et pourquoi.28* **Sortie réseau par défaut-refuser** : limitez le trafic sortant du conteneur runner et session à votre propre limite réseau sur chaque environnement ; [Sortie par défaut-refuser](#default-deny-egress) couvre ce qu'il faut autoriser et pourquoi.

26* **IAM hôte avec privilèges minimaux** : l'identité de calcul attachée à l'hôte runner, telle qu'un profil d'instance ou un compte de service de nœud, ne devrait accorder que ce dont le runner lui-même a besoin. Les sessions devraient obtenir leurs propres identifiants via votre script wrapper plutôt que d'hériter de ceux de l'hôte.29* **IAM hôte avec privilèges minimaux** : l'identité de calcul attachée à l'hôte runner, telle qu'un profil d'instance ou un compte de service de nœud, ne devrait accorder que ce dont le runner lui-même a besoin. Les sessions devraient obtenir leurs propres identifiants via votre script wrapper plutôt que d'hériter de ceux de l'hôte.


42 La garde s'exécute indépendamment de [`--trust-workspace`](/docs/fr/self-hosted-environments-reference#runner-cli-flags), et ne couvre pas les hooks de dépôt, `.mcp.json`, ou les règles Bash ; voir [Permissions et approbation des outils](/docs/fr/self-hosted-environments-configuration#permissions-and-tool-approval) pour savoir où ces autorisations doivent se trouver.45 La garde s'exécute indépendamment de [`--trust-workspace`](/docs/fr/self-hosted-environments-reference#runner-cli-flags), et ne couvre pas les hooks de dépôt, `.mcp.json`, ou les règles Bash ; voir [Permissions et approbation des outils](/docs/fr/self-hosted-environments-configuration#permissions-and-tool-approval) pour savoir où ces autorisations doivent se trouver.

43 46 

44<Note>47<Note>

45 La liste d'autorisation IP de votre organisation ne couvre pas le trafic du runner auto-hébergé par défaut. Ne vous fiez pas à elle comme contrôle réseau pour le trafic du runner ou de la session ; appliquez plutôt une sortie par défaut-refuser à votre propre limite réseau, et contactez votre équipe de compte Anthropic si vous souhaitez l'application de la liste d'autorisation IP pour votre organisation.48 Si votre organisation a activé la [liste d'autorisation IP](https://support.claude.com/en/articles/13200993-restrict-access-to-claude-with-ip-allowlisting), ajoutez les adresses de sortie publiques de vos runners et conteneurs de session à la liste d'autorisation avant de les démarrer. Si vous exécutez des [runners à la demande](/docs/fr/self-hosted-environments-configuration#on-demand-runners), ajoutez également l'adresse de l'hôte orchestrateur. Ne vous fiez pas à la liste d'autorisation comme contrôle réseau pour le trafic du runner ou de la session. Appliquez plutôt une sortie par défaut-refuser à votre propre limite réseau.

46</Note>49</Note>

47 50 

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


55 58 

56| Hôte | Port | Utilisé pour |59| Hôte | Port | Utilisé pour |

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

58| `api.anthropic.com` | 443, HTTPS ; WSS pour le connecteur SCM uniquement | Plan de contrôle du runner et streaming de session, inférence de modèle, drapeaux de fonctionnalités, analytique de produit, récupérations de clés [JWKS](/docs/fr/self-hosted-environments-identity), signature de commit, le proxy git quand `--use-anthropic-git-proxy` est défini, et le tunnel [connecteur SCM](/docs/fr/self-hosted-environments-reference#scm-connector-flags) de l'orchestrateur quand `--scm-connector-host` est défini |61| `api.anthropic.com` | 443, HTTPS ; WSS pour le [git géré par Anthropic](#use-the-anthropic-git-proxy) | Plan de contrôle du runner et streaming de session, inférence de modèle, feature flags, analytique de produit, récupérations de clés [JWKS](/docs/fr/self-hosted-environments-identity), signature de commit, et git géré par Anthropic quand `--use-anthropic-git-proxy` est défini |

59| Votre hôte git, tel que `github.com` ou votre hôte GitHub Enterprise | 443 ou 22 | Clonage et push de référentiels. Non nécessaire si le runner utilise `--use-anthropic-git-proxy`, qui route le trafic git via `api.anthropic.com`. |62| Votre hôte git, tel que `github.com` ou votre hôte GitHub Enterprise | 443 ou 22 | Clonage et push de dépôts sur chaque hôte git utilisé par les sessions du runner. Sur un runner qui utilise [`--use-anthropic-git-proxy`](#use-the-anthropic-git-proxy), consultez [quand le chemin `github.com` reste nécessaire](#github-com-egress-with-the-anthropic-git-proxy). |

63 

64<span id="github-com-egress-with-the-anthropic-git-proxy" />Un runner qui utilise [`--use-anthropic-git-proxy`](#use-the-anthropic-git-proxy) route son trafic git `github.com` via `api.anthropic.com`, il n'a donc pas besoin du chemin vers l'hôte git pour `github.com`. Il a toutefois besoin de ce chemin si vous définissez `--push-outcome-on-release` ou si vous effectuez un push depuis un hook `post-session`.

60 65 

61Que ces hôtes soient nécessaires dépend de votre configuration :66Que ces hôtes soient nécessaires dépend de votre configuration :

62 67 


71| `browser-intake-us5-datadoghq.com` | 443 | Téléchargements de rapports d'erreurs Anthropic, envoyés uniquement quand [le rapport d'erreurs](/docs/fr/data-usage#telemetry-services) est activé pour le compte de la session. Supprimé par `DISABLE_ERROR_REPORTING=1` ou `DISABLE_TELEMETRY=1`. |76| `browser-intake-us5-datadoghq.com` | 443 | Téléchargements de rapports d'erreurs Anthropic, envoyés uniquement quand [le rapport d'erreurs](/docs/fr/data-usage#telemetry-services) est activé pour le compte de la session. Supprimé par `DISABLE_ERROR_REPORTING=1` ou `DISABLE_TELEMETRY=1`. |

72| Les endpoints de votre fournisseur cloud pour les requêtes de modèle, les recherches de modèles et le renouvellement des identifiants, tels que `bedrock-runtime.us-east-1.amazonaws.com` ou `aiplatform.googleapis.com` | 443 | Uniquement quand le runner [envoie les requêtes de modèle à Amazon Bedrock ou à Agent Platform de Google Cloud](/docs/fr/self-hosted-environments-configuration#send-model-requests-to-bedrock-or-agent-platform) |77| Les endpoints de votre fournisseur cloud pour les requêtes de modèle, les recherches de modèles et le renouvellement des identifiants, tels que `bedrock-runtime.us-east-1.amazonaws.com` ou `aiplatform.googleapis.com` | 443 | Uniquement quand le runner [envoie les requêtes de modèle à Amazon Bedrock ou à Agent Platform de Google Cloud](/docs/fr/self-hosted-environments-configuration#send-model-requests-to-bedrock-or-agent-platform) |

73 78 

74Le runner n'atteint pas `statsig.anthropic.com`, `*.sentry.io`, `claude.ai`, ou `platform.claude.com`. Ces hôtes apparaissent dans certaines listes de contrôle réseau d'entreprise plus anciennes, mais vous n'avez pas besoin de les autoriser pour le trafic du runner ou de la session : les récupérations de drapeaux de fonctionnalités vont à `api.anthropic.com`, et le runner s'authentifie avec le secret de l'environnement plutôt qu'avec OAuth interactif. Deux flux côté hôte atteignent `claude.ai`, donc exécutez-les à partir d'un hôte dont la sortie le permet plutôt que d'élargir la sortie du conteneur de session : l'installateur d'une ligne récupère `install.sh` depuis `claude.ai` au moment de l'installation, et `claude auth login` interactif, que le [guide de configuration](/docs/fr/self-hosted-environments-quickstart#set-up-an-environment-and-runner), le mode signé du `doctor`, et [la dispatch CI](/docs/fr/self-hosted-environments-testing#authenticate-from-ci) utilisent, se connecte via `claude.ai`, `claude.com`, et `platform.claude.com`. `mcp-proxy.anthropic.com` n'est pas requis non plus : les sessions auto-hébergées ne l'utilisent pas, et la livraison de vos connecteurs claude.ai d'organisation aux sessions, quand activée pour votre organisation, route via `api.anthropic.com`. Consultez [Serveurs MCP](/docs/fr/self-hosted-environments-configuration#mcp-servers).79Vous n'avez pas besoin d'ajouter ces hôtes à la liste d'autorisation pour le trafic du runner ou de la session :

80 

81* **`statsig.anthropic.com`, `*.sentry.io`, `claude.ai` et `platform.claude.com`** : ces hôtes apparaissent dans certaines listes de contrôle réseau d'entreprise plus anciennes, mais le runner ne les atteint pas. Les récupérations de feature flags vont à `api.anthropic.com`, et le runner s'authentifie avec le secret de l'environnement plutôt qu'avec OAuth interactif.

82* **`mcp-proxy.anthropic.com`** : les sessions auto-hébergées ne l'utilisent pas. Quand la livraison des connecteurs est activée pour votre organisation, les connecteurs claude.ai de votre organisation atteignent les sessions via `api.anthropic.com`. Consultez [Serveurs MCP](/docs/fr/self-hosted-environments-configuration#mcp-servers).

83 

84Ces flux côté hôte atteignent bien `claude.ai`, donc exécutez-les à partir d'un hôte dont la sortie le permet plutôt que d'élargir la sortie du conteneur de session :

85 

86* **L'installateur d'une ligne** : récupère `install.sh` depuis `claude.ai` au moment de l'installation.

87* **`claude auth login` interactif** : se connecte via `claude.ai`, `claude.com` et `platform.claude.com`. La [configuration guidée](/docs/fr/self-hosted-environments-quickstart#run-the-guided-setup), le mode connecté de `doctor` et [le dispatch CI](/docs/fr/self-hosted-environments-testing#authenticate-from-ci) l'utilisent. Le navigateur avec lequel vous vous connectez charge également les vérifications de navigateur de la page de connexion claude.ai depuis `hcaptcha.com`, `*.hcaptcha.com` et `challenges.cloudflare.com`.

75 88 

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

77 Sortie par défaut-refuser90 Sortie par défaut-refuser


127* **Laisser le runner configurer git** : démarrez le runner avec `--configure-git` pour qu'il écrive la même identité et configuration de signature de commit que les sessions hébergées par Anthropic utilisent140* **Laisser le runner configurer git** : démarrez le runner avec `--configure-git` pour qu'il écrive la même identité et configuration de signature de commit que les sessions hébergées par Anthropic utilisent

128* **Livrer la configuration git dans votre image** : définissez l'identité et les identifiants push vous-même, par exemple pour committer sous votre propre identité de bot141* **Livrer la configuration git dans votre image** : définissez l'identité et les identifiants push vous-même, par exemple pour committer sous votre propre identité de bot

129 142 

143Pour les dépôts sur github.com, vous pouvez également démarrer le runner avec [`--use-anthropic-git-proxy`](#use-the-anthropic-git-proxy), ou définir `CLAUDE_RUNNER_USE_GIT_PROXY=1`, pour demander à Anthropic de servir git pour les sessions du runner.

144 

130Planchers de version Git sur l'hôte runner : [`--configure-git`](#let-the-runner-configure-git) la signature de commit SSH nécessite Git 2.34 ou plus récent, [`--use-anthropic-git-proxy`](#use-the-anthropic-git-proxy) nécessite 2.32 ou plus récent, et reprendre les sessions à partir de branches poussées par [`--push-outcome-on-release`](/docs/fr/self-hosted-environments-reference#runner-cli-flags) nécessite 2.29 ou plus récent. Git 2.24 est suffisant si vous omettez les trois et gérez l'identité git vous-même.145Planchers de version Git sur l'hôte runner : [`--configure-git`](#let-the-runner-configure-git) la signature de commit SSH nécessite Git 2.34 ou plus récent, [`--use-anthropic-git-proxy`](#use-the-anthropic-git-proxy) nécessite 2.32 ou plus récent, et reprendre les sessions à partir de branches poussées par [`--push-outcome-on-release`](/docs/fr/self-hosted-environments-reference#runner-cli-flags) nécessite 2.29 ou plus récent. Git 2.24 est suffisant si vous omettez les trois et gérez l'identité git vous-même.

131 146 

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


138* `user.name = Claude` et `user.email = noreply@anthropic.com`, correspondant aux sessions hébergées par Anthropic153* `user.name = Claude` et `user.email = noreply@anthropic.com`, correspondant aux sessions hébergées par Anthropic

139* Signature de commit et de tag au format SSH, routée via un shim géré par le runner qui signe chaque commit via le service de signature d'Anthropic en utilisant les identifiants de la session. Les signatures sont vérifiables sur GitHub par rapport à la clé de signature SSH publiée d'Anthropic.154* Signature de commit et de tag au format SSH, routée via un shim géré par le runner qui signe chaque commit via le service de signature d'Anthropic en utilisant les identifiants de la session. Les signatures sont vérifiables sur GitHub par rapport à la clé de signature SSH publiée d'Anthropic.

140* `push.negotiate = true`, donc git demande à votre hôte git quels commits il possède déjà avant de préparer un push. Nécessite Claude Code v2.1.257 ou plus récent.155* `push.negotiate = true`, donc git demande à votre hôte git quels commits il possède déjà avant de préparer un push. Nécessite Claude Code v2.1.257 ou plus récent.

141* `core.hooksPath` pointant vers un répertoire de hooks géré par le runner. Ses hooks `commit-msg` et `prepare-commit-msg` ajoutent une remorque `Co-authored-by:` pour le créateur de la session à chaque commit, construite à partir de l'email dans [`CCR_SESSION_ACCOUNT_EMAIL`](/docs/fr/self-hosted-environments-configuration#wrapper-scripts) et omise quand cette variable n'est pas définie. Si votre image définit déjà `core.hooksPath`, le runner laisse votre paramètre en place, ignore l'installation de ces hooks, et affiche un avertissement `[runner:git]`.156* `core.hooksPath` pointant vers un répertoire de hooks géré par le runner. Ses hooks `commit-msg` et `prepare-commit-msg` ajoutent une remorque `Co-authored-by:` pour le créateur de la session à chaque commit. La remorque est construite à partir de l'email dans [`CCR_SESSION_ACCOUNT_EMAIL`](/docs/fr/self-hosted-environments-configuration#wrapper-scripts) et omise quand cette variable n'est pas définie. Si votre image définit déjà `core.hooksPath` et que le runner n'utilise pas [git géré par Anthropic](#use-the-anthropic-git-proxy), le runner laisse votre paramètre en place, ignore l'installation de ces hooks, et affiche un avertissement `[runner:git]`.

142 157 

143La signature de commit nécessite git 2.34 ou plus récent ; le runner vérifie au démarrage et quitte avec une erreur si votre git est plus ancien. Ce drapeau ne configure pas les identifiants push, que vous fournissez toujours dans l'image.158La signature de commit nécessite git 2.34 ou plus récent ; le runner vérifie au démarrage et quitte avec une erreur si votre git est plus ancien. Ce drapeau ne configure pas les identifiants push, que vous fournissez toujours dans l'image.

144 159 

145Sur un runner en v2.1.280 ou plus récent, les commits que vous créez depuis un hook de cycle de vie `checkout` ou `post-session` sont également signés au nom de la session, sans la remorque `Co-authored-by:`. [Configuration git dans les hooks de cycle de vie](/docs/fr/self-hosted-environments-configuration#git-configuration-inside-lifecycle-hooks) décrit les paramètres git que le runner impose dans ces hooks.160Sur un runner en v2.1.280 ou plus récent, les commits que vous créez depuis un hook de cycle de vie `checkout` ou `post-session` sont également signés au nom de la session, sans la remorque `Co-authored-by:`. [Configuration git dans les hooks de cycle de vie](/docs/fr/self-hosted-environments-configuration#git-configuration-inside-lifecycle-hooks) décrit les paramètres git que le runner impose dans ces hooks.

146 161 

162Avec ou sans `--configure-git`, Claude Code demande à Claude de terminer ses messages de commit par une remorque `Claude-Session: <url>` et ses descriptions de pull request par l'URL de la session. Pour omettre les deux, définissez [`attribution.sessionUrl`](/docs/fr/settings-reference#attribution-sessionurl) sur `false` dans le fichier [`~/.claude/settings.json`](/docs/fr/self-hosted-environments-configuration#how-each-session’s-config-is-assembled) de l'hôte runner, puis redémarrez le runner.

163 

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

148 Livrer la configuration git dans votre image165 Livrer la configuration git dans votre image

149</h3>166</h3>


186 Utiliser le proxy git Anthropic203 Utiliser le proxy git Anthropic

187</h3>204</h3>

188 205 

189Démarrez le runner avec `--use-anthropic-git-proxy`, ou définissez `CLAUDE_RUNNER_USE_GIT_PROXY=1`, pour qu'il clone via le proxy git d'Anthropic, authentifié avec le jeton court-durée de la session. Pour les sessions utilisateur ordinaires, le proxy utilise le jeton OAuth GitHub ou GitHub Enterprise stocké pour le créateur de session ; pour les sessions de bot et d'agent, il utilise le jeton d'installation GitHub App de votre organisation. De toute façon, l'image runner n'a besoin d'aucun identifiant git : pas de clés SSH, pas de credential helper, pas de `.netrc`. C'est le même chemin d'authentification que les environnements hébergés par Anthropic utilisent.206Avec le proxy git Anthropic, également appelé git géré par Anthropic, l'image du runner n'a besoin d'aucune clé SSH, d'aucun credential helper, d'aucun `.netrc` ni d'aucun autre identifiant git pour la session elle-même. À la place, le runner demande à Anthropic de servir git pour ses sessions. Pour la session d'un utilisateur qu'Anthropic sert, le clone du runner ainsi que les récupérations et les pushs propres à la session passent par Anthropic, qui utilise le jeton OAuth GitHub stocké pour le créateur de la session. [Comment Anthropic sert git pour une session](#how-anthropic-serves-git-for-a-session) couvre les sessions de bot et d'agent.

207 

208Le proxy git est désactivé tant que vous ne l'[activez](#turn-the-anthropic-git-proxy-on) pas. Un runner qui atteint votre hôte git avec ses propres identifiants n'en a pas besoin, et son git fonctionne avec n'importe quel hôte git.

209 

210En contrepartie, le proxy git limite ce que le runner prend en charge et modifie ce dont il a besoin :

211 

212* **github.com uniquement** : Anthropic ne sert une session que lorsque tous ses dépôts sont sur github.com, et le proxy git ne prend pas encore en charge GitHub Enterprise Server. Sur un runner avec le proxy git, une session ayant un dépôt sur un autre hôte git [ne démarre pas](#when-anthropic-doesnt-serve-a-session).

213* **Comptes GitHub connectés** : la personne qui a créé une session utilisateur doit avoir connecté GitHub sur claude.ai, sinon la session [ne démarre pas](#creator-has-no-github-connection).

214* **`--capacity 1`** : le proxy git nécessite une session par processus runner, donc exécutez plus de répliques pour le parallélisme. [Activer le proxy git Anthropic](#turn-the-anthropic-git-proxy-on) liste les exigences.

215* **Configuration git globale remplacée** : le runner [supprime et remplace la configuration git globale](#git-proxy-replaces-global-git-config) de l'utilisateur sous lequel il s'exécute. Exécutez-le en tant qu'utilisateur dédié ou dans un conteneur.

216* **Identifiants de l'hôte pour les pushs de l'hôte** : le push [`--push-outcome-on-release`](/docs/fr/self-hosted-environments-reference#runner-cli-flags) du runner et tout push effectué par votre [hook `post-session`](/docs/fr/self-hosted-environments-configuration#post-session) utilisent toujours les propres identifiants git de l'hôte runner et son [chemin réseau vers `github.com`](#github-com-egress-with-the-anthropic-git-proxy). Pour ces identifiants, consultez [Livrer la configuration git dans votre image](#ship-git-config-in-your-image).

217* **Décision par session** : Anthropic décide pour chaque session du runner s'il sert son git, et une session qu'il ne sert pas ne démarre pas. [Quand des sessions ne démarrent pas sur un runner avec le proxy git](#when-anthropic-doesnt-serve-a-session) couvre les causes.

218 

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

220 

221<Warning>

222 Lorsque `--use-anthropic-git-proxy` est défini, le runner supprime et remplace la configuration git globale de l'utilisateur sous lequel il s'exécute, sans conserver de sauvegarde. Il le fait au démarrage et avant chaque session. Un identifiant de connexion ou un credential helper que vous y conserviez est perdu. Les paramètres écrits par [`--configure-git`](#let-the-runner-configure-git) sont conservés. Exécutez le runner en tant qu'utilisateur dédié ou dans un conteneur, jamais sous votre propre utilisateur.

223</Warning>

224 

225Conservez les paramètres git qui ne sont pas secrets, comme l'identité et `safe.directory`, dans la configuration git système.

226 

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

228 Activer le proxy git Anthropic

229</h4>

230 

231Avant de démarrer le runner avec `--use-anthropic-git-proxy`, vérifiez que l'hôte runner satisfait chacune de ces exigences. Le runner refuse de démarrer lorsque l'exigence de capacité ou de git n'est pas satisfaite :

190 232 

191Le proxy nécessite `--capacity 1` car l'URL du proxy est par session, et git 2.32 ou plus récent car les anciennes versions de git ignorent le mécanisme de configuration que le proxy utilise pour isoler les sessions les unes des autres. Le runner refuse de démarrer si l'une ou l'autre exigence n'est pas satisfaite. Parce que le proxy récupère du côté d'Anthropic, votre hôte git doit être accessible depuis l'infrastructure Anthropic, la même exigence que les sessions hébergées par Anthropic ont ; pour un hôte git qui n'est routable que dans votre réseau, utilisez un [hook de cycle de vie `checkout`](/docs/fr/self-hosted-environments-configuration#checkout) à la place. Chaque processus runner gère une session à la fois, donc exécutez plus de répliques pour le parallélisme. Quand le proxy est activé, `--git-host-rewrite` et `--git-ssh-rewrite` n'ont aucun effet : l'URL du proxy pointe vers `api.anthropic.com`, pas votre hôte git.233* **Claude Code v2.1.267 ou plus récent** : les versions antérieures acceptent le flag mais ne transmettent pas la demande pour qu'Anthropic serve git et n'affichent pas la ligne `Registering as opted in`, donc Anthropic ne sert pas leurs sessions.

234* **`--capacity 1`, la valeur par défaut** : chaque processus runner gère une session à la fois, donc exécutez plus de répliques pour le parallélisme.

235* **Git 2.32 ou plus récent** : les anciennes versions de git ignorent la configuration git par session que le runner met en place pour le proxy git.

192 236 

193<Warning>237<Warning>

194 Les recettes [Kubernetes](#kubernetes) et [Docker Compose](#docker-compose) sur cette page utilisent `--capacity 4`. Si vous ajoutez `--use-anthropic-git-proxy` ou `CLAUDE_RUNNER_USE_GIT_PROXY=1` à l'une d'elles sans changer la capacité à `1`, le runner quitte au démarrage chaque fois que votre orchestrateur le redémarre. Définissez `--capacity 1` et exécutez plus de répliques pour le parallélisme. [When the runner exits](#when-the-runner-exits) affiche la ligne que le runner imprime.238 Les recettes [Kubernetes](#kubernetes) et [Docker Compose](#docker-compose) sur cette page utilisent `--capacity 4`. Si vous ajoutez `--use-anthropic-git-proxy` ou `CLAUDE_RUNNER_USE_GIT_PROXY=1` à l'une d'elles sans changer la capacité à `1`, le runner quitte au démarrage chaque fois que votre orchestrateur le redémarre. Définissez `--capacity 1` et exécutez plus de répliques pour le parallélisme. [When the runner exits](#when-the-runner-exits) affiche la ligne que le runner imprime.

195</Warning>239</Warning>

196 240 

197Le runner signale également l'adhésion à Anthropic quand il s'enregistre, affichant `Registering as opted in to Anthropic-managed git (--use-anthropic-git-proxy)` au démarrage. Signaler l'adhésion nécessite Claude Code v2.1.267 ou plus récent, et les versions antérieures acceptent le drapeau sans le signaler ou afficher cette ligne. Chaque session sur un runner ayant adhéré utilise ensuite soit git géré par Anthropic, soit l'URL du proxy par session. Quand une session utilise l'URL du proxy par session, le runner enregistre une ligne `[runner:warn]` indiquant cela.241Pour activer le proxy git, ajoutez `--use-anthropic-git-proxy` à la commande du runner, ou définissez `CLAUDE_RUNNER_USE_GIT_PROXY=1` dans l'environnement du runner. Cette commande, exécutée dans un shell sur l'hôte runner, démarre le runner du [démarrage rapide](/docs/fr/self-hosted-environments-quickstart#set-up-manually) avec le proxy git activé :

242 

243```bash theme={null}

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

245```

246 

247Au démarrage, le runner affiche `Registering as opted in to Anthropic-managed git (--use-anthropic-git-proxy)`. Anthropic décide ensuite pour chaque session de ce runner s'il sert son git. Pour chaque session qu'il sert, le runner journalise une ligne `[runner:session]` contenant `governed git ACTIVE`. Si une session ne démarre pas, consultez [Quand des sessions ne démarrent pas sur un runner avec le proxy git](#when-anthropic-doesnt-serve-a-session).

248 

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

250 Comment Anthropic sert git pour une session

251</h4>

252 

253Pour une session qu'Anthropic sert, le clone du runner ainsi que les récupérations et les pushs propres à la session passent par Anthropic, authentifiés avec le jeton de courte durée propre à la session :

254 

255* **Sessions utilisateur** : Anthropic utilise le jeton OAuth GitHub stocké pour le créateur de la session.

256* **Sessions de bot et d'agent** : Anthropic utilise le jeton d'installation GitHub App de votre organisation.

257* **Réécritures d'URL** : `--git-host-rewrite` et `--git-ssh-rewrite` n'ont aucun effet sur un dépôt que le proxy git sert.

258 

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

260 Quand des sessions ne démarrent pas sur un runner avec le proxy git

261</h4>

262 

263Sur un runner démarré avec `--use-anthropic-git-proxy`, une session ne démarre pas lorsqu'Anthropic ne sert pas son git. Recherchez dans le log du runner une erreur git qui nomme une adresse `api.anthropic.com` contenant `/git_proxy/`.

264 

265Pour chaque session, un runner sur Claude Code v2.1.267 ou plus récent journalise également soit une ligne `[runner:session]` contenant `governed git ACTIVE` lorsqu'Anthropic sert le git de la session, soit une ligne `[runner:warn]` contenant `the server withheld Anthropic-managed git for this session` lorsqu'il ne le sert pas. Trouvez la ligne que vous voyez parmi ces cas :

266 

267* **Ni `governed git ACTIVE` ni la ligne `withheld`** : un runner antérieur à Claude Code v2.1.267 ne journalise aucune des deux lignes, et Anthropic ne sert pas ses sessions. Mettez à jour le runner vers v2.1.267 ou plus récent en suivant [Épingler la version](#pin-the-version).

268* **La ligne `withheld`** : Anthropic n'a pas servi la session. Un runner qui fonctionnait auparavant avec le proxy git peut échouer ainsi sans aucun changement de votre côté.

269 * **Un dépôt n'est pas sur github.com** : une session ayant ne serait-ce qu'un dépôt sur un autre hôte git, comme GitHub Enterprise Server, n'est pas servie, y compris ses dépôts github.com. [Désactivez le proxy git Anthropic](#turn-the-anthropic-git-proxy-off) pour les runners de cet environnement.

270 * **Tous les dépôts sont sur github.com** : signalez l'échec à [votre équipe de compte Anthropic](#report-an-issue) avec l'identifiant de session figurant dans la ligne `withheld`. Anthropic enregistre la raison de son côté.

271* **Une ligne contenant `remote: access denied by the git proxy`** : une session qu'Anthropic sert peut tout de même être refusée, par exemple lorsque la politique de l'organisation refuse l'accès git pour la session, ou que la session n'est pas autorisée pour le dépôt. Le log du runner affiche alors une ligne contenant `remote: access denied by the git proxy`, et le reste de cette ligne en indique la raison.

272* <span id="creator-has-no-github-connection" />**`GitHub authentication required`** : ce message apparaît lorsque le créateur de la session n'a pas de connexion GitHub fonctionnelle sur claude.ai. Le clone de la session échoue, et l'erreur git indique `GitHub authentication required. Please reconnect your GitHub account.` Demandez à cette personne de connecter ou reconnecter GitHub dans ses paramètres claude.ai.

273 

274Après avoir corrigé la cause, redémarrez les sessions qui ont échoué.

275 

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

277 Désactiver le proxy git Anthropic

278</h4>

279 

280Si des sessions d'un environnement utilisent un dépôt sur un hôte git autre que github.com, comme GitHub Enterprise Server, désactivez `--use-anthropic-git-proxy` pour les runners de cet environnement.

281 

282<Steps>

283 <Step title="Retirer le flag">

284 Retirez `--use-anthropic-git-proxy` de la commande du runner. Si vous avez défini `CLAUDE_RUNNER_USE_GIT_PROXY` dans l'environnement du runner, comme une spécification de pod ou un fichier Compose, retirez-la à cet endroit. Dans un shell, supprimez sa définition :

285 

286 ```bash theme={null}

287 unset CLAUDE_RUNNER_USE_GIT_PROXY

288 ```

289 </Step>

290 

291 <Step title="Fournir des identifiants git au runner">

292 Fournissez des identifiants qui fonctionnent sans invite pour chaque hôte git utilisé par les sessions des runners, github.com compris. Tout identifiant qui se trouvait dans la configuration git globale de l'utilisateur du runner a disparu, car le runner a supprimé cette configuration tant que `--use-anthropic-git-proxy` était défini. [Livrez les identifiants dans votre image](#ship-git-config-in-your-image) ou utilisez un [hook de cycle de vie `checkout`](/docs/fr/self-hosted-environments-configuration#checkout).

293 </Step>

294 

295 <Step title="Ouvrir le chemin réseau">

296 Autorisez le runner à atteindre chaque hôte git utilisé par les sessions des runners sur le port 443 ou 22. Consultez la ligne relative à l'hôte git dans [Exigences réseau](#network-requirements).

297 </Step>

298 

299 <Step title="Redémarrer les runners">

300 Redémarrez les runners pour qu'ils s'enregistrent sans le proxy git. Puis redémarrez chaque session qui a échoué.

301 </Step>

302</Steps>

198 303 

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

200 Accès à l'API GitHub sans la GitHub CLI305 Accès à l'API GitHub sans la GitHub CLI


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

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

268ARG CLAUDE_CODE_VERSION373ARG CLAUDE_CODE_VERSION

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

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

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

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


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

383```488```

384 489 

385Créez le Secret de sauvegarde à partir d'un fichier local contenant la valeur que vous avez copiée à l'étape [**Copier la clé d'environnement**](/docs/fr/self-hosted-environments-quickstart#set-up-an-environment-and-runner) de l'interface utilisateur d'administration, pour que le secret n'apparaisse jamais dans votre historique de shell. Exécutez `(umask 077 && cat > ./environment-secret)`, collez le secret, appuyez sur Entrée, puis Ctrl-D. Ensuite, créez le Secret et supprimez le fichier :490Créez le Secret de sauvegarde à partir d'un fichier local contenant la valeur que vous avez copiée à l'étape [**Copier la clé d'environnement**](/docs/fr/self-hosted-environments-quickstart#set-up-manually) de l'interface utilisateur d'administration, pour que le secret n'apparaisse jamais dans votre historique de shell. Exécutez `(umask 077 && cat > ./environment-secret)`, collez le secret, appuyez sur Entrée, puis Ctrl-D. Ensuite, créez le Secret et supprimez le fichier :

386 491 

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

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


500 Réutiliser un checkout pré-chauffé605 Réutiliser un checkout pré-chauffé

501</h2>606</h2>

502 607 

503Pour les grands référentiels, le clone peut dominer le démarrage de la session. À `--capacity 1` sans [hook `checkout`](/docs/fr/self-hosted-environments-configuration#checkout), le runner garde un clone canonique par référentiel à `<base-dir>/<repo-owner>/<repo>` et le réutilise entre les sessions : il récupère la ref demandée, détache `HEAD`, et réinitialise dur à celle-ci, ce qui est quasi-instantané quand peu a changé. Pour sauter le clone froid, fournissez le clone de l'une de deux façons :608Pour les grands dépôts, le clone peut dominer le démarrage de la session. Pour sauter le clone froid, fournissez vous-même un clone au chemin où le runner conserve le sien. Sans [hook `checkout`](/docs/fr/self-hosted-environments-configuration#checkout), le runner garde un clone canonique par dépôt à `<base-dir>/<repo-owner>/<repo>` et le réutilise entre les sessions :

609 

610* **À `--capacity 1`** : le runner récupère la ref demandée, détache `HEAD`, et réinitialise dur à celle-ci, ce qui est quasi-instantané quand peu a changé.

611* **À une `--capacity` supérieure à un** : le runner récupère dans ce clone, puis extrait un worktree distinct à partir de celui-ci pour chaque session. Un clone pré-chauffé économise le téléchargement, mais pas le checkout.

612 

613Fournissez le clone dans l'image ou sur un volume persistant :

504 614 

505* **Clone dans l'image** : construisez le clone dans votre image runner à ce chemin. Chaque conteneur frais démarre alors avec le clone chaud sans réutiliser un disque.615* **Clone dans l'image** : construisez le clone dans votre image runner à ce chemin. Chaque conteneur frais démarre alors avec le clone chaud sans réutiliser un disque.

506* **Clone sur un volume persistant** : sur les runners que vous pré-verrouillez au compte d'un utilisateur avec [`--lock-to-account`](/docs/fr/self-hosted-environments-reference#runner-cli-flags), pointez `--base-dir` vers un volume persistant, pour que le disque ne serve que ce compte. Un runner pré-verrouillé ne récupère jamais les sessions de canal Claude Tag, donc cette option ne s'applique pas aux runners qui les servent.616* **Clone sur un volume persistant** : sur les runners que vous pré-verrouillez au compte d'un utilisateur avec [`--lock-to-account`](/docs/fr/self-hosted-environments-reference#runner-cli-flags), pointez `--base-dir` vers un volume persistant, pour que le disque ne serve que ce compte. Un runner pré-verrouillé ne récupère jamais les sessions de canal Claude Tag, donc cette option ne s'applique pas aux runners qui les servent.


508Ce que le chemin de réutilisation fait et ne garantit pas :618Ce que le chemin de réutilisation fait et ne garantit pas :

509 619 

510* **N'importe quelle forme de clone fonctionne** : un clone complet, peu profond, ou à branche unique au chemin est utilisé tel quel. Le runner ne passe jamais `--depth` lors de la récupération dans un clone existant, donc un pré-chauffage complet garde son historique complet et un peu profond reste peu profond. `CLAUDE_RUNNER_FETCH_DEPTH` (`full`, `0`, ou un nombre ; par défaut 50) contrôle uniquement le clone froid que le runner fait quand aucun clone n'existe encore.620* **N'importe quelle forme de clone fonctionne** : un clone complet, peu profond, ou à branche unique au chemin est utilisé tel quel. Le runner ne passe jamais `--depth` lors de la récupération dans un clone existant, donc un pré-chauffage complet garde son historique complet et un peu profond reste peu profond. `CLAUDE_RUNNER_FETCH_DEPTH` (`full`, `0`, ou un nombre ; par défaut 50) contrôle uniquement le clone froid que le runner fait quand aucun clone n'existe encore.

511* **Les changements suivis se réinitialisent, les fichiers non suivis persistent** : chaque session commence à partir d'une réinitialisation dur qui efface les modifications suivies de la session précédente, mais le runner ne lance jamais `git clean`, donc les fichiers non suivis des sessions antérieures du propriétaire verrouillé restent dans l'arbre.621* **Les changements suivis se réinitialisent, les fichiers non suivis persistent** : à `--capacity 1`, chaque session commence à partir d'une réinitialisation dur qui efface les modifications suivies de la session précédente, mais le runner ne lance jamais `git clean`, donc les fichiers non suivis des sessions antérieures du propriétaire verrouillé restent dans l'arbre.

512* **Les répertoires par session persistent aussi** : à côté du checkout, le runner crée des entrées par session sous `<base-dir>/_sessions/` pour chaque session qu'il exécute. Le répertoire de configuration Claude de la session contient une copie locale de la transcription de la conversation. À côté se trouvent les fichiers téléchargés de la session, quand la session en a. Le répertoire de session s'y trouve aussi : il contient tous les worktrees par session et les checkouts du hook `checkout` pendant que la session s'exécute, et il conserve tout ce que Claude a écrit dedans.622* **Les répertoires par session persistent aussi** : à côté du checkout, le runner crée des entrées par session sous `<base-dir>/_sessions/` pour chaque session qu'il exécute. Le répertoire de configuration Claude de la session contient une copie locale de la transcription de la conversation. À côté se trouvent les fichiers téléchargés de la session, quand la session en a. Le répertoire de session s'y trouve aussi : il contient tous les worktrees par session et les checkouts du hook `checkout` pendant que la session s'exécute, et il conserve tout ce que Claude a écrit dedans.

513 623 

514 Par défaut, le runner les laisse en place quand la session se termine, donc sur un disque qui survit au processus runner, ils s'accumulent. Chaque session s'exécute en tant qu'utilisateur du runner, donc toute session ultérieure que ce disque sert peut les lire. Si vous conservez un `--base-dir` persistant, dimensionnez le volume pour cette croissance. La même chose s'applique à toute configuration qui redémarre le runner sur le même système de fichiers, y compris la [recette Docker Compose](#docker-compose).624 Par défaut, le runner les laisse en place quand la session se termine, donc sur un disque qui survit au processus runner, ils s'accumulent. Chaque session s'exécute en tant qu'utilisateur du runner, donc toute session ultérieure que ce disque sert peut les lire. Si vous conservez un `--base-dir` persistant, dimensionnez le volume pour cette croissance. La même chose s'applique à toute configuration qui redémarre le runner sur le même système de fichiers, y compris la [recette Docker Compose](#docker-compose).


522 632 

523Le processus enfant Claude Code de chaque session exécute le binaire du runner lui-même, et le runner désactive la mise à jour automatique à l'intérieur des sessions qu'il génère, donc chaque session exécute la version que vous avez installée sur l'hôte ou construite dans l'image. Une mise à jour au niveau de l'hôte prend effet la prochaine fois que le runner démarre.633Le processus enfant Claude Code de chaque session exécute le binaire du runner lui-même, et le runner désactive la mise à jour automatique à l'intérieur des sessions qu'il génère, donc chaque session exécute la version que vous avez installée sur l'hôte ou construite dans l'image. Une mise à jour au niveau de l'hôte prend effet la prochaine fois que le runner démarre.

524 634 

525Un modèle que vos sessions utilisent peut nécessiter une version plus récente de Claude Code que celle qu'elles exécutent. Le serveur rejette alors les demandes pour ce modèle avec [Claude Code ne supporte pas ce modèle](/docs/fr/errors#claude-code-does-not-support-this-model). Avant d'épingler une version, vérifiez [les versions de Claude Code que les modèles nécessitent](/docs/fr/model-config#available-models) pour chaque modèle que vos sessions utilisent.635Choisissez la version qu'exécutent vos sessions et le moment où elle change :

526 636 

637* **Avant d'épingler une version** : vérifiez [les versions de Claude Code que les modèles nécessitent](/docs/fr/model-config#available-models) pour chaque modèle que vos sessions utilisent. Si un modèle nécessite une version plus récente que celle qu'exécutent vos sessions, le serveur rejette les requêtes pour ce modèle avec [Claude Code ne supporte pas ce modèle](/docs/fr/errors#claude-code-does-not-support-this-model).

527* **Pour garder une flotte sur une version** : construisez l'image avec une version épinglée, ou sur un hôte nu installez une version spécifique et [désactivez les mises à jour automatiques](/docs/fr/setup#disable-auto-updates)638* **Pour garder une flotte sur une version** : construisez l'image avec une version épinglée, ou sur un hôte nu installez une version spécifique et [désactivez les mises à jour automatiques](/docs/fr/setup#disable-auto-updates)

528* **Pour mettre à niveau** : installez la version plus récente ou reconstruisez l'image, puis redémarrez les runners639* **Pour mettre à niveau une flotte fixe** : lisez les entrées du [changelog](/docs/en/changelog) entre votre version et celle que vous installez, puis installez la version plus récente ou reconstruisez l'image et redémarrez les runners

640* **Pour mettre à niveau des runners à la demande** : lisez les entrées du [changelog](/docs/en/changelog) entre votre version et celle que vous installez, puis modifiez l'image que démarre votre [hook `spawn-runner`](/docs/fr/self-hosted-environments-configuration#the-spawn-runner-hook). Chaque nouveau runner obtient la nouvelle version. Un runner déjà actif, y compris un runner en attente démarré par [`--min-idle`](/docs/fr/self-hosted-environments-reference#orchestrator-cli-flags), conserve sa version jusqu'à ce qu'il se termine. Ne le redémarrez pas, car son ordre de travail est à usage unique.

529* **Plugins** : les places de marché de plugins ne se mettent pas à jour automatiquement non plus ; définissez `FORCE_AUTOUPDATE_PLUGINS=1` dans l'environnement du runner pour laisser les plugins se mettre à jour automatiquement pendant que le binaire reste épinglé641* **Plugins** : les places de marché de plugins ne se mettent pas à jour automatiquement non plus ; définissez `FORCE_AUTOUPDATE_PLUGINS=1` dans l'environnement du runner pour laisser les plugins se mettre à jour automatiquement pendant que le binaire reste épinglé

530 642 

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


580</h3>692</h3>

581 693 

582* **Les sessions reprises perdent le travail non poussé** : un nouveau runner clone à nouveau le dépôt à partir de sa branche de démarrage, donc le travail que la session n'avait pas poussé est perdu.694* **Les sessions reprises perdent le travail non poussé** : un nouveau runner clone à nouveau le dépôt à partir de sa branche de démarrage, donc le travail que la session n'avait pas poussé est perdu.

583 * **Pour conserver le travail commité** : définissez [`--push-outcome-on-release`](/docs/fr/self-hosted-environments-reference#runner-cli-flags). Le runner effectue alors, dans la mesure du possible, un push des branches de résultat de la session avant de la libérer, et la session reprise démarre à partir de ces commits. Les modifications non commitées sont toujours perdues.695 * **Pour conserver le travail commité** : définissez [`--push-outcome-on-release`](/docs/fr/self-hosted-environments-reference#runner-cli-flags) sur chaque runner de l'environnement, car un runner sans ce flag reprend la session à partir de sa branche de démarrage. Un runner avec ce flag effectue, dans la mesure du possible, un push des branches de résultat de la session avant de la libérer, et la session reprise démarre à partir de ces commits. Le push utilise les propres identifiants git de l'hôte runner, y compris sur un runner qui utilise [git géré par Anthropic](#use-the-anthropic-git-proxy). Les modifications non commitées sont toujours perdues.

696 * **Avec un hook `checkout`** : les dépôts extraits via un [hook de cycle de vie `checkout`](/docs/fr/self-hosted-environments-configuration#checkout) ne font pas l'objet d'un push. Créez plutôt un instantané de ces dépôts à partir du [hook `post-session`](/docs/fr/self-hosted-environments-configuration#post-session).

584 * **Avant d'activer le flag** : limitez qui peut pousser vers les refs `claude/*` sur le dépôt distant source. À la reprise, le runner récupère la branche précédemment poussée sans vérifier qui l'a poussée.697 * **Avant d'activer le flag** : limitez qui peut pousser vers les refs `claude/*` sur le dépôt distant source. À la reprise, le runner récupère la branche précédemment poussée sans vérifier qui l'a poussée.

585* **Le clonage d'un dépôt ajouté en milieu de session peut échouer** : Claude le clone avec `git clone` via HTTPS. Sur un runner sans [`--use-anthropic-git-proxy`](#use-the-anthropic-git-proxy), le clonage échoue avec une erreur d'authentification git si rien sur l'hôte ne peut lire le dépôt. Dans la mesure du possible, sélectionnez chaque dépôt dont la session a besoin quand vous la créez.698* **Le clonage d'un dépôt ajouté en milieu de session peut échouer** : Claude le clone avec `git clone` via HTTPS. Sur un runner sans [`--use-anthropic-git-proxy`](#use-the-anthropic-git-proxy), le clonage échoue avec une erreur d'authentification git si rien sur l'hôte ne peut lire le dépôt. Dans la mesure du possible, sélectionnez chaque dépôt dont la session a besoin quand vous la créez.

586* **Certains connecteurs n'apparaissent pas dans les sessions auto-hébergées** : un connecteur que vous n'avez pas encore connecté dans les paramètres claude.ai n'est pas listé dans une session auto-hébergée, et la session ne vous invitera pas à le connecter. Connectez-le d'abord dans les paramètres, puis démarrez une session fraîche. Ajouter un connecteur à une session déjà en cours d'exécution ne rend pas non plus ses outils disponibles à Claude ; démarrez une session fraîche pour récupérer un connecteur nouvellement ajouté.699* **Certains connecteurs n'apparaissent pas dans les sessions auto-hébergées** : un connecteur que vous n'avez pas encore connecté dans les paramètres claude.ai n'est pas listé dans une session auto-hébergée, et la session ne vous invitera pas à le connecter. Connectez-le d'abord dans les paramètres, puis démarrez une session fraîche. Ajouter un connecteur à une session déjà en cours d'exécution ne rend pas non plus ses outils disponibles à Claude ; démarrez une session fraîche pour récupérer un connecteur nouvellement ajouté.


606* **Le runner n'apparaît pas dans l'environnement** : confirmez que l'hôte peut atteindre `api.anthropic.com` sur HTTPS, que le secret de l'environnement est actuel, et que l'horloge de l'hôte est à moins de cinq minutes de l'heure réelle ; un décalage plus grand cause l'échec de l'authentification. Le runner enregistre `[runner:fatal]` avec la raison du rejet en cas d'échec d'authentification.719* **Le runner n'apparaît pas dans l'environnement** : confirmez que l'hôte peut atteindre `api.anthropic.com` sur HTTPS, que le secret de l'environnement est actuel, et que l'horloge de l'hôte est à moins de cinq minutes de l'heure réelle ; un décalage plus grand cause l'échec de l'authentification. Le runner enregistre `[runner:fatal]` avec la raison du rejet en cas d'échec d'authentification.

607* **Le runner quitte au démarrage avec `cannot create or write to base directory`** : le runner ne peut pas créer ou écrire à `--base-dir`, qui par défaut est `/workspace`. Corrigez la propriété du répertoire ou pointez `--base-dir` vers un chemin inscriptible, comme décrit dans [Garder le répertoire de base et la capacité identiques sur tous les runners](#keep-the-base-directory-and-capacity-identical-across-runners). Si le runner enregistre à la place `[runner:fatal]` disant que la vérification du répertoire de base a expiré, le répertoire est sur un montage NFS ou CSI suspendu. Vérifiez la santé du montage plutôt que les permissions. Le runner imprime ces deux échecs de démarrage à stderr avant d'ouvrir `--log-file`, donc cherchez-les dans le terminal ou les journaux de conteneur de votre plateforme plutôt que dans le fichier journal. Avant v2.1.225, le runner ne vérifiait pas le répertoire de base au démarrage, et cette mauvaise configuration échouait les sessions après la récupération à la place.720* **Le runner quitte au démarrage avec `cannot create or write to base directory`** : le runner ne peut pas créer ou écrire à `--base-dir`, qui par défaut est `/workspace`. Corrigez la propriété du répertoire ou pointez `--base-dir` vers un chemin inscriptible, comme décrit dans [Garder le répertoire de base et la capacité identiques sur tous les runners](#keep-the-base-directory-and-capacity-identical-across-runners). Si le runner enregistre à la place `[runner:fatal]` disant que la vérification du répertoire de base a expiré, le répertoire est sur un montage NFS ou CSI suspendu. Vérifiez la santé du montage plutôt que les permissions. Le runner imprime ces deux échecs de démarrage à stderr avant d'ouvrir `--log-file`, donc cherchez-les dans le terminal ou les journaux de conteneur de votre plateforme plutôt que dans le fichier journal. Avant v2.1.225, le runner ne vérifiait pas le répertoire de base au démarrage, et cette mauvaise configuration échouait les sessions après la récupération à la place.

608* **Les sessions restent en attente** : chaque runner en ligne peut être verrouillé à un propriétaire différent. Vérifiez la métrique `claude_code_self_hosted_runner_locked_account` de chaque runner [métrique](/docs/fr/self-hosted-environments-reference#prometheus-metrics) ou le champ `locked_account` de sa ligne de journal `[runner:health]` pour voir qui la détient. Les deux affichent l'email du propriétaire uniquement après que le runner ait reçu un jeton de session portant une réclamation `act.email`, ce qu'une session d'agent Claude Tag ne fait jamais. Sans la réclamation, le runner n'émet aucune série `locked_account` et enregistre `locked_account=yes`, ce qui vous dit que le runner est verrouillé mais pas à quel propriétaire. Ajoutez des répliques, ou attendez qu'un runner existant se draine et redémarre. Si l'environnement utilise des runners à la demande, vérifiez l'orchestrateur à la place ; consultez [Runners à la demande](/docs/fr/self-hosted-environments-configuration#on-demand-runners).721* **Les sessions restent en attente** : chaque runner en ligne peut être verrouillé à un propriétaire différent. Vérifiez la métrique `claude_code_self_hosted_runner_locked_account` de chaque runner [métrique](/docs/fr/self-hosted-environments-reference#prometheus-metrics) ou le champ `locked_account` de sa ligne de journal `[runner:health]` pour voir qui la détient. Les deux affichent l'email du propriétaire uniquement après que le runner ait reçu un jeton de session portant une réclamation `act.email`, ce qu'une session d'agent Claude Tag ne fait jamais. Sans la réclamation, le runner n'émet aucune série `locked_account` et enregistre `locked_account=yes`, ce qui vous dit que le runner est verrouillé mais pas à quel propriétaire. Ajoutez des répliques, ou attendez qu'un runner existant se draine et redémarre. Si l'environnement utilise des runners à la demande, vérifiez l'orchestrateur à la place ; consultez [Runners à la demande](/docs/fr/self-hosted-environments-configuration#on-demand-runners).

609* **Les sessions échouent immédiatement après la récupération** : ouvrez la session dans claude.ai/code pour voir l'erreur. Les causes les plus courantes sont les identifiants git manquants [identifiants git](#configure-git) dans l'image runner et les outils de build qui ne sont pas installés. Un répertoire de base non inscriptible arrête le runner au démarrage au lieu d'échouer les sessions. Consultez l'entrée **Le runner quitte au démarrage avec `cannot create or write to base directory`** dans cette liste.722* **Les sessions échouent immédiatement après la récupération** : ouvrez la session dans claude.ai/code pour voir l'erreur. Les causes les plus courantes sont des [identifiants git](#configure-git) manquants dans l'image runner et les outils de build qui ne sont pas installés. Sur un runner démarré avec `--use-anthropic-git-proxy`, consultez [Quand les sessions ne démarrent pas sur un runner avec le proxy git](#when-anthropic-doesnt-serve-a-session). Un répertoire de base non inscriptible arrête le runner au démarrage au lieu d'échouer les sessions. Consultez l'entrée **Le runner quitte au démarrage avec `cannot create or write to base directory`** dans cette liste.

723* **Les sessions ne démarrent pas sur un runner qui a défini `--use-anthropic-git-proxy`** : cherchez dans le journal du runner `access denied by the git proxy`, ou une erreur git qui nomme une adresse `api.anthropic.com` contenant `/git_proxy/`. Pour déterminer si Anthropic a servi la session et corriger la cause, consultez [Quand les sessions ne démarrent pas sur un runner avec le proxy git](#when-anthropic-doesnt-serve-a-session).

610* **Les sessions ne peuvent pas atteindre le réseau via un proxy de sortie authentifiant** : quand la source que vous avez définie avec [`--proxy-authorization-command` ou `--proxy-authorization-file`](#authenticate-to-an-egress-proxy) échoue, expire après 30 secondes, ou produit une valeur vide, le runner répond à cette connexion `502 Bad Gateway` et enregistre pourquoi. Le runner rédige la stderr de la commande dans ce journal et ne journalise jamais la valeur de l'en-tête. Avec `--proxy-authorization-command`, exécutez la commande vous-même sur l'hôte pour confirmer qu'elle imprime la valeur d'en-tête entière sur stdout. Si le runner quitte à la place au démarrage avec `could not start the proxy-authorization listener`, il ne pouvait pas ouvrir son écouteur de boucle locale.724* **Les sessions ne peuvent pas atteindre le réseau via un proxy de sortie authentifiant** : quand la source que vous avez définie avec [`--proxy-authorization-command` ou `--proxy-authorization-file`](#authenticate-to-an-egress-proxy) échoue, expire après 30 secondes, ou produit une valeur vide, le runner répond à cette connexion `502 Bad Gateway` et enregistre pourquoi. Le runner rédige la stderr de la commande dans ce journal et ne journalise jamais la valeur de l'en-tête. Avec `--proxy-authorization-command`, exécutez la commande vous-même sur l'hôte pour confirmer qu'elle imprime la valeur d'en-tête entière sur stdout. Si le runner quitte à la place au démarrage avec `could not start the proxy-authorization listener`, il ne pouvait pas ouvrir son écouteur de boucle locale.

611* **Le runner enregistre des lignes `Poll failed` contenant `rejecting the malformed poll response`** : le runner a reçu une réponse de sondage dont le corps n'est pas le JSON attendu de la file d'attente, le plus souvent parce que quelque chose entre le runner et `api.anthropic.com`, comme un proxy d'interception ou un portail captif, a répondu avec sa propre page. Le runner rejette la réponse, la compte sous le type `transport` de la [métrique](/docs/fr/self-hosted-environments-reference#prometheus-metrics) `claude_code_self_hosted_runner_poll_errors_total`, et réessaie selon le calendrier de sondage échoué décrit dans [Cycle de vie de la session](/docs/fr/self-hosted-environments#session-lifecycle). Le runner continue de servir ses sessions en direct. Configurez le proxy pour passer les réponses de `api.anthropic.com` inchangées. Avant v2.1.246, le runner lisait une telle réponse comme une file d'attente de travail vide, ce qui pouvait terminer ses sessions en direct ou le faire quitter.725* **Le runner enregistre des lignes `Poll failed` contenant `rejecting the malformed poll response`** : le runner a reçu une réponse de sondage dont le corps n'est pas le JSON attendu de la file d'attente, le plus souvent parce que quelque chose entre le runner et `api.anthropic.com`, comme un proxy d'interception ou un portail captif, a répondu avec sa propre page. Le runner rejette la réponse, la compte sous le type `transport` de la [métrique](/docs/fr/self-hosted-environments-reference#prometheus-metrics) `claude_code_self_hosted_runner_poll_errors_total`, et réessaie selon le calendrier de sondage échoué décrit dans [Cycle de vie de la session](/docs/fr/self-hosted-environments#session-lifecycle). Le runner continue de servir ses sessions en direct. Configurez le proxy pour passer les réponses de `api.anthropic.com` inchangées. Avant v2.1.246, le runner lisait une telle réponse comme une file d'attente de travail vide, ce qui pouvait terminer ses sessions en direct ou le faire quitter.

612* **La branche d'une session n'existe plus sur la télécommande** : pour une source git que la session ne lit que, le runner saute cette source et continue sur les autres. Pour la source vers laquelle la session pousse les résultats, une branche supprimée, généralement parce qu'elle a été fusionnée et supprimée automatiquement, échoue la session avec une erreur nommant le référentiel et la branche et vous demandant de restaurer la branche et de réessayer. Le runner échoue la session avec la même erreur quand sauter laisserait sans référentiel du tout. Avant v2.1.228, une telle session démarrait dans un répertoire vide.726* **La branche d'une session n'existe plus sur la télécommande** : pour une source git que la session ne lit que, le runner saute cette source et continue sur les autres. Pour la source vers laquelle la session pousse les résultats, une branche supprimée, généralement parce qu'elle a été fusionnée et supprimée automatiquement, échoue la session avec une erreur nommant le référentiel et la branche et vous demandant de restaurer la branche et de réessayer. Le runner échoue la session avec la même erreur quand sauter laisserait sans référentiel du tout. Avant v2.1.228, une telle session démarrait dans un répertoire vide.


616 730 

617 La vérification d'accès s'exécute à nouveau chaque fois que la session démarre sur un runner, donc une fois que l'identité git du runner a accès en lecture, le prochain démarrage clone le référentiel. Avant v2.1.274, chacun de ces refus échouait le démarrage de la session.731 La vérification d'accès s'exécute à nouveau chaque fois que la session démarre sur un runner, donc une fois que l'identité git du runner a accès en lecture, le prochain démarrage clone le référentiel. Avant v2.1.274, chacun de ces refus échouait le démarrage de la session.

618* **Les sessions prennent des minutes pour démarrer** : le clone initial domine généralement. Regardez la [métrique](/docs/fr/self-hosted-environments-reference#prometheus-metrics) `claude_code_self_hosted_runner_session_init_duration_seconds` pour confirmer, et coupez le clone avec un [checkout pré-chauffé](#reuse-a-pre-warmed-checkout) ou un `CLAUDE_RUNNER_FETCH_DEPTH` plus petit.732* **Les sessions prennent des minutes pour démarrer** : le clone initial domine généralement. Regardez la [métrique](/docs/fr/self-hosted-environments-reference#prometheus-metrics) `claude_code_self_hosted_runner_session_init_duration_seconds` pour confirmer, et coupez le clone avec un [checkout pré-chauffé](#reuse-a-pre-warmed-checkout) ou un `CLAUDE_RUNNER_FETCH_DEPTH` plus petit.

619* **Les tours échouent avec un 401** : chaque session authentifie les appels de modèle avec le [`CLAUDE_CODE_OAUTH_TOKEN`](/docs/fr/self-hosted-environments-configuration#wrapper-scripts) de courte durée que le runner récupère auprès d'Anthropic et fait tourner sur stdin de la session. Quand un tour se termine avec un 401 ou 403 de l'API du modèle, le runner récupère un jeton frais et le transmet à la session. Le tour échoué n'est pas réessayé.733* **Les tours échouent avec un 401** : quand un tour se termine avec un 401 ou 403 de l'API Anthropic, le runner récupère un [`CLAUDE_CODE_OAUTH_TOKEN`](/docs/fr/self-hosted-environments-configuration#wrapper-scripts) frais auprès d'Anthropic et le transmet à la session. Le tour échoué n'est pas réessayé. Ce jeton est de courte durée, et le runner le fait tourner via le stdin de la session.

620 734 

621 Quand une récupération échoue, le runner enregistre une ligne `inference_token refresh failed` qui dit quand il réessayera, et il continue à réessayer aussi longtemps que la session s'exécute.735 Quand une récupération échoue, le runner enregistre une ligne `inference_token refresh failed` qui dit quand il réessayera, et il continue à réessayer aussi longtemps que la session s'exécute.

622 736 


637 751 

638* **Une sortie normale** : le runner a terminé ses sessions et s'est drainé, a atteint son heure de retraite, ou a reçu l'ordre de s'arrêter. Redémarrez-le pour que l'environnement ait à nouveau de la capacité. [Cycle de vie du runner](/docs/fr/self-hosted-environments#runner-lifecycle) décrit ces sorties.752* **Une sortie normale** : le runner a terminé ses sessions et s'est drainé, a atteint son heure de retraite, ou a reçu l'ordre de s'arrêter. Redémarrez-le pour que l'environnement ait à nouveau de la capacité. [Cycle de vie du runner](/docs/fr/self-hosted-environments#runner-lifecycle) décrit ces sorties.

639* **Un démarrage échoué** : le runner ne peut pas démarrer avec la configuration ou l'hôte qui lui a été donné, donc il quitte quelques secondes après son démarrage, et il quitte de la même manière chaque fois que vous le redémarrez. Le redémarrer plus rapidement n'aide pas. Quelqu'un doit lire sa sortie et corriger la cause.753* **Un démarrage échoué** : le runner ne peut pas démarrer avec la configuration ou l'hôte qui lui a été donné, donc il quitte quelques secondes après son démarrage, et il quitte de la même manière chaque fois que vous le redémarrez. Le redémarrer plus rapidement n'aide pas. Quelqu'un doit lire sa sortie et corriger la cause.

754* **Perte de contact** : un runner qui ne peut pas joindre Anthropic pendant plus longtemps que son [bail](/docs/fr/self-hosted-environments#session-lifecycle), par exemple pendant que son hôte est en veille, peut être retiré de l'environnement. Quand un runner retiré se reconnecte, il quitte. Son journal peut afficher une ligne `[runner:fatal]` qui contient `runner record gone server-side` ou, après une panne plus longue, [`poll auth failed`](/docs/fr/self-hosted-environments-quickstart#set-up-an-environment-and-runner). Le runner ne se réenregistre pas de lui-même, donc redémarrez-le.

640 755 

641Configurez votre superviseur pour redémarrer le runner chaque fois qu'il quitte, pour attendre plus longtemps entre les redémarrages quand le runner continue de quitter juste après son démarrage, et pour avertir quelqu'un quand cela continue de se produire.756Configurez votre superviseur pour redémarrer le runner chaque fois qu'il quitte, pour attendre plus longtemps entre les redémarrages quand le runner continue de quitter juste après son démarrage, et pour avertir quelqu'un quand cela continue de se produire.

642 757 

Details

195 195 

196Les wrappers reçoivent le chemin absolu du binaire du runner lui-même dans `CLAUDE_RUNNER_CLAUDE_BIN` ; utilisez ce chemin plutôt qu'un `claude` résolu par PATH afin que le décodage s'exécute sur le même binaire que le runner lui-même utilise.196Les wrappers reçoivent le chemin absolu du binaire du runner lui-même dans `CLAUDE_RUNNER_CLAUDE_BIN` ; utilisez ce chemin plutôt qu'un `claude` résolu par PATH afin que le décodage s'exécute sur le même binaire que le runner lui-même utilise.

197 197 

198Utilisez `jq -re` plutôt que `jq -r` afin qu'un claim manquant provoque une sortie non-zéro. Avec `-r` seul, un claim manquant imprime la chaîne littérale `null` et sort zéro, ce qui transmet silencieusement une mauvaise valeur en aval. Passez `--no-verify` à `decode-token` uniquement pour l'inspection hors ligne où l'endpoint JWKS est inaccessible.198Utilisez `jq -re` plutôt que `jq -r` afin qu'un claim manquant provoque une sortie non-zéro. Avec `-r` seul, un claim manquant imprime la chaîne littérale `null` et sort zéro, ce qui transmet silencieusement une mauvaise valeur en aval.

199 

200Si `decode-token` ne peut pas récupérer les clés depuis l'endpoint JWKS ou ne peut pas vérifier le token, il imprime la raison sur stderr, n'imprime aucun claim et sort avec le code 1. Passez `--no-verify` à `decode-token` uniquement pour l'inspection hors ligne où l'endpoint JWKS est inaccessible.

199 201 

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

201 Référence des claims203 Référence des claims

Details

34L'hôte du runner a besoin de :34L'hôte du runner a besoin de :

35 35 

36* Un hôte ou conteneur Linux ou macOS avec HTTPS sortant vers `api.anthropic.com`, vers `claude.ai` et les hôtes de téléchargement vers lesquels il redirige pour l'étape d'installation ci-dessous, et vers votre hôte git pour le clone ; le [tableau des exigences réseau](/docs/fr/self-hosted-environments-deploy#network-requirements) a la liste complète. Windows n'est pas pris en charge en tant qu'hôte runner ; exécutez le runner dans un conteneur Linux à la place. Les postes de travail des développeurs ne sont pas affectés, car les sessions démarrent à partir de claude.ai dans un navigateur.36* Un hôte ou conteneur Linux ou macOS avec HTTPS sortant vers `api.anthropic.com`, vers `claude.ai` et les hôtes de téléchargement vers lesquels il redirige pour l'étape d'installation ci-dessous, et vers votre hôte git pour le clone ; le [tableau des exigences réseau](/docs/fr/self-hosted-environments-deploy#network-requirements) a la liste complète. Windows n'est pas pris en charge en tant qu'hôte runner ; exécutez le runner dans un conteneur Linux à la place. Les postes de travail des développeurs ne sont pas affectés, car les sessions démarrent à partir de claude.ai dans un navigateur.

37* Un dépôt pour la session de test : un dépôt public, ou un dépôt que cet hôte peut déjà cloner via son URL HTTPS sans que des identifiants lui soient demandés.

37* Une horloge synchronisée à l'heure réelle, par exemple avec NTP. L'authentification échoue lorsque l'horloge est décalée de plus de cinq minutes ; consultez [Dépannage](/docs/fr/self-hosted-environments-deploy#troubleshooting).38* Une horloge synchronisée à l'heure réelle, par exemple avec NTP. L'authentification échoue lorsque l'horloge est décalée de plus de cinq minutes ; consultez [Dépannage](/docs/fr/self-hosted-environments-deploy#troubleshooting).

38 39 

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


57 Configurer un environnement et un runner58 Configurer un environnement et un runner

58</h2>59</h2>

59 60 

60Claude Code inclut une configuration guidée : une session Claude Code interactive qui vous guide à travers la création de l'environnement dans l'interface d'administration, démarre un runner local avec le fichier secret que vous enregistrez, confirme que le runner s'enregistre, et écrit une feuille de triche dans `./runner-setup/CHEAT-SHEET.md`. Exécutez-le sur une machine où vous vous êtes connecté avec `claude auth login` en utilisant un compte qui détient un rôle Propriétaire ; il n'est pas disponible avec les clés API ou les fournisseurs de modèles tiers. Sur les hôtes où une session interactive n'est pas possible, utilisez plutôt les étapes manuelles ci-dessous. Confirmez d'abord que la [vérification de version](#software-on-the-runner-host) a réussi : sur les versions antérieures à 2.1.224, cette commande démarre une session Claude ordinaire avec les mots comme invite au lieu de la configuration guidée. Pour démarrer la configuration guidée, exécutez la sous-commande setup et suivez les invites :61Utilisez soit la [configuration guidée](#run-the-guided-setup), soit les [étapes manuelles](#set-up-manually). La configuration guidée est une commande unique qui démarre une session Claude Code interactive et vous guide à travers le reste. Utilisez plutôt les étapes manuelles sur un hôte où une session interactive n'est pas possible. Utilisez-les également lorsqu'une personne détenant le rôle Propriétaire a créé l'environnement et vous a remis son secret, car la configuration guidée nécessite une connexion Propriétaire.

62 

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

64 Exécuter la configuration guidée

65</h3>

66 

67La configuration guidée vous accompagne dans la création de l'environnement dans l'interface d'administration, démarre un runner local avec le fichier secret que vous enregistrez, confirme que le runner s'enregistre, et écrit une feuille de triche dans `./runner-setup/CHEAT-SHEET.md`. Avant de l'exécuter, vérifiez votre connexion et votre version :

68 

69* **Connexion** : exécutez-la sur une machine où vous vous êtes connecté avec `claude auth login` en utilisant un compte qui détient un rôle Propriétaire. Avec seulement une clé API ou un fournisseur de modèles tiers, la session démarre mais ses vérifications d'organisation échouent.

70* **Version** : confirmez que la [vérification de version](#software-on-the-runner-host) a réussi. Sur les versions antérieures à 2.1.224, la commande setup démarre une session Claude avec les mots comme prompt au lieu de la configuration guidée.

71 

72Pour démarrer la configuration guidée, exécutez la sous-commande setup dans votre shell et suivez les instructions :

61 73 

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

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

64```76```

65 77 

66Pour configurer manuellement à la place :78La configuration ne démarre pas elle-même de session de test : elle vous indique d'en démarrer une sur claude.ai/code. La dernière étape de la configuration arrête le runner qu'elle a démarré. Si vous quittez la configuration avant cette étape, le runner continue de s'exécuter. Pour continuer après la dernière étape, redémarrez le runner dans votre shell avec la commande figurant dans `./runner-setup/CHEAT-SHEET.md`, puis [routez une session vers l'environnement](#route-a-session).

79 

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

81 Configurer manuellement

82</h3>

83 

84Créez l'environnement sur claude.ai, démarrez le runner depuis un terminal sur l'hôte, puis revenez sur claude.ai pour confirmer que le runner apparaît et y router une session. Si une personne détenant le rôle Propriétaire a déjà créé l'environnement et vous a remis son secret, commencez à l'étape 2.

67 85 

68<Steps>86<Steps>

69 <Step title="Créer un environnement">87 <Step title="Créer un environnement">

70 Allez à la [page **Environnements cloud**](https://claude.ai/admin-settings/cloud-environments) dans les paramètres d'administration. Sous **Environnements auto-hébergés**, sélectionnez **Nouveau**, nommez l'environnement, et sélectionnez **Créer**. À la deuxième étape de l'assistant, sélectionnez **Copier la clé d'environnement** pour copier le secret d'environnement, que l'interface d'administration étiquette comme clé d'environnement. claude.ai affiche le secret une fois, et vous ne pouvez pas le récupérer plus tard ; il expire 365 jours après sa création. L'ID `ccpool_...` de l'environnement reste visible dans sa boîte de dialogue de détail ; vous en aurez besoin pour la vérification `aud` dans [vérification de token](/docs/fr/self-hosted-environments-identity) et pour dispatcher [les sessions de test à partir de CI](/docs/fr/self-hosted-environments-testing#run-the-test-loop).88 Allez à la [page **Environnements cloud**](https://claude.ai/admin-settings/cloud-environments) dans les paramètres d'administration. Sous **Environnements auto-hébergés**, sélectionnez **Nouveau**, nommez l'environnement, et sélectionnez **Créer**. À la deuxième étape de l'assistant, sélectionnez **Copier la clé d'environnement** pour copier le secret d'environnement, que l'interface d'administration étiquette comme clé d'environnement. claude.ai affiche le secret une fois, et vous ne pouvez pas le récupérer plus tard ; il expire 365 jours après sa création. L'ID `ccpool_...` de l'environnement reste visible dans sa boîte de dialogue de détail ; vous en aurez besoin pour la vérification `aud` dans [vérification de token](/docs/fr/self-hosted-environments-identity) et pour dispatcher [les sessions de test à partir de CI](/docs/fr/self-hosted-environments-testing#run-the-test-loop).

71 89 

72 Si vous perdez le secret ou avez besoin de le faire tourner, créez un nouveau secret à partir de l'onglet **Configuration** de l'environnement, déployez le nouveau secret sur vos runners, puis révoquez l'ancien. Les runners détenant un secret révoqué échouent leur prochain sondage authentifié et se terminent, en enregistrant `poll auth failed`, et votre orchestrateur les redémarre avec le nouveau secret.90 Si vous perdez le secret ou avez besoin de le faire tourner, créez un nouveau secret à partir de l'onglet **Configuration** de l'environnement, déployez le nouveau secret sur vos runners, puis révoquez l'ancien. Les runners détenant un secret révoqué échouent leur prochain sondage authentifié et se terminent, en consignant `poll auth failed`, et votre orchestrateur les redémarre avec le nouveau secret.

73 </Step>91 </Step>

74 92 

75 <Step title="Démarrer un runner">93 <Step title="Démarrer un runner">

76 Créez le répertoire secret. Cette étape et la suivante nécessitent root pour le chemin `/etc/claude` ; n'importe quel chemin que le processus runner peut lire fonctionne, donc ajustez les deux commandes et la valeur `--environment-secret-file` ensemble si vous en utilisez un différent.94 Créez le répertoire secret. Cette commande et la suivante utilisent `/etc/claude`, qui nécessite root, et le fichier secret qu'elles créent n'est lisible que par l'utilisateur qui les exécute. Si le runner s'exécute sous un autre utilisateur, il se termine avec `error: Failed to read environment secret file <path> (EACCES: permission denied, open '<path>')`. Dans ce cas, exécutez les deux commandes en tant qu'utilisateur du runner avec un répertoire dans lequel cet utilisateur peut écrire à la place de `/etc/claude`, et passez le même chemin à `--environment-secret-file`. N'importe quel chemin que le processus runner peut lire fonctionne.

77 95 

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

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


89 107 

90 Si le runner ne peut pas créer ou écrire dans le chemin, il se termine au démarrage avec une erreur nommant le répertoire au lieu de s'enregistrer. Consultez [Dépannage](/docs/fr/self-hosted-environments-deploy#troubleshooting).108 Si le runner ne peut pas créer ou écrire dans le chemin, il se termine au démarrage avec une erreur nommant le répertoire au lieu de s'enregistrer. Consultez [Dépannage](/docs/fr/self-hosted-environments-deploy#troubleshooting).

91 109 

92 Ensuite, démarrez le runner avec `--environment-secret-file` et `--base-dir`. Le runner s'enregistre auprès de votre environnement et commence à interroger le travail. Si le runner se termine, redémarrez-le manuellement. Les déploiements en production exécutent le runner sous un orchestrateur qui redémarre les runners terminés, normalement avec un système de fichiers frais par redémarrage ; [Réutiliser un checkout pré-chauffé](/docs/fr/self-hosted-environments-deploy#reuse-a-pre-warmed-checkout) couvre la configuration de disque persistant prise en charge.110 Ensuite, démarrez le runner avec `--environment-secret-file` et `--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 Le runner consigne `Registered: runner_id=<runner-id>` une fois qu'il s'est enregistré auprès de votre environnement, puis commence à interroger pour obtenir du travail. Si le runner se termine plus tard, redémarrez-le vous-même. Consultez [Si le runner se termine](#if-the-runner-exits) pour savoir quand cela se produit.

97 </Step>117 </Step>

98 118 

99 <Step title="Vérifier que le runner apparaît">119 <Step title="Vérifier que le runner apparaît">

100 Retournez à la [page **Environnements cloud**](https://claude.ai/admin-settings/cloud-environments). Le statut de votre environnement passe de **Aucun runner déployé** à **Sain** en quelques secondes après le démarrage du runner ; ouvrez l'environnement et sélectionnez **Activité** pour voir le runner lui-même.120 Retournez à la [page **Environnements cloud**](https://claude.ai/admin-settings/cloud-environments). Le statut de votre environnement passe de **Aucun runner déployé** à **Sain** en quelques secondes après le démarrage du runner ; ouvrez l'environnement et sélectionnez **Activité** pour voir le runner lui-même. Si vous n'avez pas accès à la page d'administration, la ligne `Registered: runner_id=<runner-id>` dans le log du runner de l'étape précédente vous donne le même signal.

101 </Step>121 </Step>

102 122 

103 <Step title="Router une session vers l'environnement">123 <Step title="Router une session vers l'environnement">

104 Démarrez une session à claude.ai/code et sélectionnez votre environnement dans le sélecteur d'environnement, où les environnements auto-hébergés apparaissent aux côtés des environnements hébergés par Anthropic. Le runner clone avec les identifiants git que l'hôte a déjà, donc choisissez un référentiel que cet hôte peut déjà cloner, ou un public ; les options d'identifiants pour les référentiels privés en production sont sur [Configurer git](/docs/fr/self-hosted-environments-deploy#configure-git). Le prochain runner disponible récupère la session en attente et enregistre `Picked up session <session-id>` ainsi que son nombre actif et sa capacité, afin que vous puissiez confirmer à partir de la propre sortie du runner quel hôte a pris la session. Regardez la session fonctionner et lisez les réponses de Claude à [claude.ai/code](https://claude.ai/code). Si la session reste en attente à la place, consultez [Dépannage](/docs/fr/self-hosted-environments-deploy#troubleshooting).124 <span id="route-a-session" />Démarrez une session sur claude.ai/code et sélectionnez votre environnement dans le sélecteur d'environnement, où les environnements auto-hébergés apparaissent aux côtés des environnements hébergés par Anthropic. Pour le dépôt, choisissez celui des [prérequis](#host-and-network) : un dépôt public, ou un dépôt que cet hôte peut déjà cloner. Le runner clone avec les identifiants git dont l'hôte dispose déjà.

125 

126 Le prochain runner disponible récupère la session en attente et consigne `Picked up session <session-id>` ainsi que son nombre de sessions actives et sa capacité, afin que vous puissiez confirmer à partir de la propre sortie du runner quel hôte a pris la session. Regardez la session travailler et lisez les réponses de Claude sur [claude.ai/code](https://claude.ai/code).

127 

128 Si la session ne commence pas à travailler, identifiez ce que vous observez :

129 

130 * **La session reste en attente** : consultez [Dépannage](/docs/fr/self-hosted-environments-deploy#troubleshooting).

131 * **La session ne démarre pas en raison d'une erreur git** : l'erreur apparaît dans la session et dans le log du runner. Si elle contient le message git `could not read Username for` suivi de l'URL de votre hôte git, le runner ne disposait d'aucun identifiant HTTPS pour cet hôte. Consultez [Configurer git](/docs/fr/self-hosted-environments-deploy#configure-git), qui couvre également les options d'identifiants pour les dépôts privés en production.

105 </Step>132 </Step>

106</Steps>133</Steps>

107 134 

108Le runner se termine par conception une fois que ses sessions actives se terminent ; consultez [Cycle de vie du runner](/docs/fr/self-hosted-environments#runner-lifecycle). Pour la production, déployez-le sous un orchestrateur qui le redémarre à la sortie et attend plus longtemps entre les redémarrages lorsque le runner continue à se terminer juste après son démarrage. Consultez [Déployer en production](/docs/fr/self-hosted-environments-deploy) et [Quand le runner se termine](/docs/fr/self-hosted-environments-deploy#when-the-runner-exits).135<h3 id="if-the-runner-exits">

136 Si le runner se termine

137</h3>

138 

139Si le runner se termine pendant ce démarrage rapide, redémarrez-le avec la même commande. Le runner peut se terminer de lui-même :

140 

141* **Sessions terminées** : le log affiche `[runner:exit] account workload drained — exiting`. Le runner se termine par conception une fois que ses sessions actives se terminent. Consultez [Cycle de vie du runner](/docs/fr/self-hosted-environments#runner-lifecycle).

142* **Contact perdu** : le log affiche une ligne `[runner:fatal]` avec `runner record gone server-side` ou avec `poll auth failed`. Si le runner perd le contact avec Anthropic pendant un certain temps, par exemple parce que l'hôte se met en veille, il peut se terminer lorsqu'il joint à nouveau Anthropic.

143 

144Un tour terminé ne met pas fin à votre session de test. Après le premier tour, la session est toujours attachée et le runner est toujours actif, vous pouvez donc [envoyer un message de suivi à la session](#send-a-follow-up-message-to-a-running-session) sans redémarrer le runner au préalable.

145 

146Pour la production, déployez le runner sous un orchestrateur qui le redémarre à la sortie et attend plus longtemps entre les redémarrages lorsque le runner continue à se terminer juste après son démarrage. Consultez [Déployer en production](/docs/fr/self-hosted-environments-deploy) et [Quand le runner se termine](/docs/fr/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 Envoyer un message de suivi à une session en cours d'exécution149 Envoyer un message de suivi à une session en cours d'exécution

Details

52| `--release-idle-session-min <n>` | `SELF_HOSTED_RUNNER_SESSION_IDLE_MS` | `0` | Libérer un créneau de session après N minutes d'inactivité une fois qu'un tour se termine ou que la session attend l'action de l'utilisateur. Une session qui est toujours au milieu d'un tour, y compris une qui détient une tâche de fond qui ne finit jamais ou une approbation demandée de l'intérieur d'un appel d'outil en cours d'exécution, ne compte pas comme inactive ; associer avec `--kill-session-after-min` comme butée dure. Après la fin de la tâche de fond d'une session, le runner considère la session comme occupée jusqu'au tour de suivi qui lit le résultat commence, pendant au maximum la fenêtre [`SELF_HOSTED_RUNNER_BG_RESULT_GRACE_MS`](#environment-variable-only-settings). Jusqu'à ce que le runner reçoive un signal d'arrêt ou atteigne son heure de retraite, une libération qui laisse le runner sans sessions actives démarre le même chemin de sortie qu'un drainage normal, gouverné par `--drain-grace-sec`. Après un premier signal que vous avez différé avec [`--defer-shutdown-max-min`](/docs/fr/self-hosted-environments-deploy#defer-the-drain-past-the-first-signal), le runner se termine dès qu'une libération le laisse sans sessions. `0` désactive. |52| `--release-idle-session-min <n>` | `SELF_HOSTED_RUNNER_SESSION_IDLE_MS` | `0` | Libérer un créneau de session après N minutes d'inactivité une fois qu'un tour se termine ou que la session attend l'action de l'utilisateur. Une session qui est toujours au milieu d'un tour, y compris une qui détient une tâche de fond qui ne finit jamais ou une approbation demandée de l'intérieur d'un appel d'outil en cours d'exécution, ne compte pas comme inactive ; associer avec `--kill-session-after-min` comme butée dure. Après la fin de la tâche de fond d'une session, le runner considère la session comme occupée jusqu'au tour de suivi qui lit le résultat commence, pendant au maximum la fenêtre [`SELF_HOSTED_RUNNER_BG_RESULT_GRACE_MS`](#environment-variable-only-settings). Jusqu'à ce que le runner reçoive un signal d'arrêt ou atteigne son heure de retraite, une libération qui laisse le runner sans sessions actives démarre le même chemin de sortie qu'un drainage normal, gouverné par `--drain-grace-sec`. Après un premier signal que vous avez différé avec [`--defer-shutdown-max-min`](/docs/fr/self-hosted-environments-deploy#defer-the-drain-past-the-first-signal), le runner se termine dès qu'une libération le laisse sans sessions. `0` désactive. |

53| `--remove-session-state [bool]` | `SELF_HOSTED_RUNNER_REMOVE_SESSION_STATE` | désactivé | Supprimer les répertoires par session d'une session sous `<base-dir>/_sessions/` quand la session se termine sur ce runner, quel que soit le résultat. [Réutiliser un checkout pré-chauffé](/docs/fr/self-hosted-environments-deploy#reuse-a-pre-warmed-checkout) décrit ce qu'ils contiennent et qui peut les lire quand ils restent. La suppression est meilleur effort : les répertoires par session restent en place quand le runner est tué ou atteint sa date limite de drainage avant que le nettoyage ne s'exécute. Avec le drapeau activé, le log de débogage d'une session échouée ou interrompue n'est pas conservé sur le disque. Nécessite Claude Code v2.1.268 ou ultérieur. |53| `--remove-session-state [bool]` | `SELF_HOSTED_RUNNER_REMOVE_SESSION_STATE` | désactivé | Supprimer les répertoires par session d'une session sous `<base-dir>/_sessions/` quand la session se termine sur ce runner, quel que soit le résultat. [Réutiliser un checkout pré-chauffé](/docs/fr/self-hosted-environments-deploy#reuse-a-pre-warmed-checkout) décrit ce qu'ils contiennent et qui peut les lire quand ils restent. La suppression est meilleur effort : les répertoires par session restent en place quand le runner est tué ou atteint sa date limite de drainage avant que le nettoyage ne s'exécute. Avec le drapeau activé, le log de débogage d'une session échouée ou interrompue n'est pas conservé sur le disque. Nécessite Claude Code v2.1.268 ou ultérieur. |

54| `--retire-at <epoch-seconds>` | `SELF_HOSTED_RUNNER_RETIRE_AT` | non défini | Retirer le runner à un timestamp Unix absolu en secondes, pour l'infrastructure qui tue le runner à un moment connu ; [Cycle de vie du runner](/docs/fr/self-hosted-environments#runner-lifecycle) décrit la séquence de libération et comment dimensionner la marge. Les valeurs avant 2001 ou après l'année 5138 sont rejetées par le drapeau et ignorées par la variable d'environnement. |54| `--retire-at <epoch-seconds>` | `SELF_HOSTED_RUNNER_RETIRE_AT` | non défini | Retirer le runner à un timestamp Unix absolu en secondes, pour l'infrastructure qui tue le runner à un moment connu ; [Cycle de vie du runner](/docs/fr/self-hosted-environments#runner-lifecycle) décrit la séquence de libération et comment dimensionner la marge. Les valeurs avant 2001 ou après l'année 5138 sont rejetées par le drapeau et ignorées par la variable d'environnement. |

55| `--server-auto-mode-lists <mode>` | `SELF_HOSTED_RUNNER_SERVER_AUTO_MODE_LISTS` | `no-allow` | Lesquelles des listes de règles du classifieur du [mode auto](/docs/fr/permission-modes#eliminate-prompts-with-auto-mode) que le plan de contrôle envoie avec une session peuvent atteindre cette session : `all`, `no-allow` ou `none`. Voir [Listes de règles du mode auto](#auto-mode-rule-lists) pour ce que chaque valeur applique. Une valeur invalide arrête le runner au démarrage. Nécessite Claude Code v2.1.295 ou ultérieur. |

55| `--session-stop-grace-sec <n>` | `SELF_HOSTED_RUNNER_SESSION_STOP_GRACE_MS` | `5` | Combien de temps attendre que le processus Claude se termine proprement après la fin d'une session, avant de le tuer de force. Augmentez la valeur si les hooks `SessionEnd` propres de l'enfant ont besoin de plus de temps. |56| `--session-stop-grace-sec <n>` | `SELF_HOSTED_RUNNER_SESSION_STOP_GRACE_MS` | `5` | Combien de temps attendre que le processus Claude se termine proprement après la fin d'une session, avant de le tuer de force. Augmentez la valeur si les hooks `SessionEnd` propres de l'enfant ont besoin de plus de temps. |

56| `--startup-timeout-min <n>` | `SELF_HOSTED_RUNNER_STARTUP_TIMEOUT_MS` | `15` | Libérer un créneau de session si l'enfant n'a pas signalé qu'il s'était initialisé dans N minutes après le lancement. Effacé par le signal d'init de l'enfant sur le [canal d'activité](/docs/fr/self-hosted-environments-configuration#keep-stdin-and-file-descriptor-3-attached), pas par la sortie ordinaire, après quoi `--release-idle-session-min` prend le relais. `0` désactive. |57| `--startup-timeout-min <n>` | `SELF_HOSTED_RUNNER_STARTUP_TIMEOUT_MS` | `15` | Libérer un créneau de session si l'enfant n'a pas signalé qu'il s'était initialisé dans N minutes après le lancement. Le clonage a lieu avant le lancement, donc le temps de clonage n'est pas compté. Effacé par le signal d'init de l'enfant sur le [canal d'activité](/docs/fr/self-hosted-environments-configuration#keep-stdin-and-file-descriptor-3-attached), pas par la sortie ordinaire, après quoi `--release-idle-session-min` prend le relais. `0` désactive. |

57| `--trust-workspace [bool]` | `SELF_HOSTED_RUNNER_TRUST_WORKSPACE` | activé | Amorcer la confiance persistante pour les chemins de dépôt de chaque session afin que les `permissions.allow` et `additionalDirectories` validés par le dépôt soient honorés. Définir `false` pour supprimer les subventions de permission validées par le dépôt et configurer les règles d'autorisation dans le `settings.json` de la configuration d'hôte à la place ; les paramètres `sandbox.*` validés par le dépôt s'appliquent toujours de toute façon, c'est pourquoi la [garde de paramètres de dépôt](/docs/fr/self-hosted-environments-deploy#harden-your-deployment) les analyse indépendamment de ce drapeau. |58| `--trust-workspace [bool]` | `SELF_HOSTED_RUNNER_TRUST_WORKSPACE` | activé | Amorcer la confiance persistante pour les chemins de dépôt de chaque session afin que les `permissions.allow` et `additionalDirectories` validés par le dépôt soient honorés. Définir `false` pour supprimer les subventions de permission validées par le dépôt et configurer les règles d'autorisation dans le `settings.json` de la configuration d'hôte à la place ; les paramètres `sandbox.*` validés par le dépôt s'appliquent toujours de toute façon, c'est pourquoi la [garde de paramètres de dépôt](/docs/fr/self-hosted-environments-deploy#harden-your-deployment) les analyse indépendamment de ce drapeau. |

58| `--use-anthropic-git-proxy` | `CLAUDE_RUNNER_USE_GIT_PROXY=1` | désactivé | Cloner via le [proxy git Anthropic](/docs/fr/self-hosted-environments-deploy#use-the-anthropic-git-proxy) au lieu de l'authentification git gérée par le client. Nécessite `--capacity 1` et git 2.32 ou plus récent ; le runner refuse de démarrer sinon. Remplace les drapeaux de réécriture. |59| `--use-anthropic-git-proxy` | `CLAUDE_RUNNER_USE_GIT_PROXY=1` | désactivé | Cloner les dépôts hébergés sur github.com via le [proxy git Anthropic](/docs/fr/self-hosted-environments-deploy#use-the-anthropic-git-proxy) au lieu de l'authentification git gérée par le client. Nécessite `--capacity 1` et git 2.32 ou plus récent ; le runner refuse de démarrer sinon. Remplace les flags de réécriture. |

59 60 

60La plupart des drapeaux de durée ont un maximum, choisi pour garder chaque délai d'attente en dessous du plafond de minuteur 32 bits du runtime d'environ 24,85 jours. Les drapeaux `--*-min` sont plafonnés à 10080 minutes, 7 jours ; `--drain-grace-sec` à 604800 secondes, également 7 jours ; et `--drain-wait-sec` à 86400 secondes, 24 heures. `--session-stop-grace-sec` et `--post-session-hook-timeout-sec` ne sont pas plafonnés. Dépasser un plafond se comporte différemment par surface :61La plupart des drapeaux de durée ont un maximum, choisi pour garder chaque délai d'attente en dessous du plafond de minuteur 32 bits du runtime d'environ 24,85 jours. Les drapeaux `--*-min` sont plafonnés à 10080 minutes, 7 jours ; `--drain-grace-sec` à 604800 secondes, également 7 jours ; et `--drain-wait-sec` à 86400 secondes, 24 heures. `--session-stop-grace-sec` et `--post-session-hook-timeout-sec` ne sont pas plafonnés. Dépasser un plafond se comporte différemment par surface :

61 62 

62* **Drapeau** : le démarrage échoue avec une erreur.63* **Drapeau** : le démarrage échoue avec une erreur.

63* **Variable d'environnement** : le runner serre la valeur au plafond de minuteur plutôt que de la rejeter.64* **Variable d'environnement** : le runner serre la valeur au plafond de minuteur plutôt que de la rejeter.

64 65 

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

67 Listes de règles du mode auto

68</h3>

69 

70`--server-auto-mode-lists` vous permet de décider quelles règles du classifieur du [mode auto](/docs/fr/permission-modes#eliminate-prompts-with-auto-mode) provenant de l'extérieur du runner atteignent les sessions sur vos runners. Le plan de contrôle d'Anthropic peut envoyer des listes de règles avec une session et demander au runner de les appliquer. Certaines entrées peuvent être des règles rédigées par un administrateur de votre organisation. Les listes sont `environment`, `soft_deny` et `allow` :

71 

72* **`environment`** : une entrée peut amener le classifieur à autoriser davantage comme à autoriser moins.

73* **`soft_deny`** : une entrée bloque une action sauf si l'utilisateur l'a explicitement demandée ou si une exception `allow` s'applique.

74* **`allow`** : les exceptions aux entrées `soft_deny`.

75 

76La valeur du flag détermine quelles listes le runner applique :

77 

78* **`no-allow`** : la valeur par défaut. Applique `environment` et `soft_deny` et retient `allow`. Une entrée `environment` peut toujours amener le classifieur à autoriser davantage, donc la valeur par défaut n'exclut pas tout assouplissement.

79* **`all`** : applique les trois listes.

80* **`none`** : n'en applique aucune. Choisissez `none` pour exclure tout assouplissement provenant de ces listes. Cela supprime également les restrictions `soft_deny`.

81 

82Aucun paramètre du runner ne fait en sorte que le plan de contrôle demande au runner d'appliquer les listes. Quand il ne le demande pas, les sessions ne reçoivent aucune liste, quelle que soit la valeur que vous définissez. Pour voir ce qui s'est passé, démarrez le runner avec `--log-level debug`. Pour chaque session, le runner journalise alors une ligne contenant `the server asked this runner to apply`, ou une ligne contenant `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 Drapeaux CLI de l'orchestrateur85 Drapeaux CLI de l'orchestrateur

67</h2>86</h2>


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

73| `--hook-concurrency <n>` | `4` | Nombre maximum de hooks `spawn-runner` s'exécutant en parallèle. Limite également le nombre de demandes de génération réclamées par interrogation. |92| `--hook-concurrency <n>` | `4` | Nombre maximum de hooks `spawn-runner` s'exécutant en parallèle. Limite également le nombre de demandes de génération réclamées par interrogation. |

74| `--hook-timeout <sec>` | `60` | Terminer l'arborescence des processus du hook après ce nombre de secondes. Le délai d'attente plus sa grâce de suppression de 5 secondes doit rester en dessous de `--expected-spawn-seconds` ; l'orchestrateur applique ceci au démarrage. |93| `--hook-timeout <sec>` | `60` | Terminer l'arborescence des processus du hook après ce nombre de secondes. Le délai d'attente plus sa grâce de suppression de 5 secondes doit rester en dessous de `--expected-spawn-seconds` ; l'orchestrateur applique ceci au démarrage. |

75| `--expected-spawn-seconds <sec>` | `120` | Temps de démarrage p99 attendu pour les runners générés, dans la plage appliquée par le serveur 10 à 3600. Envoyé à chaque interrogation comme le bail côté serveur ; si aucun runner ne s'enregistre avant son expiration, la session est re-proposée avec un nouvel ID de commande. Tous les réplicas doivent partager cette valeur. |94| `--expected-spawn-seconds <sec>` | `120` | Temps p99 attendu entre le moment où l'orchestrateur reçoit une demande de génération et celui où le runner s'enregistre, y compris toute attente de capacité sur votre plateforme. Le serveur applique une plage de 10 à 3600. Envoyé à chaque interrogation comme bail côté serveur : si aucun runner ne s'enregistre avant son expiration, la session est re-proposée avec un nouvel ID de commande. Tous les réplicas doivent partager cette valeur. |

76| `--min-idle <n>` | `0` | Garder au moins N créneaux de session inactifs libres en générant proactivement des runners de secours. `0` désactive le préchauffage. Associer avec le `--exit-if-unused-min` du runner afin que les runners de secours excédentaires se réclament eux-mêmes. |95| `--min-idle <n>` | `0` | Garder au moins N créneaux de session inactifs libres en générant proactivement des runners de secours. `0` désactive le préchauffage. Associer avec le `--exit-if-unused-min` du runner afin que les runners de secours excédentaires se réclament eux-mêmes. |

77| `--debug-dir <path>` | non défini | Écrire le bon de travail de chaque demande de génération et la stderr du hook sur le disque. Débogage uniquement ; ne jamais définir en production. |96| `--debug-dir <path>` | non défini | Écrire le bon de travail de chaque demande de génération et la stderr du hook sur le disque. Débogage uniquement ; ne jamais définir en production. |

78 97 


108| `SELF_HOSTED_RUNNER_POST_TURN_SETTLE_MS` | `7000` | Limite supérieure du temps pendant lequel le runner compte une session comme occupée pour le drainage `--drain-wait-sec` après la fin d'un tour, tandis que le processus de la session signale la fin du tour à Anthropic. `0` ou une valeur inutilisable revient à la valeur par défaut, donc la retenue ne peut pas être désactivée. Nécessite Claude Code v2.1.275 ou ultérieur. |127| `SELF_HOSTED_RUNNER_POST_TURN_SETTLE_MS` | `7000` | Limite supérieure du temps pendant lequel le runner compte une session comme occupée pour le drainage `--drain-wait-sec` après la fin d'un tour, tandis que le processus de la session signale la fin du tour à Anthropic. `0` ou une valeur inutilisable revient à la valeur par défaut, donc la retenue ne peut pas être désactivée. Nécessite Claude Code v2.1.275 ou ultérieur. |

109| `SELF_HOSTED_RUNNER_SIGKILL_GRACE_MS` | `30000` | Combien de temps le runner attend que le système d'exploitation livre `SIGKILL` à un enfant bloqué dans les E/S non interruptibles avant de se terminer lui-même. Plancher à `--post-session-hook-timeout-sec` plus 15 secondes, et 30 de plus quand `--push-outcome-on-release` est défini, donc le minimum effectif est 75 secondes aux valeurs par défaut. |128| `SELF_HOSTED_RUNNER_SIGKILL_GRACE_MS` | `30000` | Combien de temps le runner attend que le système d'exploitation livre `SIGKILL` à un enfant bloqué dans les E/S non interruptibles avant de se terminer lui-même. Plancher à `--post-session-hook-timeout-sec` plus 15 secondes, et 30 de plus quand `--push-outcome-on-release` est défini, donc le minimum effectif est 75 secondes aux valeurs par défaut. |

110| `CLAUDE_RUNNER_FETCH_DEPTH` | `50` | Profondeur de récupération git pour les clones frais. Définir un entier positif, ou `full` ou `0` pour une récupération complète. Les dépôts déjà présents dans l'espace de travail conservent leur profondeur existante. |129| `CLAUDE_RUNNER_FETCH_DEPTH` | `50` | Profondeur de récupération git pour les clones frais. Définir un entier positif, ou `full` ou `0` pour une récupération complète. Les dépôts déjà présents dans l'espace de travail conservent leur profondeur existante. |

130| `CLAUDE_RUNNER_FETCH_SERVER_PROGRESS_CAP_MS` | `600000` | Durée en millisecondes, par tentative, pendant laquelle une récupération git peut attendre ses premières données tant que les indicateurs de progression du serveur git lui-même continuent d'augmenter, par exemple lorsque le serveur prépare le pack d'un dépôt volumineux. `0` ou `off` désactive cette attente : une telle récupération est alors interrompue après deux minutes sans données. Tout autre nombre entier est borné entre `120000` et `1800000`, soit 2 à 30 minutes. Nécessite Claude Code v2.1.295 ou ultérieur. |

111| `CLAUDE_RUNNER_SKIP_GIT_VERIFY` | non défini | Quand `1`, ignorer la vérification de présence `.git` après l'exécution d'un hook `checkout`. Définir ceci quand votre hook matérialise une source non-git. |131| `CLAUDE_RUNNER_SKIP_GIT_VERIFY` | non défini | Quand `1`, ignorer la vérification de présence `.git` après l'exécution d'un hook `checkout`. Définir ceci quand votre hook matérialise une source non-git. |

112| `FORCE_AUTOUPDATE_PLUGINS` | non défini | Quand `1`, laisser les marchés de plugins se mettre à jour automatiquement même si le binaire est épinglé |132| `FORCE_AUTOUPDATE_PLUGINS` | non défini | Quand `1`, laisser les marchés de plugins se mettre à jour automatiquement même si le binaire est épinglé |

113| `CLAUDE_CODE_DISABLE_ARTIFACT` | non défini | Quand `1`, désactiver l'outil Artifact dans les sessions indépendamment du paramètre d'administration de l'organisation, et supprimer l'exigence de sortie `*.frame.claudeusercontent.com` |133| `CLAUDE_CODE_DISABLE_ARTIFACT` | non défini | Quand `1`, désactiver l'outil Artifact dans les sessions indépendamment du paramètre d'administration de l'organisation, et supprimer l'exigence de sortie `*.frame.claudeusercontent.com` |


178| `claude_code_self_hosted_orchestrator_poll_errors_total{error_kind}` | Cumul des échecs PollSpawnHints par type : `transport`, `timeout`, `5xx`, `429`, ou `4xx`. Les cinq séries sont présentes depuis le démarrage du processus ; alertez sur `rate(...[5m]) > 0`. |198| `claude_code_self_hosted_orchestrator_poll_errors_total{error_kind}` | Cumul des échecs PollSpawnHints par type : `transport`, `timeout`, `5xx`, `429`, ou `4xx`. Les cinq séries sont présentes depuis le démarrage du processus ; alertez sur `rate(...[5m]) > 0`. |

179| `claude_code_self_hosted_orchestrator_queue_pending_sessions` | Demandes de spawn revendicables maintenant |199| `claude_code_self_hosted_orchestrator_queue_pending_sessions` | Demandes de spawn revendicables maintenant |

180| `claude_code_self_hosted_orchestrator_queue_backing_off_sessions` | Demandes de spawn en retry backoff après un échec de hook réessayable |200| `claude_code_self_hosted_orchestrator_queue_backing_off_sessions` | Demandes de spawn en retry backoff après un échec de hook réessayable |

181| `claude_code_self_hosted_orchestrator_queue_circuit_broken_sessions` | Demandes de spawn bloquées jusqu'à ce qu'un Owner les réessaie à partir de l'onglet **Activity** de l'environnement ; alertez si au-dessus de zéro |201| `claude_code_self_hosted_orchestrator_queue_circuit_broken_sessions` | Sessions dont le spawn est bloqué. Chacune reste bloquée jusqu'à ce qu'un utilisateur lui envoie un nouveau message ou qu'un Owner la réessaie à partir de l'onglet **Activity** de l'environnement. Le compteur peut rester au-dessus de zéro après que vous avez corrigé la cause. Alertez si au-dessus de zéro. |

182| `claude_code_self_hosted_orchestrator_pool_pending_sessions` | Total des sessions attendant un runner pour cet environnement. Agrégat à l'échelle de l'environnement, identique sur chaque instance d'orchestrateur : utilisez `MAX` plutôt que `SUM` entre les instances. |202| `claude_code_self_hosted_orchestrator_pool_pending_sessions` | Total des sessions attendant un runner pour cet environnement. Agrégat à l'échelle de l'environnement, identique sur chaque instance d'orchestrateur : utilisez `MAX` plutôt que `SUM` entre les instances. |

183| `claude_code_self_hosted_orchestrator_pool_active_sessions` | Sessions actuellement assignées à un runner vivant dans cet environnement. Agrégat à l'échelle de l'environnement, identique sur chaque instance d'orchestrateur : utilisez `MAX` plutôt que `SUM` entre les instances. |203| `claude_code_self_hosted_orchestrator_pool_active_sessions` | Sessions actuellement assignées à un runner vivant dans cet environnement. Agrégat à l'échelle de l'environnement, identique sur chaque instance d'orchestrateur : utilisez `MAX` plutôt que `SUM` entre les instances. |

184| `claude_code_self_hosted_orchestrator_spawn_hooks_total{result}` | Cumul des résultats du hook `spawn-runner` : `ok`, `retryable`, `non_retryable`. Compte les invocations de hook d'orchestrateur, pas les enfants de session que les runners génèrent : non comparable à `sessions_started_total`, puisque la capacité au-dessus d'un, les pools chauds, et les runners générés à nouveau pour la même session divergent les deux. |204| `claude_code_self_hosted_orchestrator_spawn_hooks_total{result}` | Cumul des résultats du hook `spawn-runner` : `ok`, `retryable`, `non_retryable`. Compte les invocations de hook d'orchestrateur, pas les enfants de session que les runners génèrent : non comparable à `sessions_started_total`, puisque la capacité au-dessus d'un, les pools chauds, et les runners générés à nouveau pour la même session divergent les deux. |


285 for: 1m305 for: 1m

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

287 annotations:307 annotations:

288 summary: "{{ $value }} sessions circuit-broken — le hook spawn-runner est répétitivement non-réessayable ; corrigez l'infra puis réessayez à partir de l'onglet Activity"308 summary: "Sessions dont le spawn est bloqué : {{ $value }}. Lisez l'erreur de chacune dans l'onglet Activity, corrigez la cause, puis sélectionnez Retry"

289 - alert: ClaudeOrchestratorPollErrors309 - alert: ClaudeOrchestratorPollErrors

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

291 for: 2m311 for: 2m


320 340 

321Avant v2.1.260, le runner terminait chaque session qui atteignait sa limite `--kill-session-after-min` et la comptait dans `sessions_interrupted_total`.341Avant v2.1.260, le runner terminait chaque session qui atteignait sa limite `--kill-session-after-min` et la comptait dans `sessions_interrupted_total`.

322 342 

323Le hook [`post-session`](/docs/fr/self-hosted-environments-configuration#post-session) classifie différemment les remises propres avec `CLAUDE_RUNNER_EXIT_REASON`. Le hook signale une libération, un timeout de démarrage, et une désassignation serveur comme `interrupted`, parce que le runner a arrêté l'enfant. Ces compteurs enregistrent les mêmes événements que `completed`, parce que le slot a été remis correctement.343Le hook [`post-session`](/docs/fr/self-hosted-environments-configuration#post-session) classifie différemment les remises propres avec `CLAUDE_RUNNER_EXIT_REASON`. Le hook les signale comme `interrupted`, parce que le runner a arrêté l'enfant : une libération, un timeout de démarrage, une désassignation serveur, et un archivage ou une suppression que le poll a remarqué en premier. Ces compteurs enregistrent les mêmes événements que `completed`, parce que le slot a été remis correctement.

324 344 

325Si vous réconciliez les reçus de hook directement contre `sessions_completed_total`, vous sous-comptez les complétions. Utilisez le hook pour les garanties par session et les compteurs pour les taux agrégés.345Si vous réconciliez les reçus de hook directement contre `sessions_completed_total`, vous sous-comptez les complétions. Utilisez le hook pour les garanties par session et les compteurs pour les taux agrégés.

326 346 

Details

87 87 

88Les drapeaux de dispatch `--environment` et `--ref` nécessitent Claude Code v2.1.224 ou ultérieur sur la machine qui exécute le script, le même plancher que le runner lui-même. Avec le hook en place et un runner démarré sur cet hôte, le script de test :88Les drapeaux de dispatch `--environment` et `--ref` nécessitent Claude Code v2.1.224 ou ultérieur sur la machine qui exécute le script, le même plancher que le runner lui-même. Avec le hook en place et un runner démarré sur cet hôte, le script de test :

89 89 

901. Crée une session sur l'environnement de test avec `claude -p "<prompt>" --environment <environment-id> --output-format json`, exécuté à partir d'une extraction git pour que la CLI puisse détecter automatiquement le référentiel à partir de la télécommande `origin`. Le `--ref <branch>` optionnel base l'extraction de la session sur une ref nommée au lieu du HEAD local. La commande crée la session, imprime une ligne de JSON contenant `session_id`, et se termine sans attendre la réponse de Claude.901. Crée une session sur l'environnement de test avec `claude -p "<prompt>" --environment <environment-id> --output-format json`. Exécutez la commande à partir d'une extraction git pour que la CLI puisse détecter automatiquement le dépôt à partir du dépôt distant `origin`. Le `--ref <branch>` optionnel base l'extraction de la session sur une ref nommée au lieu du HEAD local. La commande se termine sans attendre la réponse de Claude. Ce qu'elle imprime indique le résultat à votre script :

91 * **Session créée** : une ligne de JSON telle que `{"ok":true,"session_id":"session_...","title":"...","url":"...","pool_id":"..."}`

92 * **Échec de la création de la session** : la ligne `{"ok":false,"error":"..."}`, et la commande se termine avec le statut 1

93 * **Certaines erreurs antérieures**, comme l'indisponibilité des sessions cloud pour votre organisation ou un prompt manquant : l'erreur sur stderr sans ligne JSON, et la commande se termine avec le statut 1

912. Attend que la réponse apparaisse dans `$E2E_REPLY_DIR/<session_id>.txt`, écrite par le hook Stop sur le runner une fois le tour terminé.942. Attend que la réponse apparaisse dans `$E2E_REPLY_DIR/<session_id>.txt`, écrite par le hook Stop sur le runner une fois le tour terminé.

923. Envoie un suivi avec `claude -p "<message>" --cloud <session_id> --output-format json` (voir [Envoyer un message de suivi à une session en cours d'exécution](/docs/fr/claude-code-on-the-web#send-follow-ups-from-the-cli)), qui publie un événement utilisateur à la session existante et se termine.953. Envoie un suivi avec `claude -p "<message>" --cloud <session_id> --output-format json` (voir [Envoyer un message de suivi à une session en cours d'exécution](/docs/fr/claude-code-on-the-web#send-follow-ups-from-the-cli)), qui publie un événement utilisateur à la session existante et se termine.

934. Attend la réponse du suivi de la même manière qu'à l'étape 2.964. Attend la réponse du suivi de la même manière qu'à l'étape 2.


104 Exemple de script107 Exemple de script

105</h2>108</h2>

106 109 

107Le script ci-dessous exécute la boucle complète contre `$CLAUDE_TEST_ENVIRONMENT_ID`, l'ID `ccpool_...` de votre environnement de test, affiché dans la boîte de dialogue de détail de l'environnement sur la page d'administration ou retourné par l'[appel create-environment](#create-a-dedicated-test-environment), et affirme sur une phrase sentinelle dans chaque réponse. Exécutez-le à partir d'une extraction git du dépôt dans lequel vous voulez que la session fonctionne, après avoir démarré un runner sur cet hôte avec le hook de capture installé et `E2E_REPLY_DIR` exporté. Connectez-vous d'abord avec un compte claude.ai sur la machine qui exécute le script, comme décrit dans [S'authentifier depuis la CI](#authenticate-from-ci). Sans cette connexion, le premier envoi échoue avec une erreur telle que `Unable to get organization UUID for cloud session creation`.110L'exemple de script s'exécute sur la même machine que le test runner. Avant de l'exécuter, préparez cette machine :

111 

112* **Extraction du dépôt** : exécutez le script à partir d'une extraction git du dépôt dans lequel vous voulez que la session fonctionne.

113* **Runner** : démarrez un runner sur cet hôte avec le hook de capture installé et `E2E_REPLY_DIR` exporté.

114* **Connexion** : connectez-vous avec un compte claude.ai sur la machine qui exécute le script, comme décrit dans [S'authentifier depuis la CI](#authenticate-from-ci).

115* **ID d'environnement** : définissez `CLAUDE_TEST_ENVIRONMENT_ID` sur l'ID `ccpool_...` de votre environnement de test, affiché dans la boîte de dialogue de détail de l'environnement sur la page d'administration ou retourné par l'[appel create-environment](#create-a-dedicated-test-environment).

116 

117Le script ci-dessous exécute la boucle complète contre `$CLAUDE_TEST_ENVIRONMENT_ID` et affirme sur une phrase sentinelle dans chaque réponse.

108 118 

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

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


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

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

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

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

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

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

158 168 


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

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

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

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

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

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

169 179 

skills.md +1 −1

Details

235 235 

236Si une skill existe uniquement dans `~/.claude/skills/` sur votre machine, Claude Code signale que la skill n'a pas été trouvée quand une [routine](/docs/fr/routines) l'invoque, car chaque exécution de routine démarre en tant que nouvelle session cloud. Pour rendre une skill personnelle disponible dans ces sessions :236Si une skill existe uniquement dans `~/.claude/skills/` sur votre machine, Claude Code signale que la skill n'a pas été trouvée quand une [routine](/docs/fr/routines) l'invoque, car chaque exécution de routine démarre en tant que nouvelle session cloud. Pour rendre une skill personnelle disponible dans ces sessions :

237 237 

238* Pour les sessions Cowork et cloud, activez la skill pour votre compte claude.ai.238* Pour les sessions Cowork et cloud, activez le skill pour votre compte claude.ai. [Certaines sessions dans un environnement auto-hébergé](/docs/fr/self-hosted-environments-configuration#how-each-session’s-config-is-assembled) ne chargent pas les skills de votre compte.

239* Pour les sessions cloud, vous pouvez à la place valider la skill dans le `.claude/skills/` du référentiel. Les plugins déclarés dans le `.claude/settings.json` du référentiel et les plugins activés uniquement dans vos paramètres utilisateur [ne se chargent pas dans les sessions cloud](/docs/fr/cloud-environments#what-carries-over-from-your-setup).239* Pour les sessions cloud, vous pouvez à la place valider la skill dans le `.claude/skills/` du référentiel. Les plugins déclarés dans le `.claude/settings.json` du référentiel et les plugins activés uniquement dans vos paramètres utilisateur [ne se chargent pas dans les sessions cloud](/docs/fr/cloud-environments#what-carries-over-from-your-setup).

240 240 

241Les [tâches planifiées Desktop](/docs/fr/desktop-scheduled-tasks) s'exécutent localement sur votre machine, donc elles chargent `~/.claude/skills/`.241Les [tâches planifiées Desktop](/docs/fr/desktop-scheduled-tasks) s'exécutent localement sur votre machine, donc elles chargent `~/.claude/skills/`.

vs-code.md +1 −1

Details

479 479 

480Claude ouvre de nouveaux onglets pour les tâches du navigateur et partage l'état de connexion de votre navigateur, ce qui lui permet d'accéder à n'importe quel site auquel vous êtes déjà connecté.480Claude ouvre de nouveaux onglets pour les tâches du navigateur et partage l'état de connexion de votre navigateur, ce qui lui permet d'accéder à n'importe quel site auquel vous êtes déjà connecté.

481 481 

482Pour que chaque session se connecte à votre navigateur dès son démarrage, sans taper `@browser`, consultez [Activer Chrome par défaut](/docs/fr/chrome#enable-chrome-by-default). Pour les cas où Claude Code vous demande confirmation avant une action du navigateur dans une session connectée de cette façon, consultez [Demandes de permission dans les sessions VS Code](/docs/fr/chrome#permission-prompts-in-vs-code-sessions).482Pour que chaque session se connecte à votre navigateur dès son démarrage, sans taper `@browser`, consultez [Activer Chrome par défaut](/docs/fr/chrome#enable-chrome-by-default). Pour les cas où Claude Code vous demande confirmation avant une action du navigateur, consultez [Demandes de permission dans les sessions VS Code](/docs/fr/chrome#permission-prompts-in-vs-code-sessions).

483 483 

484Pour les instructions de configuration, la liste complète des capacités et le dépannage, consultez [Utiliser Claude Code avec Chrome](/docs/fr/chrome).484Pour les instructions de configuration, la liste complète des capacités et le dépannage, consultez [Utiliser Claude Code avec Chrome](/docs/fr/chrome).

485 485