SpyBara
Go Premium

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

19 files changed +487 −139. 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 

125Tanpa pesan parsial diaktifkan, Anda menerima semua jenis pesan kecuali `StreamEvent`. Jenis umum termasuk `SystemMessage` (inisialisasi sesi), `AssistantMessage` (blok konten lengkap), `ResultMessage` (hasil akhir), dan pesan batas kompak yang menunjukkan kapan riwayat percakapan dikompres (`SDKCompactBoundaryMessage` di TypeScript; `SystemMessage` dengan subtipe `"compact_boundary"` di Python).125Tanpa pesan parsial diaktifkan, Anda menerima semua jenis pesan kecuali `StreamEvent`. Jenis umum termasuk `SystemMessage` (inisialisasi sesi), `AssistantMessage` (blok konten lengkap), `ResultMessage` (hasil akhir), dan pesan batas kompak yang menunjukkan kapan riwayat percakapan dikompres (`SDKCompactBoundaryMessage` di TypeScript; `SystemMessage` dengan subtipe `"compact_boundary"` di Python).

126 126 

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

128 Menangani stream yang terputus

129</h3>

130 

131Jika sebuah stream terputus di tengah pesan, misalnya saat Anda menginterupsi giliran atau koneksi terputus, Anda tetap menerima `message_stop` untuk pesan tersebut sebelum giliran berakhir. Blok teks atau thinking block yang terputus juga mendapatkan `content_block_stop`-nya. Panggilan tool yang terputus tidak mendapatkannya, jadi jika `message_stop` tiba saat blok panggilan tool masih terbuka, anggap input panggilan tersebut tidak lengkap.

132 

133Sebelum Claude Code v2.1.290, stream yang terputus dapat mengakhiri giliran tanpa `message_stop`, sehingga balasan yang Anda render dari acara stream dapat tetap ditampilkan sebagai sedang berlangsung. TypeScript Agent SDK menyertakan Claude Code v2.1.290 atau yang lebih baru mulai dari v0.3.290, dan Python Agent SDK mulai dari v0.2.164. Jika balasan tetap ditampilkan sebagai sedang berlangsung setelah giliran berakhir, perbarui SDK.

134 

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

128 Stream tool calls136 Stream tool calls

129</h2>137</h2>

Details

1588 1588 

1589Cocokkan pesan subagent dengan event tugasnya berdasarkan `agent_id` alih-alih memasangkan `parent_tool_use_id` sebuah pesan dengan `tool_use_id` sebuah event tugas. Ketika sebuah panggilan tool melanjutkan subagent, event tugas membawa `tool_use_id` dari panggilan tersebut, sedangkan pesan tetap membawa `parent_tool_use_id` dari panggilan tool yang pertama kali memulai subagent, sehingga keduanya tidak lagi cocok.1589Cocokkan pesan subagent dengan event tugasnya berdasarkan `agent_id` alih-alih memasangkan `parent_tool_use_id` sebuah pesan dengan `tool_use_id` sebuah event tugas. Ketika sebuah panggilan tool melanjutkan subagent, event tugas membawa `tool_use_id` dari panggilan tersebut, sedangkan pesan tetap membawa `parent_tool_use_id` dari panggilan tool yang pertama kali memulai subagent, sehingga keduanya tidak lagi cocok.

1590 1590 

1591Claude Code menetapkan `user_message_uuid` dan `user_message_uuids` pada pesan asisten pertama giliran, di bawah kondisi dalam [`user_message_uuid`](#user_message_uuid). Ketika Claude Code menjalankan kembali giliran yang terinterupsi oleh restart, pesan asisten re-run yang membawa bidang itu juga membawa [`resume_reason`](#resume_reason).1591Claude Code menetapkan `user_message_uuid` dan `user_message_uuids` pada pesan asisten pertama dari giliran tersebut, dengan ketentuan yang dijelaskan di [`user_message_uuid`](#user_message_uuid). Ketika giliran tersebut melanjutkan giliran yang terinterupsi oleh restart, pesan asisten yang membawa field tersebut juga membawa [`resume_reason`](#resume_reason).

1592 1592 

1593`timestamp` adalah waktu ISO 8601 ketika konten pesan selesai dihasilkan pada proses yang menghasilkannya. Nilai berasal dari jam mesin itu, jadi gunakan hanya untuk tampilan dan jangan urutkan pesan berdasarkannya. Satu giliran API dapat menghasilkan beberapa pesan asisten yang berbagi `message.id`, masing-masing dengan `timestamp` sendiri. Ketika bidang tidak ada, kembali ke waktu Anda menerima pesan.1593`timestamp` adalah waktu ISO 8601 ketika konten pesan selesai dihasilkan pada proses yang menghasilkannya. Nilai berasal dari jam mesin itu, jadi gunakan hanya untuk tampilan dan jangan urutkan pesan berdasarkannya. Satu giliran API dapat menghasilkan beberapa pesan asisten yang berbagi `message.id`, masing-masing dengan `timestamp` sendiri. Ketika bidang tidak ada, kembali ke waktu Anda menerima pesan.

1594 1594 


1631 1631 

1632Tetapkan `inline_pastes` untuk memberi tahu Claude Code bagian mana dari `message.content` yang ditempelkan pengguna alih-alih diketik, satu string per tempelan. Teks prompt tetap berada di tempat pengguna meletakkannya. Claude Code dapat membungkus setiap tempelan yang tercantum dalam tag `<pasted_content>` di tempatnya berada, sehingga Claude dapat membedakan materi yang ditempelkan dari kata-kata pengguna sendiri. Hanya tempelan di blok teks terakhir prompt yang dibungkus. Memerlukan TypeScript Agent SDK v0.3.280 atau lebih baru.1632Tetapkan `inline_pastes` untuk memberi tahu Claude Code bagian mana dari `message.content` yang ditempelkan pengguna alih-alih diketik, satu string per tempelan. Teks prompt tetap berada di tempat pengguna meletakkannya. Claude Code dapat membungkus setiap tempelan yang tercantum dalam tag `<pasted_content>` di tempatnya berada, sehingga Claude dapat membedakan materi yang ditempelkan dari kata-kata pengguna sendiri. Hanya tempelan di blok teks terakhir prompt yang dibungkus. Memerlukan TypeScript Agent SDK v0.3.280 atau lebih baru.

1633 1633 

1634Setiap field tempelan memiliki batas ukuran:

1635 

1636* `pasted_content`: jika jumlah entri ditambah blok konten di dalamnya melebihi 1.000, Claude Code mengabaikan seluruh field.

1637* `inline_pastes`: Claude Code menggunakan 100 entri pertama yang tidak kosong dan mengabaikan sisanya.

1638 

1634Tetapkan `shouldQuery`, `client_composed`, atau `priority` untuk mengubah cara Claude Code menangani pesan yang Anda kirim:1639Tetapkan `shouldQuery`, `client_composed`, atau `priority` untuk mengubah cara Claude Code menangani pesan yang Anda kirim:

1635 1640 

1636* `shouldQuery`: atur ke `false` untuk menambahkan pesan ke transkrip tanpa memicu giliran asisten. Pesan ditahan dan digabungkan ke pesan pengguna berikutnya yang memicu giliran. Gunakan ini untuk menyuntikkan konteks, seperti output perintah yang Anda jalankan di luar pita, tanpa menghabiskan panggilan model.1641* `shouldQuery`: atur ke `false` untuk menambahkan pesan ke transkrip tanpa memicu giliran asisten. Pesan ditahan dan digabungkan ke pesan pengguna berikutnya yang memicu giliran. Gunakan ini untuk menyuntikkan konteks, seperti output perintah yang Anda jalankan di luar pita, tanpa menghabiskan panggilan model.


1775* `ttft_stream_ms`: waktu dalam milidetik hingga acara aliran `message_start` pertama, ketika aliran respons terbuka. Lebih rendah dari `ttft_ms`; celah antara keduanya adalah waktu yang dihabiskan untuk streaming pesan pertama. Hadir hanya pada lengan kesuksesan.1780* `ttft_stream_ms`: waktu dalam milidetik hingga acara aliran `message_start` pertama, ketika aliran respons terbuka. Lebih rendah dari `ttft_ms`; celah antara keduanya adalah waktu yang dihabiskan untuk streaming pesan pertama. Hadir hanya pada lengan kesuksesan.

1776* `user_message_uuid`: `uuid` dari pesan yang Anda kirim yang dijawab giliran ini. Lihat [`user_message_uuid`](#user_message_uuid) untuk hasil mana yang membawanya.1781* `user_message_uuid`: `uuid` dari pesan yang Anda kirim yang dijawab giliran ini. Lihat [`user_message_uuid`](#user_message_uuid) untuk hasil mana yang membawanya.

1777* `user_message_uuids`: `uuid` dari setiap pesan yang Anda kirim yang dijawab Claude Code dalam giliran ini. Lihat [`user_message_uuids`](#user_message_uuids).1782* `user_message_uuids`: `uuid` dari setiap pesan yang Anda kirim yang dijawab Claude Code dalam giliran ini. Lihat [`user_message_uuids`](#user_message_uuids).

1778* `resume_reason`: alasan Claude Code menjalankan ulang giliran ini setelah restart menginterupsinya. Ada pada kedua cabang. Lihat [`resume_reason`](#resume_reason).1783* `resume_reason`: alasan giliran ini melanjutkan giliran yang terinterupsi oleh restart. Ada pada kedua cabang. Lihat [`resume_reason`](#resume_reason).

1779* `local_command`: nama perintah yang dijalankan giliran, pada hasil kesuksesan giliran yang diselesaikan oleh perintah tanpa memasuki loop agent, seperti `/compact`. Nama dilipat menjadi huruf kecil dan garis bawah, jadi `/reload-plugins` melaporkan `reload_plugins`. Perintah yang disediakan server MCP, dan `/mcp` bawaan, melaporkan `mcp`. Perintah yang Anda tentukan sendiri melaporkan `custom`. Argumen tidak pernah disertakan. Tidak ada pada setiap giliran yang memasuki loop agent dan pada pengiriman yang tidak menjalankan perintah. Memerlukan Agent SDK v0.3.268 atau lebih baru.1784* `local_command`: nama perintah yang dijalankan giliran, pada hasil kesuksesan giliran yang diselesaikan oleh perintah tanpa memasuki loop agent, seperti `/compact`. Nama dilipat menjadi huruf kecil dan garis bawah, jadi `/reload-plugins` melaporkan `reload_plugins`. Perintah yang disediakan server MCP, dan `/mcp` bawaan, melaporkan `mcp`. Perintah yang Anda tentukan sendiri melaporkan `custom`. Argumen tidak pernah disertakan. Tidak ada pada setiap giliran yang memasuki loop agent dan pada pengiriman yang tidak menjalankan perintah. Memerlukan Agent SDK v0.3.268 atau lebih baru.

1780* `request_sent_wall_ms`: epoch milidetik di mana Claude Code mengirim permintaan API, untuk penggabungan dengan stempel waktu sisi server. Hadir hanya bersama dengan [`user_message_uuid`](#user_message_uuid), pada hasil kesuksesan dengan `is_error` false yang gilirannya mengirim permintaan API.1785* `request_sent_wall_ms`: epoch milidetik di mana Claude Code mengirim permintaan API, untuk penggabungan dengan stempel waktu sisi server. Hadir hanya bersama dengan [`user_message_uuid`](#user_message_uuid), pada hasil kesuksesan dengan `is_error` false yang gilirannya mengirim permintaan API.

1781* `first_content_frame_ms`: waktu dalam milidetik hingga acara aliran `content_block_start` atau `content_block_delta` pertama, menghitung thinking block sebagai konten. Hadir hanya pada lengan kesuksesan, ketika `is_error` adalah false. Memerlukan Agent SDK v0.3.260 atau lebih baru.1786* `first_content_frame_ms`: waktu dalam milidetik hingga acara aliran `content_block_start` atau `content_block_delta` pertama, menghitung thinking block sebagai konten. Hadir hanya pada lengan kesuksesan, ketika `is_error` adalah false. Memerlukan Agent SDK v0.3.260 atau lebih baru.


1825 1830 

1826* **Pesan reguler yang Anda kirim**, yang berarti tanpa `isSynthetic: true`: giliran menjawab pesan itu untuk seluruh jalannya. Ketika Anda mengirim beberapa pesan berdekatan, Claude Code dapat menggabungkannya menjadi satu giliran, dan bidang kemudian membawa hanya `uuid` pesan terakhir. Untuk mencocokkan balasan dengan salah satu pesan yang digabungkan, gunakan [`user_message_uuids`](#user_message_uuids).1831* **Pesan reguler yang Anda kirim**, yang berarti tanpa `isSynthetic: true`: giliran menjawab pesan itu untuk seluruh jalannya. Ketika Anda mengirim beberapa pesan berdekatan, Claude Code dapat menggabungkannya menjadi satu giliran, dan bidang kemudian membawa hanya `uuid` pesan terakhir. Untuk mencocokkan balasan dengan salah satu pesan yang digabungkan, gunakan [`user_message_uuids`](#user_message_uuids).

1827* **Pesan yang Anda kirim dengan `isSynthetic: true`**: giliran menjawab pesan itu pada awalnya. Jika Claude Code mengambil pesan reguler Anda di antara panggilan tool, giliran menjawab pesan yang diambil dari saat itu. Mengulangi `uuid` pesan sintetis memerlukan Agent SDK v0.3.265 atau lebih baru; versi sebelumnya tidak mengulangi apa pun pada giliran sintetis.1832* **Pesan yang Anda kirim dengan `isSynthetic: true`**: giliran menjawab pesan itu pada awalnya. Jika Claude Code mengambil pesan reguler Anda di antara panggilan tool, giliran menjawab pesan yang diambil dari saat itu. Mengulangi `uuid` pesan sintetis memerlukan Agent SDK v0.3.265 atau lebih baru; versi sebelumnya tidak mengulangi apa pun pada giliran sintetis.

1828* **Prompt yang dihasilkan Claude Code untuk menjalankan kembali giliran terputus di bawah [`CLAUDE_CODE_RESUME_INTERRUPTED_TURN`](/docs/id/env-vars)**: ketika prompt terakhir giliran terputus adalah pesan reguler yang Anda kirim, baik itu membuka giliran maupun Claude Code mengambilnya selama giliran, re-run menjawab pesan itu pada awalnya. [`resume_reason`](#resume_reason) membedakan frame re-run dari frame upaya terputus. Ketika prompt terakhir bukan pesan reguler Anda, re-run tidak menjawab pesan Anda pada awalnya. Jika Claude Code mengambil pesan reguler Anda di antara panggilan tool, giliran menjawab pesan yang diambil dari saat itu. Mengulangi prompt giliran terputus memerlukan Agent SDK v0.3.268 atau lebih baru.1833* **Prompt yang dihasilkan Claude Code untuk melanjutkan giliran yang terinterupsi di bawah [`CLAUDE_CODE_RESUME_INTERRUPTED_TURN`](/docs/id/env-vars)**: ketika prompt terakhir dari giliran yang terinterupsi adalah pesan reguler yang Anda kirim, baik yang membuka giliran maupun yang diambil Claude Code selama giliran, giliran yang dilanjutkan menjawab pesan tersebut pada awalnya. [`resume_reason`](#resume_reason) membedakan frame giliran yang dilanjutkan dari frame upaya yang terinterupsi. Ketika prompt terakhir bukan pesan reguler Anda, giliran yang dilanjutkan tidak menjawab pesan Anda pada awalnya. Jika Claude Code mengambil pesan reguler Anda di antara panggilan tool, giliran menjawab pesan yang diambil tersebut sejak saat itu. Pengembalian prompt giliran yang terinterupsi memerlukan Agent SDK v0.3.268 atau yang lebih baru.

1829* **Prompt lain yang dihasilkan Claude Code sendiri**: giliran tidak menjawab pesan Anda pada awalnya dan frame-nya tidak membawa echo. Jika Claude Code mengambil pesan reguler Anda di antara panggilan tool, giliran menjawab pesan itu dari saat itu. Echo pengambilan memerlukan Agent SDK v0.3.265 atau lebih baru; versi sebelumnya tidak mengulangi apa pun pada giliran ini.1834* **Prompt lain yang dihasilkan Claude Code sendiri**: giliran tidak menjawab pesan Anda pada awalnya dan frame-nya tidak membawa echo. Jika Claude Code mengambil pesan reguler Anda di antara panggilan tool, giliran menjawab pesan itu dari saat itu. Echo pengambilan memerlukan Agent SDK v0.3.265 atau lebih baru; versi sebelumnya tidak mengulangi apa pun pada giliran ini.

1830 1835 

1831Claude Code mengulangi `uuid` pesan yang dijawab pada tiga jenis frame:1836Claude Code mengulangi `uuid` pesan yang dijawab pada tiga jenis frame:


1857 `resume_reason`1862 `resume_reason`

1858</h4>1863</h4>

1859 1864 

1860Mengapa Claude Code menjalankan kembali giliran ini setelah restart. Claude Code menetapkan bidang ini pada giliran yang dijalankan kembali di bawah [`CLAUDE_CODE_RESUME_INTERRUPTED_TURN`](/docs/id/env-vars), jadi Anda dapat membedakan balasan dan hasil re-run dari upaya terputus. Memerlukan Agent SDK v0.3.268 atau lebih baru.1865Alasan giliran ini melanjutkan giliran yang terinterupsi oleh restart. Claude Code menetapkan field ini pada giliran yang melanjutkan giliran terinterupsi di bawah [`CLAUDE_CODE_RESUME_INTERRUPTED_TURN`](/docs/id/env-vars), sehingga Anda dapat membedakan balasan dan hasil giliran yang dilanjutkan dari upaya yang terinterupsi. Memerlukan Agent SDK v0.3.268 atau yang lebih baru.

1861 1866 

1862Claude Code menetapkan bidang pada dua jenis frame:1867Claude Code menetapkan bidang pada dua jenis frame:

1863 1868 

1864* **Hasil re-run**: pada lengan kesuksesan dan kesalahan sama-sama, baik hasil membawa `user_message_uuid` maupun tidak.1869* **Hasil giliran yang dilanjutkan**: pada cabang success maupun error, baik hasil membawa `user_message_uuid` maupun tidak.

1865* **Frame balasan re-run**: yang membawa [`user_message_uuid`](#user_message_uuid).1870* **Frame balasan giliran yang dilanjutkan**: yang membawa [`user_message_uuid`](#user_message_uuid).

1866 1871 

1867Nilainya adalah token huruf kecil pendek yang menyebutkan alasan giliran dijalankan ulang, seperti `interrupted_turn`.1872Nilainya adalah token huruf kecil yang pendek, seperti `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 menetapkan `user_message_uuid` dan `user_message_uuids` pada acara aliran non-ping pertama giliran, dan lagi ketika pesan yang dijawab giliran berubah, di bawah kondisi dalam [`user_message_uuid`](#user_message_uuid). Ketika Claude Code menjalankan kembali giliran yang terinterupsi oleh restart, acara aliran re-run yang membawa bidang itu juga membawa [`resume_reason`](#resume_reason).2037Claude Code menetapkan `user_message_uuid` dan `user_message_uuids` pada event stream non-ping pertama dari giliran, dan lagi ketika pesan yang dijawab giliran berubah, dengan ketentuan di [`user_message_uuid`](#user_message_uuid). Ketika giliran melanjutkan giliran yang terinterupsi oleh restart, event stream yang membawa field tersebut juga membawa [`resume_reason`](#resume_reason).

2033 2038 

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

2035 `SDKCompactBoundaryMessage`2040 `SDKCompactBoundaryMessage`


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

3561| `script` | `string` | Skrip workflow inline. Harus dimulai dengan `export const meta = { name, description }` sebagai literal, diikuti oleh badan skrip menggunakan `agent()`, `parallel()`, `pipeline()`, dan `phase()`. Array `phases` opsional dalam `meta` mengelompokkan agent di bawah tahap bernama dalam tampilan kemajuan |3566| `script` | `string` | Skrip workflow inline. Harus dimulai dengan `export const meta = { name, description }` sebagai literal, diikuti oleh badan skrip menggunakan `agent()`, `parallel()`, `pipeline()`, dan `phase()`. Array `phases` opsional dalam `meta` mengelompokkan agent di bawah tahap bernama dalam tampilan kemajuan |

3562| `name` | `string` | Nama workflow bawaan atau yang disimpan di `.claude/workflows/`. Diselesaikan ke skrip |3567| `name` | `string` | Nama workflow bawaan atau yang disimpan di `.claude/workflows/`. Diselesaikan ke skrip |

3563| `scriptPath` | `string` | Jalur ke file skrip workflow di disk. Diutamakan daripada `script` dan `name`. Claude Code tetap menyimpan skrip setiap invokasi dan mengembalikan jalur dalam hasil, sehingga Anda dapat mengedit file itu dan menginvokasi kembali dengan `scriptPath` yang sama untuk melakukan iterasi |3568| `scriptPath` | `string` | Jalur ke file skrip workflow di disk, seperti `scriptPath` yang dikembalikan oleh run sebelumnya. Diutamakan daripada `script` dan `name`. Claude Code menolak `scriptPath` dengan error ketika tool sesi tidak menyertakan `Read` |

3564| `args` | `unknown` | Nilai input yang diekspos ke skrip sebagai `args` global, untuk workflow bernama yang diparameterisasi seperti pertanyaan penelitian atau daftar jalur file. Lewatkan array dan objek sebagai nilai JSON aktual, bukan sebagai string yang dikodekan JSON |3569| `args` | `unknown` | Nilai input yang diekspos ke skrip sebagai `args` global, untuk workflow bernama yang diparameterisasi seperti pertanyaan penelitian atau daftar jalur file. Lewatkan array dan objek sebagai nilai JSON aktual, bukan sebagai string yang dikodekan JSON |

3565| `resumeFromRunId` | `string` | ID Jalankan dari invokasi `Workflow` sebelumnya untuk dilanjutkan. Panggilan `agent()` yang selesai dengan input tidak berubah biasanya mengembalikan hasil cache; sisanya berjalan langsung. [Lanjutkan setelah jeda](/docs/id/workflows#resume-after-a-pause) mencakup panggilan selesai mana yang dijalankan kembali. Sesi yang sama saja |3570| `resumeFromRunId` | `string` | ID Jalankan dari invokasi `Workflow` sebelumnya untuk dilanjutkan. Panggilan `agent()` yang selesai dengan input tidak berubah biasanya mengembalikan hasil cache; sisanya berjalan langsung. [Lanjutkan setelah jeda](/docs/id/workflows#resume-after-a-pause) mencakup panggilan selesai mana yang dijalankan kembali. Sesi yang sama saja |

3566| `title` | `string` | Diabaikan; blok `meta` skrip menetapkan judul |3571| `title` | `string` | Diabaikan; blok `meta` skrip menetapkan judul |

chrome.md +3 −4

Details

129 Dialog izin dalam sesi VS Code129 Dialog izin dalam sesi VS Code

130</h3>130</h3>

131 131 

132Dalam sesi VS Code, apakah Claude Code meminta konfirmasi Anda sebelum tindakan browser bergantung pada cara sesi tersebut terhubung ke browser Anda:132Dalam sesi VS Code, ketika Claude Code meminta konfirmasi sebelum tindakan browser, dialog izin muncul sebagai kartu di panel chat. Ketika tindakan tersebut menargetkan situs yang belum Anda izinkan, kartu tersebut juga menawarkan untuk mengizinkan situs itu.

133 133 

134* **Anda mengetik `@browser`**: ekstensi menyetujui setiap tindakan browser yang jika tidak demikian akan ditanyakan Claude Code kepada Anda.134Dalam sesi yang terhubung ke browser Anda saat dimulai karena [Enabled by default](#enable-chrome-by-default) aktif, Claude Code meminta konfirmasi Anda sebelum tindakan browser di situs yang belum Anda izinkan, dalam mode izin Manual, Edit automatically, Auto, dan Bypass permissions. Dalam mode izin Auto dan Bypass permissions, hal ini berlaku hingga Anda mengetik `@browser` dalam sesi tersebut.

135* **Pengaturan [Enabled by default](#enable-chrome-by-default) menghubungkannya saat dimulai**: Claude Code meminta konfirmasi Anda sebelum tindakan browser di situs yang belum Anda izinkan, dalam mode izin Manual, Edit automatically, Auto, dan Bypass permissions, hingga Anda mengetik `@browser` dalam sesi tersebut.

136 135 

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

138 Alat browser dalam plan mode137 Alat browser dalam plan mode

139</h3>138</h3>

140 139 

141Dalam [plan mode](/docs/id/permission-modes#analyze-before-you-edit-with-plan-mode), dialog izin muncul sebelum Claude merekam GIF, membuka tab baru, atau menjalankan pintasan, kecuali dalam sesi VS Code di mana Anda mengetik [`@browser`](#permission-prompts-in-vs-code-sessions). Dalam sesi CLI interaktif, jika [mode bypass permissions tersedia](/docs/id/permission-modes#skip-all-checks-with-bypasspermissions-mode) dan [pengambilan feature-flag](/docs/id/env-vars#features-that-need-feature-flag-fetching) dimatikan, panggilan ini berjalan tanpa dialog izin.140Dalam [plan mode](/docs/id/permission-modes#analyze-before-you-edit-with-plan-mode), dialog izin muncul sebelum Claude merekam GIF, membuka tab baru, atau menjalankan pintasan. Dalam sesi CLI interaktif, jika [mode bypass permissions tersedia](/docs/id/permission-modes#skip-all-checks-with-bypasspermissions-mode) dan [pengambilan feature-flag](/docs/id/env-vars#features-that-need-feature-flag-fetching) dimatikan, panggilan ini berjalan tanpa dialog izin.

142 141 

143Panggilan `tabs_context_mcp` juga meminta ketika menetapkan `createIfEmpty`, dan begitu juga panggilan `browser_batch` yang mencakup salah satu tindakan ini.142Panggilan `tabs_context_mcp` juga meminta ketika menetapkan `createIfEmpty`, dan begitu juga panggilan `browser_batch` yang mencakup salah satu tindakan ini.

144 143 

Details

981 * **Kunci campuran**: file yang memiliki `code` dan `cli` sekaligus, atau ejaan lamanya `settings`, menghentikan gateway saat boot. Letakkan setiap blok di bawah satu kunci, dalam satu kali edit.981 * **Kunci campuran**: file yang memiliki `code` dan `cli` sekaligus, atau ejaan lamanya `settings`, menghentikan gateway saat boot. Letakkan setiap blok di bawah satu kunci, dalam satu kali edit.

982</Warning>982</Warning>

983 983 

984Pengaturan Claude Code suatu kebijakan, seperti aturan yang menolak pembacaan file `.env`, ditempatkan dalam blok di bawah kunci `cli` atau `code`. Kedua kunci menerima isi yang sama. Kunci menentukan di mana pengaturan ditegakkan:984Pengaturan Claude Code suatu kebijakan, seperti aturan yang menolak pembacaan file `.env`, diletakkan dalam blok di bawah kunci `cli` atau `code`. `code` adalah kunci yang direkomendasikan, dan `cli` adalah kunci lama. Kedua kunci menerima isi yang sama. Kunci tersebut menentukan di mana pengaturan ditegakkan:

985 985 

986* **`cli`**: terminal, ekstensi VS Code dan JetBrains, serta Agent SDK. Di bawah `cli`, tab Code di Claude Desktop mendapatkan [pengaturan turunan](#claude-desktop-overlay), sehingga aturan berlingkup seperti `Read(./.env)` tidak menghentikan pengguna di sana.986* **`cli`**: terminal, ekstensi VS Code dan JetBrains, serta Agent SDK. Di bawah `cli`, tab Code di Claude Desktop mendapatkan [pengaturan turunan](#claude-desktop-overlay), sehingga aturan berlingkup seperti `Read(./.env)` tidak menghentikan pengguna di sana.

987* **`code`**: tempat yang sama, dan tab Code di Claude Desktop juga dapat dicakup.987* **`code`**: tempat yang sama, dan tab Code di Claude Desktop juga dapat dicakup.

988 988 

989Pilihannya adalah apakah pengaturan ini juga harus mencakup tab Code. Jika tidak, jangan ubah apa pun. File yang menggunakan `cli` berfungsi seperti sebelumnya, dan gateway yang menemukan `cli` dalam kebijakan dengan kunci [`desktop`](#claude-desktop-overlay) memberikan peringatan saat boot dan tetap mulai. Untuk mencakup tab Code, beralihlah ke `code`, kunci yang direkomendasikan.989File yang menggunakan `cli` tetap berfungsi seperti sebelumnya, dan gateway yang menemukan `cli` dalam kebijakan dengan kunci [`desktop`](#claude-desktop-overlay) memberi peringatan saat boot dan tetap dimulai. Beralihlah ke `code` agar pengaturan juga dapat mencakup tab Code.

990 990 

991Sebelum beralih, baca [Menerapkan pengaturan `code` di tab Code](#apply-code-settings-in-the-code-tab). Kebijakan memerlukan kunci `desktop` dan mesin pengguna memerlukan penyiapan sebelum pengaturan berlaku di sana, dan pencarian web dimatikan di Claude Desktop.991Sebelum beralih, baca [Menerapkan pengaturan `code` di tab Code](#apply-code-settings-in-the-code-tab). Kebijakan memerlukan kunci `desktop` dan mesin pengguna memerlukan penyiapan sebelum pengaturan berlaku di sana, dan pencarian web dimatikan di Claude Desktop.

992 992 

Details

277 277 

278Thread berjalan dalam [auto mode](/docs/id/permission-modes#eliminate-prompts-with-auto-mode) ketika model thread mendukungnya, jadi sebagian besar panggilan alat berjalan tanpa meminta Anda. Ketika thread membutuhkan persetujuan Anda, prompt ada di dalam thread itu dan thread menunggu sampai Anda menjawabnya di sana. Memberi tahu Claude dalam percakapan project untuk melanjutkan tidak mencapainya.278Thread berjalan dalam [auto mode](/docs/id/permission-modes#eliminate-prompts-with-auto-mode) ketika model thread mendukungnya, jadi sebagian besar panggilan alat berjalan tanpa meminta Anda. Ketika thread membutuhkan persetujuan Anda, prompt ada di dalam thread itu dan thread menunggu sampai Anda menjawabnya di sana. Memberi tahu Claude dalam percakapan project untuk melanjutkan tidak mencapainya.

279 279 

280Setiap persetujuan mencakup prompt itu, atau sisa thread itu jika Anda memilih opsi yang lebih luas. Untuk membiarkan setiap thread menjalankan perintah tertentu tanpa bertanya, atau untuk memblokir beberapa, tambahkan [permission rules](/docs/id/permissions) ke `.claude/settings.json` repositori. Thread menerapkannya hanya dalam project dengan satu repositori; lihat [Apa yang diambil thread dari repositori Anda](#what-threads-pick-up-from-your-repositories). Dalam project dengan beberapa repositori, tidak ada permission rules repositori yang mencapai thread cloud, jadi Anda mengandalkan auto mode dan pada persetujuan yang Anda berikan di dalam setiap thread.280Setiap persetujuan mencakup prompt itu, atau sisa thread itu jika Anda memilih opsi yang lebih luas.

281 

282Untuk membiarkan setiap thread menjalankan perintah tertentu tanpa bertanya, atau untuk memblokir beberapa, tambahkan [aturan izin](/docs/id/permissions) ke `.claude/settings.json` repositori. Periksa apakah thread cloud di project Anda menerapkannya:

283 

284* **Satu repositori**: thread cloud menerapkan aturan tersebut. Lihat [Apa yang diambil thread dari repositori Anda](#what-threads-pick-up-from-your-repositories).

285* **Beberapa repositori, lingkungan yang di-host Anthropic**: tidak ada aturan izin repositori yang mencapai thread cloud, jadi Anda mengandalkan auto mode dan pada persetujuan yang Anda berikan di dalam setiap thread.

286* **Beberapa repositori, lingkungan self-hosted**: lihat [pengaturan repositori mana yang berlaku](/docs/id/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 Jalankan thread di komputer Anda sendiri289 Jalankan thread di komputer Anda sendiri


381 Apa yang diambil thread dari repositori Anda387 Apa yang diambil thread dari repositori Anda

382</h3>388</h3>

383 389 

384Setiap thread cloud mengkloning setiap repositori dalam project dan memuat `CLAUDE.md` dan skills dari semuanya. Aturan izin, hook, dan `env` hanya datang dari `.claude/settings.json` di direktori tempat thread dimulai: di dalam repositori ketika project memiliki satu, dan di atas klon ketika memiliki beberapa, di mana file repositori mana pun tidak dibaca untuk hal tersebut.390Setiap thread cloud mengkloning setiap repositori dalam project dan memuat `CLAUDE.md` dan skills dari semuanya. Aturan izin, hook, dan `env` hanya datang dari `.claude/settings.json` di direktori tempat thread dimulai.

385 391 

386| Di setiap repositori | Satu repositori | Beberapa repositori |392| Di setiap repositori | Satu repositori | Beberapa repositori |

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

388| `CLAUDE.md` | Dimuat ketika thread dimulai | Dimuat dari setiap repositori ketika thread dimulai |394| `CLAUDE.md` | Dimuat ketika thread dimulai | Dimuat dari setiap repositori ketika thread dimulai |

389| Skills, agent, dan perintah di bawah `.claude/` | Dimuat | Dimuat dari setiap repositori |395| Skills, agent, dan perintah di bawah `.claude/` | Dimuat | Dimuat dari setiap repositori |

390| Plugin yang diaktifkan di `.claude/settings.json` | Tidak dimuat. Tambahkan plugin di **Project settings > Plugins** sebagai gantinya | Tidak dimuat. Tambahkan plugin di **Project settings > Plugins** sebagai gantinya |396| Plugin yang diaktifkan di `.claude/settings.json` | Tidak dimuat. Tambahkan plugin di **Project settings > Plugins** sebagai gantinya | Tidak dimuat. Tambahkan plugin di **Project settings > Plugins** sebagai gantinya |

391| Aturan izin, hook, dan `env` yang didefinisikan di `.claude/settings.json` | Berlaku untuk thread, kecuali kunci `env` yang [tidak dihormati sesi cloud apa pun](/docs/id/cloud-environments#what-carries-over-from-your-setup) | Tidak berlaku |397| Aturan izin, hook, dan `env` yang didefinisikan di `.claude/settings.json` | Berlaku untuk thread, kecuali kunci `env` yang [tidak dihormati sesi cloud apa pun](/docs/id/cloud-environments#what-carries-over-from-your-setup) | Tidak berlaku dalam environment yang dihosting Anthropic. Untuk environment self-hosted, lihat [pengaturan repositori mana yang berlaku](/docs/id/self-hosted-environments-configuration#repository-settings-in-sessions-with-several-repositories) |

392 398 

393Dalam project dengan beberapa repositori, setiap klon dilampirkan ke thread sebagai [direktori tambahan](/docs/id/memory#load-from-additional-directories) dengan pemuatan `CLAUDE.md` diaktifkan, itulah mengapa `CLAUDE.md` dan skills setiap repositori dimuat saat mulai meskipun thread dimulai di atasnya. Dalam project seperti itu, masukkan aturan berdiri di project instructions dan berikan thread environment variable melalui [cloud environment](#choose-an-environment-for-threads).399Dalam project dengan beberapa repositori, masukkan aturan berdiri di project instructions dan berikan thread environment variable melalui [cloud environment](#choose-an-environment-for-threads).

394 400 

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

396 Pilih environment untuk thread402 Pilih environment untuk thread


406 412 

407Thread cloud tidak memiliki skills, server MCP, plugin, dan tool yang diinstal hanya di mesin Anda. Thread yang Claude jalankan di mesin Anda melalui [Remote Control](/docs/id/remote-control) menggunakan apa yang diinstal di sana. Untuk membuat masing-masing tersedia untuk thread cloud:413Thread cloud tidak memiliki skills, server MCP, plugin, dan tool yang diinstal hanya di mesin Anda. Thread yang Claude jalankan di mesin Anda melalui [Remote Control](/docs/id/remote-control) menggunakan apa yang diinstal di sana. Untuk membuat masing-masing tersedia untuk thread cloud:

408 414 

409* Skills, subagent, dan perintah: commit ke repositori yang Anda tambahkan ke project, misalnya skill di `.claude/skills/<skill-name>/SKILL.md`. Setiap thread cloud mengkloning setiap repositori dalam project dan memuat `.claude/skills/`, `.claude/agents/`, dan `.claude/commands/` dari masing-masing, jadi skill yang di-commit ke satu repositori tersedia di setiap thread cloud. Thread cloud juga memuat skills yang Anda aktifkan untuk akun claude.ai Anda.415* Skills, subagent, dan perintah: commit ke repositori yang Anda tambahkan ke project, misalnya skill di `.claude/skills/<skill-name>/SKILL.md`. Setiap thread cloud mengkloning setiap repositori dalam project dan memuat `.claude/skills/`, `.claude/agents/`, dan `.claude/commands/` dari masing-masing, jadi skill yang di-commit ke satu repositori tersedia di setiap thread cloud. Thread cloud juga memuat [skills yang Anda aktifkan untuk akun claude.ai Anda](/docs/id/skills#skills-in-cowork-and-cloud-sessions).

410* Plugin: tambahkan di **Project settings > Plugins**; mereka dimuat ke setiap thread cloud baru. Plugin yang dideklarasikan repositori di `.claude/settings.json`-nya [tidak dimuat dalam thread cloud](/docs/id/cloud-environments#what-carries-over-from-your-setup).416* Plugin: tambahkan di **Project settings > Plugins**; mereka dimuat ke setiap thread cloud baru. Plugin yang dideklarasikan repositori di `.claude/settings.json`-nya [tidak dimuat dalam thread cloud](/docs/id/cloud-environments#what-carries-over-from-your-setup).

411* Server MCP: thread cloud mendapatkan tool MCP mereka dari konektor di akun claude.ai Anda, yang merupakan server MCP yang Anda hubungkan sekali di [claude.ai/customize/connectors](https://claude.ai/customize/connectors) atau melalui link **Manage connectors** di **Project settings > Environment**. Setiap thread cloud dapat menggunakan semuanya tanpa setup per-project. Percakapan project itu sendiri tidak memiliki konektor, jadi kirim pekerjaan yang membutuhkan konektor sebagai tugas untuk thread cloud. Dalam project dengan satu repositori, thread cloud juga memuat server MCP dari [`.mcp.json`](/docs/id/cloud-environments#what-carries-over-from-your-setup) repositori itu. [Bagaimana konektor mencapai Claude Code](/docs/id/mcp#how-connectors-reach-claude-code) mencantumkan aturan untuk sesi cloud dan pengaturan yang mematikan konektor.417* Server MCP: thread cloud mendapatkan tool MCP mereka dari konektor di akun claude.ai Anda, yang merupakan server MCP yang Anda hubungkan sekali di [claude.ai/customize/connectors](https://claude.ai/customize/connectors) atau melalui link **Manage connectors** di **Project settings > Environment**. Setiap thread cloud dapat menggunakan semuanya tanpa setup per-project. Percakapan project itu sendiri tidak memiliki konektor, jadi kirim pekerjaan yang membutuhkan konektor sebagai tugas untuk thread cloud. Dalam project dengan satu repositori, thread cloud juga memuat server MCP dari [`.mcp.json`](/docs/id/cloud-environments#what-carries-over-from-your-setup) repositori itu. [Bagaimana konektor mencapai Claude Code](/docs/id/mcp#how-connectors-reach-claude-code) mencantumkan aturan untuk sesi cloud dan pengaturan yang mematikan konektor.

412* Tool command-line dan paket: instal di [setup script](/docs/id/cloud-environments#setup-scripts) environment.418* Tool command-line dan paket: instal di [setup script](/docs/id/cloud-environments#setup-scripts) environment.

Details

108| `--maintenance` | Jalankan [hook Setup](/docs/id/hooks#setup) dengan pencocokan `maintenance` sebelum sesi (mode cetak saja) | `claude -p --maintenance "query"` |108| `--maintenance` | Jalankan [hook Setup](/docs/id/hooks#setup) dengan pencocokan `maintenance` sebelum sesi (mode cetak saja) | `claude -p --maintenance "query"` |

109| `--max-budget-usd` | Hentikan eksekusi setelah estimasi pengeluaran untuk panggilan API mencapai jumlah ini (mode cetak saja). Claude Code memeriksa batas ini terhadap [estimasi biaya sisi klien](/docs/id/agent-sdk/cost-tracking#estimates-not-billing), yang dapat berbeda dari tagihan Anda. Pengeluaran dari [subagent](/docs/id/sub-agents) dihitung terhadap batas. Pengeluaran dapat melewati batas, jadi [sisakan ruang](/docs/id/agent-sdk/agent-loop#budget-headroom). Ketika Anda kembali ke percakapan dengan `--continue` atau `--resume`, total yang [dipulihkan dari eksekusi sebelumnya](/docs/id/agent-sdk/cost-tracking#accumulate-costs-across-multiple-calls) tidak dihitung terhadapnya. Setelah pengeluaran mencapai batas, memunculkan subagent lain gagal dengan `Budget limit reached`, dan Claude Code menghentikan subagent latar belakang yang masih berjalan; perilaku penegakan batas ini memerlukan Claude Code v2.1.217 atau lebih baru | `claude -p --max-budget-usd 5.00 "query"` |109| `--max-budget-usd` | Hentikan eksekusi setelah estimasi pengeluaran untuk panggilan API mencapai jumlah ini (mode cetak saja). Claude Code memeriksa batas ini terhadap [estimasi biaya sisi klien](/docs/id/agent-sdk/cost-tracking#estimates-not-billing), yang dapat berbeda dari tagihan Anda. Pengeluaran dari [subagent](/docs/id/sub-agents) dihitung terhadap batas. Pengeluaran dapat melewati batas, jadi [sisakan ruang](/docs/id/agent-sdk/agent-loop#budget-headroom). Ketika Anda kembali ke percakapan dengan `--continue` atau `--resume`, total yang [dipulihkan dari eksekusi sebelumnya](/docs/id/agent-sdk/cost-tracking#accumulate-costs-across-multiple-calls) tidak dihitung terhadapnya. Setelah pengeluaran mencapai batas, memunculkan subagent lain gagal dengan `Budget limit reached`, dan Claude Code menghentikan subagent latar belakang yang masih berjalan; perilaku penegakan batas ini memerlukan Claude Code v2.1.217 atau lebih baru | `claude -p --max-budget-usd 5.00 "query"` |

110| `--max-turns` | Batasi jumlah putaran agentic (mode cetak saja). Keluar dengan kesalahan ketika batas tercapai. Tidak ada batas secara default. Dengan `--input-format stream-json`, pesan yang masih antri ketika batas mengakhiri putaran tetap antri dan memulai putaran baru dengan batasnya sendiri | `claude -p --max-turns 3 "query"` |110| `--max-turns` | Batasi jumlah putaran agentic (mode cetak saja). Keluar dengan kesalahan ketika batas tercapai. Tidak ada batas secara default. Dengan `--input-format stream-json`, pesan yang masih antri ketika batas mengakhiri putaran tetap antri dan memulai putaran baru dengan batasnya sendiri | `claude -p --max-turns 3 "query"` |

111| `--mcp-config` | Muat server MCP dari file atau string JSON (dipisahkan spasi). Ketika Anda melewatkan bendera ini dengan `-p`, Claude Code menunggu server yang masih tertunda untuk terhubung sebelum menjalankan putaran pertama, hingga waktu tunggu startup [`MCP_TIMEOUT`](/docs/id/env-vars), 30 detik secara default; server dengan [daftar alat yang di-cache](/docs/id/mcp#managing-your-servers) melewati tunggu dan terhubung saat penggunaan pertama. Tunggu memerlukan Claude Code v2.1.221 atau lebih baru | `claude --mcp-config ./mcp.json` |111| `--mcp-config` | Muat server MCP dari file atau string JSON (dipisahkan spasi). Ketika Anda meneruskan flag ini dengan `-p`, Claude Code menunggu server yang masih tertunda untuk terhubung sebelum menjalankan giliran pertama, hingga timeout startup [`MCP_TIMEOUT`](/docs/id/env-vars), 30 detik secara default; server dengan [daftar tool yang di-cache](/docs/id/mcp#managing-your-servers) melewati penantian dan terhubung saat penggunaan pertama. Di [lingkungan yang dihosting sendiri](/docs/id/self-hosted-environments-configuration#connection-timing), penantian yang lebih singkat berlaku sebagai gantinya. Penantian ini memerlukan Claude Code v2.1.221 atau lebih baru | `claude --mcp-config ./mcp.json` |

112| `--model` | Menetapkan model untuk sesi saat ini dengan [alias model](/docs/id/model-config#model-aliases) seperti `sonnet`, `opus`, `haiku`, atau `fable`, atau nama lengkap model. Menimpa pengaturan [`model`](/docs/id/settings-reference#model) dan [`ANTHROPIC_MODEL`](/docs/id/model-config#environment-variables) | `claude --model claude-sonnet-5` |112| `--model` | Menetapkan model untuk sesi saat ini dengan [alias model](/docs/id/model-config#model-aliases) seperti `sonnet`, `opus`, `haiku`, atau `fable`, atau nama lengkap model. Menimpa pengaturan [`model`](/docs/id/settings-reference#model) dan [`ANTHROPIC_MODEL`](/docs/id/model-config#environment-variables) | `claude --model claude-sonnet-5` |

113| `--name`, `-n` | Atur nama tampilan untuk sesi, ditampilkan di `/resume` dan judul terminal. Anda dapat melanjutkan sesi bernama dengan `claude --resume <name>`. Dalam sesi interaktif, jika sesi langsung lain di mesin ini sudah menggunakan nama, Claude Code menerapkan [varian darinya](/docs/id/sessions#name-your-sessions) sebagai gantinya. <br /><br />[`/rename`](/docs/id/commands) mengubah nama pertengahan sesi dan juga menampilkannya di bilah prompt | `claude -n "my-feature-work"` |113| `--name`, `-n` | Atur nama tampilan untuk sesi, ditampilkan di `/resume` dan judul terminal. Anda dapat melanjutkan sesi bernama dengan `claude --resume <name>`. Dalam sesi interaktif, jika sesi langsung lain di mesin ini sudah menggunakan nama, Claude Code menerapkan [varian darinya](/docs/id/sessions#name-your-sessions) sebagai gantinya. <br /><br />[`/rename`](/docs/id/commands) mengubah nama pertengahan sesi dan juga menampilkannya di bilah prompt | `claude -n "my-feature-work"` |

114| `--no-chrome` | Nonaktifkan [integrasi browser Chrome](/docs/id/chrome) untuk sesi ini | `claude --no-chrome` |114| `--no-chrome` | Nonaktifkan [integrasi browser Chrome](/docs/id/chrome) untuk sesi ini | `claude --no-chrome` |

Details

314| Plugin dan marketplace yang dideklarasikan di `.claude/settings.json` repo Anda | Tidak | Sesi cloud tidak menginstal plugin yang dihidupkan repositori di bawah [`enabledPlugins`](/docs/id/settings-reference#enabledplugins), termasuk yang dari marketplace yang dicantumkan di bawah [`extraKnownMarketplaces`](/docs/id/settings-reference#extraknownmarketplaces) |314| Plugin dan marketplace yang dideklarasikan di `.claude/settings.json` repo Anda | Tidak | Sesi cloud tidak menginstal plugin yang dihidupkan repositori di bawah [`enabledPlugins`](/docs/id/settings-reference#enabledplugins), termasuk yang dari marketplace yang dicantumkan di bawah [`extraKnownMarketplaces`](/docs/id/settings-reference#extraknownmarketplaces) |

315| [Pengaturan terkelola server](/docs/id/server-managed-settings) organisasi Anda | Ya, kecuali dalam sesi [Claude Tag](https://claude.com/docs/claude-tag/overview) | Diambil dari server Anthropic ketika sesi dimulai. Lihat [Surface coverage](/docs/id/model-config#surface-coverage) untuk cara `availableModels` diterapkan di sesi cloud. Pengaturan yang digunakan di perangkat Anda melalui MDM atau file pengaturan terkelola tidak berlaku, karena sesi berjalan di VM yang dikelola Anthropic; di [lingkungan yang di-host sendiri](/docs/id/self-hosted-environments), sesi juga membaca file pengaturan terkelola dalam gambar runner, per [cara Claude Code menggabungkan sumber terkelola](/docs/id/managed-settings#how-claude-code-combines-managed-sources) |315| [Pengaturan terkelola server](/docs/id/server-managed-settings) organisasi Anda | Ya, kecuali dalam sesi [Claude Tag](https://claude.com/docs/claude-tag/overview) | Diambil dari server Anthropic ketika sesi dimulai. Lihat [Surface coverage](/docs/id/model-config#surface-coverage) untuk cara `availableModels` diterapkan di sesi cloud. Pengaturan yang digunakan di perangkat Anda melalui MDM atau file pengaturan terkelola tidak berlaku, karena sesi berjalan di VM yang dikelola Anthropic; di [lingkungan yang di-host sendiri](/docs/id/self-hosted-environments), sesi juga membaca file pengaturan terkelola dalam gambar runner, per [cara Claude Code menggabungkan sumber terkelola](/docs/id/managed-settings#how-claude-code-combines-managed-sources) |

316| `~/.claude/CLAUDE.md` pengguna Anda | Tidak | Hidup di mesin Anda, bukan di repo. Lihat [Tambahkan preferensi pribadi tanpa melakukan commit ke repo](#add-personal-preferences-without-committing-to-the-repo) |316| `~/.claude/CLAUDE.md` pengguna Anda | Tidak | Hidup di mesin Anda, bukan di repo. Lihat [Tambahkan preferensi pribadi tanpa melakukan commit ke repo](#add-personal-preferences-without-committing-to-the-repo) |

317| `~/.claude/skills/`, `~/.claude/agents/`, `~/.claude/commands/` pengguna Anda | Tidak | Hidup di mesin Anda, bukan di repo. Commit mereka ke direktori `.claude/` repo sebagai gantinya. Sesi cloud secara otomatis memuat skill yang Anda aktifkan di claude.ai |317| `~/.claude/skills/`, `~/.claude/agents/`, `~/.claude/commands/` pengguna Anda | Tidak | Hidup di mesin Anda, bukan di repo. Commit mereka ke direktori `.claude/` repo sebagai gantinya. Sesi cloud secara otomatis memuat [skill yang Anda aktifkan di claude.ai](/docs/id/skills#skills-in-cowork-and-cloud-sessions) |

318| Plugin yang hanya diaktifkan di pengaturan pengguna Anda | Tidak | `enabledPlugins` yang dibatasi pengguna hidup di `~/.claude/settings.json` di mesin Anda |318| Plugin yang hanya diaktifkan di pengaturan pengguna Anda | Tidak | `enabledPlugins` yang dibatasi pengguna hidup di `~/.claude/settings.json` di mesin Anda |

319| Server MCP yang Anda tambahkan dengan `claude mcp add` di cakupan lokal default atau cakupan pengguna | Tidak | Mereka menulis ke `~/.claude.json` di mesin Anda, bukan repo. Tambahkan server dengan `claude mcp add --scope project`, yang menulis [`.mcp.json`](/docs/id/mcp#project-scope) repo, dan commit file itu. Sesi dengan satu repositori memuat file itu |319| Server MCP yang Anda tambahkan dengan `claude mcp add` di cakupan lokal default atau cakupan pengguna | Tidak | Mereka menulis ke `~/.claude.json` di mesin Anda, bukan repo. Tambahkan server dengan `claude mcp add --scope project`, yang menulis [`.mcp.json`](/docs/id/mcp#project-scope) repo, dan commit file itu. Sesi dengan satu repositori memuat file itu |

320| Variabel transport di blok `env` `.claude/settings.json` repo Anda, seperti `NODE_EXTRA_CA_CERTS` dan [variabel sertifikat klien mTLS](/docs/id/network-config#mtls-authentication) | Tidak | Lingkungan hosting mengelola koneksi API sesi, jadi Claude Code mengabaikan kunci ini dan mencatat setiap kunci yang diabaikan di log debug sesi |320| Variabel transport di blok `env` `.claude/settings.json` repo Anda, seperti `NODE_EXTRA_CA_CERTS` dan [variabel sertifikat klien mTLS](/docs/id/network-config#mtls-authentication) | Tidak | Lingkungan hosting mengelola koneksi API sesi, jadi Claude Code mengabaikan kunci ini dan mencatat setiap kunci yang diabaikan di log debug sesi |

env-vars.md +1 −1

Details

340| `CLAUDE_CODE_MAX_WEB_SEARCHES_PER_SESSION` | Batas panggilan [WebSearch](/docs/id/tools-reference#session-search-limit) (default: 200). Saat Claude mencapai batas, panggilan WebSearch berikutnya mengembalikan pemberitahuan yang memintanya melanjutkan dengan informasi yang sudah dikumpulkan. Menerima bilangan bulat positif tanpa batas atas. Nilai lain diabaikan dan default berlaku, sehingga batas dapat dinaikkan tetapi tidak dapat dimatikan. Memerlukan Claude Code v2.1.212 atau lebih baru |340| `CLAUDE_CODE_MAX_WEB_SEARCHES_PER_SESSION` | Batas panggilan [WebSearch](/docs/id/tools-reference#session-search-limit) (default: 200). Saat Claude mencapai batas, panggilan WebSearch berikutnya mengembalikan pemberitahuan yang memintanya melanjutkan dengan informasi yang sudah dikumpulkan. Menerima bilangan bulat positif tanpa batas atas. Nilai lain diabaikan dan default berlaku, sehingga batas dapat dinaikkan tetapi tidak dapat dimatikan. Memerlukan Claude Code v2.1.212 atau lebih baru |

341| `CLAUDE_CODE_MCP_ALLOWLIST_ENV` | Setel ke `1` untuk memunculkan server MCP stdio hanya dengan lingkungan dasar yang aman ditambah `env` yang dikonfigurasi untuk server, alih-alih mewarisi lingkungan shell Anda |341| `CLAUDE_CODE_MCP_ALLOWLIST_ENV` | Setel ke `1` untuk memunculkan server MCP stdio hanya dengan lingkungan dasar yang aman ditambah `env` yang dikonfigurasi untuk server, alih-alih mewarisi lingkungan shell Anda |

342| `CLAUDE_CODE_MCP_AUTO_BACKGROUND_MS` | Waktu berlalu dalam milidetik sebelum panggilan tool MCP yang masih berjalan [dipindahkan ke tugas latar belakang](/docs/id/mcp#automatic-backgrounding-of-long-tool-calls) (default: 120000, atau 2 menit). Setel ke `0` untuk mematikan pemindahan otomatis ke latar belakang. Memerlukan Claude Code v2.1.212 atau lebih baru |342| `CLAUDE_CODE_MCP_AUTO_BACKGROUND_MS` | Waktu berlalu dalam milidetik sebelum panggilan tool MCP yang masih berjalan [dipindahkan ke tugas latar belakang](/docs/id/mcp#automatic-backgrounding-of-long-tool-calls) (default: 120000, atau 2 menit). Setel ke `0` untuk mematikan pemindahan otomatis ke latar belakang. Memerlukan Claude Code v2.1.212 atau lebih baru |

343| `CLAUDE_CODE_MCP_STARTUP_WAIT_MS` | Berapa lama dalam milidetik giliran pertama sesi [non-interaktif](/docs/id/headless) menunggu server MCP yang masih terhubung, menggantikan [penantian giliran pertama](/docs/id/agent-sdk/mcp#connection-timing) default. Saat disetel, penantian mencakup setiap server yang tertunda. Setel ke `0` untuk melewati penantian. Server [`--permission-prompt-tool`](/docs/id/cli-reference#cli-flags) mempertahankan penantian `MCP_TIMEOUT`-nya sendiri terlepas dari nilainya. Memerlukan Claude Code v2.1.274 atau lebih baru |343| `CLAUDE_CODE_MCP_STARTUP_WAIT_MS` | Berapa lama dalam milidetik giliran pertama sesi [non-interaktif](/docs/id/headless) menunggu server MCP yang masih menyambung, menggantikan [penantian giliran pertama](/docs/id/agent-sdk/mcp#connection-timing) default. Ketika diatur, penantian mencakup setiap server yang tertunda; dalam [lingkungan self-hosted](/docs/id/self-hosted-environments-configuration#connection-timing), ini hanya mengubah berapa lama penantian berlangsung. Atur ke `0` untuk melewati penantian. Server [`--permission-prompt-tool`](/docs/id/cli-reference#cli-flags) tetap menggunakan penantian `MCP_TIMEOUT`-nya sendiri terlepas dari nilai ini. Memerlukan Claude Code v2.1.274 atau lebih baru |

344| `CLAUDE_CODE_MCP_TOOL_IDLE_TIMEOUT` | Timeout idle dalam milidetik untuk panggilan tool MCP. Saat server MCP stdio, HTTP, SSE, WebSocket, atau [konektor claude.ai](/docs/id/mcp#use-mcp-servers-from-claude-ai) tidak mengirim respons dan tidak ada notifikasi progres selama selama ini, panggilan tool dibatalkan dengan error alih-alih menunggu `MCP_TOOL_TIMEOUT` keseluruhan. Menimpa default per transport sebesar 300000 (5 menit) untuk server jaringan dan 1800000 (30 menit) untuk server stdio. Setel ke `0` untuk menonaktifkan pemeriksaan idle. Nilai di bawah 1000 dinaikkan menjadi satu detik, dan nilai dibatasi pada `MCP_TOOL_TIMEOUT` efektif. `timeout` per server di `.mcp.json` setidaknya 1000 menaikkan jendela idle server tersebut setidaknya menjadi nilai `timeout`. Tidak berlaku untuk server IDE atau server in-process SDK. Memerlukan Claude Code v2.1.187 atau lebih baru. Sebelum v2.1.203, server stdio dikecualikan dari timeout idle |344| `CLAUDE_CODE_MCP_TOOL_IDLE_TIMEOUT` | Timeout idle dalam milidetik untuk panggilan tool MCP. Saat server MCP stdio, HTTP, SSE, WebSocket, atau [konektor claude.ai](/docs/id/mcp#use-mcp-servers-from-claude-ai) tidak mengirim respons dan tidak ada notifikasi progres selama selama ini, panggilan tool dibatalkan dengan error alih-alih menunggu `MCP_TOOL_TIMEOUT` keseluruhan. Menimpa default per transport sebesar 300000 (5 menit) untuk server jaringan dan 1800000 (30 menit) untuk server stdio. Setel ke `0` untuk menonaktifkan pemeriksaan idle. Nilai di bawah 1000 dinaikkan menjadi satu detik, dan nilai dibatasi pada `MCP_TOOL_TIMEOUT` efektif. `timeout` per server di `.mcp.json` setidaknya 1000 menaikkan jendela idle server tersebut setidaknya menjadi nilai `timeout`. Tidak berlaku untuk server IDE atau server in-process SDK. Memerlukan Claude Code v2.1.187 atau lebih baru. Sebelum v2.1.203, server stdio dikecualikan dari timeout idle |

345| `CLAUDE_CODE_MESSAGING_SOCKET` | Disetel oleh Claude Code, bukan oleh Anda: dalam sesi yang mengikat [socket inbox](/docs/id/cross-session-messaging#the-sessions-inbox-socket), Claude Code mengekspor path socket tersebut ke hook dan perintah Bash saat mengikat socket. Dalam sesi yang dimulai dengan pesan aktif, Claude Code mengikat socket sebelum hook apa pun berjalan. Sesi lain di mesin mengirim pesan ke path ini. Setiap sesi mengekspor socket-nya sendiri alih-alih yang diwarisi dari induk, dan pesan yang tiba di socket tersebut melewati [kontrol masuk](/docs/id/cross-session-messaging#control-inbound-messages) sesi. Blok `env` pengaturan tidak dapat menyetelnya. Memerlukan Claude Code v2.1.224 atau lebih baru |345| `CLAUDE_CODE_MESSAGING_SOCKET` | Disetel oleh Claude Code, bukan oleh Anda: dalam sesi yang mengikat [socket inbox](/docs/id/cross-session-messaging#the-sessions-inbox-socket), Claude Code mengekspor path socket tersebut ke hook dan perintah Bash saat mengikat socket. Dalam sesi yang dimulai dengan pesan aktif, Claude Code mengikat socket sebelum hook apa pun berjalan. Sesi lain di mesin mengirim pesan ke path ini. Setiap sesi mengekspor socket-nya sendiri alih-alih yang diwarisi dari induk, dan pesan yang tiba di socket tersebut melewati [kontrol masuk](/docs/id/cross-session-messaging#control-inbound-messages) sesi. Blok `env` pengaturan tidak dapat menyetelnya. Memerlukan Claude Code v2.1.224 atau lebih baru |

346| `CLAUDE_CODE_MESSAGING_TOKEN` | Disetel oleh Claude Code, bukan oleh Anda: dalam sesi yang mengikat [socket inbox](/docs/id/cross-session-messaging#the-sessions-inbox-socket), Claude Code mengekspor token per sesi ini ke hook dan perintah Bash bersama `CLAUDE_CODE_MESSAGING_SOCKET`. Skrip yang mengirim ke socket dapat mengirim `{"type":"auth","token":"<token>"}` sebagai baris pertamanya untuk membuktikan bahwa skrip tersebut milik sesi. Di Windows native, Claude Code mewajibkan baris ini dan menutup koneksi apa pun yang tidak dibuka dengan baris yang valid. [Aturan anak sendiri](/docs/id/cross-session-messaging#the-sessions-inbox-socket) menjelaskan kapan Claude Code memeriksa token. Setiap sesi mengekspor tokennya sendiri, tidak pernah yang diwarisi dari sesi induk. Blok `env` pengaturan tidak dapat menyetelnya. Memerlukan Claude Code v2.1.228 atau lebih baru |346| `CLAUDE_CODE_MESSAGING_TOKEN` | Disetel oleh Claude Code, bukan oleh Anda: dalam sesi yang mengikat [socket inbox](/docs/id/cross-session-messaging#the-sessions-inbox-socket), Claude Code mengekspor token per sesi ini ke hook dan perintah Bash bersama `CLAUDE_CODE_MESSAGING_SOCKET`. Skrip yang mengirim ke socket dapat mengirim `{"type":"auth","token":"<token>"}` sebagai baris pertamanya untuk membuktikan bahwa skrip tersebut milik sesi. Di Windows native, Claude Code mewajibkan baris ini dan menutup koneksi apa pun yang tidak dibuka dengan baris yang valid. [Aturan anak sendiri](/docs/id/cross-session-messaging#the-sessions-inbox-socket) menjelaskan kapan Claude Code memeriksa token. Setiap sesi mengekspor tokennya sendiri, tidak pernah yang diwarisi dari sesi induk. Blok `env` pengaturan tidak dapat menyetelnya. Memerlukan Claude Code v2.1.228 atau lebih baru |

errors.md +45 −8

Details

247| `Windows reported an error (EBADF) when Claude Code read this session's transcript file` | [Command-line errors](#windows-reported-an-error-ebadf) |247| `Windows reported an error (EBADF) when Claude Code read this session's transcript file` | [Command-line errors](#windows-reported-an-error-ebadf) |

248| `Cannot switch renderers in this session` | [Command-line errors](#cannot-switch-renderers-in-this-session) |248| `Cannot switch renderers in this session` | [Command-line errors](#cannot-switch-renderers-in-this-session) |

249| `Cannot switch renderers while work is running in the background` | [Command-line errors](#cannot-switch-renderers-in-this-session) |249| `Cannot switch renderers while work is running in the background` | [Command-line errors](#cannot-switch-renderers-in-this-session) |

250| `Claude Code couldn't restart` | [Command-line errors](#claude-code-couldnt-restart) |

250| `Couldn't open Claude Desktop` | [Command-line errors](#couldnt-open-claude-desktop) |251| `Couldn't open Claude Desktop` | [Command-line errors](#couldnt-open-claude-desktop) |

251| `Failed to open Claude Desktop. Please try opening it manually.` | [Command-line errors](#couldnt-open-claude-desktop) |252| `Failed to open Claude Desktop. Please try opening it manually.` | [Command-line errors](#couldnt-open-claude-desktop) |

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


334| `Session isn't responding` / `Press enter again to restart this session — it isn't responding` | [Background session errors](#session-isnt-responding) |335| `Session isn't responding` / `Press enter again to restart this session — it isn't responding` | [Background session errors](#session-isnt-responding) |

335| `Session <id> was stopped while the respawn was in flight` | [Background session errors](#session-was-stopped-while-the-respawn-was-in-flight) |336| `Session <id> was stopped while the respawn was in flight` | [Background session errors](#session-was-stopped-while-the-respawn-was-in-flight) |

336| `This session was running agent '<name>', which is no longer available` | [Background session errors](#session-agent-no-longer-available) |337| `This session was running agent '<name>', which is no longer available` | [Background session errors](#session-agent-no-longer-available) |

338| `This session restarted <time> after its next /loop wakeup was due, so that wakeup will not fire` | [Background session errors](#restarted-after-its-next-loop-wakeup-was-due) |

337| `CLAUDE_CODE_PROCESS_WRAPPER: launcher ...` | [Background session errors](#claude_code_process_wrapper-launcher-errors) |339| `CLAUDE_CODE_PROCESS_WRAPPER: launcher ...` | [Background session errors](#claude_code_process_wrapper-launcher-errors) |

338| `EUNKNOWN: unknown error, uv_spawn` | [Background session errors](#eunknown-when-starting-a-background-session) |340| `EUNKNOWN: unknown error, uv_spawn` | [Background session errors](#eunknown-when-starting-a-background-session) |

339| `EACCES: permission denied, posix_spawn` | [Background session errors](#eacces-when-starting-a-background-session) |341| `EACCES: permission denied, posix_spawn` | [Background session errors](#eacces-when-starting-a-background-session) |


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

440| [`CLAUDE_CODE_MAX_RETRIES`](/docs/id/env-vars) | 10 | Jumlah percobaan retry. Dibatasi pada 15 mulai v2.1.186; mulai v2.1.199 `CLAUDE_CODE_RETRY_WATCHDOG` menaikkan default dan menghapus batas. Turunkan untuk menampilkan kegagalan lebih cepat dalam script. |442| [`CLAUDE_CODE_MAX_RETRIES`](/docs/id/env-vars) | 10 | Jumlah percobaan retry. Dibatasi pada 15 mulai v2.1.186; mulai v2.1.199 `CLAUDE_CODE_RETRY_WATCHDOG` menaikkan default dan menghapus batas. Turunkan untuk menampilkan kegagalan lebih cepat dalam script. |

441| [`CLAUDE_CODE_RETRY_WATCHDOG`](/docs/id/env-vars) | unset | Atur ke `1` dalam sesi tanpa pengawasan seperti CI jobs untuk mencoba ulang `429` dan `529` capacity errors tanpa batas bukan gagal setelah `CLAUDE_CODE_MAX_RETRIES` percobaan. Claude Code gagal sekaligus ketika standard-speed request mendapat `429` yang melaporkan spend limit atau kredit penggunaan yang habis, bahkan satu dari [gateway spend cap](#spend-limit-reached) yang reset pada jadwal. Sebelum v2.1.239, watchdog mencoba ulang ini tanpa batas. Untuk fast mode requests, lihat [Handle rate limits](/docs/id/fast-mode#handle-rate-limits). Pada v2.1.199 atau lebih baru itu juga menaikkan default retry count untuk transient errors lainnya, seperti server errors, timeouts, dan dropped connections, menjadi 300, kira-kira tiga jam backoff, dan menghapus batas 15 pada `CLAUDE_CODE_MAX_RETRIES` jika Anda menetapkan variabel itu secara eksplisit. |443| [`CLAUDE_CODE_RETRY_WATCHDOG`](/docs/id/env-vars) | unset | Atur ke `1` dalam sesi tanpa pengawasan seperti CI jobs untuk mencoba ulang `429` dan `529` capacity errors tanpa batas bukan gagal setelah `CLAUDE_CODE_MAX_RETRIES` percobaan. Claude Code gagal sekaligus ketika standard-speed request mendapat `429` yang melaporkan spend limit atau kredit penggunaan yang habis, bahkan satu dari [gateway spend cap](#spend-limit-reached) yang reset pada jadwal. Sebelum v2.1.239, watchdog mencoba ulang ini tanpa batas. Untuk fast mode requests, lihat [Handle rate limits](/docs/id/fast-mode#handle-rate-limits). Pada v2.1.199 atau lebih baru itu juga menaikkan default retry count untuk transient errors lainnya, seperti server errors, timeouts, dan dropped connections, menjadi 300, kira-kira tiga jam backoff, dan menghapus batas 15 pada `CLAUDE_CODE_MAX_RETRIES` jika Anda menetapkan variabel itu secara eksplisit. |

444| [`CLAUDE_CODE_RETRY_WATCHDOG_MAX_WAIT_MS`](/docs/id/env-vars) | unset | Waktu maksimum dalam milidetik yang dihabiskan setiap permintaan API untuk menunggu kesalahan `429` dan `529` ketika `CLAUDE_CODE_RETRY_WATCHDOG` ditetapkan. Ketika tidak ditetapkan, waktu tunggunya tidak terbatas. Memerlukan Claude Code v2.1.295 atau lebih baru. |

442| [`CLAUDE_CODE_OVERLOADED_RETRY_BASE_DELAY_MS`](/docs/id/env-vars) | 500 | Penundaan awal dalam milidetik dari backoff di antara retry permintaan yang ditolak API dengan kesalahan `529` overloaded. Naikkan, hingga 32000, untuk menyebarkan retry dalam rentang waktu yang lebih panjang ketika API sedang mencapai kapasitas. Tidak berpengaruh ketika `CLAUDE_CODE_RETRY_WATCHDOG` diatur ke `1`, atau ketika permintaan yang ditolak dikirim dalam [fast mode](/docs/id/fast-mode#handle-rate-limits). Memerlukan Claude Code v2.1.292 atau lebih baru. |445| [`CLAUDE_CODE_OVERLOADED_RETRY_BASE_DELAY_MS`](/docs/id/env-vars) | 500 | Penundaan awal dalam milidetik dari backoff di antara retry permintaan yang ditolak API dengan kesalahan `529` overloaded. Naikkan, hingga 32000, untuk menyebarkan retry dalam rentang waktu yang lebih panjang ketika API sedang mencapai kapasitas. Tidak berpengaruh ketika `CLAUDE_CODE_RETRY_WATCHDOG` diatur ke `1`, atau ketika permintaan yang ditolak dikirim dalam [fast mode](/docs/id/fast-mode#handle-rate-limits). Memerlukan Claude Code v2.1.292 atau lebih baru. |

443| [`API_TIMEOUT_MS`](/docs/id/env-vars) | 600000 | Per-request timeout dalam milliseconds. Naikkan untuk jaringan lambat atau proxy. Ini juga membatasi berapa lama Claude Code menunggu response headers, dijelaskan dalam [No response from API](#no-response-from-api). |446| [`API_TIMEOUT_MS`](/docs/id/env-vars) | 600000 | Per-request timeout dalam milliseconds. Naikkan untuk jaringan lambat atau proxy. Ini juga membatasi berapa lama Claude Code menunggu response headers, dijelaskan dalam [No response from API](#no-response-from-api). |

444| [`CLAUDE_CODE_NONSTREAMING_TIMEOUT_RETRIES`](/docs/id/env-vars) | unset | Batas pengiriman ulang [permintaan non-streaming](#streaming-response-ended-before-any-complete-data-was-received) yang mengalami timeout. Saat batas tercapai, permintaan gagal. Respons dari Claude yang membutuhkan waktu lebih lama dari timeout untuk dihasilkan akan mengalami timeout lagi pada setiap pengiriman ulang, jadi tetapkan angka rendah seperti `0` agar gagal lebih cepat. Setiap percobaan non-streaming mengalami timeout setelah 300 detik dalam sesi lokal, atau setelah `API_TIMEOUT_MS` ketika Anda menetapkan nilai positif. Memerlukan Claude Code v2.1.285 atau lebih baru. |447| [`CLAUDE_CODE_NONSTREAMING_TIMEOUT_RETRIES`](/docs/id/env-vars) | unset | Batas pengiriman ulang [permintaan non-streaming](#streaming-response-ended-before-any-complete-data-was-received) yang mengalami timeout. Saat batas tercapai, permintaan gagal. Respons dari Claude yang membutuhkan waktu lebih lama dari timeout untuk dihasilkan akan mengalami timeout lagi pada setiap pengiriman ulang, jadi tetapkan angka rendah seperti `0` agar gagal lebih cepat. Setiap percobaan non-streaming mengalami timeout setelah 300 detik dalam sesi lokal, atau setelah `API_TIMEOUT_MS` ketika Anda menetapkan nilai positif. Memerlukan Claude Code v2.1.285 atau lebih baru. |


3413Claude Code menampilkan kesalahan yang sama untuk skill apa pun yang [menyisipkan konteks dinamis](/docs/id/skills#when-an-injected-command-fails), dan perintah sisipan yang gagal membatalkan pemanggilan skill tersebut. Dua string terkait muncul bahkan sebelum perintah dijalankan:3416Claude Code menampilkan kesalahan yang sama untuk skill apa pun yang [menyisipkan konteks dinamis](/docs/id/skills#when-an-injected-command-fails), dan perintah sisipan yang gagal membatalkan pemanggilan skill tersebut. Dua string terkait muncul bahkan sebelum perintah dijalankan:

3414 3417 

3415* `Shell command permission check failed for pattern "..."`: pemeriksaan izin perintah tidak mengizinkannya. [Pemeriksaan izin pada perintah sisipan](/docs/id/skills#permission-checks-on-injected-commands) membahas hasil mana yang membatalkan di setiap mode izin dan cara menyetujui perintah sebelumnya dengan `allowed-tools`3418* `Shell command permission check failed for pattern "..."`: pemeriksaan izin perintah tidak mengizinkannya. [Pemeriksaan izin pada perintah sisipan](/docs/id/skills#permission-checks-on-injected-commands) membahas hasil mana yang membatalkan di setiap mode izin dan cara menyetujui perintah sebelumnya dengan `allowed-tools`

3416* ``Skill <name> requires bash (`shell: bash` in frontmatter) but Git Bash was not found``: frontmatter skill menuntut bash di mesin yang tidak memilikinya. Instal Git for Windows atau ubah frontmatter menjadi `shell: powershell`. Lihat [Cara perintah sisipan dijalankan](/docs/id/skills#how-injected-commands-run)3419* ``Skill <name> requires bash (`shell: bash` in frontmatter) but Git Bash was not found``: frontmatter skill menuntut bash pada mesin yang tidak memilikinya. Instal Git for Windows atau ubah frontmatter menjadi `shell: powershell`. Lihat [Cara perintah sisipan dijalankan](/docs/id/skills#how-injected-commands-run)

3417 3420 

3418**Yang perlu dilakukan:**3421**Yang perlu dilakukan:**

3419 3422 


3562 3565 

3563* **Anda tidak memberikan branch dasar**: Claude Code membandingkan dengan branch default repositori dan menyarankan untuk memberikan branch dasar Anda secara eksplisit, seperti pada contoh di atas3566* **Anda tidak memberikan branch dasar**: Claude Code membandingkan dengan branch default repositori dan menyarankan untuk memberikan branch dasar Anda secara eksplisit, seperti pada contoh di atas

3564* **Anda memberikan branch dasar yang sudah ada di clone Anda**: petunjuknya berbunyi ``Make sure <branch> exists locally or on origin (try `git fetch origin <branch>`)``3567* **Anda memberikan branch dasar yang sudah ada di clone Anda**: petunjuknya berbunyi ``Make sure <branch> exists locally or on origin (try `git fetch origin <branch>`)``

3565* **Anda memberikan branch dasar yang tidak ada di clone Anda**: Claude Code melakukan fetch dari origin sebelum membandingkan. Petunjuknya berbunyi ``<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>`)``; ketika Claude Code tidak dapat mengetahui apakah clone Anda dangkal, Claude Code menyarankan `git fetch --unshallow origin`. Sebelum v2.1.221, petunjuk menyarankan `git fetch --unshallow origin` untuk setiap branch dasar yang di-fetch, dan pada clone yang lengkap perintah tersebut gagal dengan `fatal: --unshallow on a complete repository does not make sense`.3568* **Anda meneruskan branch dasar yang tidak ada di clone Anda**: Claude Code melakukan fetch dari origin sebelum membandingkan. Petunjuknya berbunyi ``<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>`)``; ketika Claude Code tidak dapat mengetahui apakah clone Anda dangkal (shallow), ia menyarankan `git fetch --unshallow origin` sebagai gantinya. Sebelum v2.1.221, petunjuk menyarankan `git fetch --unshallow origin` untuk setiap branch dasar yang di-fetch, dan pada clone lengkap perintah tersebut gagal dengan `fatal: --unshallow on a complete repository does not make sense`.

3566 3569 

3567**Yang perlu dilakukan:**3570**Yang perlu dilakukan:**

3568 3571 


3816 3819 

3817* Dalam sesi yang dimulai tanpa batasan tersebut, jalankan `/tui fullscreen`, atau `/tui default` untuk beralih kembali. Claude Code menyimpan [pengaturan `tui`](/docs/id/settings-reference#tui) di sana3820* Dalam sesi yang dimulai tanpa batasan tersebut, jalankan `/tui fullscreen`, atau `/tui default` untuk beralih kembali. Claude Code menyimpan [pengaturan `tui`](/docs/id/settings-reference#tui) di sana

3818 3821 

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

3823 Claude Code couldn't restart

3824</h3>

3825 

3826Claude Code sedang memulai ulang, misalnya untuk beralih ke atau dari rendering layar penuh setelah Anda menjalankan [`/tui`](/docs/id/fullscreen#enable-fullscreen-rendering). Claude Code menutup sesi tetapi tidak dapat memulai proses baru, sehingga mencetak pesan ini dan keluar dengan status 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 

3832Jika proses mulai ulang tidak memiliki percakapan untuk dibuka kembali, misalnya karena `/tui` adalah input pertama Anda di sesi baru, pesannya berbunyi `Claude Code couldn't restart. Start Claude Code again.`

3833 

3834**Yang perlu dilakukan:**

3835 

3836* Jalankan `claude` lagi di shell Anda dari direktori yang sama. Jika pesan menyebutkan bahwa percakapan Anda tersimpan, jalankan [`/resume`](/docs/id/sessions#resume-a-session) di sesi baru dan pilih percakapan tersebut

3837* Jika proses mulai ulang terus gagal, mulai Claude Code dari shell Anda dengan [`claude --debug-file claude-debug.log`](/docs/id/cli-reference#cli-flags). Jika mulai ulang dari sesi tersebut gagal, `claude-debug.log` di direktori tempat Anda memulai mencatat baris `Failed to relaunch:` dengan error dari sistem operasi. Sertakan baris tersebut saat Anda [melaporkan masalahnya](#report-an-error)

3838 

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

3820 Tidak dapat membuka Claude Desktop3840 Tidak dapat membuka Claude Desktop

3821</h3>3841</h3>


4752 Perintah diblokir oleh pemeriksaan isolasi worktree4772 Perintah diblokir oleh pemeriksaan isolasi worktree

4753</h3>4773</h3>

4754 4774 

4755Claude menjalankan perintah Bash atau Monitor dalam [sesi yang terisolasi dalam worktree](/docs/id/worktrees#how-claude-code-enforces-isolation), dan Claude Code menolaknya karena salah satu dari dua alasan:4775Claude menjalankan perintah Bash, [PowerShell](/docs/id/tools-reference#powershell-tool), atau [Monitor](/docs/id/tools-reference#monitor-tool) dalam [sesi yang terisolasi dalam worktree](/docs/id/worktrees#how-claude-code-enforces-isolation), dan Claude Code menolaknya karena salah satu alasan berikut:

4756 4776 

4757* Perintah menunjukkan git ke checkout utama.4777* Perintah akan berjalan di checkout utama atau di worktree lain. Pesan mengatakan direktori kerjanya `resolved to the shared checkout` atau `is in a different worktree`.

4758* Claude Code tidak dapat memverifikasi dari teks perintah bahwa git apa pun yang dijalankan perintah tetap berada di dalam worktree. Perintah yang tidak pernah menamai git masih dapat ditolak karena alasan ini, karena memperluas indirection variabel seperti `${!name}` atau menjalankan substitusi fungsi Bash seperti `${ command; }` menghasilkan nilai pada runtime yang dapat menjadi perintah itu sendiri.4778* Perintah Bash atau Monitor menunjukkan git ke checkout utama.

4779* Claude Code tidak dapat memverifikasi dari teks perintah Bash atau Monitor bahwa git apa pun yang dijalankan perintah tetap berada di dalam worktree. Perintah yang tidak pernah menamai git masih dapat ditolak karena alasan ini, karena memperluas indirection variabel seperti `${!name}` atau menjalankan substitusi fungsi Bash seperti `${ command; }` menghasilkan nilai pada runtime yang dapat menjadi perintah itu sendiri.

4759 4780 

4760Bagian tengah pesan menamai apa yang tidak dapat diverifikasi:4781Pesan mengatakan `is isolated in the worktree <path>, but this command`, diikuti oleh alasannya, seperti perintah yang teksnya tidak dapat diverifikasi Claude Code:

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**Yang harus dilakukan:**4787**Yang harus dilakukan:**

4767 4788 

4768* Biasanya tidak ada: Claude membaca pesan dan menulis ulang perintah dengan cara yang diminta kalimat terakhirnya4789* **Git yang ditunjukkan ke checkout utama, atau teks perintah yang tidak dapat diverifikasi**: tidak ada. Claude membaca pesan dan menulis ulang perintah dengan cara yang diminta kalimat terakhirnya. Jika perintah yang Anda minta terus ditolak karena ekspansi dalam teksnya, ejakan nilai yang ditandai secara harfiah dan jalankan git sebagai perintah biasa tersendiri dari dalam worktree

4769* Jika perintah yang Anda minta terus ditolak, ejakan nilai yang ditandai secara harfiah: ganti indirection atau substitusi dengan nilainya, dan jalankan git sebagai perintah biasa terpisahnya dari dalam worktree

4770* Untuk bertindak pada checkout utama dengan sengaja, jalankan perintah sendiri di terminal di luar sesi4790* Untuk bertindak pada checkout utama dengan sengaja, jalankan perintah sendiri di terminal di luar sesi

4771 4791 

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


4946* Atau lanjutkan dengan `--agent <name>` yang menamai agent yang memang ada, untuk menjalankan sesi sebagai agent itu sebagai gantinya4966* Atau lanjutkan dengan `--agent <name>` yang menamai agent yang memang ada, untuk menjalankan sesi sebagai agent itu sebagai gantinya

4947* Jika agent bersifat proyek dan Anda belum mempercayai direktori asli sesi, jalankan Claude Code di sana sekali, terima dialog kepercayaan, kemudian lanjutkan lagi4967* Jika agent bersifat proyek dan Anda belum mempercayai direktori asli sesi, jalankan Claude Code di sana sekali, terima dialog kepercayaan, kemudian lanjutkan lagi

4948 4968 

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

4970 Sesi ini dimulai ulang setelah wakeup /loop berikutnya jatuh tempo

4971</h3>

4972 

4973Sebuah [`/loop` yang mengatur tempo sendiri](/docs/id/scheduled-tasks#let-claude-choose-the-interval) dalam [sesi latar belakang](/docs/id/agent-view) telah berhenti. Proses sesi berakhir saat loop sedang menunggu wakeup berikutnya, dan wakeup itu jatuh tempo sebelum [proses berikutnya](/docs/id/agent-view#the-supervisor-process) sesi dimulai. Wakeup yang terlewat tidak dijalankan terlambat. Pemberitahuan menyebutkan seberapa terlambat wakeup tersebut ketika sesi dimulai ulang:

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 

4979Sebelum v2.1.295, loop berhenti dalam situasi ini tanpa pemberitahuan.

4980 

4981**Yang harus dilakukan:**

4982 

4983* Untuk melanjutkan loop, [balas ke sesi](/docs/id/agent-view#peek-and-reply) dan katakan demikian, seperti `keep the loop running`. Claude membaca pemberitahuan bersama balasan Anda dan dapat menjadwalkan wakeup berikutnya

4984* Jika Anda sudah selesai dengan loop, tidak perlu melakukan apa pun. Loop sudah berhenti

4985 

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

4950 Kesalahan peluncur CLAUDE\_CODE\_PROCESS\_WRAPPER4987 Kesalahan peluncur CLAUDE\_CODE\_PROCESS\_WRAPPER

4951</h3>4988</h3>

headless.md +37 −35

Details

89* **Watch [Monitor](/docs/id/tools-reference#monitor-tool)**: eksekusi menunggu hingga watch mencapai timeout atau batas 10 menit mengakhiri penantian, mana pun yang terjadi lebih dulu. Selama menunggu, Claude terus merespons apa yang dilaporkan watch. Secara default, watch mencapai timeout lima menit setelah Claude memulainya.89* **Watch [Monitor](/docs/id/tools-reference#monitor-tool)**: eksekusi menunggu hingga watch mencapai timeout atau batas 10 menit mengakhiri penantian, mana pun yang terjadi lebih dulu. Selama menunggu, Claude terus merespons apa yang dilaporkan watch. Secara default, watch mencapai timeout lima menit setelah Claude memulainya.

90* **Wakeup yang tertunda**: dalam eksekusi yang prompt-nya Anda berikan sebagai teks alih-alih dengan `--input-format stream-json`, ketika Claude telah menjadwalkan [wakeup `/loop` dengan tempo sendiri](/docs/id/scheduled-tasks#let-claude-choose-the-interval), eksekusi menunggu setiap wakeup terpicu dan menjalankan iterasinya hingga [loop berakhir](/docs/id/scheduled-tasks#stop-a-loop), bahkan melewati batas 10 menit.90* **Wakeup yang tertunda**: dalam eksekusi yang prompt-nya Anda berikan sebagai teks alih-alih dengan `--input-format stream-json`, ketika Claude telah menjadwalkan [wakeup `/loop` dengan tempo sendiri](/docs/id/scheduled-tasks#let-claude-choose-the-interval), eksekusi menunggu setiap wakeup terpicu dan menjalankan iterasinya hingga [loop berakhir](/docs/id/scheduled-tasks#stop-a-loop), bahkan melewati batas 10 menit.

91 91 

92Ketika stderr adalah terminal dan eksekusi telah menunggu selama lima detik, Claude Code mencetak satu baris ke stderr yang diawali dengan `Waiting for background work to finish` dan menyebutkan pekerjaan tersebut. Dengan [output `json` atau `stream-json`](#get-structured-output), baris tersebut hanya dicetak ketika stdout bukan terminal, sehingga JSON yang dibaca skrip Anda tidak pernah memuatnya.

93 

92Jika eksekusi mencapai batas [`--max-budget-usd`](/docs/id/cli-reference#cli-flags), Claude Code menghentikan pekerjaan latar belakang yang tersisa alih-alih menunggu.94Jika eksekusi mencapai batas [`--max-budget-usd`](/docs/id/cli-reference#cli-flags), Claude Code menghentikan pekerjaan latar belakang yang tersisa alih-alih menunggu.

93 95 

94Ketika pekerjaan latar belakang memulai giliran lain, eksekusi mencetak hasil setiap giliran dengan output `text` default dan hasil giliran terakhir dengan output `json`. Sebelum v2.1.295, eksekusi juga hanya mencetak hasil giliran terakhir dengan output `text`.96Ketika pekerjaan latar belakang memulai giliran lain, eksekusi mencetak hasil setiap giliran dengan output `text` default dan hasil giliran terakhir dengan output `json`. Sebelum v2.1.295, eksekusi juga hanya mencetak hasil giliran terakhir dengan output `text`.


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

210```212```

211 213 

212Baris terakhir dari aliran adalah pesan `result` dengan teks respons akhir, biaya, dan metadata sesi.214Baris terakhir dari stream adalah pesan `result` dengan teks respons akhir, biaya, dan metadata sesi.

213 215 

214Jika konsumen Anda membaca aliran dengan lambat, Claude Code menunggu output yang antri untuk mengalir sebelum keluar, menskalakan tunggu dengan berapa banyak yang masih antri, dibatasi pada 30 detik. Sebelum v2.1.214 tunggu keluar dibatasi pada sekitar dua detik, yang dapat memotong akhir respons besar.216Jika konsumen Anda membaca stream dengan lambat, Claude Code menunggu output yang antri untuk terkuras sebelum keluar, menskalakan waktu tunggu dengan berapa banyak yang masih antri, dibatasi pada 30 detik. Sebelum v2.1.214 waktu tunggu keluar dibatasi pada sekitar dua detik, yang dapat memotong akhir respons besar.

215 217 

216Contoh berikut menggunakan [jq](https://jqlang.org/) untuk memfilter delta teks dan menampilkan hanya teks streaming. Flag `-r` menampilkan string mentah (tanpa tanda kutip) dan `-j` bergabung tanpa baris baru sehingga token streaming terus menerus:218Contoh berikut menggunakan [jq](https://jqlang.org/) untuk memfilter delta teks dan menampilkan hanya teks streaming. Flag `-r` menampilkan string mentah (tanpa tanda kutip) dan `-j` bergabung tanpa baris baru sehingga token streaming terus menerus:

217 219 


226 Ikuti pesan subagent228 Ikuti pesan subagent

227</h4>229</h4>

228 230 

229Pesan dari [subagent](/docs/id/sub-agents) dan dari skill yang [berjalan dalam subagent](/docs/id/skills#run-skills-in-a-subagent) muncul dalam aliran sebagai pesan `assistant` dan `user`. Bidang `parent_tool_use_id` pada pesan tersebut menunjukkan eksekusi mana yang memiliki setiap pesan. Pesan dari percakapan utama membawa `null` di bidang itu.231Pesan dari [subagent](/docs/id/sub-agents) dan dari skill yang [berjalan dalam subagent](/docs/id/skills#run-skills-in-a-subagent) muncul dalam stream sebagai pesan `assistant` dan `user`. Bidang `parent_tool_use_id` pada pesan tersebut menunjukkan eksekusi mana yang memiliki setiap pesan. Pesan dari percakapan utama membawa `null` di bidang itu.

230 232 

231Pesan pertama dari forked skill, atau dari subagent yang berjalan di [foreground](/docs/id/sub-agents#run-subagents-in-foreground-or-background), adalah pesan `user` yang membawa prompt atau konten skill yang mendorongnya. Setelah pesan pertama itu, Claude Code memancarkan:233Pesan pertama dari forked skill, atau dari subagent yang berjalan di [foreground](/docs/id/sub-agents#run-subagents-in-foreground-or-background), adalah pesan `user` yang membawa prompt atau konten skill yang mendorongnya. Setelah pesan pertama itu, Claude Code memancarkan:

232 234 


245 247 

246Untuk forked skill yang dimulai dari prompt, cocokkan `parent_tool_use_id` pada awalan `forked-command-`, karena nama setelahnya dapat berbeda dari yang Anda ketik.248Untuk forked skill yang dimulai dari prompt, cocokkan `parent_tool_use_id` pada awalan `forked-command-`, karena nama setelahnya dapat berbeda dari yang Anda ketik.

247 249 

248Jika sebagian pesan ini tidak ada di aliran Anda, periksa versi Claude Code Anda terhadap versi minimum berikut:250Jika sebagian pesan ini tidak ada di stream Anda, periksa versi Claude Code Anda terhadap versi minimum berikut:

249 251 

250* **`--forward-subagent-text` dan `CLAUDE_CODE_FORWARD_SUBAGENT_TEXT`**: v2.1.211 atau lebih baru252* **`--forward-subagent-text` dan `CLAUDE_CODE_FORWARD_SUBAGENT_TEXT`**: v2.1.211 atau lebih baru

251* **Penerusan di setiap kedalaman nesting**: v2.1.219 atau lebih baru253* **Penerusan di setiap kedalaman nesting**: v2.1.219 atau lebih baru


254* **Pesan forked skill yang Anda mulai dengan memberikan `/<skill-name>` sebagai prompt**: v2.1.287 atau lebih baru256* **Pesan forked skill yang Anda mulai dengan memberikan `/<skill-name>` sebagai prompt**: v2.1.287 atau lebih baru

255 257 

256<h4 id="handle-api-retries">258<h4 id="handle-api-retries">

257 Tangani percobaan ulang API259 Tangani retry API

258</h4>260</h4>

259 261 

260Ketika permintaan API gagal dengan kesalahan yang dapat dicoba ulang, Claude Code memancarkan acara `system/api_retry` sebelum mencoba ulang. Pada v2.1.246 atau lebih baru, ketika `401` atau `403` menolak kredensial [`apiKeyHelper`](/docs/id/settings-reference#apikeyhelper), Claude Code membuat dua percobaan ulang pertama diam-diam tanpa acara, kemudian memancarkan acara seperti biasa dari percobaan ulang berturut-turut ketiga dan seterusnya. Percobaan ulang diam-diam masih dihitung menuju `attempt`. Anda dapat menggunakan acara untuk menampilkan kemajuan percobaan ulang di antarmuka Anda sendiri.262Ketika permintaan API gagal dengan kesalahan yang dapat dicoba ulang, Claude Code memancarkan acara `system/api_retry` sebelum mencoba ulang. Pada v2.1.246 atau lebih baru, ketika `401` atau `403` menolak kredensial [`apiKeyHelper`](/docs/id/settings-reference#apikeyhelper), Claude Code melakukan dua retry pertama secara diam-diam tanpa acara, kemudian memancarkan acara seperti biasa mulai dari retry berturut-turut ketiga dan seterusnya. Retry diam-diam tersebut tetap dihitung dalam `attempt`. Anda dapat menggunakan acara ini untuk menampilkan kemajuan retry di antarmuka Anda sendiri.

261 263 

262| Bidang | Tipe | Deskripsi |264| Bidang | Tipe | Deskripsi |

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

264| `type` | `"system"` | tipe pesan |266| `type` | `"system"` | tipe pesan |

265| `subtype` | `"api_retry"` | mengidentifikasi ini sebagai acara percobaan ulang |267| `subtype` | `"api_retry"` | mengidentifikasi ini sebagai acara retry |

266| `attempt` | integer | nomor percobaan saat ini, dimulai dari 1 |268| `attempt` | integer | nomor percobaan saat ini, dimulai dari 1 |

267| `max_retries` | integer | total percobaan ulang yang diizinkan untuk penyebab kegagalan ini |269| `max_retries` | integer | total retry yang diizinkan untuk penyebab kegagalan ini |

268| `retry_delay_ms` | integer | milidetik hingga percobaan berikutnya |270| `retry_delay_ms` | integer | milidetik hingga percobaan berikutnya |

269| `error_status` | integer atau null | kode status HTTP dari percobaan yang gagal, atau `null` ketika percobaan tidak mendapat respons HTTP dari API |271| `error_status` | integer atau null | kode status HTTP dari percobaan yang gagal, atau `null` ketika percobaan tidak mendapat respons HTTP dari API |

270| `no_response` | object, opsional | hadir hanya ketika percobaan yang gagal mendapat [tidak ada header respons tepat waktu](/docs/id/errors#no-response-from-api). `waited_ms` adalah berapa lama percobaan itu menunggu dan `retry_wait_ms` adalah berapa lama percobaan ulang akan menunggu. Memerlukan Claude Code v2.1.261 atau lebih baru |272| `no_response` | object, opsional | hadir hanya ketika percobaan yang gagal [tidak mendapat header respons tepat waktu](/docs/id/errors#no-response-from-api). `waited_ms` adalah berapa lama percobaan itu menunggu dan `retry_wait_ms` adalah berapa lama retry akan menunggu. Memerlukan Claude Code v2.1.261 atau lebih baru |

271| `error` | string | kategori kesalahan: `authentication_failed`, `oauth_org_not_allowed`, `account_on_hold`, `billing_error`, `rate_limit`, `overloaded`, `invalid_request`, `model_not_found`, `server_error`, `max_output_tokens`, `cloud_credential_error`, atau `unknown` |273| `error` | string | kategori kesalahan: `authentication_failed`, `oauth_org_not_allowed`, `account_on_hold`, `billing_error`, `rate_limit`, `overloaded`, `invalid_request`, `model_not_found`, `server_error`, `max_output_tokens`, `cloud_credential_error`, atau `unknown` |

272| `uuid` | string | pengidentifikasi acara unik |274| `uuid` | string | pengidentifikasi acara unik |

273| `session_id` | string | sesi yang dimiliki acara |275| `session_id` | string | sesi yang dimiliki acara |


276 Baca metadata sesi278 Baca metadata sesi

277</h4>279</h4>

278 280 

279Acara `system/init` melaporkan metadata sesi termasuk model, alat, server MCP, dan plugin yang dimuat. Ini adalah acara pertama dalam aliran kecuali acara startup mendahuluinya:281Acara `system/init` melaporkan metadata sesi termasuk model, tool, server MCP, dan plugin yang dimuat. Ini adalah acara pertama dalam stream kecuali acara startup mendahuluinya:

280 282 

281* Acara `plugin_install`, ketika [`CLAUDE_CODE_SYNC_PLUGIN_INSTALL`](/docs/id/env-vars) diatur.283* Acara `plugin_install`, ketika [`CLAUDE_CODE_SYNC_PLUGIN_INSTALL`](/docs/id/env-vars) diatur.

282* [Acara `hook_started`, `hook_progress`, dan `hook_response`](/docs/id/agent-sdk/typescript#sdkhookstartedmessage), saat hook [`SessionStart`](/docs/id/hooks#sessionstart) atau [`Setup`](/docs/id/hooks#setup) yang dikonfigurasi berjalan. Ini streaming saat hook menghasilkannya. Claude Code v2.1.169 hingga v2.1.203 mengirimkannya dalam satu batch setelah hook selesai, masih sebelum `system/init`; v2.1.204 mengembalikan pengiriman langsung.284* [Acara `hook_started`, `hook_progress`, dan `hook_response`](/docs/id/agent-sdk/typescript#sdkhookstartedmessage), saat hook [`SessionStart`](/docs/id/hooks#sessionstart) atau [`Setup`](/docs/id/hooks#setup) yang dikonfigurasi berjalan. Acara ini di-stream saat hook menghasilkannya. Claude Code v2.1.169 hingga v2.1.203 mengirimkannya dalam satu batch setelah hook selesai, masih sebelum `system/init`; v2.1.204 mengembalikan pengiriman langsung.

283 285 

284Acara ini juga membawa array `capabilities` opsional dari string yang menamai perilaku protokol yang diimplementasikan versi Claude Code ini, seperti `interrupt_receipt_v1` atau `interrupt_cancel_queued_v1`. Periksanya untuk mendeteksi fitur alih-alih membandingkan string versi, dan abaikan nilai yang tidak Anda kenali. Bidang ini memerlukan Claude Code v2.1.205 atau lebih baru dan tidak ada di versi sebelumnya. Lihat [`SDKSystemMessage`](/docs/id/agent-sdk/typescript#sdksystemmessage) untuk daftar kemampuan.286Acara ini juga membawa array `capabilities` opsional dari string yang menamai perilaku protokol yang diimplementasikan versi Claude Code ini, seperti `interrupt_receipt_v1` atau `interrupt_cancel_queued_v1`. Periksanya untuk mendeteksi fitur alih-alih membandingkan string versi, dan abaikan nilai yang tidak Anda kenali. Bidang ini memerlukan Claude Code v2.1.205 atau lebih baru dan tidak ada di versi sebelumnya. Lihat [`SDKSystemMessage`](/docs/id/agent-sdk/typescript#sdksystemmessage) untuk daftar kemampuan.

285 287 


296 298 

297Ketika direktori `--plugin-dir` atau arsip itu sendiri gagal dimuat, entri `plugin_errors`-nya mencakup jalur absolut yang diselesaikan sebagai `path`. Gunakan untuk membedakan mana dari beberapa nilai `--plugin-dir` yang gagal. Bidang `path` memerlukan Claude Code v2.1.283 atau lebih baru.299Ketika direktori `--plugin-dir` atau arsip itu sendiri gagal dimuat, entri `plugin_errors`-nya mencakup jalur absolut yang diselesaikan sebagai `path`. Gunakan untuk membedakan mana dari beberapa nilai `--plugin-dir` yang gagal. Bidang `path` memerlukan Claude Code v2.1.283 atau lebih baru.

298 300 

299Gunakan bidang server MCP dengan cara yang sama. Ketika Anda berikan [`--mcp-config`](/docs/id/cli-reference#cli-flags) dengan `-p`, Claude Code menunggu server yang masih tertunda sebelum menjalankan giliran pertama, hingga timeout startup [`MCP_TIMEOUT`](/docs/id/env-vars), 30 detik secara default. Server jarak jauh dengan [daftar alat yang di-cache](/docs/id/agent-sdk/mcp#connection-timing) melewati tunggu, menampilkan `pending` di `system/init`, dan terhubung pada pemanggilan alat pertamanya. Tunggu memerlukan Claude Code v2.1.221 atau lebih baru.301Gunakan bidang server MCP dengan cara yang sama. Ketika Anda memberikan [`--mcp-config`](/docs/id/cli-reference#cli-flags) dengan `-p`, Claude Code menunggu server yang masih tertunda sebelum menjalankan giliran pertama, hingga timeout startup [`MCP_TIMEOUT`](/docs/id/env-vars), 30 detik secara default. Server jarak jauh dengan [daftar tool yang di-cache](/docs/id/agent-sdk/mcp#connection-timing) melewati penantian, menampilkan `pending` di `system/init`, dan terhubung pada panggilan tool pertamanya. Dalam [lingkungan self-hosted](/docs/id/self-hosted-environments-configuration#connection-timing), penantian yang lebih singkat berlaku sebagai gantinya. Penantian ini memerlukan Claude Code v2.1.221 atau lebih baru.

300 302 

301Claude Code memvalidasi setiap entri `--mcp-config` pada startup dan melewati entri yang gagal validasi, misalnya entri `url` tanpa `type`. Jalankan berlanjut dan keluar dengan bersih, jadi periksa bidang ini untuk menangkap server yang tidak pernah dimuat:303Claude Code memvalidasi setiap entri `--mcp-config` pada startup dan melewati entri yang gagal validasi, misalnya entri `url` tanpa `type`. Jalankan berlanjut dan keluar dengan bersih, jadi periksa bidang ini untuk menangkap server yang tidak pernah dimuat:

302 304 


324| `session_id` | string | sesi yang dimiliki acara |326| `session_id` | string | sesi yang dimiliki acara |

325 327 

326<h3 id="auto-approve-tools">328<h3 id="auto-approve-tools">

327 Persetujuan otomatis alat329 Persetujuan otomatis tool

328</h3>330</h3>

329 331 

330Gunakan `--allowedTools` untuk membiarkan Claude menggunakan alat tertentu tanpa meminta. Mencantumkan `Read` dan `Edit` memungkinkan Claude membaca dan mengedit file tanpa meminta izin. Mencantumkan `Bash` melakukan hal yang sama untuk perintah shell, kecuali dalam jalankan yang dimulai dalam [mode auto](/docs/id/permission-modes#how-auto-mode-evaluates-actions), di mana Claude Code menghapus entri `Bash` telanjang sebagai aturan allow yang luas dan mode auto mengevaluasi setiap perintah sebagai gantinya. Contoh ini menjalankan suite pengujian dan memperbaiki kegagalan dengan ketiga alat tersebut tercantum:332Gunakan `--allowedTools` untuk membiarkan Claude menggunakan tool tertentu tanpa meminta persetujuan. Mencantumkan `Read` dan `Edit` memungkinkan Claude membaca dan mengedit file tanpa meminta izin. Mencantumkan `Bash` melakukan hal yang sama untuk perintah shell, kecuali dalam jalankan yang dimulai dalam [auto mode](/docs/id/permission-modes#how-auto-mode-evaluates-actions), di mana Claude Code menghapus entri `Bash` polos sebagai aturan allow yang luas dan auto mode mengevaluasi setiap perintah sebagai gantinya. Contoh ini menjalankan suite pengujian dan memperbaiki kegagalan dengan ketiga tool tersebut tercantum:

331 333 

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

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

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

335```337```

336 338 

337Untuk menetapkan baseline untuk seluruh sesi alih-alih mencantumkan alat individual, berikan [mode izin](/docs/id/permission-modes). Jalankan di mana tidak ada yang menetapkan mode izin mengambil [mode izin awal bawaan](/docs/id/permission-modes#which-mode-a-session-starts-in), yang dapat berupa `auto`, jadi berikan yang Anda inginkan:339Untuk menetapkan baseline untuk seluruh sesi alih-alih mencantumkan tool individual, berikan [mode izin](/docs/id/permission-modes). Jalankan di mana tidak ada yang menetapkan mode izin mengambil [mode izin awal bawaan](/docs/id/permission-modes#which-mode-a-session-starts-in), yang dapat berupa `auto`, jadi berikan yang Anda inginkan:

338 340 

339* **`auto`**: berikan `--permission-mode auto` untuk memiliki pengklasifikasi meninjau sebagian besar tindakan alih-alih Anda341* **`auto`**: berikan `--permission-mode auto` agar pengklasifikasi meninjau sebagian besar tindakan alih-alih Anda

340* **`dontAsk`**: Claude Code menolak setiap panggilan yang akan meminta sebaliknya, yang berguna untuk CI runs yang terkunci. Tindakan yang tidak memerlukan persetujuan dalam mode Manual masih berjalan, seperti pembacaan file di direktori kerja Anda dan [set perintah read-only](/docs/id/permissions#read-only-commands), dan begitu juga tindakan yang entri `--allowedTools` Anda atau aturan `permissions.allow` cover. `AskUserQuestion`, alat konektor [organisasi Anda atur ke `ask`](/docs/id/mcp#organization-controls-on-connector-tools), dan alat MCP yang ditandai [`requiresUserInteraction`](/docs/id/mcp#require-approval-for-a-specific-tool) ditolak bahkan ketika aturan allow cocok342* **`dontAsk`**: Claude Code menolak setiap panggilan yang sebaliknya akan memunculkan permintaan izin, yang berguna untuk jalankan CI yang terkunci. Tindakan yang tidak memerlukan persetujuan dalam mode Manual tetap berjalan, seperti pembacaan file di direktori kerja Anda dan [set perintah read-only](/docs/id/permissions#read-only-commands), begitu juga tindakan yang dicakup oleh entri `--allowedTools` Anda atau aturan `permissions.allow`. `AskUserQuestion`, tool konektor yang [diatur organisasi Anda ke `ask`](/docs/id/mcp#organization-controls-on-connector-tools), dan tool MCP yang ditandai [`requiresUserInteraction`](/docs/id/mcp#require-approval-for-a-specific-tool) ditolak bahkan ketika aturan allow cocok

341* **`acceptEdits`**: Claude menulis file tanpa meminta, dan Claude Code auto-approves perintah filesystem umum seperti `mkdir`, `touch`, `mv`, dan `cp`. [Tindakan yang tidak ada mode auto-approve](/docs/id/permission-modes#actions-no-mode-auto-approves) masih berlaku. Terlepas dari set perintah read-only, perintah shell lainnya dan permintaan jaringan masih memerlukan entri `--allowedTools` atau aturan `permissions.allow`. Lihat [apa yang `acceptEdits` auto-approve](/docs/id/permission-modes#auto-approve-file-edits-with-acceptedits-mode) untuk daftar lengkap343* **`acceptEdits`**: Claude menulis file tanpa meminta persetujuan, dan Claude Code menyetujui secara otomatis perintah filesystem umum seperti `mkdir`, `touch`, `mv`, dan `cp`. [Tindakan yang tidak disetujui otomatis oleh mode mana pun](/docs/id/permission-modes#actions-no-mode-auto-approves) tetap berlaku. Selain set perintah read-only, perintah shell lainnya dan permintaan jaringan masih memerlukan entri `--allowedTools` atau aturan `permissions.allow`. Lihat [apa yang disetujui otomatis oleh `acceptEdits`](/docs/id/permission-modes#auto-approve-file-edits-with-acceptedits-mode) untuk daftar lengkap

342 344 

343Contoh ini menerapkan perbaikan lint dengan `acceptEdits` sebagai baseline:345Contoh ini menerapkan perbaikan lint dengan `acceptEdits` sebagai baseline:

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 Matikan prompt izin dalam jalankan tanpa pengawasan352 Matikan permintaan izin dalam jalankan tanpa pengawasan

351</h3>353</h3>

352 354 

353Berikan `--permission-prompts none` ketika tidak ada yang tersedia untuk menjawab prompt izin, misalnya dalam pekerjaan terjadwal. Bendera paling penting ketika jalankan Anda memiliki host izin: aplikasi Agent SDK dengan callback [`canUseTool`](/docs/id/agent-sdk/user-input), atau alat MCP yang Anda berikan dengan [`--permission-prompt-tool`](/docs/id/cli-reference#cli-flags). Tanpa bendera, jalankan Anda menunggu host itu menjawab setiap permintaan izin.355Berikan `--permission-prompts none` ketika tidak ada yang tersedia untuk menjawab permintaan izin, misalnya dalam pekerjaan terjadwal. Flag ini paling penting ketika jalankan Anda memiliki host izin: aplikasi Agent SDK dengan [callback `canUseTool`](/docs/id/agent-sdk/user-input), atau tool MCP yang Anda berikan dengan [`--permission-prompt-tool`](/docs/id/cli-reference#cli-flags). Tanpa flag ini, jalankan Anda menunggu host itu menjawab setiap permintaan izin.

354 356 

355Dengan bendera, jalankan Anda tidak berkonsultasi dengan host atau menunggu itu. Apa pun yang akan meminta ditolak kecuali hook `PermissionRequest` mengizinkannya, Claude diberitahu bahwa tidak ada yang dapat menyetujui permintaan dan tidak mencoba ulang, dan jalankan berlanjut. Dalam jalankan `-p` tanpa host, permintaan ini ditolak baik cara, dan bendera juga memberitahu Claude tidak mencoba ulang mereka. Aturan izin, [hook `PermissionRequest`](/docs/id/hooks#permissionrequest), dan mode izin yang Anda atur masih memutuskan setiap panggilan terlebih dahulu; Claude Code hanya menolak permintaan yang tidak ada yang lain selesaikan.357Dengan flag ini, jalankan Anda tidak berkonsultasi dengan host atau menunggunya. Apa pun yang akan memunculkan permintaan izin ditolak kecuali hook `PermissionRequest` mengizinkannya, Claude diberi tahu bahwa tidak ada yang dapat menyetujui permintaan tersebut dan agar tidak mencobanya ulang, dan jalankan berlanjut. Dalam jalankan `-p` tanpa host, permintaan ini tetap ditolak, dan flag ini juga memberi tahu Claude agar tidak mencobanya ulang. Aturan izin, [hook `PermissionRequest`](/docs/id/hooks#permissionrequest), dan mode izin yang Anda atur tetap memutuskan setiap panggilan terlebih dahulu; Claude Code hanya menolak permintaan yang tidak diselesaikan oleh hal lain.

356 358 

357Contoh ini menjalankan tugas tanpa pengawasan dalam [mode auto](/docs/id/permission-modes#eliminate-prompts-with-auto-mode). Pengklasifikasi meninjau setiap tindakan seperti biasa, dan Claude Code menolak apa pun yang akan jatuh kembali ke prompt:359Contoh ini menjalankan tugas tanpa pengawasan dalam [auto mode](/docs/id/permission-modes#eliminate-prompts-with-auto-mode). Pengklasifikasi meninjau setiap tindakan seperti biasa, dan Claude Code menolak apa pun yang akan jatuh kembali ke permintaan izin:

358 360 

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

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

361```363```

362 364 

363Dengan `--permission-prompts none`, Claude Code menghapus alat yang memerlukan jawaban dari orang, seperti [`AskUserQuestion`](/docs/id/tools-reference#askuserquestion-tool-behavior), sehingga Claude tidak dapat memanggilnya. Setiap [permintaan elicitasi MCP](/docs/id/mcp#respond-to-mcp-elicitation-requests) yang tidak ada hook [`Elicitation`](/docs/id/hooks#elicitation) jawab dibatalkan.365Dengan `--permission-prompts none`, Claude Code menghapus tool yang memerlukan jawaban dari seseorang, seperti [`AskUserQuestion`](/docs/id/tools-reference#askuserquestion-tool-behavior), sehingga Claude tidak dapat memanggilnya. Setiap [permintaan elicitation MCP](/docs/id/mcp#respond-to-mcp-elicitation-requests) yang tidak dijawab oleh [hook `Elicitation`](/docs/id/hooks#elicitation) dibatalkan.

364 366 

365Dengan `--output-format stream-json`, penolakan muncul sebagai pesan sistem `permission_denied`, dan pesan hasil akhir mencantumnya di `permission_denials`.367Dengan `--output-format stream-json`, penolakan muncul sebagai pesan sistem `permission_denied`, dan pesan hasil akhir mencantumkannya di `permission_denials`.

366 368 

367<Note>369<Note>

368 Bendera `--permission-prompts` memerlukan Claude Code v2.1.259 atau lebih baru. Versi sebelumnya menolaknya dengan kesalahan opsi tidak dikenal.370 Flag `--permission-prompts` memerlukan Claude Code v2.1.259 atau lebih baru. Versi sebelumnya menolaknya dengan kesalahan opsi tidak dikenal.

369</Note>371</Note>

370 372 

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

372 Buat komit374 Buat commit

373</h3>375</h3>

374 376 

375Contoh ini meninjau perubahan yang dipentaskan dan membuat komit dengan pesan yang sesuai:377Contoh ini meninjau perubahan yang di-stage dan membuat commit dengan pesan yang sesuai:

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 

382Bendera `--allowedTools` menggunakan [sintaks aturan izin](/docs/id/settings-reference#permission-rule-syntax). Spasi di akhir ` *` memungkinkan pencocokan awalan, jadi `Bash(git diff *)` memungkinkan perintah apa pun yang dimulai dengan `git diff`. Spasi sebelum `*` penting: tanpanya, `Bash(git diff*)` juga akan cocok dengan `git diff-index`.384Flag `--allowedTools` menggunakan [sintaks aturan izin](/docs/id/settings-reference#permission-rule-syntax). ` *` di akhir memungkinkan pencocokan awalan, jadi `Bash(git diff *)` mengizinkan perintah apa pun yang dimulai dengan `git diff`. Spasi sebelum `*` penting: tanpanya, `Bash(git diff*)` juga akan cocok dengan `git diff-index`.

383 385 

384<Note>386<Note>

385 Dukungan perintah berbeda dalam mode `-p`:387 Dukungan perintah berbeda dalam mode `-p`:

386 388 

387 * [skills](/docs/id/skills) yang dipanggil pengguna dan perintah kustom bekerja. Sertakan `/skill-name` dalam string prompt dan Claude Code memperluasnya sebelum menjalankan.389 * [Skills](/docs/id/skills) yang dipanggil pengguna dan perintah kustom berfungsi. Sertakan `/skill-name` dalam string prompt dan Claude Code memperluasnya sebelum menjalankan.

388 * Perintah bawaan yang hanya berjalan di antarmuka terminal, seperti `/login`, tidak tersedia.390 * Perintah bawaan yang hanya berjalan di antarmuka terminal, seperti `/login`, tidak tersedia.

389 * `/model`, `/effort`, `/fast`, `/color`, dan `/rename` menerima nilai sebagai argumen, misalnya `/model sonnet`, dan `/mcp` tanpa argumen mencetak ringkasan teks status server. Bentuk-bentuk ini memerlukan Claude Code v2.1.205 atau lebih baru dan mengikuti [catatan ketersediaan](/docs/id/commands#all-commands) setiap perintah.391 * `/model`, `/effort`, `/fast`, `/color`, dan `/rename` menerima nilai sebagai argumen, misalnya `/model sonnet`, dan `/mcp` tanpa argumen mencetak ringkasan teks status server. Bentuk-bentuk ini memerlukan Claude Code v2.1.205 atau lebih baru dan mengikuti [catatan ketersediaan](/docs/id/commands#all-commands) setiap perintah.

390 * Untuk mengubah pengaturan, berikan `key=value` ke `/config`, misalnya `/config thinking=false`.392 * Untuk mengubah pengaturan, berikan `key=value` ke `/config`, misalnya `/config thinking=false`.

391 * `/output-style <style>` beralih [output styles](/docs/id/output-styles) dan `/output-style` saja mencantumnya. Memerlukan Claude Code v2.1.269 atau lebih baru.393 * `/output-style <style>` beralih [gaya output](/docs/id/output-styles) dan `/output-style` saja mencantumkannya. Memerlukan Claude Code v2.1.269 atau lebih baru.

392</Note>394</Note>

393 395 

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

395 Sesuaikan prompt sistem397 Sesuaikan system prompt

396</h3>398</h3>

397 399 

398Gunakan `--append-system-prompt` untuk menambahkan instruksi sambil mempertahankan perilaku default Claude Code. Contoh ini menyalurkan diff PR ke Claude dan menginstruksikannya untuk meninjau kerentanan keamanan. Simpan sebagai skrip shell, misalnya `review.sh`:400Gunakan `--append-system-prompt` untuk menambahkan instruksi sambil mempertahankan perilaku default Claude Code. Contoh ini menyalurkan diff PR ke Claude dan menginstruksikannya untuk meninjau kerentanan keamanan. Simpan sebagai skrip shell, misalnya `review.sh`:


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

404```406```

405 407 

406Dalam skrip, `"$1"` berdiri untuk argumen pertama yang Anda berikan di baris perintah. Jalankan `bash review.sh 123` dan shell mengganti `"$1"` dengan `123`, jadi skrip mengambil diff untuk PR 123. Claude Code mencetak tinjauan sebagai JSON, dengan teks di bidang `result`.408Dalam skrip, `"$1"` mewakili argumen pertama yang Anda berikan di baris perintah. Jalankan `bash review.sh 123` dan shell mengganti `"$1"` dengan `123`, jadi skrip mengambil diff untuk PR 123. Claude Code mencetak tinjauan sebagai JSON, dengan teks di bidang `result`.

407 409 

408Lihat [system prompt flags](/docs/id/cli-reference#system-prompt-flags) untuk opsi lebih lanjut termasuk `--system-prompt` untuk sepenuhnya mengganti prompt default.410Lihat [flag system prompt](/docs/id/cli-reference#system-prompt-flags) untuk opsi lebih lanjut termasuk `--system-prompt` untuk sepenuhnya mengganti prompt default.

409 411 

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

411 Lanjutkan percakapan413 Lanjutkan percakapan

412</h3>414</h3>

413 415 

414Gunakan `--continue` untuk melanjutkan percakapan terbaru, atau `--resume` dengan ID sesi untuk melanjutkan percakapan tertentu. Pada Claude Code v2.1.257 atau lebih baru, ketika Anda berikan `--continue`, Claude Code membuka [sesi latar belakang](/docs/id/sessions#resume-a-session) yang telah selesai, tetapi bukan yang masih berjalan. Contoh ini menjalankan tinjauan, kemudian mengirim prompt tindak lanjut:416Gunakan `--continue` untuk melanjutkan percakapan terbaru, atau `--resume` dengan ID sesi untuk melanjutkan percakapan tertentu. Pada Claude Code v2.1.257 atau lebih baru, ketika Anda memberikan `--continue`, Claude Code membuka [sesi latar belakang](/docs/id/sessions#resume-a-session) yang telah selesai, tetapi bukan yang masih berjalan. Contoh ini menjalankan tinjauan, kemudian mengirim prompt tindak lanjut:

415 417 

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

417# First request419# First request


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

430```432```

431 433 

432Anda dapat menjalankan dua perintah dari direktori yang berbeda: Claude Code [menemukan sesi berdasarkan ID-nya](/docs/id/sessions#resume-a-session) di proyek apa pun di mesin ini. Sebelum v2.1.223, Claude Code mencari ID hanya di direktori proyek saat ini dan git worktrees-nya, jadi Anda harus menjalankan kedua perintah dari direktori yang sama.434Anda dapat menjalankan dua perintah dari direktori yang berbeda: Claude Code [menemukan sesi berdasarkan ID-nya](/docs/id/sessions#resume-a-session) di proyek apa pun di mesin ini. Sebelum v2.1.223, Claude Code mencari ID hanya di direktori proyek saat ini dan git worktree-nya, jadi Anda harus menjalankan kedua perintah dari direktori yang sama.

433 435 

434Sebagai ganti ID sesi, Anda dapat memberikan `--resume` jalur absolut ke file [transkrip](/docs/id/sessions#where-transcripts-are-stored) `.jsonl` sesi, dan Claude Code melanjutkan percakapan yang disimpan dalam file itu.436Sebagai ganti ID sesi, Anda dapat memberikan `--resume` jalur absolut ke file [transkrip](/docs/id/sessions#where-transcripts-are-stored) `.jsonl` sesi, dan Claude Code melanjutkan percakapan yang disimpan dalam file itu.

435 437 

Details

132Runner dan sesinya membuat beberapa jenis koneksi keluar, dan tidak ada konektivitas masuk dari Anthropic yang diperlukan:132Runner dan sesinya membuat beberapa jenis koneksi keluar, dan tidak ada konektivitas masuk dari Anthropic yang diperlukan:

133 133 

134* **Control plane**: runner polling `api.anthropic.com` untuk pekerjaan dan posting peristiwa kemajuan setup dan kegagalan, semua HTTPS keluar. Polling berfungsi ganda sebagai detak jantung runner.134* **Control plane**: runner polling `api.anthropic.com` untuk pekerjaan dan posting peristiwa kemajuan setup dan kegagalan, semua HTTPS keluar. Polling berfungsi ganda sebagai detak jantung runner.

135* **SCM connector**: orchestrator opsional [SCM connector](/docs/id/self-hosted-environments-reference#scm-connector-flags) tunnel adalah satu-satunya koneksi WebSocket.135* **Git**: runner mengkloning dari dan melakukan push ke host git Anda melalui HTTPS atau SSH, diautentikasi dengan kredensial yang disediakan deployment Anda. Lihat [Konfigurasi git](/docs/id/self-hosted-environments-deploy#configure-git) untuk opsinya, termasuk kredensial yang dicetak per sesi. Dengan [proxy git Anthropic](/docs/id/self-hosted-environments-deploy#use-the-anthropic-git-proxy), lalu lintas git untuk repositori di github.com melewati `api.anthropic.com` sebagai gantinya.

136* **Git**: runner mengkloning dari dan mendorong ke host git Anda melalui HTTPS atau SSH, diautentikasi dengan kredensial yang disediakan deployment Anda; [Konfigurasi git](/docs/id/self-hosted-environments-deploy#configure-git) mencakup opsinya, termasuk kredensial yang dicetak per-sesi dan [proxy git Anthropic](/docs/id/self-hosted-environments-deploy#use-the-anthropic-git-proxy), yang merutekan git melalui `api.anthropic.com` sebagai gantinya.136* **Session child**: proses Claude Code anak memegang stream peristiwa sesi ke `api.anthropic.com`, dan membuat panggilan keluarnya sendiri untuk inferensi model dan untuk perintah git yang dijalankan selama sesi. Dalam sesi yang menggunakan [git yang dikelola Anthropic](/docs/id/self-hosted-environments-deploy#use-the-anthropic-git-proxy), proses anak mengirim lalu lintas `git` dan `gh` untuk github.com melalui koneksi WebSocket yang dibukanya ke `api.anthropic.com`.

137* **Session child**: proses Claude Code anak menyimpan aliran peristiwa sesi ke `api.anthropic.com`, dan membuat panggilan keluar miliknya sendiri untuk inferensi model dan untuk perintah git yang dijalankan selama sesi. Lihat [Persyaratan jaringan](/docs/id/self-hosted-environments-deploy#network-requirements) untuk daftar egress lengkap. [Diagram di atas](#how-self-hosted-environments-work) menunjukkan jalur ini, terlepas dari SCM connector opsional.137* **SCM connector**: [SCM connector](/docs/id/self-hosted-environments-reference#scm-connector-flags) orchestrator yang opsional tidak tersedia, sehingga tunnel-nya tidak terbuka. Tunnel tersebut adalah koneksi WebSocket ke `api.anthropic.com`.

138 

139Lihat [Persyaratan jaringan](/docs/id/self-hosted-environments-deploy#network-requirements) untuk daftar egress lengkap. [Diagram di atas](#how-self-hosted-environments-work) menunjukkan jalur-jalur ini, kecuali SCM connector opsional dan koneksi git yang dikelola Anthropic.

138 140 

139Secara default, inferensi model menggunakan Anthropic API. Control plane mengirimkan endpoint API ke setiap sesi, dan sesi mengautentikasi dengan token OAuth yang diterbitkan Anthropic dan berlingkup sesi. Untuk mengirim permintaan model ke akun cloud Anda sendiri sebagai gantinya, lihat [Kirim permintaan model ke Bedrock atau Agent Platform](/docs/id/self-hosted-environments-configuration#send-model-requests-to-bedrock-or-agent-platform).141Secara default, inferensi model menggunakan Anthropic API. Control plane mengirimkan endpoint API ke setiap sesi, dan sesi mengautentikasi dengan token OAuth yang diterbitkan Anthropic dan berlingkup sesi. Untuk mengirim permintaan model ke akun cloud Anda sendiri sebagai gantinya, lihat [Kirim permintaan model ke Bedrock atau Agent Platform](/docs/id/self-hosted-environments-configuration#send-model-requests-to-bedrock-or-agent-platform).

140 142 

Details

31| Variabel | Deskripsi |31| Variabel | Deskripsi |

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

33| `CLAUDE_CODE_SESSION_ACCESS_TOKEN` | JWT sesi, diawali dengan `sk-ant-cc-`. Klaim `act` mengidentifikasi pembuat sesi, dengan email pembuat ketika surface pembuatan merekamnya. Nilainya adalah token pada waktu pemijahan; penyegaran tiba melalui stdin anak, jadi wrapper hanya melihat nilai awal. Lihat [Verify session identity](/docs/id/self-hosted-environments-identity). |33| `CLAUDE_CODE_SESSION_ACCESS_TOKEN` | JWT sesi, diawali dengan `sk-ant-cc-`. Klaim `act` mengidentifikasi pembuat sesi, dengan email pembuat ketika surface pembuatan merekamnya. Nilainya adalah token pada waktu pemijahan; penyegaran tiba melalui stdin anak, jadi wrapper hanya melihat nilai awal. Lihat [Verify session identity](/docs/id/self-hosted-environments-identity). |

34| `CCR_SESSION_ACCOUNT_EMAIL` | Email pembuat sesi, pra-ekstrak oleh runner dari klaim `act.email` token tanpa verifikasi tanda tangan. Cocok untuk pelabelan, seperti trailer commit. Ketika email membuka akses penyediaan kredensial, verifikasi token dan baca klaim darinya; lihat [Provision credentials scoped to the session creator](#provision-credentials-scoped-to-the-session-creator). Tidak diatur ketika token tidak membawa email pembuat. Perlakukan sebagai informasi yang dapat diidentifikasi secara pribadi. |34| `CCR_SESSION_ACCOUNT_EMAIL` | Email pembuat sesi, pra-ekstrak oleh runner dari klaim `act.email` token tanpa verifikasi tanda tangan. Cocok untuk pelabelan, seperti trailer commit. Ketika email membuka akses penyediaan kredensial, verifikasi token dan baca klaim darinya sebagai gantinya. Lihat [Provision credentials scoped to the session creator](#provision-credentials-scoped-to-the-session-creator). Tidak diatur ketika token tidak membawa email pembuat, misalnya pada sesi yang dibuat oleh identitas layanan organisasi Anda. Perlakukan sebagai informasi yang dapat diidentifikasi secara pribadi. |

35| `CLAUDE_RUNNER_CLIENT_PLATFORM` | Surface klien yang membuat sesi, seperti `web_claude_ai`, `desktop_app`, `ios`, `claude_code_cli`, atau `scheduled_trigger`. Anthropic merekam nilainya sekali saat pembuatan sesi, jadi wrapper dan setiap hook siklus hidup melihat nilai yang sama. Gunakan untuk analitik adopsi dan pelabelan saja, bukan sebagai sinyal otorisasi. Tidak diatur ketika sesi tidak memiliki surface yang tercatat atau dikenali, jadi referensikan sebagai `${CLAUDE_RUNNER_CLIENT_PLATFORM:-}` di bawah `set -u`. Memerlukan Claude Code v2.1.229 atau lebih baru. |35| `CLAUDE_RUNNER_CLIENT_PLATFORM` | Surface klien yang membuat sesi, seperti `web_claude_ai`, `desktop_app`, `ios`, `claude_code_cli`, atau `scheduled_trigger`. Anthropic merekam nilainya sekali saat pembuatan sesi, jadi wrapper dan setiap hook siklus hidup melihat nilai yang sama. Gunakan untuk analitik adopsi dan pelabelan saja, bukan sebagai sinyal otorisasi. Tidak diatur ketika sesi tidak memiliki surface yang tercatat atau dikenali. Memerlukan Claude Code v2.1.229 atau lebih baru. |

36| `CLAUDE_RUNNER_CLAUDE_BIN` | Jalur absolut ke biner Claude Code runner sendiri. Akhiri wrapper Anda dengan `exec "$CLAUDE_RUNNER_CLAUDE_BIN" "$@"` untuk menyerahkan ke biner yang disematkan tanpa hardcoding jalur instalasi. |36| `CLAUDE_RUNNER_CLAUDE_BIN` | Jalur absolut ke biner Claude Code runner sendiri. Akhiri wrapper Anda dengan `exec "$CLAUDE_RUNNER_CLAUDE_BIN" "$@"` untuk menyerahkan ke biner yang disematkan tanpa hardcoding jalur instalasi. |

37| `CLAUDE_CODE_REMOTE_SESSION_ID` | ID sesi dalam bentuk `cse_...` yang ditandai. Ini adalah sesi yang sama yang dilihat [lifecycle hooks](#lifecycle-hooks) sebagai `CLAUDE_RUNNER_SESSION_ID` dalam bentuk `session_...`; variabel UUID cocok di kedua sisi, dan mengganti awalan `cse_` dengan `session_` menghasilkan ID yang ditampilkan di URL sesi. |37| `CLAUDE_CODE_REMOTE_SESSION_ID` | ID sesi dalam bentuk `cse_...` yang ditandai. Ini adalah sesi yang sama yang dilihat [lifecycle hooks](#lifecycle-hooks) sebagai `CLAUDE_RUNNER_SESSION_ID` dalam bentuk `session_...`; variabel UUID cocok di kedua sisi, dan mengganti awalan `cse_` dengan `session_` menghasilkan ID yang ditampilkan di URL sesi. |

38| `CLAUDE_CODE_REMOTE_SESSION_UUID` | ID sesi yang sama dalam bentuk UUID kanonik, untuk sistem yang menggunakan UUID sebagai kunci. |38| `CLAUDE_CODE_REMOTE_SESSION_UUID` | ID sesi yang sama dalam bentuk UUID kanonik, untuk sistem yang menggunakan UUID sebagai kunci. |

39| `CLAUDE_CODE_REMOTE_SLACK_THREAD_URL` | Untuk sesi [Claude Tag](https://claude.com/docs/claude-tag/overview) yang dimiliki oleh satu thread Slack, tautan ke thread tersebut. Tidak diatur untuk sesi lain, dan dapat juga tidak diatur untuk sesi thread. |

40| `CLAUDE_CODE_REMOTE_SLACK_THREAD_TS` | Untuk sesi Claude Tag yang dimiliki oleh satu thread Slack, timestamp Slack thread tersebut, seperti `1700000000.000100`. Dapat tidak diatur, dan dapat diatur ketika `CLAUDE_CODE_REMOTE_SLACK_THREAD_URL` tidak diatur, jadi periksa setiap variabel secara terpisah. |

39| `CLAUDE_SESSION_INGRESS_TOKEN_FILE` | Jalur absolut ke file per-sesi yang menyimpan JWT sesi saat ini, tetap segar di seluruh penyegaran token. Subproses shell membacanya untuk header `Authorization` mereka saat mengunduh lampiran yang ditambahkan pengguna ke sesi. `exec` menyimpan variabel secara otomatis; wrapper yang membangun kembali lingkungan anak harus membawa variabel, atau unduhan lampiran berhenti bekerja diam-diam. |41| `CLAUDE_SESSION_INGRESS_TOKEN_FILE` | Jalur absolut ke file per-sesi yang menyimpan JWT sesi saat ini, tetap segar di seluruh penyegaran token. Subproses shell membacanya untuk header `Authorization` mereka saat mengunduh lampiran yang ditambahkan pengguna ke sesi. `exec` menyimpan variabel secara otomatis; wrapper yang membangun kembali lingkungan anak harus membawa variabel, atau unduhan lampiran berhenti bekerja diam-diam. |

40| `CLAUDE_CONFIG_DIR` | Direktori konfigurasi Claude per-sesi, ditulis saat awal sesi dari snapshot konfigurasi host runner yang ditangkap runner saat startup; lihat [Permissions and tool approval](#permissions-and-tool-approval). Penulisan di sini terisolasi ke sesi ini. Direktori tetap di bawah `<base-dir>/_sessions/` setelah sesi berakhir kecuali Anda memulai runner dengan [`--remove-session-state`](/docs/id/self-hosted-environments-reference#runner-cli-flags); lihat [Reuse a pre-warmed checkout](/docs/id/self-hosted-environments-deploy#reuse-a-pre-warmed-checkout). |42| `CLAUDE_CONFIG_DIR` | Direktori konfigurasi Claude per-sesi, ditulis saat awal sesi dari snapshot konfigurasi host runner yang ditangkap runner saat startup; lihat [Permissions and tool approval](#permissions-and-tool-approval). Penulisan di sini terisolasi ke sesi ini. Direktori tetap di bawah `<base-dir>/_sessions/` setelah sesi berakhir kecuali Anda memulai runner dengan [`--remove-session-state`](/docs/id/self-hosted-environments-reference#runner-cli-flags); lihat [Reuse a pre-warmed checkout](/docs/id/self-hosted-environments-deploy#reuse-a-pre-warmed-checkout). |

41| `ANTHROPIC_BASE_URL` | URL dasar API yang akan digunakan anak, dikirimkan oleh bidang kontrol per sesi dan biasanya `https://api.anthropic.com`. Jangan timpa: kredensial inferensi sesi adalah token OAuth yang dikeluarkan Anthropic yang tidak diterima penyedia lain. |43| `ANTHROPIC_BASE_URL` | URL dasar API yang akan digunakan anak, dikirimkan oleh bidang kontrol per sesi dan biasanya `https://api.anthropic.com`. Jangan timpa: kredensial inferensi sesi adalah token OAuth yang dikeluarkan Anthropic yang tidak diterima penyedia lain. |


43 45 

44Wrapper juga mewarisi sisa lingkungan anak yang dikelola, termasuk environment variable yang disediakan server. `exec` menyebarkan semuanya secara otomatis; jika wrapper Anda memijahkan anak dengan cara lain, teruskan lingkungan lengkap.46Wrapper juga mewarisi sisa lingkungan anak yang dikelola, termasuk environment variable yang disediakan server. `exec` menyebarkan semuanya secara otomatis; jika wrapper Anda memijahkan anak dengan cara lain, teruskan lingkungan lengkap.

45 47 

48`CLAUDE_CODE_REMOTE_SLACK_THREAD_URL` dan `CLAUDE_CODE_REMOTE_SLACK_THREAD_TS` sampai ke wrapper Anda atau [hook `command`](#command). Variabel tersebut juga sampai ke apa yang dijalankan sesi, seperti perintah shell, hook git, dan hook Claude Code. Hook `checkout`, `post-session`, dan `spawn-runner` tidak menerimanya.

49 

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

51 Berikan nilai default untuk variabel yang dapat tidak diatur

52</h3>

53 

54`CCR_SESSION_ACCOUNT_EMAIL`, `CLAUDE_RUNNER_CLIENT_PLATFORM`, `CLAUDE_CODE_REMOTE_SLACK_THREAD_URL`, dan `CLAUDE_CODE_REMOTE_SLACK_THREAD_TS` masing-masing dapat tidak diatur. Jika skrip Anda menggunakan `set -u`, Bash berhenti dengan `unbound variable` ketika mengekspansi variabel yang tidak diatur, jadi ekspansikan dengan nilai default, seperti `${CCR_SESSION_ACCOUNT_EMAIL:-}`.

55 

56Di mana pun shell mengekspansi tautan thread Slack, lakukan tindakan pencegahan berikut:

57 

58* **Beri tanda kutip**: tautan dapat berisi karakter yang diproses shell, seperti `?` dan `&`, jadi beri tanda kutip pada variabel, seperti dalam `"${CLAUDE_CODE_REMOTE_SLACK_THREAD_URL:-}"`.

59* **Jauhkan nilainya dari string `eval` dan `sh -c`**: jangan substitusikan nilainya ke dalam string yang dijalankan `eval` atau `sh -c`, bahkan di dalam tanda kutip. Buat string tersebut mereferensikan variabelnya sebagai gantinya.

60 

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

47 Jaga stdin dan file descriptor 3 terlampir62 Jaga stdin dan file descriptor 3 terlampir

48</h3>63</h3>

49 64 

50Stdin anak adalah saluran kontrol runner. Rotasi token dan sinyal akhir sesi tiba di atasnya. Runner juga membuka pipa pada file descriptor 3 dan membaca sinyal aktivitas anak darinya untuk mendorong timeout idle dan startup. `exec "$CLAUDE_RUNNER_CLAUDE_BIN" "$@"` biasa menyimpan keduanya secara otomatis.65Stdin anak adalah saluran kontrol runner. Rotasi token dan sinyal akhir sesi tiba di atasnya. Runner juga membuka pipa pada file descriptor 3 dan membaca sinyal aktivitas anak darinya untuk mendorong timeout idle dan startup. `exec "$CLAUDE_RUNNER_CLAUDE_BIN" "$@"` biasa menyimpan keduanya secara otomatis.

51 66 

52Jika wrapper Anda menempatkan anak di latar belakang dengan `&` telanjang, itu memutus stdin anak: sesi terlihat sehat sampai masa pakai token OAuth awal sekitar 30 menit berakhir, kemudian setiap panggilan API gagal dengan `401 authentication_error`. Jika wrapper Anda harus menempatkan anak di latar belakang, misalnya untuk menjaga perangkap pembongkaran tetap hidup, simpan stdin pada file descriptor 4 atau lebih tinggi dan lampirkan kembali secara eksplisit:67Jika wrapper Anda menempatkan anak di latar belakang dengan `&` telanjang, itu memutus stdin anak. Sesi terlihat sehat sampai masa pakai token OAuth awal sekitar 30 menit berakhir, kemudian setiap panggilan API yang menggunakan token tersebut gagal dengan `401 authentication_error`. Jika wrapper Anda harus menempatkan anak di latar belakang, misalnya untuk menjaga perangkap pembongkaran tetap hidup, simpan stdin pada file descriptor 4 atau lebih tinggi dan lampirkan kembali secara eksplisit:

53 68 

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

55exec 4<&070exec 4<&0


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

60```75```

61 76 

62Jangan tutup atau gunakan kembali file descriptor 3 di wrapper. Mengalihkan stdout dan stderr anak tidak apa-apa.77Anda dapat mengalihkan stdout anak. Jaga file descriptor 3 dan stderr tetap terlampir ke runner:

78 

79* **File descriptor 3**: membawa sinyal aktivitas anak ke runner. Jangan tutup atau gunakan kembali di wrapper.

80* **stderr**: ketika wrapper atau anak keluar dengan kode bukan nol, runner mengirimkan baris-baris terakhir stderr ke sesi dan mencetaknya di log-nya sendiri. Pengguna sesi melihat baris-baris tersebut, jadi jangan cetak rahasia ke stderr, dan hapus `set -x` sebelum Anda men-deploy wrapper. Jika Anda mengalihkan stderr, sesi tetap berjalan, tetapi runner melaporkan kegagalan hanya dengan exit code.

63 81 

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

65 Teruskan flag system prompt83 Teruskan flag system prompt


108 checkout126 checkout

109</h3>127</h3>

110 128 

111Berjalan sekali per repositori, sebagai pengganti klon dan fetch bawaan runner. Gunakan hook untuk mengkloning dari mirror read-through, mengisi working tree dari arsip, atau menerapkan autentikasi git per-sesi. Runner menetapkan variabel-variabel ini, dan dapat menetapkan variabel `CLAUDE_RUNNER_` lain yang tidak tercantum dalam tabel:129Berjalan sekali per repositori, sebagai pengganti clone dan fetch bawaan runner. Gunakan hook untuk melakukan clone dari mirror read-through yang Anda jangkau melalui HTTPS atau SSH, mengisi working tree dari arsip, atau menerapkan autentikasi git per-sesi. Runner menetapkan variabel-variabel ini, dan dapat menetapkan variabel `CLAUDE_RUNNER_` lain yang tidak tercantum dalam tabel:

112 130 

113| Variabel | Deskripsi |131| Variabel | Deskripsi |

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

115| `CLAUDE_RUNNER_REPO_URL` | URL repositori untuk mengkloning, setelah `--git-host-rewrite` dan `--git-ssh-rewrite` apa pun telah diterapkan |133| `CLAUDE_RUNNER_REPO_URL` | URL repositori untuk mengkloning, setelah `--git-host-rewrite` dan `--git-ssh-rewrite` apa pun telah diterapkan |

116| `CLAUDE_RUNNER_REPO_REF` | Revisi untuk checkout: cabang, tag, atau commit SHA seperti yang diminta sesi. Kosong berarti cabang default repositori. |134| `CLAUDE_RUNNER_REPO_REF` | Revisi untuk di-checkout, sebagaimana diminta oleh sesi: branch, tag, commit SHA, atau nama referensi lengkap seperti `refs/pull/<number>/head`. Kosong berarti branch default repositori. |

117| `CLAUDE_RUNNER_CHECKOUT_PATH` | Jalur absolut di mana pohon kerja harus ditinggalkan |135| `CLAUDE_RUNNER_CHECKOUT_PATH` | Jalur absolut di mana pohon kerja harus ditinggalkan |

118| `CLAUDE_RUNNER_SESSION_ID` | ID sesi dalam bentuk `session_...` yang ditandai, untuk logging dan korelasi |136| `CLAUDE_RUNNER_SESSION_ID` | ID sesi dalam bentuk `session_...` yang ditandai, untuk logging dan korelasi |

119| `CLAUDE_RUNNER_SESSION_UUID` | ID sesi yang sama dalam bentuk UUID kanonik |137| `CLAUDE_RUNNER_SESSION_UUID` | ID sesi yang sama dalam bentuk UUID kanonik |

120| `CLAUDE_RUNNER_API_BASE_URL` | URL dasar API Anthropic untuk panggilan yang dibatasi sesi |138| `CLAUDE_RUNNER_API_BASE_URL` | URL dasar API Anthropic untuk panggilan yang dibatasi sesi |

121| `CLAUDE_RUNNER_CLIENT_PLATFORM` | Permukaan klien yang membuat sesi, seperti `web_claude_ai`, `desktop_app`, atau `ios`. Tidak diatur ketika sesi tidak memiliki permukaan yang tercatat atau dikenali. |139| `CLAUDE_RUNNER_CLIENT_PLATFORM` | Surface klien yang membuat sesi, seperti `web_claude_ai`, `desktop_app`, atau `ios`. Tidak diatur ketika sesi tidak memiliki surface yang tercatat atau dikenali, jadi rujuk sebagai `${CLAUDE_RUNNER_CLIENT_PLATFORM:-}` di bawah `set -u`. Memerlukan Claude Code v2.1.229 atau lebih baru. |

122| `CLAUDE_CODE_SESSION_ACCESS_TOKEN` | Token akses sesi, untuk panggilan API yang dibatasi sesi |140| `CLAUDE_CODE_SESSION_ACCESS_TOKEN` | Token akses sesi, untuk panggilan API yang dibatasi sesi |

123| `GIT_CONFIG_COUNT`, `GIT_CONFIG_KEY_n`, `GIT_CONFIG_VALUE_n` | Pengaturan git yang ditetapkan runner untuk git yang dijalankan hook Anda. [Konfigurasi Git di dalam lifecycle hooks](#git-configuration-inside-lifecycle-hooks) menjelaskannya. Memerlukan Claude Code v2.1.280 atau lebih baru. |141| `GIT_CONFIG_COUNT`, `GIT_CONFIG_KEY_n`, `GIT_CONFIG_VALUE_n` | Pengaturan git yang ditetapkan runner untuk git yang dijalankan hook Anda. [Konfigurasi Git di dalam lifecycle hooks](#git-configuration-inside-lifecycle-hooks) menjelaskannya. Memerlukan Claude Code v2.1.280 atau lebih baru. |

124 142 

125Skrip harus meninggalkan pohon kerja di `CLAUDE_RUNNER_CHECKOUT_PATH` yang diperiksa pada revisi yang diminta. Detached HEAD tidak apa-apa; runner membuat cabang kerja sesi di atasnya. Runner memverifikasi jalur berisi `.git` sesudahnya; jika hook Anda mewujudkan sumber non-git seperti Perforce atau tarball yang dibuka, atur `CLAUDE_RUNNER_SKIP_GIT_VERIFY=1` di lingkungan runner untuk melewati pemeriksaan itu. Alur berbasis Git seperti pembuatan cabang kerja dan hasil push memerlukan checkout git, jadi ekspor hasil dari pohon non-git dengan hook [`post-session`](#post-session).143Skrip harus meninggalkan working tree di `CLAUDE_RUNNER_CHECKOUT_PATH` yang di-checkout pada revisi yang diminta. Detached HEAD dapat digunakan, karena runner membuat branch kerja sesi di atasnya.

126 144 

127Runner tidak melewatkan kredensial git ke hook. Sebaliknya, cetak kredensial klon per-sesi dari identitas sesi: verifikasi `CLAUDE_CODE_SESSION_ACCESS_TOKEN` dengan perpustakaan JWT standar terhadap titik akhir JWKS di bawah `CLAUDE_RUNNER_API_BASE_URL`, seperti yang dijelaskan dalam [Verify the token from your service](/docs/id/self-hosted-environments-identity#verify-the-token-from-your-service), kemudian buat layanan kredensial Anda mengeluarkan kredensial klon jangka pendek untuk identitas dalam klaim `act` token. `CLAUDE_RUNNER_CLAUDE_BIN` tidak diatur di lingkungan checkout-hook, jadi subperintah `decode-token` tidak tersedia di sini. Kembali ke apa pun autentikasi git yang sudah dimiliki host, seperti agen SSH, pembantu kredensial, atau `.netrc`, juga merupakan pilihan.145Setelah hook Anda selesai, runner memverifikasi bahwa `CLAUDE_RUNNER_CHECKOUT_PATH` berisi `.git`. Jika hook Anda mewujudkan sumber non-git seperti Perforce atau tarball yang telah dibongkar, atur `CLAUDE_RUNNER_SKIP_GIT_VERIFY=1` di lingkungan runner untuk melewati pemeriksaan itu. Alur berbasis Git seperti pembuatan branch kerja dan push hasil memerlukan checkout git, jadi ekspor hasil dari tree non-git dengan [hook `post-session`](#post-session).

128 146 

129Ketika hook keluar bukan nol, atau keluar 0 tanpa meninggalkan checkout yang dapat digunakan di belakang, apa yang dilakukan runner tergantung pada repositori:147<h4 id="get-git-credentials-in-the-hook">

148 Mendapatkan kredensial git di dalam hook

149</h4>

130 150 

131* **Repositori yang sesi dorong hasil ke**: runner gagal sesi, dan pada keluar bukan nol permukaan ekor stderr skrip ke pengguna.151Runner tidak meneruskan kredensial git ke hook. Subperintah `decode-token` juga tidak tersedia di sini, karena `CLAUDE_RUNNER_CLAUDE_BIN` tidak diatur di lingkungan checkout-hook. Sebagai gantinya, buat kredensial clone per-sesi dari identitas sesi, atau gunakan autentikasi git milik host sendiri sebagai alternatif:

132* **Repositori yang hanya dibaca sesi**, seperti repositori yang ditambahkan ke sesi yang berjalan: runner mencatat baris `[runner:warn]` dengan detail kegagalan, memposting langkah `Skipped` ke sesi, menghapus apa pun yang ditinggalkan hook di jalur checkout, dan melanjutkan dengan repositori yang tersisa. Ketika runner tidak dapat menghapus jalur segera, itu mencoba penghapusan lagi saat akhir sesi. Jika melewati meninggalkan sesi tanpa repositori sama sekali, runner gagal sesi pula.

133 152 

134Sebelum v2.1.228, runner gagal sesi pada kegagalan hook untuk repositori apa pun, jadi repositori hanya-baca yang tidak dapat dilayani hook gagal sesi lagi pada setiap runner segar yang dilanjutkan sesi.153* **Kredensial clone per-sesi**: verifikasi `CLAUDE_CODE_SESSION_ACCESS_TOKEN` dengan library JWT standar terhadap endpoint JWKS di bawah `CLAUDE_RUNNER_API_BASE_URL`, seperti yang dijelaskan dalam [Verify the token from your service](/docs/id/self-hosted-environments-identity#verify-the-token-from-your-service). Kemudian minta layanan kredensial Anda menerbitkan kredensial clone berumur pendek untuk identitas dalam klaim `act` token. Kaitkan kredensial tersebut dengan `act.sub`, dan jangan mewajibkan `act.email`.

154* **Autentikasi git host**: gunakan autentikasi git apa pun yang sudah dimiliki host, seperti SSH agent, credential helper, atau `.netrc`.

135 155 

136Runner menghapus jalur checkout setelah sesi berakhir.156<h4 id="when-the-hook-fails">

157 Ketika hook gagal

158</h4>

159 

160Hook gagal ketika keluar dengan kode bukan nol, atau keluar dengan 0 tanpa meninggalkan checkout yang dapat digunakan:

161 

162* **Repositori yang sesi dorong hasil ke**: runner gagal sesi, dan pada keluar bukan nol permukaan ekor stderr skrip ke pengguna.

163* **Repositori yang hanya dibaca sesi**, seperti repositori yang ditambahkan ke sesi yang sedang berjalan: runner mencatat baris `[runner:warn]` dengan detail kegagalan, memposting langkah `Skipped` ke sesi, menghapus apa pun yang ditinggalkan hook di jalur checkout, dan melanjutkan dengan repositori yang tersisa. Jika proses melewati ini membuat sesi tidak memiliki repositori sama sekali, runner tetap menggagalkan sesi.

164 

165Ketika hook berhasil, runner menghapus jalur checkout setelah sesi berakhir.

137 166 

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

139 post-session168 post-session


151| `CLAUDE_RUNNER_WORKSPACE_PATHS` | Jalur absolut yang dipisahkan titik dua dari pohon kerja sesi. Kosong untuk sesi tanpa repo. |180| `CLAUDE_RUNNER_WORKSPACE_PATHS` | Jalur absolut yang dipisahkan titik dua dari pohon kerja sesi. Kosong untuk sesi tanpa repo. |

152| `CLAUDE_RUNNER_DEBUG_LOG_PATH` | Jalur ke log debug sesi, masih di disk saat hook berjalan |181| `CLAUDE_RUNNER_DEBUG_LOG_PATH` | Jalur ke log debug sesi, masih di disk saat hook berjalan |

153| `CLAUDE_RUNNER_API_BASE_URL` | URL dasar API Anthropic untuk panggilan yang dibatasi sesi |182| `CLAUDE_RUNNER_API_BASE_URL` | URL dasar API Anthropic untuk panggilan yang dibatasi sesi |

154| `CLAUDE_RUNNER_CLIENT_PLATFORM` | Permukaan klien yang membuat sesi, seperti `web_claude_ai`, `desktop_app`, atau `ios`. Tidak diatur ketika sesi tidak memiliki permukaan yang tercatat atau dikenali. Memerlukan Claude Code v2.1.229 atau lebih baru. |183| `CLAUDE_RUNNER_CLIENT_PLATFORM` | Surface klien yang membuat sesi, seperti `web_claude_ai`, `desktop_app`, atau `ios`. Tidak diatur ketika sesi tidak memiliki surface yang tercatat atau dikenali, jadi rujuk sebagai `${CLAUDE_RUNNER_CLIENT_PLATFORM:-}` di bawah `set -u`. Memerlukan Claude Code v2.1.229 atau lebih baru. |

155| `CLAUDE_CODE_SESSION_ACCESS_TOKEN` | Token akses sesi, untuk panggilan API yang dibatasi sesi |184| `CLAUDE_CODE_SESSION_ACCESS_TOKEN` | Token akses sesi, untuk panggilan API yang dibatasi sesi |

156| `GIT_CONFIG_COUNT`, `GIT_CONFIG_KEY_n`, `GIT_CONFIG_VALUE_n` | Pengaturan git yang ditetapkan runner untuk git yang dijalankan hook Anda. [Konfigurasi Git di dalam lifecycle hooks](#git-configuration-inside-lifecycle-hooks) menjelaskannya. Memerlukan Claude Code v2.1.280 atau lebih baru. |185| `GIT_CONFIG_COUNT`, `GIT_CONFIG_KEY_n`, `GIT_CONFIG_VALUE_n` | Pengaturan git yang ditetapkan runner untuk git yang dijalankan hook Anda. [Konfigurasi Git di dalam lifecycle hooks](#git-configuration-inside-lifecycle-hooks) menjelaskannya. Memerlukan Claude Code v2.1.280 atau lebih baru. |

157 186 

158`CLAUDE_RUNNER_EXIT_REASON` mengambil salah satu dari empat nilai:187`CLAUDE_RUNNER_EXIT_REASON` mengambil salah satu dari empat nilai:

159 188 

160* `completed`: sesi berakhir dengan bersih. Proses Claude Code keluar secara normal, atau sesi diarsipkan atau dihapus saat masih berjalan.189* `completed`: sesi berakhir dengan bersih. Proses Claude Code keluar secara normal, atau keluar dengan sendirinya setelah sesi diarsipkan atau dihapus.

161* `failed`: proses Claude Code mogok, atau setup gagal setelah dimulai.190* `failed`: proses Claude Code mogok, atau setup gagal setelah dimulai.

162* `interrupted`: runner menghentikan sesi. Itu merilis sesi untuk membebaskan slot, sesi timeout saat startup, server memindahkan sesi dari runner ini, runner sedang mengalirkan, atau sesi melampaui batas [`--kill-session-after-min`](/docs/id/self-hosted-environments-reference#runner-cli-flags) nya.191* `interrupted`: runner menghentikan sesi, dalam salah satu kasus berikut:

192 * Runner melepaskan sesi untuk membebaskan slot.

193 * Sesi mengalami timeout saat startup.

194 * Server memindahkan sesi dari runner ini.

195 * Polling runner mendeteksi pengarsipan atau penghapusan sebelum proses keluar.

196 * Runner sedang melakukan drain.

197 * Sesi melampaui batas [`--kill-session-after-min`](/docs/id/self-hosted-environments-reference#runner-cli-flags) miliknya.

163* `abandoned`: dicadangkan untuk sesi yang diklaim runner lain. Hook saat ini tidak menyala dalam kasus itu.198* `abandoned`: dicadangkan untuk sesi yang diklaim runner lain. Hook saat ini tidak menyala dalam kasus itu.

164 199 

165[Penghitung siklus hidup sesi](/docs/id/self-hosted-environments-reference#session-lifecycle-counter-semantics) menghitung rilis, timeout startup, dan perpindahan server sebagai `completed` daripada `interrupted`, karena runner menyerahkan slot kembali dengan bersih. Harapkan perbedaan itu jika Anda membandingkan penerimaan hook dengan penghitung.200Jika Anda membandingkan catatan penerimaan hook dengan [penghitung siklus hidup sesi](/docs/id/self-hosted-environments-reference#session-lifecycle-counter-semantics), perkirakan beberapa catatan `interrupted` dihitung sebagai `completed` di sana. Penghitung menghitung pelepasan, timeout startup, perpindahan server, serta pengarsipan atau penghapusan yang lebih dulu dideteksi polling runner sebagai `completed`, karena runner mengembalikan slot dengan bersih.

166 201 

167Status keluar hook tidak pernah mempengaruhi hasil sesi; kegagalan dicatat dan diabaikan. Runner menunggu hingga `--post-session-hook-timeout-sec`, 60 detik secara default, pada setiap akhir sesi termasuk shutdown runner. Contoh ini menyimpan pekerjaan yang tidak dikomit ke cabang penyelamatan:202Status keluar hook tidak pernah mempengaruhi hasil sesi; kegagalan dicatat dan diabaikan. Runner menunggu hingga `--post-session-hook-timeout-sec`, 60 detik secara default, pada setiap akhir sesi termasuk shutdown runner. Contoh ini menyimpan pekerjaan yang tidak dikomit ke cabang penyelamatan:

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# Override -c mengalahkan pengaturan lokal repo, memblokir konfigurasi fsmonitor,209# -c overrides beat repo-local settings, blocking session-written fsmonitor,

174# hook-path, dan gpg-program yang ditulis sesi agar tidak mengeksekusi kode dengan210# hook-path, and gpg-program config from executing code with the hook's

175# hak istimewa hook. -c commit.gpgsign=false juga membuat commit penyelamatan ini211# privileges. -c commit.gpgsign=false also leaves these rescue commits

176# tidak ditandatangani di bawah --configure-git.212# unsigned under --configure-git.

177# credential.helper dan pushurl lokal repo masih berlaku, dan pada runner213# Repo-local credential.helper and pushurl still apply, and on a runner

178# sebelum v2.1.280 begitu pula core.sshCommand; jika hook menyimpan kredensial214# before v2.1.280 so does core.sshCommand; if the hook holds credentials

179# yang tidak dimiliki sesi, lihat catatan di bawah skrip.215# the session didn't, see the note below the script.

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

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

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


188done224done

189```225```

190 226 

227Baris `GIT_ALLOW_PROTOCOL` dalam skrip membatasi git pada remote HTTPS, HTTP, dan SSH. Jika lingkungan runner sudah menetapkan daftar `GIT_ALLOW_PROTOCOL` sendiri yang tidak kosong, skrip mempertahankan daftar tersebut.

228 

191Hook melakukan push dengan kredensial git apa pun yang tersedia di lingkungannya sendiri di host runner. Di bawah [postur tanpa-kredensial-dalam-image](/docs/id/self-hosted-environments-deploy#configure-git), termasuk ketika klon bawaan melewati proxy git Anthropic, tidak ada kredensial, jadi buat kredensial push jangka pendek di dalam hook sebelum melakukan push: tukarkan token sesi yang diterima hook di `CLAUDE_CODE_SESSION_ACCESS_TOKEN` dengan layanan token Anda sendiri, dengan memverifikasinya seperti yang dijelaskan di [Verify session identity](/docs/id/self-hosted-environments-identity). Ketika hook menyimpan kredensial yang tidak dimiliki sesi, ganti `origin` dengan URL yang disediakan operator dan teruskan `-c credential.helper=` ditambah helper Anda sendiri. [Konfigurasi Git di dalam lifecycle hooks](#git-configuration-inside-lifecycle-hooks) menjelaskan apa yang masih dapat dipengaruhi oleh konfigurasi yang ditulis sesi.229Hook melakukan push dengan kredensial git apa pun yang tersedia di lingkungannya sendiri di host runner. Di bawah [postur tanpa-kredensial-dalam-image](/docs/id/self-hosted-environments-deploy#configure-git), termasuk ketika klon bawaan melewati proxy git Anthropic, tidak ada kredensial, jadi buat kredensial push jangka pendek di dalam hook sebelum melakukan push: tukarkan token sesi yang diterima hook di `CLAUDE_CODE_SESSION_ACCESS_TOKEN` dengan layanan token Anda sendiri, dengan memverifikasinya seperti yang dijelaskan di [Verify session identity](/docs/id/self-hosted-environments-identity). Ketika hook menyimpan kredensial yang tidak dimiliki sesi, ganti `origin` dengan URL yang disediakan operator dan teruskan `-c credential.helper=` ditambah helper Anda sendiri. [Konfigurasi Git di dalam lifecycle hooks](#git-configuration-inside-lifecycle-hooks) menjelaskan apa yang masih dapat dipengaruhi oleh konfigurasi yang ditulis sesi.

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` | Kunci idempotency yang buram, unik per permintaan pemijahan dan aman untuk nama sumber daya Kubernetes. Gunakan hanya order ID sebagai kunci dedup provisioner Anda. |302| `CLAUDE_RUNNER_ORDER_ID` | Kunci idempotency yang buram, unik per permintaan pemijahan dan aman untuk nama sumber daya Kubernetes. Gunakan hanya order ID sebagai kunci dedup provisioner Anda. |

265| `CLAUDE_RUNNER_SESSION_ID` | Sesi yang diminta ini untuk. Ini berulang pada setiap permintaan ulang untuk sesi, jadi gunakan untuk logging dan routing, bukan sebagai kunci dedup. Kosong untuk permintaan pre-warming, yang boot runner standby sebelum sesi spesifik apa pun ketika [`--min-idle`](/docs/id/self-hosted-environments-reference#orchestrator-cli-flags) diatur, jadi jangan asumsikan variabel diatur. |303| `CLAUDE_RUNNER_SESSION_ID` | Sesi yang diminta ini untuk. Ini berulang pada setiap permintaan ulang untuk sesi, jadi gunakan untuk logging dan routing, bukan sebagai kunci dedup. Kosong untuk permintaan pre-warming, yang boot runner standby sebelum sesi spesifik apa pun ketika [`--min-idle`](/docs/id/self-hosted-environments-reference#orchestrator-cli-flags) diatur, jadi jangan asumsikan variabel diatur. |

266| `CLAUDE_RUNNER_SESSION_UUID` | ID sesi yang sama dalam bentuk UUID kanonik. Kosong untuk permintaan pre-warming. |304| `CLAUDE_RUNNER_SESSION_UUID` | ID sesi yang sama dalam bentuk UUID kanonik. Kosong untuk permintaan pre-warming. |

267| `CLAUDE_RUNNER_ATTEMPT` | Berapa banyak permintaan pemijahan yang dimiliki sesi ini. `0` untuk permintaan pre-warming. |305| `CLAUDE_RUNNER_ATTEMPT` | Penghitung per sesi untuk digunakan dalam logging. Ini bukan jumlah retry maupun jumlah permintaan. `0` untuk permintaan pre-warming, meskipun permintaan untuk suatu sesi juga dapat membawa `0`. |

268| `CLAUDE_RUNNER_ORDER_SERVER_TIME` | Waktu server dari header HTTP `Date` respons polling. Ketika hook memverifikasi `exp` JWT pesanan kerja, bandingkan terhadap nilai ini daripada jam lokal untuk mentoleransi skew. Kosong ketika gateway menghilangkan header. |306| `CLAUDE_RUNNER_ORDER_SERVER_TIME` | Waktu server dari header HTTP `Date` respons polling. Ketika hook memverifikasi `exp` JWT pesanan kerja, bandingkan terhadap nilai ini daripada jam lokal untuk mentoleransi skew. Kosong ketika gateway menghilangkan header. |

269| `CLAUDE_RUNNER_POOL_ID` | ID lingkungan yang harus diikuti runner baru, dalam bentuk `ccpool_...` |307| `CLAUDE_RUNNER_POOL_ID` | ID lingkungan yang harus diikuti runner baru, dalam bentuk `ccpool_...` |

270| `CLAUDE_RUNNER_ACCOUNT_ID` | ID yang ditandai dari akun yang antri sesi, untuk routing per-akun, kuota, atau chargeback. Kosong ketika tidak tersedia, dan selalu kosong untuk sesi saluran Claude Tag, yang tidak ada akun antri. |308| `CLAUDE_RUNNER_ACCOUNT_ID` | ID yang ditandai dari akun yang antri sesi, untuk routing per-akun, kuota, atau chargeback. Kosong ketika tidak tersedia, dan selalu kosong untuk sesi saluran Claude Tag, yang tidak ada akun antri. |

271| `CLAUDE_RUNNER_ACCOUNT_EMAIL` | Email akun yang antri sesi. Kosong ketika tidak tersedia. Perlakukan email sebagai informasi yang dapat diidentifikasi secara pribadi dan jangan catat. |309| `CLAUDE_RUNNER_ACCOUNT_EMAIL` | Email akun yang antri sesi. Kosong ketika tidak tersedia. Perlakukan email sebagai informasi yang dapat diidentifikasi secara pribadi dan jangan catat. |

272| `CLAUDE_RUNNER_PRIMARY_REPO_URL` | URL sumber git pertama sesi, untuk routing ke runner dengan repositori itu pre-warmed. Kosong ketika sesi tidak memiliki sumber git. |310| `CLAUDE_RUNNER_PRIMARY_REPO_URL` | URL sumber git pertama sesi, untuk routing ke runner dengan repositori itu pre-warmed. Kosong ketika sesi tidak memiliki sumber git. |

273| `CLAUDE_RUNNER_PRIMARY_REPO_REVISION` | Revisi sumber git pertama sesi: cabang, SHA, atau tag. Kosong ketika tidak ditentukan. |311| `CLAUDE_RUNNER_PRIMARY_REPO_REVISION` | Revisi sumber git pertama sesi: branch, SHA, tag, atau nama referensi lengkap. Kosong ketika tidak ditentukan. |

274| `CLAUDE_RUNNER_REPO_SOURCES` | Array JSON dari `{url, revision}` untuk semua sumber git sesi, untuk hook yang route pada repositori sekunder. Kosong ketika tidak ada sumber. |312| `CLAUDE_RUNNER_REPO_SOURCES` | Array JSON dari `{url, revision}` untuk semua sumber git sesi, untuk hook yang route pada repositori sekunder. Kosong ketika tidak ada sumber. |

275| `CLAUDE_RUNNER_CORRELATION_ID` | ID korelasi yang disediakan saat pembuatan sesi, digemakan kembali sehingga hook dapat memetakan pesanan kerja ini ke permintaan yang membuat sesi. Kosong ketika sesi tidak memiliki satu. |313| `CLAUDE_RUNNER_CORRELATION_ID` | ID korelasi yang disediakan saat pembuatan sesi, digemakan kembali sehingga hook dapat memetakan pesanan kerja ini ke permintaan yang membuat sesi. Kosong ketika sesi tidak memiliki satu. |

276| `CLAUDE_RUNNER_CLIENT_PLATFORM` | Permukaan klien yang membuat sesi, seperti `web_claude_ai`, `desktop_app`, `ios`, atau `scheduled_trigger`, untuk analitik adopsi. Tidak diatur ketika sesi tidak memiliki permukaan yang tercatat atau dikenali, dan untuk permintaan pre-warming; periksa dengan `[ -n "${CLAUDE_RUNNER_CLIENT_PLATFORM:-}" ]`, yang tetap aman di bawah `set -u`. |314| `CLAUDE_RUNNER_CLIENT_PLATFORM` | Permukaan klien yang membuat sesi, seperti `web_claude_ai`, `desktop_app`, `ios`, atau `scheduled_trigger`, untuk analitik adopsi. Tidak diatur ketika sesi tidak memiliki permukaan yang tercatat atau dikenali, dan untuk permintaan pre-warming; periksa dengan `[ -n "${CLAUDE_RUNNER_CLIENT_PLATFORM:-}" ]`, yang tetap aman di bawah `set -u`. |


282* **Gunakan `--capacity 1` di runner yang dipijahkan**: pesanan kerja yang terikat sesi mendaftarkan tepat satu runner yang terikat ke sesi itu, jadi kapasitas lebih tinggi menambah slot yang tidak pernah menerima pekerjaan, dan runner mencatat peringatan saat startup.320* **Gunakan `--capacity 1` di runner yang dipijahkan**: pesanan kerja yang terikat sesi mendaftarkan tepat satu runner yang terikat ke sesi itu, jadi kapasitas lebih tinggi menambah slot yang tidak pernah menerima pekerjaan, dan runner mencatat peringatan saat startup.

283* **Pesanan kerja pre-warming mendaftarkan tidak terikat**: runner standby tidak terikat ke sesi dan mengklaim pekerjaan antri seperti runner fleet tetap.321* **Pesanan kerja pre-warming mendaftarkan tidak terikat**: runner standby tidak terikat ke sesi dan mengklaim pekerjaan antri seperti runner fleet tetap.

284 322 

285Kontrak memiliki empat aturan yang agnostik provisioner:323Kontrak memiliki empat aturan, di platform mana pun hook Anda melakukan provisioning:

286 324 

2871. **Jadilah idempoten pada `CLAUDE_RUNNER_ORDER_ID`.** Pengiriman ulang permintaan yang sama harus memijahkan paling banyak satu runner. Turunkan nama sumber daya deterministik dari order ID dan biarkan platform Anda menolak duplikat. Jangan kunci pada `CLAUDE_RUNNER_SESSION_ID` sebagai gantinya. Setiap permintaan ulang untuk sesi membawa ID sesi yang sama dengan order ID baru, jadi beban kerja yang dinamai atau dideduplikasi oleh ID sesi dibuat sekali dan tidak pernah lagi untuk sesi itu.3251. **Jadilah idempoten pada `CLAUDE_RUNNER_ORDER_ID`.** Pengiriman ulang permintaan yang sama harus memijahkan paling banyak satu runner. Turunkan nama sumber daya deterministik dari order ID dan biarkan platform Anda menolak duplikat. Jangan kunci pada `CLAUDE_RUNNER_SESSION_ID` sebagai gantinya. Setiap permintaan ulang untuk sesi membawa ID sesi yang sama dengan order ID baru, jadi beban kerja yang dinamai atau dideduplikasi oleh ID sesi dibuat sekali dan tidak pernah lagi untuk sesi itu.

2882. **Jangan coba ulang beban kerja.** Satu ID pesanan berarti paling banyak satu beban kerja yang dibuat. Jika runner tidak pernah mendaftar, Anthropic meminta ulang dengan ID pesanan segar setelah `--expected-spawn-seconds`.3262. **Jangan coba ulang beban kerja.** Satu ID pesanan berarti paling banyak satu beban kerja yang dibuat. Jika runner tidak pernah mendaftar, Anthropic meminta ulang dengan ID pesanan segar setelah `--expected-spawn-seconds`.

2893. **Gunakan kontrak kode keluar.** Keluar 0 berarti dikirimkan. Keluar 1 berarti kegagalan yang dapat dicoba ulang; sesi mundur dan ditawarkan kembali. Keluar 2 atau lebih tinggi berarti tidak dapat dicoba ulang; sesi diblokir dari pemijahan lagi sampai [Owner](/docs/id/cloud-environments#organization-shared-environments) memilih **Retry** di atasnya di tab **Activity** lingkungan. Pada keluar bukan nol, ekor stderr hook muncul di sana sebagai alasan kegagalan, jadi tulis kesalahan yang dapat ditindaklanjuti ke stderr dan jangan pernah rahasia. Untuk permintaan pre-warming tidak ada sesi untuk gagal: orchestrator mencatat keluar bukan nol secara lokal saja, dan server meminta ulang pemijahan setelah sewa.3273. **Gunakan kontrak exit code.** Keluar dengan status yang sesuai dengan hasilnya:

2904. **Atur `--expected-spawn-seconds` ke setidaknya waktu boot p99 Anda.** Ini adalah sewa server-side. Semua replika orchestrator harus menggunakan nilai yang sama.328 

329 * **Keluar 0**: dikirimkan.

330 * **Keluar 1**: kegagalan yang dapat dicoba ulang. Sesi mundur dan ditawarkan kembali.

331 * **Keluar 2 atau lebih tinggi**: kegagalan yang tidak dapat dicoba ulang. Sesi diblokir dari pemijahan lagi sampai pengguna mengirimkan pesan baru ke sesi tersebut atau [Owner](/docs/id/cloud-environments#organization-shared-environments) memilih **Retry** di atasnya di tab **Activity** lingkungan.

332 

333 Pada keluar bukan nol, ekor stderr hook muncul di tab **Activity** sebagai alasan kegagalan, jadi tulis kesalahan yang dapat ditindaklanjuti ke stderr dan jangan pernah menulis rahasia di sana. Dalam hook shell, [pertahankan kegagalan sementara agar dapat dicoba ulang](#keep-transient-failures-retryable-in-a-shell-hook).

334 

335 Permintaan pre-warming tidak memiliki sesi untuk gagal: orchestrator mencatat keluar bukan nol secara lokal saja, dan server meminta ulang pemijahan setelah sewa `--expected-spawn-seconds` kedaluwarsa.

3364. **Atur `--expected-spawn-seconds` ke setidaknya waktu p99 Anda dari permintaan pemijahan hingga pendaftaran runner.** Ukur sejak orchestrator menerima permintaan pemijahan, dan sertakan waktu tunggu untuk kapasitas di platform Anda serta waktu boot. Nilai ini adalah sewa server-side, dan pesanan kerja kedaluwarsa bersamanya, sehingga runner yang beban kerjanya membutuhkan waktu lebih lama tidak dapat mendaftar. Semua replika orchestrator harus menggunakan nilai yang sama.

291 337 

292Semua yang ditulis hook ke stdout atau stderr muncul dalam log orchestrator dengan kredensial secara otomatis diredaksi. Jika sesi tetap antri, periksa badan `/healthz` orchestrator untuk hitungan antrian, kemudian buka tab **Activity** lingkungan Anda di [halaman admin **Cloud environments**](https://claude.ai/admin-settings/cloud-environments): perluas sesi yang gagal di sana untuk kesalahan pemijahan, dan pilih **Retry** untuk memintanya ulang.338Semua yang ditulis hook ke stdout atau stderr muncul dalam log orchestrator dengan kredensial secara otomatis diredaksi. Jika sesi tetap antri, periksa badan `/healthz` orchestrator untuk hitungan antrian, kemudian buka tab **Activity** lingkungan Anda di [halaman admin **Cloud environments**](https://claude.ai/admin-settings/cloud-environments): perluas sesi yang gagal di sana untuk kesalahan pemijahan, dan pilih **Retry** untuk memintanya ulang.

293 339 

294Sesi yang tetap antri tanpa kesalahan pemijahan di tab **Activity** dapat berarti hook dikunci pada ID sesi. Untuk mengonfirmasi, periksa apakah platform Anda memiliki beban kerja untuk permintaan pemijahan pertama sesi itu dan tidak ada untuk permintaan ulang. Jika demikian, kunci beban kerja pada `CLAUDE_RUNNER_ORDER_ID` sebagai gantinya.340Sesi yang tetap antri tanpa kesalahan pemijahan di tab **Activity** dapat berarti hook dikunci pada ID sesi. Untuk mengonfirmasi, periksa apakah platform Anda memiliki beban kerja untuk permintaan pemijahan pertama sesi itu dan tidak ada untuk permintaan ulang. Jika demikian, kunci beban kerja pada `CLAUDE_RUNNER_ORDER_ID` sebagai gantinya.

295 341 

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

343 Pertahankan kegagalan sementara agar dapat dicoba ulang dalam hook shell

344</h4>

345 

346Dalam hook shell yang menggunakan `set -e`, kegagalan yang sebenarnya dapat teratasi dengan retry dapat memblokir sesi. Hook berhenti pada perintah yang gagal dan keluar dengan status milik perintah itu sendiri, dan orchestrator menerapkan kontrak exit code pada status tersebut. Banyak kegagalan mengembalikan status 2 atau lebih tinggi, seperti `127` ketika suatu perintah tidak terinstal dan `22` dari `curl --fail` pada kesalahan HTTP, sehingga kegagalan tersebut memblokir sesi pada kegagalan pertamanya.

347 

348Sesi yang telah diblokir oleh hook tetap diblokir sampai pengguna mengirimkan pesan baru ke sesi tersebut atau [Owner](/docs/id/cloud-environments#organization-shared-environments) memilih **Retry** di atasnya di tab **Activity** lingkungan.

349 

350Untuk mengubah kegagalan semacam itu menjadi keluar 1, letakkan baris-baris berikut tepat di bawah baris `#!` hook, di atas apa pun yang dapat gagal:

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 

358Baris-baris ini mengubah perilaku bagian hook lainnya, jadi periksa hook untuk setiap pola berikut setelah Anda menambahkannya:

359 

360* **`exit 2` atau lebih tinggi secara langsung**: dengan trap terpasang, ini menjadi keluar 1. Untuk kesalahan yang tidak dapat diperbaiki oleh retry apa pun, panggil `permanent` dengan alasannya sebagai gantinya, seperti `permanent "namespace claude-runners does not exist"`. Panggil di shell utama, bukan di dalam `$( )`, `( )`, atau pipe.

361* **`exec`**: jangan memulai perintah terakhir hook dengan `exec`, karena `exec` menggantikan shell dan trap tidak berjalan.

362* **Trap `EXIT` kedua**: `trap ... EXIT` kedua menggantikan yang pertama, jadi gabungkan keduanya menjadi satu trap. Letakkan perintah pembersihan Anda tepat setelah `rc=$?;` dan akhiri masing-masing dengan `|| true;`. Pembersihan kemudian berjalan saat gagal maupun saat berhasil, dan perintah pembersihan yang gagal tidak menetapkan status keluar hook. Trap gabungan ini menunjukkan bentuknya, dengan `your-cleanup-command` sebagai pengganti perintah Anda sendiri:

363 

364 ```bash theme={null}

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

366 ```

367* **Perintah yang boleh gagal**: jika hook sebelumnya tidak menggunakan `set -e`, kini hook berhenti pada perintah pertama yang mengembalikan nilai bukan nol, seperti pencarian yang tidak menemukan apa pun atau pengiriman duplikat yang ditolak platform Anda. Jika hook bertindak berdasarkan hasilnya, jadikan perintah tersebut kondisi dari sebuah `if`. Jika hook mengabaikan hasilnya, tambahkan `|| true` setelah perintah tersebut.

368 

369Untuk mengonfirmasi bahwa trap berfungsi, tambahkan baris tepat di bawah baris `trap` yang memanggil perintah yang tidak ada, seperti `no-such-command`. Jalankan file hook dari shell Anda dan periksa bahwa `echo $?` mencetak `1`, lalu hapus baris tersebut.

370 

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

297 Mengirim permintaan model ke Bedrock atau Agent Platform372 Mengirim permintaan model ke Bedrock atau Agent Platform

298</h2>373</h2>


381Sesi yang mengirim permintaan model ke Amazon Bedrock atau Google Cloud's Agent Platform berbeda dari sesi di Anthropic API dalam hal-hal berikut:456Sesi yang mengirim permintaan model ke Amazon Bedrock atau Google Cloud's Agent Platform berbeda dari sesi di Anthropic API dalam hal-hal berikut:

382 457 

383* **Kebijakan dari claude.ai**: [pengaturan yang dikelola server](/docs/id/server-managed-settings) tidak sampai ke sesi ini. Begitu pula kebijakan organisasi yang ditetapkan Owner di pengaturan admin Claude Code, sehingga Claude Code tidak memberlakukannya di dalam sesi. Letakkan aturan yang Anda andalkan di [file pengaturan terkelola](/docs/id/managed-settings#delivery-mechanisms) pada image runner.458* **Kebijakan dari claude.ai**: [pengaturan yang dikelola server](/docs/id/server-managed-settings) tidak sampai ke sesi ini. Begitu pula kebijakan organisasi yang ditetapkan Owner di pengaturan admin Claude Code, sehingga Claude Code tidak memberlakukannya di dalam sesi. Letakkan aturan yang Anda andalkan di [file pengaturan terkelola](/docs/id/managed-settings#delivery-mechanisms) pada image runner.

459* **Skill akun**: sesi ini tidak mengunduh skill yang diaktifkan untuk akun claude.ai seseorang. Lihat [Bagaimana konfigurasi setiap sesi disusun](#how-each-session’s-config-is-assembled).

384* **File**: file yang dilampirkan orang ke sesi di claude.ai atau aplikasi seluler atau desktop tidak sampai ke sesi tersebut, dan Claude tidak dapat mengirim file kembali dengan [tool `SendUserFile`](/docs/id/tools-reference). Sebagai gantinya, letakkan file input di repositori atau di runner.460* **File**: file yang dilampirkan orang ke sesi di claude.ai atau aplikasi seluler atau desktop tidak sampai ke sesi tersebut, dan Claude tidak dapat mengirim file kembali dengan [tool `SendUserFile`](/docs/id/tools-reference). Sebagai gantinya, letakkan file input di repositori atau di runner.

385* **Pemilihan model**: control plane Anthropic mengirimkan model setiap sesi, dan ketika sesi dimulai tanpa model, Claude Code menggunakan model default untuk penyedia tersebut. Runner menghapus `ANTHROPIC_MODEL` dan `ANTHROPIC_DEFAULT_MODEL` dari environment yang diteruskannya ke sesi. Contoh di halaman penyedia menetapkan `ANTHROPIC_MODEL`, tetapi di environment runner tidak satu pun variabel tersebut berpengaruh. Variabel per keluarga model di Menyematkan versi model untuk [Amazon Bedrock](/docs/id/amazon-bedrock#4-pin-model-versions) dan [Agent Platform](/docs/id/google-vertex-ai#5-pin-model-versions) memang sampai ke sesi. Variabel tersebut menentukan ke mana alias seperti `opus` diarahkan, bukan ke mana ID model lengkap diarahkan.461* **Pemilihan model**: control plane Anthropic mengirimkan model setiap sesi, dan ketika sesi dimulai tanpa model, Claude Code menggunakan model default untuk penyedia tersebut. Anda tidak dapat memilih model dengan `ANTHROPIC_MODEL` atau `ANTHROPIC_DEFAULT_MODEL` di environment runner, tetapi Anda dapat menyematkan ke mana sebuah alias diarahkan:

462 * **`ANTHROPIC_MODEL` dan `ANTHROPIC_DEFAULT_MODEL`**: runner menghapus keduanya dari environment yang diteruskannya ke sesi, meskipun contoh di halaman penyedia menetapkan `ANTHROPIC_MODEL`.

463 * **Variabel penyematan per keluarga model**: variabel di Menyematkan versi model untuk [Amazon Bedrock](/docs/id/amazon-bedrock#4-pin-model-versions) dan [Agent Platform](/docs/id/google-vertex-ai#5-pin-model-versions) memang sampai ke sesi. Variabel tersebut menentukan ke mana alias seperti `opus` diarahkan, bukan ke mana ID model lengkap diarahkan.

386* **Model yang tidak dilayani akun Anda**: sebuah sesi dapat gagal pada suatu pesan dengan error yang menyebutkan nama model. Aktifkan model yang dapat dipilih developer Anda, model latar belakang yang dijelaskan dalam Menyematkan versi model, dan model pengklasifikasi yang digunakan [auto mode](/docs/id/permission-modes#enable-auto-mode-on-bedrock-agent-platform-or-foundry). Di Amazon Bedrock, izinkan masing-masing model tersebut dalam kebijakan Anda.464* **Model yang tidak dilayani akun Anda**: sebuah sesi dapat gagal pada suatu pesan dengan error yang menyebutkan nama model. Aktifkan model yang dapat dipilih developer Anda, model latar belakang yang dijelaskan dalam Menyematkan versi model, dan model pengklasifikasi yang digunakan [auto mode](/docs/id/permission-modes#enable-auto-mode-on-bedrock-agent-platform-or-foundry). Di Amazon Bedrock, izinkan masing-masing model tersebut dalam kebijakan Anda.

387* **Pencarian web dan fast mode**: [pencarian web](/docs/id/tools-reference#websearch-tool-behavior) tidak tersedia di Amazon Bedrock, dan [fast mode](/docs/id/fast-mode) tidak tersedia di kedua penyedia. Untuk kemampuan lain yang berbeda menurut penyedia, lihat [Kemampuan CLI yang bervariasi menurut penyedia](/docs/id/feature-availability#cli-capabilities-that-vary-by-provider).465* **Pencarian web dan fast mode**: [pencarian web](/docs/id/tools-reference#websearch-tool-behavior) tidak tersedia di Amazon Bedrock, dan [fast mode](/docs/id/fast-mode) tidak tersedia di kedua penyedia. Untuk kemampuan lain yang berbeda menurut penyedia, lihat [Kemampuan CLI yang bervariasi menurut penyedia](/docs/id/feature-availability#cli-capabilities-that-vary-by-provider).

388 466 


411 489 

412Sesi mewarisi environment runner, jadi atur [`ENABLE_TOOL_SEARCH`](/docs/id/mcp#scale-with-mcp-tool-search) di sana untuk mengontrol pencarian tool MCP bagi setiap sesi yang dijalankan runner; halaman MCP menjelaskan nilai-nilainya.490Sesi mewarisi environment runner, jadi atur [`ENABLE_TOOL_SEARCH`](/docs/id/mcp#scale-with-mcp-tool-search) di sana untuk mengontrol pencarian tool MCP bagi setiap sesi yang dijalankan runner; halaman MCP menjelaskan nilai-nilainya.

413 491 

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

493 

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

495 Menunggu server MCP sebelum giliran pertama

496</h3>

497 

498Sesi self-hosted menunggu sebentar server MCP yang masih dalam proses terhubung, pada dua titik terpisah. Server yang terlewat dari suatu penantian akan kehilangan tool-nya saat giliran pertama dimulai, dan tool tersebut akan tersedia kemudian tanpa tindakan apa pun dari Anda. Kedua penantian tersebut adalah:

499 

500* **Startup sesi**: sebelum daftar tool pertama kali diambil, sesi menunggu hingga 5 detik secara default untuk server HTTP atau SSE yang entrinya mengatur [`alwaysLoad: true`](/docs/id/mcp#exempt-a-server-from-deferral), atau untuk semua server ketika Anda mengatur [`MCP_CONNECTION_NONBLOCKING=0`](/docs/id/env-vars) di environment runner. Jika tidak, server HTTP dan SSE terhubung di latar belakang. Selama sesi menunggu di sini, inisialisasinya menjadi lebih lambat. [`MCP_CONNECT_TIMEOUT_MS`](/docs/id/env-vars) mengubah default 5 detik tersebut.

501* **Giliran pertama**: setelah pesan tiba, giliran pertama menunggu hingga 2 detik untuk server stdio yang masih dalam proses terhubung. Selama sesi menunggu di sini, balasan pertama menjadi lebih lambat. Untuk mengubah berapa lama penantian ini berlangsung, atur [`CLAUDE_CODE_MCP_STARTUP_WAIT_MS`](/docs/id/env-vars) di environment runner. Variabel ini tidak mengubah server mana yang dicakup oleh penantian tersebut. Memerlukan Claude Code v2.1.274 atau yang lebih baru.

502 

503`claude mcp add` tidak memiliki flag `alwaysLoad`. Untuk mengatur kunci tersebut, tambahkan server dengan `claude mcp add-json` sebagai gantinya, yang menerima kunci itu dalam JSON server dan menuliskannya ke `.claude.json`. Di Dockerfile Anda:

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 

509Jika tool sebuah server juga tidak muncul pada giliran berikutnya, periksa apakah server tersebut benar-benar mencapai sesi, seperti yang dijelaskan di [Server MCP](#mcp-servers).

510 

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

415 Matikan tool sesi bawaan512 Matikan tool sesi bawaan

416</h3>513</h3>


574 671 

575Atur `SELF_HOSTED_RUNNER_HOST_CONFIG_DIR` untuk menabur dari jalur berbeda, atau arahkan ke direktori kosong untuk menonaktifkan penanaman.672Atur `SELF_HOSTED_RUNNER_HOST_CONFIG_DIR` untuk menabur dari jalur berbeda, atau arahkan ke direktori kosong untuk menonaktifkan penanaman.

576 673 

577`.claude/settings.json` yang di-commit ke repositori diterapkan di atasnya sebagai pengaturan proyek. Dalam sesi dengan beberapa repositori, [paling banyak hanya file dari satu repositori yang berlaku](#repository-settings-in-sessions-with-several-repositories). Sesi juga membaca [`managed-settings.json`](/docs/id/settings#where-settings-live) dari jalur sistem standar di image runner Anda. Apakah kuncinya berlaku bersama [pengaturan terkelola server](/docs/id/server-managed-settings) mengikuti [bagaimana Claude Code menggabungkan sumber terkelola](/docs/id/managed-settings#how-claude-code-combines-managed-sources): secara default, ketika organisasi Anda mengirimkan kunci terkelola server apa pun, sesi mengabaikan file image runner kecuali [kunci yang dibaca Claude Code dari setiap sumber admin](/docs/id/managed-settings#keys-read-from-every-admin-source), seperti blok `env`, kunci sandbox, jalur biner sandbox, dan `forceRemoteSettingsRefresh`. Lihat [prioritas pengaturan](/docs/id/settings#settings-precedence).674Sesi juga membaca file pengaturan berikut:

675 

676* **Pengaturan proyek**: `.claude/settings.json` yang di-commit ke repositori diterapkan di atas baseline tingkat pengguna. Dalam sesi dengan beberapa repositori, [paling banyak hanya file dari satu repositori yang berlaku](#repository-settings-in-sessions-with-several-repositories).

677* **Pengaturan terkelola**: sesi membaca [`managed-settings.json`](/docs/id/settings#where-settings-live) dari jalur sistem standar di image runner Anda. Untuk mengetahui apakah kuncinya berlaku bersama [pengaturan terkelola server](/docs/id/server-managed-settings), lihat [bagaimana Claude Code menggabungkan sumber terkelola](/docs/id/managed-settings#how-claude-code-combines-managed-sources).

678 

679Untuk urutan penerapan sumber-sumber ini, lihat [prioritas pengaturan](/docs/id/settings#settings-precedence).

578 680 

579Ketika bidang kontrol Anthropic memasok sesi dengan [Claude Code hooks](/docs/id/hooks), runner memasangnya bersama, bukan di atas, konfigurasi Anda sendiri. Memerlukan Claude Code v2.1.229 atau lebih baru.681Ketika bidang kontrol Anthropic memasok sesi dengan [Claude Code hooks](/docs/id/hooks), runner memasangnya bersama, bukan di atas, konfigurasi Anda sendiri. Memerlukan Claude Code v2.1.229 atau lebih baru.

580 682 


582* **Siapa yang menulisnya**: bidang kontrol mengisinya dari konstanta tetap dalam deployment-nya sendiri, tidak pernah dari input per-sesi atau pihak ketiga.684* **Siapa yang menulisnya**: bidang kontrol mengisinya dari konstanta tetap dalam deployment-nya sendiri, tidak pernah dari input per-sesi atau pihak ketiga.

583* **Apa yang masih mengaturnya**: hook yang dikirimkan melalui `--settings` memasuki konfigurasi hook yang digabungkan biasa, bukan tingkat yang dikelola, jadi pengaturan yang dikelola Anda masih berlaku. `disableAllHooks` menonaktifkannya, dan mereka bukan di antara kategori yang [`allowManagedHooksOnly`](/docs/id/settings-reference#allowmanagedhooksonly) tetap dimuat.685* **Apa yang masih mengaturnya**: hook yang dikirimkan melalui `--settings` memasuki konfigurasi hook yang digabungkan biasa, bukan tingkat yang dikelola, jadi pengaturan yang dikelola Anda masih berlaku. `disableAllHooks` menonaktifkannya, dan mereka bukan di antara kategori yang [`allowManagedHooksOnly`](/docs/id/settings-reference#allowmanagedhooksonly) tetap dimuat.

584 686 

687Ketika seseorang memulai sesinya sendiri, Claude Code juga mengunduh [skills yang diaktifkan untuk akun claude.ai mereka](/docs/id/skills#skills-in-cowork-and-cloud-sessions) ke direktori konfigurasi sesi tersebut. Eksekusi [routine](/docs/id/routines) tidak mendapatkan skills pemiliknya, dan sesi yang [mengirimkan permintaan model ke Bedrock atau Agent Platform](#send-model-requests-to-bedrock-or-agent-platform) tidak mengunduh skill apa pun. Untuk skill yang dibutuhkan sesi tersebut, commit skill tersebut ke `.claude/skills/` repositori atau tambahkan ke image runner Anda.

688 

585Di luar sesi [Claude Tag](https://claude.com/docs/claude-tag/overview), sesi dalam lingkungan yang di-host sendiri berjalan dengan [auto memory](/docs/id/memory#auto-memory) nonaktif secara default. Untuk instruksi yang harus terbawa antar sesi, gunakan `CLAUDE.md` di image runner Anda atau di repositori.689Di luar sesi [Claude Tag](https://claude.com/docs/claude-tag/overview), sesi dalam lingkungan yang di-host sendiri berjalan dengan [auto memory](/docs/id/memory#auto-memory) nonaktif secara default. Untuk instruksi yang harus terbawa antar sesi, gunakan `CLAUDE.md` di image runner Anda atau di repositori.

586 690 

587Snapshot runner atas `~/.claude/` host tidak menyertakan direktori `projects/`. Lokasi penyimpanan default auto memory berada di bawah direktori tersebut. Jika Anda meletakkan file memori di sana, runner tidak menanamkannya ke dalam sesi, dan file tersebut tidak mengaktifkan auto memory.691Snapshot runner atas `~/.claude/` host tidak menyertakan direktori `projects/`. Lokasi penyimpanan default auto memory berada di bawah direktori tersebut. Jika Anda meletakkan file memori di sana, runner tidak menanamkannya ke dalam sesi, dan file tersebut tidak mengaktifkan auto memory.

Details

20 20 

21* **Container ephemeral per sesi**: jalankan setiap proses runner dalam container atau VM baru yang dihancurkan saat proses berakhir, dengan `--capacity 1` dan `--drain-grace-sec 0` default sehingga setiap container melayani tepat satu sesi. Pada kapasitas yang lebih tinggi, atau dengan drain grace positif, satu container melayani beberapa sesi dari [pemilik terkunci](/docs/id/self-hosted-environments#key-concepts) yang sama; lihat [Siklus hidup runner](/docs/id/self-hosted-environments#runner-lifecycle). Jangan gunakan ulang sistem file di antara restart runner, kecuali dalam penyiapan [checkout yang sudah dipanaskan sebelumnya](#reuse-a-pre-warmed-checkout) yang disengaja, dan jangan pernah lintas pemilik.21* **Container ephemeral per sesi**: jalankan setiap proses runner dalam container atau VM baru yang dihancurkan saat proses berakhir, dengan `--capacity 1` dan `--drain-grace-sec 0` default sehingga setiap container melayani tepat satu sesi. Pada kapasitas yang lebih tinggi, atau dengan drain grace positif, satu container melayani beberapa sesi dari [pemilik terkunci](/docs/id/self-hosted-environments#key-concepts) yang sama; lihat [Siklus hidup runner](/docs/id/self-hosted-environments#runner-lifecycle). Jangan gunakan ulang sistem file di antara restart runner, kecuali dalam penyiapan [checkout yang sudah dipanaskan sebelumnya](#reuse-a-pre-warmed-checkout) yang disengaja, dan jangan pernah lintas pemilik.

22 * <span id="processes-a-stopped-session-leaves" />Saat runner menghentikan sesi, runner tidak mengirimkan sinyal ke proses yang masih berjalan setelah perintah shell-nya selesai, seperti layanan yang berjalan sebagai daemon. Menghancurkan container atau VM akan mengakhiri proses tersebut.22 * <span id="processes-a-stopped-session-leaves" />Saat runner menghentikan sesi, runner tidak mengirimkan sinyal ke proses yang masih berjalan setelah perintah shell-nya selesai, seperti layanan yang berjalan sebagai daemon. Menghancurkan container atau VM akan mengakhiri proses tersebut.

23* **Tidak ada kredensial luas di dalam image**: jangan sertakan kunci SSH berumur panjang, kredensial penyedia cloud, atau token akses pribadi yang memberikan lebih dari yang dibutuhkan sesi. Buat kredensial yang digunakan selama sesi, seperti token push atau API, per sesi dari [skrip wrapper](/docs/id/self-hosted-environments-configuration#wrapper-scripts) Anda. Untuk clone awal, yang terjadi sebelum wrapper berjalan, gunakan [hook siklus hidup `checkout`](/docs/id/self-hosted-environments-configuration#checkout) atau [`--use-anthropic-git-proxy`](#use-the-anthropic-git-proxy); lihat [Konfigurasikan git](#configure-git).23* **Tidak ada kredensial luas di dalam image**: jangan sertakan kunci SSH berumur panjang, kredensial penyedia cloud, atau token akses pribadi yang memberikan lebih dari yang dibutuhkan sesi. Buat kredensial yang digunakan selama sesi, seperti token push atau API, per sesi dari [skrip wrapper](/docs/id/self-hosted-environments-configuration#wrapper-scripts) Anda. Clone awal terjadi sebelum wrapper berjalan, jadi tangani dengan [hook siklus hidup `checkout`](/docs/id/self-hosted-environments-configuration#checkout), atau dengan [`--use-anthropic-git-proxy`](#use-the-anthropic-git-proxy) jika semua repositori sesi berada di github.com. Untuk keduanya, lihat [Konfigurasikan git](#configure-git).

24* **Jauhkan kredensial GitHub milik host dari sesi**: Claude dapat menggunakan kredensial GitHub apa pun yang dapat dibaca oleh sesi, dengan akses apa pun yang diberikan oleh kredensial tersebut. Jauhkan kredensial GitHub milik host runner sendiri yang memiliki cakupan luas dari apa pun yang dapat dibaca oleh sesi. Kredensial semacam itu dapat berupa token akses pribadi, token yang disimpan `gh auth login` untuk akun Anda, atau `GH_TOKEN` di lingkungan runner.

25 * **Dengan [git yang dikelola Anthropic](#use-the-anthropic-git-proxy)**: dengan kredensial semacam itu, Claude menjangkau GitHub secara langsung alih-alih melalui git yang dikelola Anthropic.

26 * **Tanpa git yang dikelola Anthropic**: kredensial clone dapat tetap berada di dalam image jika Anda membatasinya seketat yang dijelaskan di [Sertakan konfigurasi git di image Anda](#ship-git-config-in-your-image).

24* **Jauhkan secret lingkungan dari host yang menjalankan sesi**: secret lingkungan dapat mendaftarkan runner dan mengambil sesi apa pun yang diantrekan pada lingkungan tersebut. Pada armada tetap, secret ini berada di setiap host runner, tempat kode sesi mana pun dapat membaca file secret. Utamakan [runner on-demand](/docs/id/self-hosted-environments-configuration#on-demand-runners), di mana secret tetap berada di host orkestrator, yang tidak pernah menjalankan kode pengguna, dan setiap runner menerima work order sekali pakai yang mendaftarkan tepat satu runner. Pada armada tetap, perlakukan file secret lingkungan sebagai dapat dibaca oleh setiap sesi dan rotasi secret setelah adanya dugaan kompromi sesi.27* **Jauhkan secret lingkungan dari host yang menjalankan sesi**: secret lingkungan dapat mendaftarkan runner dan mengambil sesi apa pun yang diantrekan pada lingkungan tersebut. Pada armada tetap, secret ini berada di setiap host runner, tempat kode sesi mana pun dapat membaca file secret. Utamakan [runner on-demand](/docs/id/self-hosted-environments-configuration#on-demand-runners), di mana secret tetap berada di host orkestrator, yang tidak pernah menjalankan kode pengguna, dan setiap runner menerima work order sekali pakai yang mendaftarkan tepat satu runner. Pada armada tetap, perlakukan file secret lingkungan sebagai dapat dibaca oleh setiap sesi dan rotasi secret setelah adanya dugaan kompromi sesi.

25* **Tolak egress jaringan secara default**: batasi lalu lintas keluar runner dan container sesi di batas jaringan Anda sendiri pada setiap lingkungan; [Tolak egress secara default](#default-deny-egress) menjelaskan apa yang perlu diizinkan dan alasannya.28* **Tolak egress jaringan secara default**: batasi lalu lintas keluar runner dan container sesi di batas jaringan Anda sendiri pada setiap lingkungan; [Tolak egress secara default](#default-deny-egress) menjelaskan apa yang perlu diizinkan dan alasannya.

26* **IAM host dengan hak akses minimal**: identitas komputasi yang terpasang pada host runner, seperti instance profile atau akun layanan node, sebaiknya hanya memberikan apa yang dibutuhkan oleh runner itu sendiri. Sesi sebaiknya memperoleh kredensialnya sendiri melalui skrip wrapper Anda alih-alih mewarisi kredensial host.29* **IAM host dengan hak akses minimal**: identitas komputasi yang terpasang pada host runner, seperti instance profile atau akun layanan node, sebaiknya hanya memberikan apa yang dibutuhkan oleh runner itu sendiri. Sesi sebaiknya memperoleh kredensialnya sendiri melalui skrip wrapper Anda alih-alih mewarisi kredensial host.


42 Guard berjalan terlepas dari [`--trust-workspace`](/docs/id/self-hosted-environments-reference#runner-cli-flags), dan tidak mencakup hook repositori, `.mcp.json`, atau aturan Bash; lihat [Izin dan persetujuan tool](/docs/id/self-hosted-environments-configuration#permissions-and-tool-approval) untuk mengetahui tempat pemberian akses tersebut seharusnya berada.45 Guard berjalan terlepas dari [`--trust-workspace`](/docs/id/self-hosted-environments-reference#runner-cli-flags), dan tidak mencakup hook repositori, `.mcp.json`, atau aturan Bash; lihat [Izin dan persetujuan tool](/docs/id/self-hosted-environments-configuration#permissions-and-tool-approval) untuk mengetahui tempat pemberian akses tersebut seharusnya berada.

43 46 

44<Note>47<Note>

45 Allowlist IP organisasi Anda tidak mencakup lalu lintas runner self-hosted secara default. Jangan mengandalkannya sebagai kontrol jaringan untuk lalu lintas runner atau sesi; sebagai gantinya, terapkan penolakan egress secara default di batas jaringan Anda sendiri, dan hubungi tim akun Anthropic Anda jika Anda menginginkan penerapan allowlist IP untuk organisasi Anda.48 Jika organisasi Anda mengaktifkan [allowlist IP](https://support.claude.com/en/articles/13200993-restrict-access-to-claude-with-ip-allowlisting), tambahkan alamat egress publik runner dan container sesi Anda ke allowlist sebelum Anda memulainya. Jika Anda menjalankan [runner on-demand](/docs/id/self-hosted-environments-configuration#on-demand-runners), tambahkan juga alamat host orkestrator. Jangan mengandalkan allowlist sebagai kontrol jaringan untuk lalu lintas runner atau sesi. Sebagai gantinya, terapkan penolakan egress secara default di batas jaringan Anda sendiri.

46</Note>49</Note>

47 50 

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


55 58 

56| Host | Port | Digunakan untuk |59| Host | Port | Digunakan untuk |

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

58| `api.anthropic.com` | 443, HTTPS; WSS untuk konektor SCM saja | Bidang kontrol runner dan streaming sesi, inferensi model, flag fitur, analitik produk, pengambilan kunci [JWKS](/docs/id/self-hosted-environments-identity), penandatanganan komit, proxy git ketika `--use-anthropic-git-proxy` diatur, dan terowongan [SCM connector](/docs/id/self-hosted-environments-reference#scm-connector-flags) orchestrator ketika `--scm-connector-host` diatur |61| `api.anthropic.com` | 443, HTTPS; WSS untuk [git yang dikelola Anthropic](#use-the-anthropic-git-proxy) | Bidang kontrol runner dan streaming sesi, inferensi model, flag fitur, analitik produk, pengambilan kunci [JWKS](/docs/id/self-hosted-environments-identity), penandatanganan commit, dan git yang dikelola Anthropic ketika `--use-anthropic-git-proxy` diatur |

59| Host git Anda, seperti `github.com` atau host GitHub Enterprise Anda | 443 atau 22 | Kloning dan push repositori. Tidak diperlukan jika runner menggunakan `--use-anthropic-git-proxy`, yang merutekan lalu lintas git melalui `api.anthropic.com`. |62| Host git Anda, seperti `github.com` atau host GitHub Enterprise Anda | 443 atau 22 | Kloning dan push repositori di setiap host git yang digunakan oleh sesi runner. Pada runner yang menggunakan [`--use-anthropic-git-proxy`](#use-the-anthropic-git-proxy), lihat [kapan jalur `github.com` masih diperlukan](#github-com-egress-with-the-anthropic-git-proxy). |

63 

64<span id="github-com-egress-with-the-anthropic-git-proxy" />Runner yang menggunakan [`--use-anthropic-git-proxy`](#use-the-anthropic-git-proxy) merutekan lalu lintas git `github.com`-nya melalui `api.anthropic.com`, sehingga tidak memerlukan jalur host git untuk `github.com`. Runner tersebut tetap memerlukan jalur itu jika Anda mengatur `--push-outcome-on-release` atau melakukan push dari hook `post-session`.

60 65 

61Apakah host-host ini diperlukan tergantung pada konfigurasi Anda:66Apakah host-host ini diperlukan tergantung pada konfigurasi Anda:

62 67 


71| `browser-intake-us5-datadoghq.com` | 443 | Unggahan laporan kesalahan Anthropic, dikirim hanya ketika [pelaporan kesalahan](/docs/id/data-usage#telemetry-services) diaktifkan untuk akun sesi. Ditekan oleh `DISABLE_ERROR_REPORTING=1` atau `DISABLE_TELEMETRY=1`. |76| `browser-intake-us5-datadoghq.com` | 443 | Unggahan laporan kesalahan Anthropic, dikirim hanya ketika [pelaporan kesalahan](/docs/id/data-usage#telemetry-services) diaktifkan untuk akun sesi. Ditekan oleh `DISABLE_ERROR_REPORTING=1` atau `DISABLE_TELEMETRY=1`. |

72| Endpoint penyedia cloud Anda untuk permintaan model, pencarian model, dan pembaruan kredensial, seperti `bedrock-runtime.us-east-1.amazonaws.com` atau `aiplatform.googleapis.com` | 443 | Hanya ketika runner [mengirim permintaan model ke Amazon Bedrock atau Agent Platform Google Cloud](/docs/id/self-hosted-environments-configuration#send-model-requests-to-bedrock-or-agent-platform) |77| Endpoint penyedia cloud Anda untuk permintaan model, pencarian model, dan pembaruan kredensial, seperti `bedrock-runtime.us-east-1.amazonaws.com` atau `aiplatform.googleapis.com` | 443 | Hanya ketika runner [mengirim permintaan model ke Amazon Bedrock atau Agent Platform Google Cloud](/docs/id/self-hosted-environments-configuration#send-model-requests-to-bedrock-or-agent-platform) |

73 78 

74Runner tidak menjangkau `statsig.anthropic.com`, `*.sentry.io`, `claude.ai`, atau `platform.claude.com`. Host-host ini muncul dalam beberapa daftar periksa jaringan enterprise yang lebih lama, tetapi Anda tidak perlu mengizinkan daftar mereka untuk lalu lintas runner atau sesi: pengambilan flag fitur pergi ke `api.anthropic.com`, dan runner mengautentikasi dengan rahasia lingkungan daripada OAuth interaktif. Dua alur sisi host memang menjangkau `claude.ai`, jadi jalankan dari host yang egress-nya memungkinkannya daripada memperluas egress kontainer sesi: installer satu baris mengambil `install.sh` dari `claude.ai` pada waktu instalasi, dan `claude auth login` interaktif, yang [guided setup](/docs/id/self-hosted-environments-quickstart#set-up-an-environment-and-runner), mode signed-in `doctor`, dan [CI dispatch](/docs/id/self-hosted-environments-testing#authenticate-from-ci) gunakan, masuk melalui `claude.ai`, `claude.com`, dan `platform.claude.com`. `mcp-proxy.anthropic.com` juga tidak diperlukan: sesi yang di-host sendiri tidak menggunakannya, dan pengiriman konektor claude.ai organisasi Anda ke sesi, ketika diaktifkan untuk organisasi Anda, merutekan melalui `api.anthropic.com`. Lihat [MCP servers](/docs/id/self-hosted-environments-configuration#mcp-servers).79Anda tidak perlu menambahkan host-host ini ke allowlist untuk lalu lintas runner atau sesi:

80 

81* **`statsig.anthropic.com`, `*.sentry.io`, `claude.ai`, dan `platform.claude.com`**: host-host ini muncul dalam beberapa daftar periksa jaringan enterprise yang lebih lama, tetapi runner tidak menjangkaunya. Pengambilan flag fitur pergi ke `api.anthropic.com`, dan runner mengautentikasi dengan rahasia lingkungan daripada OAuth interaktif.

82* **`mcp-proxy.anthropic.com`**: sesi yang di-host sendiri tidak menggunakannya. Ketika pengiriman konektor diaktifkan untuk organisasi Anda, konektor claude.ai organisasi Anda menjangkau sesi melalui `api.anthropic.com`. Lihat [MCP servers](/docs/id/self-hosted-environments-configuration#mcp-servers).

83 

84Alur sisi host berikut memang menjangkau `claude.ai`, jadi jalankan dari host yang egress-nya memungkinkannya daripada memperluas egress kontainer sesi:

85 

86* **Installer satu baris**: mengambil `install.sh` dari `claude.ai` pada waktu instalasi.

87* **`claude auth login` interaktif**: masuk melalui `claude.ai`, `claude.com`, dan `platform.claude.com`. [Guided setup](/docs/id/self-hosted-environments-quickstart#run-the-guided-setup), mode signed-in `doctor`, dan [CI dispatch](/docs/id/self-hosted-environments-testing#authenticate-from-ci) menggunakannya. Browser yang Anda gunakan untuk masuk juga memuat pemeriksaan browser halaman masuk claude.ai dari `hcaptcha.com`, `*.hcaptcha.com`, dan `challenges.cloudflare.com`.

75 88 

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

77 Default-deny egress90 Default-deny egress


127* **Biarkan runner mengonfigurasi git**: mulai runner dengan `--configure-git` untuk memilikinya menulis identitas yang sama dan konfigurasi penandatanganan komit yang digunakan sesi yang di-host Anthropic140* **Biarkan runner mengonfigurasi git**: mulai runner dengan `--configure-git` untuk memilikinya menulis identitas yang sama dan konfigurasi penandatanganan komit yang digunakan sesi yang di-host Anthropic

128* **Kirim konfigurasi git dalam gambar Anda**: atur identitas dan kredensial push sendiri, misalnya untuk berkomitmen di bawah identitas bot Anda sendiri141* **Kirim konfigurasi git dalam gambar Anda**: atur identitas dan kredensial push sendiri, misalnya untuk berkomitmen di bawah identitas bot Anda sendiri

129 142 

143Untuk repositori di github.com, Anda juga dapat memulai runner dengan [`--use-anthropic-git-proxy`](#use-the-anthropic-git-proxy), atau menetapkan `CLAUDE_RUNNER_USE_GIT_PROXY=1`, untuk meminta Anthropic melayani git bagi sesi-sesi runner.

144 

130Lantai versi Git di host runner: [`--configure-git`](#let-the-runner-configure-git) penandatanganan komit SSH memerlukan Git 2.34 atau lebih baru, [`--use-anthropic-git-proxy`](#use-the-anthropic-git-proxy) memerlukan 2.32 atau lebih baru, dan melanjutkan sesi dari cabang yang didorong oleh [`--push-outcome-on-release`](/docs/id/self-hosted-environments-reference#runner-cli-flags) memerlukan 2.29 atau lebih baru. Git 2.24 cukup jika Anda menghilangkan ketiganya dan mengelola identitas git sendiri.145Lantai versi Git di host runner: [`--configure-git`](#let-the-runner-configure-git) penandatanganan komit SSH memerlukan Git 2.34 atau lebih baru, [`--use-anthropic-git-proxy`](#use-the-anthropic-git-proxy) memerlukan 2.32 atau lebih baru, dan melanjutkan sesi dari cabang yang didorong oleh [`--push-outcome-on-release`](/docs/id/self-hosted-environments-reference#runner-cli-flags) memerlukan 2.29 atau lebih baru. Git 2.24 cukup jika Anda menghilangkan ketiganya dan mengelola identitas git sendiri.

131 146 

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


138* `user.name = Claude` dan `user.email = noreply@anthropic.com`, cocok dengan sesi yang di-host Anthropic153* `user.name = Claude` dan `user.email = noreply@anthropic.com`, cocok dengan sesi yang di-host Anthropic

139* Penandatanganan komit dan tag format SSH, dirutekan melalui shim yang dikelola runner yang menandatangani setiap komit melalui layanan penandatanganan Anthropic menggunakan kredensial sesi itu sendiri. Tanda tangan dapat diverifikasi di GitHub terhadap kunci penandatanganan SSH yang dipublikasikan Anthropic.154* Penandatanganan komit dan tag format SSH, dirutekan melalui shim yang dikelola runner yang menandatangani setiap komit melalui layanan penandatanganan Anthropic menggunakan kredensial sesi itu sendiri. Tanda tangan dapat diverifikasi di GitHub terhadap kunci penandatanganan SSH yang dipublikasikan Anthropic.

140* `push.negotiate = true`, jadi git menanyakan host git Anda komit mana yang sudah dimilikinya sebelum mengemas push. Memerlukan Claude Code v2.1.257 atau lebih baru.155* `push.negotiate = true`, jadi git menanyakan host git Anda komit mana yang sudah dimilikinya sebelum mengemas push. Memerlukan Claude Code v2.1.257 atau lebih baru.

141* `core.hooksPath` menunjuk ke direktori hooks yang dikelola runner. Hook `commit-msg` dan `prepare-commit-msg`-nya menambahkan trailer `Co-authored-by:` untuk pembuat sesi ke setiap komit, dibangun dari email dalam [`CCR_SESSION_ACCOUNT_EMAIL`](/docs/id/self-hosted-environments-configuration#wrapper-scripts) dan dihilangkan ketika variabel itu tidak diatur. Jika gambar Anda sudah menetapkan `core.hooksPath`, runner membiarkan pengaturan Anda tetap, melewati instalasi hook ini, dan mencetak peringatan `[runner:git]`.156* `core.hooksPath` menunjuk ke direktori hooks yang dikelola runner. Hook `commit-msg` dan `prepare-commit-msg`-nya menambahkan trailer `Co-authored-by:` untuk pembuat sesi ke setiap commit. Trailer tersebut dibangun dari email dalam [`CCR_SESSION_ACCOUNT_EMAIL`](/docs/id/self-hosted-environments-configuration#wrapper-scripts) dan dihilangkan ketika variabel itu tidak diatur. Jika gambar Anda sudah menetapkan `core.hooksPath` dan runner tidak menggunakan [git yang dikelola Anthropic](#use-the-anthropic-git-proxy), runner mempertahankan pengaturan Anda, melewati instalasi hook ini, dan mencetak peringatan `[runner:git]`.

142 157 

143Penandatanganan komit memerlukan git 2.34 atau lebih baru; runner memeriksa pada startup dan keluar dengan kesalahan jika git Anda lebih lama. Flag ini tidak mengonfigurasi kredensial push, yang masih Anda sediakan dalam gambar.158Penandatanganan komit memerlukan git 2.34 atau lebih baru; runner memeriksa pada startup dan keluar dengan kesalahan jika git Anda lebih lama. Flag ini tidak mengonfigurasi kredensial push, yang masih Anda sediakan dalam gambar.

144 159 

145Pada runner dengan v2.1.280 atau lebih baru, commit yang Anda buat dari lifecycle hook `checkout` atau `post-session` juga ditandatangani sebagai sesi, tanpa trailer `Co-authored-by:`. [Konfigurasi git di dalam lifecycle hook](/docs/id/self-hosted-environments-configuration#git-configuration-inside-lifecycle-hooks) menjelaskan pengaturan git yang ditetapkan runner di dalam hook tersebut.160Pada runner dengan v2.1.280 atau lebih baru, commit yang Anda buat dari lifecycle hook `checkout` atau `post-session` juga ditandatangani sebagai sesi, tanpa trailer `Co-authored-by:`. [Konfigurasi git di dalam lifecycle hook](/docs/id/self-hosted-environments-configuration#git-configuration-inside-lifecycle-hooks) menjelaskan pengaturan git yang ditetapkan runner di dalam hook tersebut.

146 161 

162Dengan atau tanpa `--configure-git`, Claude Code menginstruksikan Claude untuk mengakhiri pesan commit-nya dengan trailer `Claude-Session: <url>` dan deskripsi pull request-nya dengan URL sesi. Untuk menghilangkan keduanya, atur [`attribution.sessionUrl`](/docs/id/settings-reference#attribution-sessionurl) ke `false` di [`~/.claude/settings.json`](/docs/id/self-hosted-environments-configuration#how-each-session’s-config-is-assembled) host runner, lalu mulai ulang runner.

163 

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

148 Kirim konfigurasi git dalam gambar Anda165 Kirim konfigurasi git dalam gambar Anda

149</h3>166</h3>


186 Gunakan proxy git Anthropic203 Gunakan proxy git Anthropic

187</h3>204</h3>

188 205 

189Mulai runner dengan `--use-anthropic-git-proxy`, atau atur `CLAUDE_RUNNER_USE_GIT_PROXY=1`, untuk memilikinya klon melalui proxy git Anthropic, diautentikasi dengan token jangka pendek sesi itu sendiri. Untuk sesi pengguna biasa, proxy menggunakan token OAuth GitHub atau GitHub Enterprise yang disimpan untuk pembuat sesi; untuk sesi bot dan agen, itu menggunakan token instalasi GitHub App organisasi Anda. Bagaimanapun, gambar runner tidak memerlukan kredensial git sama sekali: tidak ada kunci SSH, tidak ada credential helper, tidak ada `.netrc`. Ini adalah jalur auth yang sama yang digunakan lingkungan yang di-host Anthropic.206Dengan proxy git Anthropic, yang juga disebut git yang dikelola Anthropic, gambar runner tidak memerlukan kunci SSH, credential helper, `.netrc`, atau kredensial git lain untuk sesi itu sendiri. Sebagai gantinya, runner meminta Anthropic untuk melayani git bagi sesi-sesinya. Untuk sesi pengguna yang dilayani Anthropic, clone runner serta fetch dan push milik sesi itu sendiri melewati Anthropic, yang menggunakan token OAuth GitHub yang disimpan untuk pembuat sesi. [Bagaimana Anthropic melayani git untuk sebuah sesi](#how-anthropic-serves-git-for-a-session) membahas sesi bot dan agent.

207 

208Proxy git nonaktif kecuali Anda [mengaktifkannya](#turn-the-anthropic-git-proxy-on). Runner yang menjangkau host git Anda dengan kredensialnya sendiri tidak memerlukannya, dan git-nya bekerja dengan host git apa pun.

209 

210Sebagai gantinya, proxy git membatasi apa yang didukung runner dan mengubah apa yang dibutuhkannya:

211 

212* **Hanya github.com**: Anthropic melayani sebuah sesi hanya ketika semua repositorinya berada di github.com, dan proxy git belum mendukung GitHub Enterprise Server. Pada runner dengan proxy git, sesi dengan repositori di host git lain [gagal dimulai](#when-anthropic-doesnt-serve-a-session).

213* **Akun GitHub yang terhubung**: orang yang membuat sesi pengguna harus telah menghubungkan GitHub di claude.ai, atau sesi [tidak dimulai](#creator-has-no-github-connection).

214* **`--capacity 1`**: proxy git memerlukan satu sesi per proses runner, jadi jalankan lebih banyak replika untuk paralelisme. [Aktifkan proxy git Anthropic](#turn-the-anthropic-git-proxy-on) mencantumkan persyaratannya.

215* **Konfigurasi git global yang digantikan**: runner [menghapus dan menggantikan konfigurasi git global](#git-proxy-replaces-global-git-config) milik pengguna yang menjalankannya. Jalankan runner sebagai pengguna khusus atau di dalam kontainer.

216* **Kredensial host untuk push dari host**: push [`--push-outcome-on-release`](/docs/id/self-hosted-environments-reference#runner-cli-flags) milik runner dan push apa pun yang dilakukan [hook `post-session`](/docs/id/self-hosted-environments-configuration#post-session) Anda tetap menggunakan kredensial git milik host runner sendiri dan [jalur jaringannya ke `github.com`](#github-com-egress-with-the-anthropic-git-proxy). Untuk kredensial tersebut, lihat [Kirim konfigurasi git dalam gambar Anda](#ship-git-config-in-your-image).

217* **Keputusan per sesi**: Anthropic memutuskan untuk setiap sesi di runner apakah akan melayani git-nya, dan sesi yang tidak dilayaninya gagal dimulai. [Ketika sesi gagal dimulai pada runner dengan proxy git](#when-anthropic-doesnt-serve-a-session) membahas penyebabnya.

218 

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

220 

221<Warning>

222 Dengan `--use-anthropic-git-proxy` ditetapkan, runner menghapus dan menggantikan konfigurasi git global milik pengguna yang menjalankannya, tanpa menyimpan cadangan. Ini dilakukan saat startup dan sebelum setiap sesi. Login atau credential helper yang Anda simpan di sana akan hilang. Pengaturan yang ditulis [`--configure-git`](#let-the-runner-configure-git) tetap bertahan. Jalankan runner sebagai pengguna khusus atau di dalam kontainer, jangan pernah sebagai pengguna Anda sendiri.

223</Warning>

224 

225Simpan pengaturan git yang tidak rahasia, seperti identitas dan `safe.directory`, di konfigurasi git sistem.

226 

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

228 Aktifkan proxy git Anthropic

229</h4>

230 

231Sebelum Anda memulai runner dengan `--use-anthropic-git-proxy`, pastikan host runner memenuhi setiap persyaratan berikut. Runner menolak untuk dimulai ketika persyaratan kapasitas atau git tidak terpenuhi:

190 232 

191Proxy memerlukan `--capacity 1` karena URL proxy adalah per-sesi, dan git 2.32 atau lebih baru karena git yang lebih lama mengabaikan mekanisme konfigurasi yang digunakan proxy untuk mengisolasi sesi satu sama lain. Runner menolak untuk memulai jika salah satu persyaratan tidak terpenuhi. Karena proxy mengambil dari sisi Anthropic, host git Anda harus dapat dijangkau dari infrastruktur Anthropic, persyaratan yang sama yang dimiliki sesi yang di-host Anthropic; untuk host git yang hanya dapat dirutekan di dalam jaringan Anda, gunakan [`checkout` lifecycle hook](/docs/id/self-hosted-environments-configuration#checkout). Setiap proses runner menangani satu sesi pada satu waktu, jadi jalankan lebih banyak replika untuk paralelisme. Ketika proxy diaktifkan, `--git-host-rewrite` dan `--git-ssh-rewrite` tidak berpengaruh: URL proxy menunjuk ke `api.anthropic.com`, bukan host git Anda.233* **Claude Code v2.1.267 atau lebih baru**: versi sebelumnya menerima flag tetapi tidak melaporkan permintaan agar Anthropic melayani git atau mencetak baris `Registering as opted in`, sehingga Anthropic tidak melayani sesi-sesinya.

234* **`--capacity 1`, nilai default**: setiap proses runner menangani satu sesi pada satu waktu, jadi jalankan lebih banyak replika untuk paralelisme.

235* **Git 2.32 atau lebih baru**: git yang lebih lama mengabaikan konfigurasi git per sesi yang disiapkan runner untuk proxy git.

192 236 

193<Warning>237<Warning>

194 Resep [Kubernetes](#kubernetes) dan [Docker Compose](#docker-compose) di halaman ini menggunakan `--capacity 4`. Jika Anda menambahkan `--use-anthropic-git-proxy` atau `CLAUDE_RUNNER_USE_GIT_PROXY=1` ke salah satunya tanpa mengubah kapasitas menjadi `1`, runner keluar pada startup setiap kali orchestrator Anda memulainya kembali. Atur `--capacity 1` dan jalankan lebih banyak replika untuk paralelisme. [When the runner exits](#when-the-runner-exits) menunjukkan baris yang dicetak runner.238 Resep [Kubernetes](#kubernetes) dan [Docker Compose](#docker-compose) di halaman ini menggunakan `--capacity 4`. Jika Anda menambahkan `--use-anthropic-git-proxy` atau `CLAUDE_RUNNER_USE_GIT_PROXY=1` ke salah satunya tanpa mengubah kapasitas menjadi `1`, runner keluar pada startup setiap kali orchestrator Anda memulainya kembali. Atur `--capacity 1` dan jalankan lebih banyak replika untuk paralelisme. [When the runner exits](#when-the-runner-exits) menunjukkan baris yang dicetak runner.

195</Warning>239</Warning>

196 240 

197Runner juga melaporkan opt-in ke Anthropic ketika mendaftar, mencetak `Registering as opted in to Anthropic-managed git (--use-anthropic-git-proxy)` pada startup. Melaporkan opt-in memerlukan Claude Code v2.1.267 atau lebih baru, dan versi sebelumnya menerima flag tanpa melaporkannya atau mencetak baris itu. Setiap sesi pada runner yang telah opt-in kemudian menggunakan baik git yang dikelola Anthropic atau URL proxy per-sesi. Ketika sesi menggunakan URL proxy per-sesi, runner mencatat satu baris `[runner:warn]` mengatakan demikian.241Untuk mengaktifkan proxy git, tambahkan `--use-anthropic-git-proxy` ke perintah runner, atau atur `CLAUDE_RUNNER_USE_GIT_PROXY=1` di lingkungan runner. Perintah ini, yang dijalankan di shell pada host runner, memulai runner dari [mulai cepat](/docs/id/self-hosted-environments-quickstart#set-up-manually) dengan proxy git aktif:

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 

247Saat startup, runner mencetak `Registering as opted in to Anthropic-managed git (--use-anthropic-git-proxy)`. Anthropic kemudian memutuskan untuk setiap sesi pada runner tersebut apakah akan melayani git-nya. Untuk setiap sesi yang dilayaninya, runner mencatat baris `[runner:session]` yang berisi `governed git ACTIVE`. Jika sebuah sesi justru gagal dimulai, lihat [Ketika sesi gagal dimulai pada runner dengan proxy git](#when-anthropic-doesnt-serve-a-session).

248 

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

250 Bagaimana Anthropic melayani git untuk sebuah sesi

251</h4>

252 

253Untuk sesi yang dilayani Anthropic, clone runner serta fetch dan push milik sesi itu sendiri melewati Anthropic, diautentikasi dengan token jangka pendek milik sesi itu sendiri:

254 

255* **Sesi pengguna**: Anthropic menggunakan token OAuth GitHub yang disimpan untuk pembuat sesi.

256* **Sesi bot dan agent**: Anthropic menggunakan token instalasi GitHub App organisasi Anda.

257* **Penulisan ulang URL**: `--git-host-rewrite` dan `--git-ssh-rewrite` tidak berpengaruh pada repositori yang dilayani proxy git.

258 

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

260 Ketika sesi gagal dimulai pada runner dengan proxy git

261</h4>

262 

263Pada runner yang dimulai dengan `--use-anthropic-git-proxy`, sebuah sesi gagal dimulai ketika Anthropic tidak melayani git-nya. Cari di log runner kesalahan git yang menyebutkan alamat `api.anthropic.com` yang berisi `/git_proxy/`.

264 

265Untuk setiap sesi, runner dengan Claude Code v2.1.267 atau lebih baru juga mencatat baris `[runner:session]` yang berisi `governed git ACTIVE` ketika Anthropic melayani git sesi tersebut, atau satu baris `[runner:warn]` yang berisi `the server withheld Anthropic-managed git for this session` ketika tidak. Temukan baris yang Anda lihat di antara kasus-kasus berikut:

266 

267* **Baik `governed git ACTIVE` maupun baris `withheld` tidak ada**: runner yang lebih lama dari Claude Code v2.1.267 tidak mencatat kedua baris tersebut, dan Anthropic tidak melayani sesi-sesinya. Perbarui runner ke v2.1.267 atau lebih baru dengan mengikuti [Pin the version](#pin-the-version).

268* **Baris `withheld`**: Anthropic tidak melayani sesi tersebut. Runner yang sebelumnya bekerja dengan proxy git dapat gagal dengan cara ini tanpa perubahan apa pun di pihak Anda.

269 * **Sebuah repositori tidak berada di github.com**: sesi dengan satu repositori saja di host git lain, seperti GitHub Enterprise Server, tidak dilayani, termasuk repositori github.com-nya. [Nonaktifkan proxy git Anthropic](#turn-the-anthropic-git-proxy-off) untuk runner di lingkungan tersebut.

270 * **Setiap repositori berada di github.com**: laporkan kegagalan tersebut ke [tim akun Anthropic Anda](#report-an-issue) dengan ID sesi dari baris `withheld`. Anthropic mencatat alasannya di sisinya.

271* **Baris yang berisi `remote: access denied by the git proxy`**: sesi yang dilayani Anthropic masih dapat ditolak, misalnya ketika kebijakan organisasi menolak akses git untuk sesi tersebut, atau sesi tidak diotorisasi untuk repositori. Log runner kemudian menampilkan baris yang berisi `remote: access denied by the git proxy`, dan sisa baris tersebut menjelaskan alasannya.

272* <span id="creator-has-no-github-connection" />**`GitHub authentication required`**: ini muncul ketika pembuat sesi tidak memiliki koneksi GitHub yang berfungsi di claude.ai. Clone sesi gagal, dan kesalahan git berbunyi `GitHub authentication required. Please reconnect your GitHub account.` Minta orang tersebut untuk menghubungkan atau menghubungkan ulang GitHub di pengaturan claude.ai mereka.

273 

274Setelah Anda memperbaiki penyebabnya, mulai lagi sesi-sesi yang gagal.

275 

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

277 Nonaktifkan proxy git Anthropic

278</h4>

279 

280Jika sesi di suatu lingkungan menggunakan repositori di host git selain github.com, seperti GitHub Enterprise Server, nonaktifkan `--use-anthropic-git-proxy` untuk runner di lingkungan tersebut.

281 

282<Steps>

283 <Step title="Hapus flag">

284 Hapus `--use-anthropic-git-proxy` dari perintah runner. Jika Anda mengatur `CLAUDE_RUNNER_USE_GIT_PROXY` di lingkungan runner, seperti pod spec atau file Compose, hapus dari sana. Di shell, batalkan pengaturannya:

285 

286 ```bash theme={null}

287 unset CLAUDE_RUNNER_USE_GIT_PROXY

288 ```

289 </Step>

290 

291 <Step title="Berikan kredensial git ke runner">

292 Sediakan kredensial yang bekerja tanpa prompt untuk setiap host git yang digunakan sesi-sesi runner, termasuk github.com. Kredensial apa pun yang ada di konfigurasi git global pengguna runner sudah hilang, karena runner menghapus konfigurasi tersebut selama `--use-anthropic-git-proxy` ditetapkan. [Kirim kredensial dalam gambar Anda](#ship-git-config-in-your-image) atau gunakan [lifecycle hook `checkout`](/docs/id/self-hosted-environments-configuration#checkout).

293 </Step>

294 

295 <Step title="Buka jalur jaringan">

296 Izinkan runner menjangkau setiap host git yang digunakan sesi-sesi runner pada port 443 atau 22. Lihat baris host git di [Persyaratan jaringan](#network-requirements).

297 </Step>

298 

299 <Step title="Mulai ulang runner">

300 Mulai ulang runner agar terdaftar tanpa proxy git. Kemudian mulai lagi setiap sesi yang gagal.

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 Akses GitHub API tanpa GitHub CLI305 Akses GitHub API tanpa 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 

385Buat Secret pendukung dari file lokal yang memegang nilai yang Anda salin dalam langkah [**Copy environment key**](/docs/id/self-hosted-environments-quickstart#set-up-an-environment-and-runner) UI admin, jadi rahasia tidak pernah muncul dalam riwayat shell Anda. Jalankan `(umask 077 && cat > ./environment-secret)`, tempel rahasia, tekan Enter, kemudian Ctrl-D. Kemudian buat Secret dan hapus file:490Buat Secret pendukung dari file lokal yang memegang nilai yang Anda salin dalam [langkah **Copy environment key**](/docs/id/self-hosted-environments-quickstart#set-up-manually) UI admin, jadi rahasia tidak pernah muncul dalam riwayat shell Anda. Jalankan `(umask 077 && cat > ./environment-secret)`, tempel rahasia, tekan Enter, kemudian Ctrl-D. Kemudian buat Secret dan hapus file:

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 Gunakan kembali checkout yang telah dipanaskan sebelumnya605 Gunakan kembali checkout yang telah dipanaskan sebelumnya

501</h2>606</h2>

502 607 

503Untuk repositori besar, klon dapat mendominasi startup sesi. Pada `--capacity 1` tanpa [`checkout` hook](/docs/id/self-hosted-environments-configuration#checkout), runner menyimpan satu klon kanonik per repositori di `<base-dir>/<repo-owner>/<repo>` dan menggunakannya kembali di seluruh sesi: itu mengambil ref yang diminta, melepaskan `HEAD`, dan reset keras ke sana, yang hampir instan ketika sedikit yang berubah. Untuk melewati klon dingin, sediakan klon dalam salah satu dari dua cara:608Untuk repositori besar, klon dapat mendominasi startup sesi. Untuk melewati klon dingin, sediakan sendiri klon di jalur tempat runner menyimpan klonnya sendiri. Tanpa [`checkout` hook](/docs/id/self-hosted-environments-configuration#checkout), runner menyimpan satu klon kanonik per repositori di `<base-dir>/<repo-owner>/<repo>` dan menggunakannya kembali di seluruh sesi:

609 

610* **Pada `--capacity 1`**: runner mengambil ref yang diminta, melepaskan `HEAD`, dan melakukan reset keras ke sana, yang hampir instan ketika hanya sedikit yang berubah.

611* **Pada `--capacity` di atas satu**: runner mengambil ke dalam klon tersebut, lalu melakukan checkout worktree terpisah darinya untuk setiap sesi. Klon yang telah dipanaskan sebelumnya menghemat unduhan tetapi tidak menghemat checkout.

612 

613Sediakan klon di dalam image atau pada volume persisten:

504 614 

505* **Klon dalam gambar**: bangun klon ke gambar runner Anda di jalur itu. Setiap kontainer segar kemudian dimulai dengan klon hangat tanpa menggunakan kembali disk.615* **Klon dalam gambar**: bangun klon ke gambar runner Anda di jalur itu. Setiap kontainer segar kemudian dimulai dengan klon hangat tanpa menggunakan kembali disk.

506* **Klon pada volume persisten**: pada runner yang Anda pre-lock ke akun satu pengguna dengan [`--lock-to-account`](/docs/id/self-hosted-environments-reference#runner-cli-flags), arahkan `--base-dir` ke volume persisten, jadi disk hanya pernah melayani akun itu. Runner yang pre-locked tidak pernah mengambil sesi saluran Claude Tag, jadi opsi ini tidak berlaku untuk runner yang melayani mereka.616* **Klon pada volume persisten**: pada runner yang Anda pre-lock ke akun satu pengguna dengan [`--lock-to-account`](/docs/id/self-hosted-environments-reference#runner-cli-flags), arahkan `--base-dir` ke volume persisten, jadi disk hanya pernah melayani akun itu. Runner yang pre-locked tidak pernah mengambil sesi saluran Claude Tag, jadi opsi ini tidak berlaku untuk runner yang melayani mereka.


508Apa jalur penggunaan kembali lakukan dan tidak jamin:618Apa jalur penggunaan kembali lakukan dan tidak jamin:

509 619 

510* **Bentuk klon apa pun bekerja**: klon penuh, shallow, atau single-branch di jalur digunakan apa adanya. Runner tidak pernah melewatkan `--depth` ketika mengambil ke klon yang ada, jadi pre-warm penuh menyimpan riwayat penuhnya dan yang shallow tetap shallow. `CLAUDE_RUNNER_FETCH_DEPTH` (`full`, `0`, atau angka; default 50) mengontrol hanya klon dingin yang dibuat runner ketika tidak ada klon yang ada.620* **Bentuk klon apa pun bekerja**: klon penuh, shallow, atau single-branch di jalur digunakan apa adanya. Runner tidak pernah melewatkan `--depth` ketika mengambil ke klon yang ada, jadi pre-warm penuh menyimpan riwayat penuhnya dan yang shallow tetap shallow. `CLAUDE_RUNNER_FETCH_DEPTH` (`full`, `0`, atau angka; default 50) mengontrol hanya klon dingin yang dibuat runner ketika tidak ada klon yang ada.

511* **Perubahan terlacak reset, file tidak terlacak bertahan**: setiap sesi dimulai dari reset keras yang menghapus modifikasi sesi sebelumnya, tetapi runner tidak pernah menjalankan `git clean`, jadi file tidak terlacak dari sesi sebelumnya pemilik terkunci tetap di pohon.621* **Perubahan terlacak di-reset, file tidak terlacak bertahan**: pada `--capacity 1`, setiap sesi dimulai dari reset keras yang menghapus modifikasi terlacak dari sesi sebelumnya, tetapi runner tidak pernah menjalankan `git clean`, sehingga file tidak terlacak dari sesi-sesi sebelumnya milik pemilik terkunci tetap ada di pohon.

512* **Direktori per-sesi juga bertahan**: di samping checkout, runner membuat entri per-sesi di bawah `<base-dir>/_sessions/` untuk setiap sesi yang dijalankannya. Direktori konfigurasi Claude sesi menyimpan salinan lokal transkrip percakapan. Di sebelahnya duduk file yang diunggah sesi, ketika sesi memiliki apa pun. Direktori sesi duduk di sana juga: itu menyimpan worktree per-sesi apa pun dan checkout hook `checkout` sementara sesi berjalan, dan itu menyimpan apa pun yang Claude tulis di dalamnya.622* **Direktori per-sesi juga bertahan**: di samping checkout, runner membuat entri per-sesi di bawah `<base-dir>/_sessions/` untuk setiap sesi yang dijalankannya. Direktori konfigurasi Claude sesi menyimpan salinan lokal transkrip percakapan. Di sebelahnya duduk file yang diunggah sesi, ketika sesi memiliki apa pun. Direktori sesi duduk di sana juga: itu menyimpan worktree per-sesi apa pun dan checkout hook `checkout` sementara sesi berjalan, dan itu menyimpan apa pun yang Claude tulis di dalamnya.

513 623 

514 Secara default runner meninggalkan ini di tempat ketika sesi berakhir, jadi pada disk yang melampaui proses runner mereka menumpuk. Setiap sesi berjalan sebagai pengguna runner sendiri, jadi sesi kemudian apa pun yang disk layani dapat membacanya. Jika Anda menyimpan `--base-dir` persisten, ukuran volume untuk pertumbuhan itu. Hal yang sama berlaku untuk setup apa pun yang memulai ulang runner pada filesystem yang sama, termasuk resep [Docker Compose](#docker-compose).624 Secara default runner meninggalkan ini di tempat ketika sesi berakhir, jadi pada disk yang melampaui proses runner mereka menumpuk. Setiap sesi berjalan sebagai pengguna runner sendiri, jadi sesi kemudian apa pun yang disk layani dapat membacanya. Jika Anda menyimpan `--base-dir` persisten, ukuran volume untuk pertumbuhan itu. Hal yang sama berlaku untuk setup apa pun yang memulai ulang runner pada filesystem yang sama, termasuk resep [Docker Compose](#docker-compose).


522 632 

523Proses Claude Code anak setiap sesi menjalankan biner runner itu sendiri, dan runner mematikan auto-update di dalam sesi yang dihasilkannya, jadi setiap sesi menjalankan versi yang Anda instal di host atau bangun ke gambar. Update tingkat host berlaku waktu berikutnya runner dimulai.633Proses Claude Code anak setiap sesi menjalankan biner runner itu sendiri, dan runner mematikan auto-update di dalam sesi yang dihasilkannya, jadi setiap sesi menjalankan versi yang Anda instal di host atau bangun ke gambar. Update tingkat host berlaku waktu berikutnya runner dimulai.

524 634 

525Model yang digunakan sesi Anda dapat memerlukan versi Claude Code yang lebih baru daripada yang mereka jalankan. Server kemudian menolak permintaan untuk model tersebut dengan [Claude Code does not support this model](/docs/id/errors#claude-code-does-not-support-this-model). Sebelum Anda menyematkan versi, periksa [versi Claude Code yang diperlukan model](/docs/id/model-config#available-models) untuk setiap model yang digunakan sesi Anda.635Pilih versi yang dijalankan sesi Anda dan kapan versi tersebut berubah:

526 636 

637* **Sebelum Anda menyematkan versi**: periksa [versi Claude Code yang diperlukan model](/docs/id/model-config#available-models) untuk setiap model yang digunakan sesi Anda. Jika suatu model memerlukan versi yang lebih baru daripada yang dijalankan sesi Anda, server menolak permintaan untuk model tersebut dengan [Claude Code does not support this model](/docs/id/errors#claude-code-does-not-support-this-model).

527* **Untuk menyimpan armada pada satu versi**: bangun gambar dengan versi yang disematkan, atau pada host telanjang instal versi spesifik dan [nonaktifkan auto-update](/docs/id/setup#disable-auto-updates)638* **Untuk menyimpan armada pada satu versi**: bangun gambar dengan versi yang disematkan, atau pada host telanjang instal versi spesifik dan [nonaktifkan auto-update](/docs/id/setup#disable-auto-updates)

528* **Untuk upgrade**: instal versi yang lebih baru atau bangun ulang gambar, kemudian mulai ulang runner639* **Untuk upgrade armada tetap**: baca entri [changelog](/docs/en/changelog) antara versi Anda dan versi yang akan Anda instal, kemudian instal versi yang lebih baru atau build ulang gambar dan mulai ulang runner

640* **Untuk upgrade runner sesuai permintaan**: baca entri [changelog](/docs/en/changelog) antara versi Anda dan versi yang akan Anda instal, kemudian ubah gambar yang dimulai oleh [hook `spawn-runner`](/docs/id/self-hosted-environments-configuration#the-spawn-runner-hook) Anda. Setiap runner baru mendapatkan versi baru. Runner yang sudah berjalan, termasuk runner siaga yang dimulai oleh [`--min-idle`](/docs/id/self-hosted-environments-reference#orchestrator-cli-flags), mempertahankan versinya hingga keluar. Jangan mulai ulang runner tersebut, karena perintah kerjanya hanya sekali pakai.

529* **Plugin**: marketplace plugin tidak auto-update juga; atur `FORCE_AUTOUPDATE_PLUGINS=1` dalam lingkungan runner untuk membiarkan plugin auto-update sementara biner tetap disematkan641* **Plugin**: marketplace plugin tidak auto-update juga; atur `FORCE_AUTOUPDATE_PLUGINS=1` dalam lingkungan runner untuk membiarkan plugin auto-update sementara biner tetap disematkan

530 642 

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


580</h3>692</h3>

581 693 

582* **Sesi yang dilanjutkan kehilangan pekerjaan yang belum di-push**: runner segar mengklon repositori lagi dari branch awalnya, jadi pekerjaan yang belum di-push oleh sesi hilang.694* **Sesi yang dilanjutkan kehilangan pekerjaan yang belum di-push**: runner segar mengklon repositori lagi dari branch awalnya, jadi pekerjaan yang belum di-push oleh sesi hilang.

583 * **Untuk mempertahankan pekerjaan yang sudah di-commit**: atur [`--push-outcome-on-release`](/docs/id/self-hosted-environments-reference#runner-cli-flags). Runner kemudian melakukan push best-effort atas branch hasil sesi sebelum melepaskannya, dan sesi yang dilanjutkan dimulai dari commit tersebut. Perubahan yang belum di-commit tetap hilang.695 * **Untuk mempertahankan pekerjaan yang sudah di-commit**: atur [`--push-outcome-on-release`](/docs/id/self-hosted-environments-reference#runner-cli-flags) pada setiap runner di lingkungan tersebut, karena runner tanpa flag ini melanjutkan sesi dari branch awalnya. Runner dengan flag ini melakukan push best-effort atas branch hasil sesi sebelum melepaskannya, dan sesi yang dilanjutkan dimulai dari commit tersebut. Push tersebut menggunakan kredensial git milik host runner sendiri, termasuk pada runner yang menggunakan [git yang dikelola Anthropic](#use-the-anthropic-git-proxy). Perubahan yang belum di-commit tetap hilang.

696 * **Dengan hook `checkout`**: repositori yang di-checkout melalui [hook siklus hidup `checkout`](/docs/id/self-hosted-environments-configuration#checkout) tidak di-push. Buat snapshot repositori tersebut dari [hook `post-session`](/docs/id/self-hosted-environments-configuration#post-session) sebagai gantinya.

584 * **Sebelum mengaktifkan flag ini**: batasi siapa yang dapat melakukan push ke ref `claude/*` pada remote sumber. Saat dilanjutkan, runner mengambil branch yang sebelumnya di-push tanpa memverifikasi siapa yang melakukan push-nya.697 * **Sebelum mengaktifkan flag ini**: batasi siapa yang dapat melakukan push ke ref `claude/*` pada remote sumber. Saat dilanjutkan, runner mengambil branch yang sebelumnya di-push tanpa memverifikasi siapa yang melakukan push-nya.

585* **Repositori yang ditambahkan di tengah sesi dapat gagal diklon**: Claude mengklonnya dengan `git clone` melalui HTTPS. Pada runner tanpa [`--use-anthropic-git-proxy`](#use-the-anthropic-git-proxy), klon gagal dengan kesalahan autentikasi git jika tidak ada apa pun di host yang dapat membaca repositori tersebut. Jika memungkinkan, pilih setiap repositori yang dibutuhkan sesi ketika Anda membuatnya.698* **Repositori yang ditambahkan di tengah sesi dapat gagal diklon**: Claude mengklonnya dengan `git clone` melalui HTTPS. Pada runner tanpa [`--use-anthropic-git-proxy`](#use-the-anthropic-git-proxy), klon gagal dengan kesalahan autentikasi git jika tidak ada apa pun di host yang dapat membaca repositori tersebut. Jika memungkinkan, pilih setiap repositori yang dibutuhkan sesi ketika Anda membuatnya.

586* **Beberapa konektor tidak muncul dalam sesi yang di-host sendiri**: konektor yang belum Anda hubungkan dalam pengaturan claude.ai tidak terdaftar dalam sesi yang di-host sendiri, dan sesi tidak akan meminta Anda untuk menghubungkannya. Hubungkan dalam Pengaturan terlebih dahulu, kemudian mulai sesi segar. Menambahkan konektor ke sesi yang sudah berjalan juga tidak membuat alat-alatnya tersedia untuk Claude; mulai sesi segar untuk mengambil konektor yang baru ditambahkan.699* **Beberapa konektor tidak muncul dalam sesi yang di-host sendiri**: konektor yang belum Anda hubungkan dalam pengaturan claude.ai tidak terdaftar dalam sesi yang di-host sendiri, dan sesi tidak akan meminta Anda untuk menghubungkannya. Hubungkan dalam Pengaturan terlebih dahulu, kemudian mulai sesi segar. Menambahkan konektor ke sesi yang sudah berjalan juga tidak membuat alat-alatnya tersedia untuk Claude; mulai sesi segar untuk mengambil konektor yang baru ditambahkan.


606* **Runner tidak muncul di lingkungan**: konfirmasi bahwa host dapat menjangkau `api.anthropic.com` melalui HTTPS, rahasia lingkungan saat ini, dan jam host berada dalam lima menit dari waktu nyata; skew yang lebih besar menyebabkan autentikasi gagal. Log runner `[runner:fatal]` dengan alasan penolakan pada kegagalan auth.719* **Runner tidak muncul di lingkungan**: konfirmasi bahwa host dapat menjangkau `api.anthropic.com` melalui HTTPS, rahasia lingkungan saat ini, dan jam host berada dalam lima menit dari waktu nyata; skew yang lebih besar menyebabkan autentikasi gagal. Log runner `[runner:fatal]` dengan alasan penolakan pada kegagalan auth.

607* **Runner keluar saat startup dengan `cannot create or write to base directory`**: runner tidak dapat membuat atau menulis ke `--base-dir`, yang secara default adalah `/workspace`. Perbaiki kepemilikan direktori atau arahkan `--base-dir` ke jalur yang dapat ditulis, seperti dijelaskan dalam [Keep the base directory and capacity identical across runners](#keep-the-base-directory-and-capacity-identical-across-runners). Jika runner malah mencatat `[runner:fatal]` mengatakan pemeriksaan direktori dasar habis waktu, direktori berada pada mount NFS atau CSI yang tergantung. Periksa kesehatan mount daripada izin. Runner mencetak kedua kegagalan startup ini ke stderr sebelum membuka `--log-file`, jadi cari di terminal atau log kontainer platform Anda daripada file log. Sebelum v2.1.225, runner tidak memeriksa direktori dasar saat startup, dan misconfiguration ini gagal sesi setelah pickup sebagai gantinya.720* **Runner keluar saat startup dengan `cannot create or write to base directory`**: runner tidak dapat membuat atau menulis ke `--base-dir`, yang secara default adalah `/workspace`. Perbaiki kepemilikan direktori atau arahkan `--base-dir` ke jalur yang dapat ditulis, seperti dijelaskan dalam [Keep the base directory and capacity identical across runners](#keep-the-base-directory-and-capacity-identical-across-runners). Jika runner malah mencatat `[runner:fatal]` mengatakan pemeriksaan direktori dasar habis waktu, direktori berada pada mount NFS atau CSI yang tergantung. Periksa kesehatan mount daripada izin. Runner mencetak kedua kegagalan startup ini ke stderr sebelum membuka `--log-file`, jadi cari di terminal atau log kontainer platform Anda daripada file log. Sebelum v2.1.225, runner tidak memeriksa direktori dasar saat startup, dan misconfiguration ini gagal sesi setelah pickup sebagai gantinya.

608* **Sesi tetap antri**: setiap runner online dapat dikunci ke pemilik yang berbeda. Periksa `claude_code_self_hosted_runner_locked_account` [metrik](/docs/id/self-hosted-environments-reference#prometheus-metrics) setiap runner atau bidang `locked_account` dari baris log `[runner:health]`-nya untuk melihat siapa yang memegangnya. Keduanya menunjukkan email pemilik hanya setelah runner telah dikeluarkan token sesi yang membawa klaim `act.email`, yang sesi agen Claude Tag tidak pernah lakukan. Tanpa klaim, runner tidak memancarkan seri `locked_account` dan mencatat `locked_account=yes`, yang memberi tahu Anda bahwa runner terkunci tetapi tidak ke pemilik mana. Tambahkan replika, atau tunggu runner yang ada untuk mengalirkan dan memulai ulang. Jika lingkungan menggunakan runner on-demand, periksa orchestrator sebagai gantinya; lihat [On-demand runners](/docs/id/self-hosted-environments-configuration#on-demand-runners).721* **Sesi tetap antri**: setiap runner online dapat dikunci ke pemilik yang berbeda. Periksa `claude_code_self_hosted_runner_locked_account` [metrik](/docs/id/self-hosted-environments-reference#prometheus-metrics) setiap runner atau bidang `locked_account` dari baris log `[runner:health]`-nya untuk melihat siapa yang memegangnya. Keduanya menunjukkan email pemilik hanya setelah runner telah dikeluarkan token sesi yang membawa klaim `act.email`, yang sesi agen Claude Tag tidak pernah lakukan. Tanpa klaim, runner tidak memancarkan seri `locked_account` dan mencatat `locked_account=yes`, yang memberi tahu Anda bahwa runner terkunci tetapi tidak ke pemilik mana. Tambahkan replika, atau tunggu runner yang ada untuk mengalirkan dan memulai ulang. Jika lingkungan menggunakan runner on-demand, periksa orchestrator sebagai gantinya; lihat [On-demand runners](/docs/id/self-hosted-environments-configuration#on-demand-runners).

609* **Sesi gagal segera setelah pickup**: buka sesi di claude.ai/code untuk melihat kesalahan. Penyebab paling umum adalah [kredensial git](#configure-git) yang hilang dalam gambar runner dan alat build yang tidak diinstal. Direktori dasar yang tidak dapat ditulis menghentikan runner saat startup daripada gagal sesi. Lihat entri **Runner keluar saat startup dengan `cannot create or write to base directory`** dalam daftar ini.722* **Sesi gagal segera setelah pickup**: buka sesi di claude.ai/code untuk melihat kesalahan. Penyebab paling umum adalah [kredensial git](#configure-git) yang hilang dalam gambar runner dan alat build yang tidak diinstal. Pada runner yang dimulai dengan `--use-anthropic-git-proxy`, lihat [When sessions fail to start on a runner with the git proxy](#when-anthropic-doesnt-serve-a-session). Direktori dasar yang tidak dapat ditulis menghentikan runner saat startup daripada gagal sesi. Lihat entri **Runner keluar saat startup dengan `cannot create or write to base directory`** dalam daftar ini.

723* **Sesi gagal dimulai pada runner yang mengatur `--use-anthropic-git-proxy`**: cari di log runner `access denied by the git proxy`, atau kesalahan git yang menyebutkan alamat `api.anthropic.com` yang berisi `/git_proxy/`. Untuk mengetahui apakah Anthropic melayani sesi tersebut dan memperbaiki penyebabnya, lihat [When sessions fail to start on a runner with the git proxy](#when-anthropic-doesnt-serve-a-session).

610* **Sesi tidak dapat menjangkau jaringan melalui proxy egress yang mengautentikasi**: ketika sumber yang Anda atur dengan [`--proxy-authorization-command` atau `--proxy-authorization-file`](#authenticate-to-an-egress-proxy) gagal, habis waktu setelah 30 detik, atau menghasilkan nilai kosong, runner menjawab koneksi itu `502 Bad Gateway` dan mencatat alasannya. Runner menyunting stderr perintah dalam log itu dan tidak pernah mencatat nilai header. Dengan `--proxy-authorization-command`, jalankan perintah sendiri pada host untuk mengonfirmasi bahwa itu mencetak seluruh nilai header pada stdout. Jika runner malah keluar saat startup dengan `could not start the proxy-authorization listener`, itu tidak dapat membuka pendengar loopback-nya.724* **Sesi tidak dapat menjangkau jaringan melalui proxy egress yang mengautentikasi**: ketika sumber yang Anda atur dengan [`--proxy-authorization-command` atau `--proxy-authorization-file`](#authenticate-to-an-egress-proxy) gagal, habis waktu setelah 30 detik, atau menghasilkan nilai kosong, runner menjawab koneksi itu `502 Bad Gateway` dan mencatat alasannya. Runner menyunting stderr perintah dalam log itu dan tidak pernah mencatat nilai header. Dengan `--proxy-authorization-command`, jalankan perintah sendiri pada host untuk mengonfirmasi bahwa itu mencetak seluruh nilai header pada stdout. Jika runner malah keluar saat startup dengan `could not start the proxy-authorization listener`, itu tidak dapat membuka pendengar loopback-nya.

611* **Runner mencatat baris `Poll failed` yang berisi `rejecting the malformed poll response`**: runner menerima respons work-poll yang badan-nya bukan JSON yang diharapkan antrian, paling sering karena sesuatu antara runner dan `api.anthropic.com`, seperti proxy intersepsi atau portal captive, menjawab dengan halaman sendiri. Runner menolak respons, menghitung di bawah jenis `transport` dari [metrik](/docs/id/self-hosted-environments-reference#prometheus-metrics) `claude_code_self_hosted_runner_poll_errors_total`, dan mencoba ulang pada jadwal poll-gagal yang dijelaskan dalam [Session lifecycle](/docs/id/self-hosted-environments#session-lifecycle). Runner terus melayani sesi live-nya. Konfigurasikan proxy untuk melewatkan respons dari `api.anthropic.com` tanpa perubahan. Sebelum v2.1.246, runner membaca respons seperti itu sebagai antrian kerja kosong, yang dapat mengakhiri sesi live-nya atau membuatnya keluar.725* **Runner mencatat baris `Poll failed` yang berisi `rejecting the malformed poll response`**: runner menerima respons work-poll yang badan-nya bukan JSON yang diharapkan antrian, paling sering karena sesuatu antara runner dan `api.anthropic.com`, seperti proxy intersepsi atau portal captive, menjawab dengan halaman sendiri. Runner menolak respons, menghitung di bawah jenis `transport` dari [metrik](/docs/id/self-hosted-environments-reference#prometheus-metrics) `claude_code_self_hosted_runner_poll_errors_total`, dan mencoba ulang pada jadwal poll-gagal yang dijelaskan dalam [Session lifecycle](/docs/id/self-hosted-environments#session-lifecycle). Runner terus melayani sesi live-nya. Konfigurasikan proxy untuk melewatkan respons dari `api.anthropic.com` tanpa perubahan. Sebelum v2.1.246, runner membaca respons seperti itu sebagai antrian kerja kosong, yang dapat mengakhiri sesi live-nya atau membuatnya keluar.

612* **Cabang sesi tidak lagi ada di remote**: untuk sumber git yang hanya dibaca sesi, runner melewati sumber itu dan melanjutkan pada sumber yang tersisa. Untuk sumber yang sesi dorong hasil ke, cabang yang dihapus, biasanya karena digabungkan dan dihapus otomatis, gagal sesi dengan kesalahan yang menamai repositori dan cabang dan meminta Anda untuk mengembalikan cabang dan mencoba ulang. Runner gagal sesi dengan kesalahan yang sama ketika melewati akan meninggalkannya tanpa repositori sama sekali. Sebelum v2.1.228, sesi seperti itu dimulai di direktori kosong.726* **Cabang sesi tidak lagi ada di remote**: untuk sumber git yang hanya dibaca sesi, runner melewati sumber itu dan melanjutkan pada sumber yang tersisa. Untuk sumber yang sesi dorong hasil ke, cabang yang dihapus, biasanya karena digabungkan dan dihapus otomatis, gagal sesi dengan kesalahan yang menamai repositori dan cabang dan meminta Anda untuk mengembalikan cabang dan mencoba ulang. Runner gagal sesi dengan kesalahan yang sama ketika melewati akan meninggalkannya tanpa repositori sama sekali. Sebelum v2.1.228, sesi seperti itu dimulai di direktori kosong.


616 730 

617 Pemeriksaan akses berjalan lagi setiap kali sesi dimulai pada runner, jadi setelah identitas git runner memiliki akses baca, awal berikutnya mengklona repositori. Sebelum v2.1.274, masing-masing penolakan ini gagal memulai sesi.731 Pemeriksaan akses berjalan lagi setiap kali sesi dimulai pada runner, jadi setelah identitas git runner memiliki akses baca, awal berikutnya mengklona repositori. Sebelum v2.1.274, masing-masing penolakan ini gagal memulai sesi.

618* **Sesi membutuhkan waktu berapa menit untuk dimulai**: klon awal biasanya mendominasi. Tonton [metrik](/docs/id/self-hosted-environments-reference#prometheus-metrics) `claude_code_self_hosted_runner_session_init_duration_seconds` untuk mengonfirmasi, dan potong klon dengan [pre-warmed checkout](#reuse-a-pre-warmed-checkout) atau `CLAUDE_RUNNER_FETCH_DEPTH` yang lebih kecil.732* **Sesi membutuhkan waktu berapa menit untuk dimulai**: klon awal biasanya mendominasi. Tonton [metrik](/docs/id/self-hosted-environments-reference#prometheus-metrics) `claude_code_self_hosted_runner_session_init_duration_seconds` untuk mengonfirmasi, dan potong klon dengan [pre-warmed checkout](#reuse-a-pre-warmed-checkout) atau `CLAUDE_RUNNER_FETCH_DEPTH` yang lebih kecil.

619* **Turns gagal dengan 401**: setiap sesi mengautentikasi panggilan model dengan [`CLAUDE_CODE_OAUTH_TOKEN`](/docs/id/self-hosted-environments-configuration#wrapper-scripts) jangka pendek yang runner ambil dari Anthropic dan putar di atas stdin sesi. Ketika turn berakhir dengan 401 atau 403 dari API model, runner mengambil token segar dan meneruskannya ke sesi. Turn yang gagal tidak dicoba ulang.733* **Giliran gagal dengan 401**: ketika giliran berakhir dengan 401 atau 403 dari API Anthropic, runner mengambil [`CLAUDE_CODE_OAUTH_TOKEN`](/docs/id/self-hosted-environments-configuration#wrapper-scripts) segar dari Anthropic dan meneruskannya ke sesi. Giliran yang gagal tidak dicoba ulang. Token ini berumur pendek, dan runner merotasinya melalui stdin sesi.

620 734 

621 Ketika pengambilan gagal, runner mencatat baris `inference_token refresh failed` yang mengatakan kapan itu akan mencoba ulang, dan itu terus mencoba ulang selama sesi berjalan.735 Ketika pengambilan gagal, runner mencatat baris `inference_token refresh failed` yang mengatakan kapan itu akan mencoba ulang, dan itu terus mencoba ulang selama sesi berjalan.

622 736 


637 751 

638* **Keluar normal**: runner menyelesaikan sesi-sesinya dan mengalirkan, mencapai waktu pensiun-nya, atau diperintahkan untuk berhenti. Mulai ulang sehingga lingkungan memiliki kapasitas lagi. [Runner lifecycle](/docs/id/self-hosted-environments#runner-lifecycle) menjelaskan keluar ini.752* **Keluar normal**: runner menyelesaikan sesi-sesinya dan mengalirkan, mencapai waktu pensiun-nya, atau diperintahkan untuk berhenti. Mulai ulang sehingga lingkungan memiliki kapasitas lagi. [Runner lifecycle](/docs/id/self-hosted-environments#runner-lifecycle) menjelaskan keluar ini.

639* **Awal yang gagal**: runner tidak dapat dimulai dengan konfigurasi atau host yang diberikan, jadi itu keluar dalam hitungan detik setelah dimulai, dan itu keluar dengan cara yang sama setiap kali Anda memulainya ulang. Memulai ulang lebih cepat tidak membantu. Seseorang perlu membaca output-nya dan memperbaiki penyebabnya.753* **Awal yang gagal**: runner tidak dapat dimulai dengan konfigurasi atau host yang diberikan, jadi itu keluar dalam hitungan detik setelah dimulai, dan itu keluar dengan cara yang sama setiap kali Anda memulainya ulang. Memulai ulang lebih cepat tidak membantu. Seseorang perlu membaca output-nya dan memperbaiki penyebabnya.

754* **Kehilangan kontak**: runner yang tidak dapat menjangkau Anthropic lebih lama dari [lease](/docs/id/self-hosted-environments#session-lifecycle)-nya, misalnya saat host-nya dalam mode sleep, dapat dihapus dari lingkungan. Ketika runner yang dihapus terhubung kembali, runner tersebut keluar. Log-nya dapat menampilkan baris `[runner:fatal]` yang berisi `runner record gone server-side` atau, setelah gangguan yang lebih lama, [`poll auth failed`](/docs/id/self-hosted-environments-quickstart#set-up-an-environment-and-runner). Runner tidak mendaftar ulang dengan sendirinya, jadi mulai ulang runner tersebut.

640 755 

641Konfigurasikan supervisor Anda untuk memulai ulang runner kapan pun itu keluar, untuk menunggu lebih lama antara restart ketika runner terus keluar tepat setelah dimulai, dan untuk memberitahu seseorang ketika itu terus terjadi.756Konfigurasikan supervisor Anda untuk memulai ulang runner kapan pun itu keluar, untuk menunggu lebih lama antara restart ketika runner terus keluar tepat setelah dimulai, dan untuk memberitahu seseorang ketika itu terus terjadi.

642 757 

Details

195 195 

196Wrapper menerima jalur absolut ke binary runner sendiri di `CLAUDE_RUNNER_CLAUDE_BIN`; gunakan jalur itu daripada `claude` yang diselesaikan PATH sehingga decode berjalan pada binary yang sama yang digunakan runner sendiri.196Wrapper menerima jalur absolut ke binary runner sendiri di `CLAUDE_RUNNER_CLAUDE_BIN`; gunakan jalur itu daripada `claude` yang diselesaikan PATH sehingga decode berjalan pada binary yang sama yang digunakan runner sendiri.

197 197 

198Gunakan `jq -re` daripada `jq -r` sehingga klaim yang hilang menyebabkan exit bukan nol. Dengan `-r` saja, klaim yang hilang mencetak string literal `null` dan keluar nol, yang secara diam-diam melewatkan nilai buruk ke hilir. Teruskan `--no-verify` ke `decode-token` hanya untuk inspeksi offline di mana endpoint JWKS tidak dapat dijangkau.198Gunakan `jq -re` daripada `jq -r` sehingga klaim yang hilang menyebabkan exit bukan nol. Dengan `-r` saja, klaim yang hilang mencetak string literal `null` dan keluar nol, yang secara diam-diam melewatkan nilai buruk ke hilir.

199 

200Jika `decode-token` tidak dapat mengambil kunci dari endpoint JWKS atau tidak dapat memverifikasi token, perintah tersebut mencetak alasannya ke stderr, tidak mencetak klaim apa pun, dan keluar dengan kode 1. Teruskan `--no-verify` ke `decode-token` hanya untuk inspeksi offline di mana endpoint JWKS tidak dapat dijangkau.

199 201 

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

201 Referensi klaim203 Referensi klaim

Details

34Host runner memerlukan:34Host runner memerlukan:

35 35 

36* Host atau kontainer Linux atau macOS dengan HTTPS keluar ke `api.anthropic.com`, ke `claude.ai` dan host unduhan yang dialihkan untuk langkah instalasi di bawah, dan ke host git Anda untuk klon; [tabel persyaratan jaringan](/docs/id/self-hosted-environments-deploy#network-requirements) memiliki daftar lengkap. Windows tidak didukung sebagai host runner; jalankan runner dalam kontainer Linux sebagai gantinya. Workstation pengembang tidak terpengaruh, karena sesi dimulai dari claude.ai di browser.36* Host atau kontainer Linux atau macOS dengan HTTPS keluar ke `api.anthropic.com`, ke `claude.ai` dan host unduhan yang dialihkan untuk langkah instalasi di bawah, dan ke host git Anda untuk klon; [tabel persyaratan jaringan](/docs/id/self-hosted-environments-deploy#network-requirements) memiliki daftar lengkap. Windows tidak didukung sebagai host runner; jalankan runner dalam kontainer Linux sebagai gantinya. Workstation pengembang tidak terpengaruh, karena sesi dimulai dari claude.ai di browser.

37* Sebuah repositori untuk sesi uji: repositori publik, atau repositori yang sudah dapat diklon oleh host ini melalui URL HTTPS-nya tanpa diminta kredensial.

37* Jam yang disinkronkan dengan waktu nyata, misalnya dengan NTP. Autentikasi gagal ketika jam lebih dari lima menit mati; lihat [Troubleshooting](/docs/id/self-hosted-environments-deploy#troubleshooting).38* Jam yang disinkronkan dengan waktu nyata, misalnya dengan NTP. Autentikasi gagal ketika jam lebih dari lima menit mati; lihat [Troubleshooting](/docs/id/self-hosted-environments-deploy#troubleshooting).

38 39 

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


57 Siapkan lingkungan dan runner58 Siapkan lingkungan dan runner

58</h2>59</h2>

59 60 

60Claude Code mencakup pengaturan terpandu: sesi Claude Code interaktif yang memandu Anda melalui pembuatan lingkungan di UI admin, memulai runner lokal dengan file rahasia yang Anda simpan, mengonfirmasi bahwa runner terdaftar, dan menulis lembar contekan ke `./runner-setup/CHEAT-SHEET.md`. Jalankan pada mesin di mana Anda telah masuk dengan `claude auth login` menggunakan akun yang memiliki peran Pemilik; tidak tersedia dengan kunci API atau penyedia model pihak ketiga. Pada host di mana sesi interaktif tidak mungkin, gunakan langkah manual di bawah sebagai gantinya. Konfirmasi [pemeriksaan versi](#software-on-the-runner-host) lulus terlebih dahulu: pada versi yang lebih lama dari 2.1.224, perintah ini memulai sesi Claude biasa dengan kata-kata sebagai prompt alih-alih pengaturan terpandu. Untuk memulai pengaturan terpandu, jalankan subperintah setup dan ikuti prompt:61Gunakan [pengaturan terpandu](#run-the-guided-setup) atau [langkah manual](#set-up-manually). Pengaturan terpandu adalah satu perintah yang memulai sesi Claude Code interaktif dan memandu Anda melalui sisanya. Gunakan langkah manual sebagai gantinya pada host di mana sesi interaktif tidak mungkin. Gunakan juga langkah manual ketika seseorang yang memiliki peran Owner telah membuat lingkungan dan menyerahkan rahasianya kepada Anda, karena pengaturan terpandu memerlukan masuk sebagai Owner.

62 

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

64 Jalankan pengaturan terpandu

65</h3>

66 

67Pengaturan terpandu memandu Anda melalui pembuatan lingkungan di UI admin, memulai runner lokal dengan file rahasia yang Anda simpan, mengonfirmasi bahwa runner terdaftar, dan menulis lembar contekan ke `./runner-setup/CHEAT-SHEET.md`. Sebelum menjalankannya, konfirmasikan status masuk dan versi Anda:

68 

69* **Masuk**: jalankan pada mesin di mana Anda telah masuk dengan `claude auth login` menggunakan akun yang memiliki peran Owner. Dengan hanya kunci API atau penyedia model pihak ketiga, sesi dimulai tetapi pemeriksaan organisasinya gagal.

70* **Versi**: konfirmasikan bahwa [pemeriksaan versi](#software-on-the-runner-host) lulus. Pada versi yang lebih lama dari 2.1.224, perintah setup memulai sesi Claude dengan kata-kata tersebut sebagai prompt alih-alih pengaturan terpandu.

71 

72Untuk memulai pengaturan terpandu, jalankan subperintah setup di shell Anda dan ikuti petunjuknya:

61 73 

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

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

64```76```

65 77 

66Untuk menyiapkan secara manual sebagai gantinya:78Pengaturan tidak memulai sesi uji dengan sendirinya: pengaturan memberi tahu Anda untuk memulainya di claude.ai/code. Langkah terakhir pengaturan menghentikan runner yang dimulainya. Jika Anda meninggalkan pengaturan sebelum langkah tersebut, runner tetap berjalan. Untuk melanjutkan setelah langkah terakhir, mulai runner lagi di shell Anda dengan perintah di `./runner-setup/CHEAT-SHEET.md`, kemudian [arahkan sesi ke lingkungan](#route-a-session).

79 

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

81 Siapkan secara manual

82</h3>

83 

84Buat lingkungan di claude.ai, mulai runner dari terminal di host, kemudian kembali ke claude.ai untuk mengonfirmasi bahwa runner muncul dan arahkan sesi ke sana. Jika seseorang yang memiliki peran Owner sudah membuat lingkungan dan menyerahkan rahasianya kepada Anda, mulailah dari langkah 2.

67 85 

68<Steps>86<Steps>

69 <Step title="Buat lingkungan">87 <Step title="Buat lingkungan">


73 </Step>91 </Step>

74 92 

75 <Step title="Mulai runner">93 <Step title="Mulai runner">

76 Buat direktori rahasia. Langkah ini dan berikutnya memerlukan root untuk jalur `/etc/claude`; jalur apa pun yang dapat dibaca proses runner berfungsi, jadi sesuaikan kedua perintah dan nilai `--environment-secret-file` bersama-sama jika Anda menggunakan yang berbeda.94 Buat direktori rahasia. Perintah ini dan berikutnya menggunakan `/etc/claude`, yang memerlukan root, dan file rahasia yang dibuatnya hanya dapat dibaca oleh pengguna yang menjalankannya. Jika runner akan berjalan sebagai pengguna lain, runner keluar dengan `error: Failed to read environment secret file <path> (EACCES: permission denied, open '<path>')`. Dalam hal ini, jalankan kedua perintah sebagai pengguna runner dengan direktori yang dapat ditulis oleh pengguna tersebut sebagai pengganti `/etc/claude`, dan berikan jalur yang sama ke `--environment-secret-file`. Jalur apa pun yang dapat dibaca proses runner berfungsi.

77 95 

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

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


89 107 

90 Jika runner tidak dapat membuat atau menulis ke jalur, itu keluar saat startup dengan kesalahan yang menamai direktori alih-alih mendaftar. Lihat [Troubleshooting](/docs/id/self-hosted-environments-deploy#troubleshooting).108 Jika runner tidak dapat membuat atau menulis ke jalur, itu keluar saat startup dengan kesalahan yang menamai direktori alih-alih mendaftar. Lihat [Troubleshooting](/docs/id/self-hosted-environments-deploy#troubleshooting).

91 109 

92 Kemudian mulai runner dengan `--environment-secret-file` dan `--base-dir`. Runner mendaftar dengan lingkungan Anda dan mulai menunggu pekerjaan. Jika runner keluar, mulai ulang dengan tangan. Penerapan produksi menjalankan runner di bawah orkestrator yang memulai ulang runner yang keluar, biasanya dengan filesystem segar per restart; [Gunakan kembali checkout yang sudah hangat](/docs/id/self-hosted-environments-deploy#reuse-a-pre-warmed-checkout) mencakup pengaturan disk persisten yang didukung.110 Kemudian mulai runner dengan `--environment-secret-file` dan `--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 Runner mencatat `Registered: runner_id=<runner-id>` setelah terdaftar dengan lingkungan Anda, kemudian mulai melakukan polling untuk pekerjaan. Jika runner keluar kemudian, mulai ulang sendiri. Lihat [Jika runner keluar](#if-the-runner-exits) untuk mengetahui kapan hal itu terjadi.

97 </Step>117 </Step>

98 118 

99 <Step title="Verifikasi runner muncul">119 <Step title="Verifikasi runner muncul">

100 Kembali ke [halaman **Cloud environments**](https://claude.ai/admin-settings/cloud-environments). Status lingkungan Anda berubah dari **No runners deployed** menjadi **Healthy** dalam beberapa detik setelah runner dimulai; buka lingkungan dan pilih **Activity** untuk melihat runner itu sendiri.120 Kembali ke [halaman **Cloud environments**](https://claude.ai/admin-settings/cloud-environments). Status lingkungan Anda berubah dari **No runners deployed** menjadi **Healthy** dalam beberapa detik setelah runner dimulai; buka lingkungan dan pilih **Activity** untuk melihat runner itu sendiri. Jika Anda tidak memiliki akses ke halaman admin, baris `Registered: runner_id=<runner-id>` di log runner dari langkah sebelumnya memberi Anda sinyal yang sama.

101 </Step>121 </Step>

102 122 

103 <Step title="Arahkan sesi ke lingkungan">123 <Step title="Arahkan sesi ke lingkungan">

104 Mulai sesi di claude.ai/code dan pilih lingkungan Anda dari pemilih lingkungan, di mana lingkungan yang di-host sendiri muncul bersama yang di-host Anthropic. Runner mengklon dengan kredensial git apa pun yang sudah dimiliki host, jadi pilih repositori yang sudah dapat diklon host ini, atau yang publik; opsi kredensial untuk repositori pribadi dalam produksi ada di [Konfigurasi git](/docs/id/self-hosted-environments-deploy#configure-git). Runner yang tersedia berikutnya mengambil sesi yang antri dan mencatat `Picked up session <session-id>` bersama dengan hitungan aktif dan kapasitasnya, sehingga Anda dapat mengonfirmasi dari output runner sendiri host mana yang mengambil sesi. Tonton sesi bekerja dan baca balasan Claude di [claude.ai/code](https://claude.ai/code). Jika sesi duduk antri sebagai gantinya, lihat [Troubleshooting](/docs/id/self-hosted-environments-deploy#troubleshooting).124 <span id="route-a-session" />Mulai sesi di claude.ai/code dan pilih lingkungan Anda dari pemilih lingkungan, di mana lingkungan yang di-host sendiri muncul bersama yang di-host Anthropic. Untuk repositori, pilih repositori dari [prasyarat](#host-and-network): repositori publik, atau repositori yang sudah dapat diklon host ini. Runner mengklon dengan kredensial git apa pun yang sudah dimiliki host.

125 

126 Runner yang tersedia berikutnya mengambil sesi yang antri dan mencatat `Picked up session <session-id>` bersama dengan hitungan aktif dan kapasitasnya, sehingga Anda dapat mengonfirmasi dari output runner sendiri host mana yang mengambil sesi. Tonton sesi bekerja dan baca balasan Claude di [claude.ai/code](https://claude.ai/code).

127 

128 Jika sesi tidak mulai bekerja, cocokkan dengan apa yang Anda lihat:

129 

130 * **Sesi tetap dalam antrean**: lihat [Troubleshooting](/docs/id/self-hosted-environments-deploy#troubleshooting).

131 * **Sesi gagal dimulai dengan kesalahan git**: kesalahan muncul di sesi dan di log runner. Jika kesalahan tersebut menyertakan `could not read Username for` dari git diikuti URL host git Anda, runner tidak memiliki kredensial HTTPS untuk host tersebut. Lihat [Konfigurasi git](/docs/id/self-hosted-environments-deploy#configure-git), yang juga mencakup opsi kredensial untuk repositori pribadi dalam produksi.

105 </Step>132 </Step>

106</Steps>133</Steps>

107 134 

108Runner keluar dengan desain setelah sesi aktifnya selesai; lihat [Runner lifecycle](/docs/id/self-hosted-environments#runner-lifecycle). Untuk produksi, terapkan di bawah orkestrator yang memulai ulang saat keluar dan menunggu lebih lama antara restart ketika runner terus keluar tepat setelah dimulai. Lihat [Terapkan ke produksi](/docs/id/self-hosted-environments-deploy) dan [Ketika runner keluar](/docs/id/self-hosted-environments-deploy#when-the-runner-exits).135<h3 id="if-the-runner-exits">

136 Jika runner keluar

137</h3>

138 

139Jika runner keluar selama mulai cepat ini, mulai lagi dengan perintah yang sama. Runner dapat keluar dengan sendirinya:

140 

141* **Sesi selesai**: log menampilkan `[runner:exit] account workload drained — exiting`. Runner keluar sesuai desain setelah sesi aktifnya selesai. Lihat [Runner lifecycle](/docs/id/self-hosted-environments#runner-lifecycle).

142* **Kehilangan kontak**: log menampilkan baris `[runner:fatal]` dengan `runner record gone server-side` atau dengan `poll auth failed`. Jika runner kehilangan kontak dengan Anthropic untuk sementara waktu, misalnya karena host tertidur, runner dapat keluar saat berikutnya terhubung ke Anthropic.

143 

144Giliran yang selesai tidak mengakhiri sesi uji Anda. Setelah giliran pertama, sesi masih terpasang dan runner masih berjalan, sehingga Anda dapat [mengirim pesan lanjutan ke sesi](#send-a-follow-up-message-to-a-running-session) tanpa memulai ulang runner terlebih dahulu.

145 

146Untuk produksi, terapkan runner di bawah orkestrator yang memulai ulang saat keluar dan menunggu lebih lama antara restart ketika runner terus keluar tepat setelah dimulai. Lihat [Terapkan ke produksi](/docs/id/self-hosted-environments-deploy) dan [Ketika runner keluar](/docs/id/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 Mengirim pesan lanjutan ke sesi yang sedang berjalan149 Mengirim pesan lanjutan ke sesi yang sedang berjalan

Details

52| `--release-idle-session-min <n>` | `SELF_HOSTED_RUNNER_SESSION_IDLE_MS` | `0` | Lepaskan slot session setelah N menit inaktivitas setelah turn selesai atau session menunggu tindakan pengguna. Session yang masih mid-turn, termasuk yang menahan background task yang tidak pernah selesai atau persetujuan yang diminta dari dalam panggilan tool yang berjalan, tidak dihitung sebagai idle; pasangkan dengan `--kill-session-after-min` sebagai backstop keras. Setelah background task session selesai, runner menganggap session sibuk sampai turn follow-up yang membaca hasil dimulai, untuk paling banyak jendela [`SELF_HOSTED_RUNNER_BG_RESULT_GRACE_MS`](#environment-variable-only-settings). Sampai runner menerima sinyal shutdown atau mencapai waktu pensiun, release yang meninggalkan runner tanpa session aktif memulai jalur keluar yang sama seperti drain normal, diatur oleh `--drain-grace-sec`. Setelah sinyal pertama yang Anda tunda dengan [`--defer-shutdown-max-min`](/docs/id/self-hosted-environments-deploy#defer-the-drain-past-the-first-signal), runner keluar segera setelah release meninggalkannya tanpa session. `0` menonaktifkan. |52| `--release-idle-session-min <n>` | `SELF_HOSTED_RUNNER_SESSION_IDLE_MS` | `0` | Lepaskan slot session setelah N menit inaktivitas setelah turn selesai atau session menunggu tindakan pengguna. Session yang masih mid-turn, termasuk yang menahan background task yang tidak pernah selesai atau persetujuan yang diminta dari dalam panggilan tool yang berjalan, tidak dihitung sebagai idle; pasangkan dengan `--kill-session-after-min` sebagai backstop keras. Setelah background task session selesai, runner menganggap session sibuk sampai turn follow-up yang membaca hasil dimulai, untuk paling banyak jendela [`SELF_HOSTED_RUNNER_BG_RESULT_GRACE_MS`](#environment-variable-only-settings). Sampai runner menerima sinyal shutdown atau mencapai waktu pensiun, release yang meninggalkan runner tanpa session aktif memulai jalur keluar yang sama seperti drain normal, diatur oleh `--drain-grace-sec`. Setelah sinyal pertama yang Anda tunda dengan [`--defer-shutdown-max-min`](/docs/id/self-hosted-environments-deploy#defer-the-drain-past-the-first-signal), runner keluar segera setelah release meninggalkannya tanpa session. `0` menonaktifkan. |

53| `--remove-session-state [bool]` | `SELF_HOSTED_RUNNER_REMOVE_SESSION_STATE` | off | Hapus direktori per-session session di bawah `<base-dir>/_sessions/` ketika session berakhir di runner ini, apa pun hasilnya. [Reuse a pre-warmed checkout](/docs/id/self-hosted-environments-deploy#reuse-a-pre-warmed-checkout) menjelaskan apa yang mereka pegang dan siapa yang dapat membacanya ketika mereka tetap. Penghapusan adalah best-effort: direktori per-session tetap ada ketika runner dibunuh atau mencapai deadline drain sebelum cleanup berjalan. Dengan flag aktif, debug log session yang gagal atau terputus tidak disimpan di disk. Memerlukan Claude Code v2.1.268 atau lebih baru. |53| `--remove-session-state [bool]` | `SELF_HOSTED_RUNNER_REMOVE_SESSION_STATE` | off | Hapus direktori per-session session di bawah `<base-dir>/_sessions/` ketika session berakhir di runner ini, apa pun hasilnya. [Reuse a pre-warmed checkout](/docs/id/self-hosted-environments-deploy#reuse-a-pre-warmed-checkout) menjelaskan apa yang mereka pegang dan siapa yang dapat membacanya ketika mereka tetap. Penghapusan adalah best-effort: direktori per-session tetap ada ketika runner dibunuh atau mencapai deadline drain sebelum cleanup berjalan. Dengan flag aktif, debug log session yang gagal atau terputus tidak disimpan di disk. Memerlukan Claude Code v2.1.268 atau lebih baru. |

54| `--retire-at <epoch-seconds>` | `SELF_HOSTED_RUNNER_RETIRE_AT` | unset | Pensiun runner pada timestamp Unix absolut dalam detik, untuk infrastruktur yang membunuh runner pada waktu yang diketahui; [Runner lifecycle](/docs/id/self-hosted-environments#runner-lifecycle) menjelaskan urutan release dan cara mengukur margin. Nilai sebelum 2001 atau setelah tahun 5138 ditolak oleh flag dan diabaikan oleh variabel lingkungan. |54| `--retire-at <epoch-seconds>` | `SELF_HOSTED_RUNNER_RETIRE_AT` | unset | Pensiun runner pada timestamp Unix absolut dalam detik, untuk infrastruktur yang membunuh runner pada waktu yang diketahui; [Runner lifecycle](/docs/id/self-hosted-environments#runner-lifecycle) menjelaskan urutan release dan cara mengukur margin. Nilai sebelum 2001 atau setelah tahun 5138 ditolak oleh flag dan diabaikan oleh variabel lingkungan. |

55| `--server-auto-mode-lists <mode>` | `SELF_HOSTED_RUNNER_SERVER_AUTO_MODE_LISTS` | `no-allow` | Daftar aturan pengklasifikasi [auto mode](/docs/id/permission-modes#eliminate-prompts-with-auto-mode) mana yang dikirim control plane bersama sebuah sesi yang boleh mencapai sesi tersebut: `all`, `no-allow`, atau `none`. Lihat [Daftar aturan auto mode](#auto-mode-rule-lists) untuk apa yang diterapkan setiap nilai. Nilai yang tidak valid menghentikan runner saat startup. Memerlukan Claude Code v2.1.295 atau lebih baru. |

55| `--session-stop-grace-sec <n>` | `SELF_HOSTED_RUNNER_SESSION_STOP_GRACE_MS` | `5` | Berapa lama menunggu proses Claude keluar dengan bersih setelah session berakhir, sebelum force-killing. Naikkan nilai jika hook `SessionEnd` child sendiri memerlukan lebih banyak waktu. |56| `--session-stop-grace-sec <n>` | `SELF_HOSTED_RUNNER_SESSION_STOP_GRACE_MS` | `5` | Berapa lama menunggu proses Claude keluar dengan bersih setelah session berakhir, sebelum force-killing. Naikkan nilai jika hook `SessionEnd` child sendiri memerlukan lebih banyak waktu. |

56| `--startup-timeout-min <n>` | `SELF_HOSTED_RUNNER_STARTUP_TIMEOUT_MS` | `15` | Lepaskan slot session jika child belum menandakan bahwa itu diinisialisasi dalam N menit spawn. Dihapus oleh sinyal init child di [activity channel](/docs/id/self-hosted-environments-configuration#keep-stdin-and-file-descriptor-3-attached), bukan oleh output biasa, setelah itu `--release-idle-session-min` mengambil alih. `0` menonaktifkan. |57| `--startup-timeout-min <n>` | `SELF_HOSTED_RUNNER_STARTUP_TIMEOUT_MS` | `15` | Lepaskan slot sesi jika child belum memberi sinyal bahwa ia telah diinisialisasi dalam N menit sejak dijalankan. Cloning terjadi sebelum child dijalankan, sehingga waktu clone tidak dihitung. Dihapus oleh sinyal init child di [activity channel](/docs/id/self-hosted-environments-configuration#keep-stdin-and-file-descriptor-3-attached), bukan oleh output biasa, setelah itu `--release-idle-session-min` mengambil peran. `0` menonaktifkan. |

57| `--trust-workspace [bool]` | `SELF_HOSTED_RUNNER_TRUST_WORKSPACE` | on | Seed kepercayaan yang bertahan untuk setiap path repositori session sehingga `permissions.allow` dan `additionalDirectories` yang berkomitmen repo dihormati. Atur `false` untuk menghapus hibah izin yang berkomitmen repo dan mengonfigurasi aturan allow dalam `settings.json` konfigurasi host sebagai gantinya; pengaturan `sandbox.*` yang berkomitmen repo masih berlaku baik cara, itulah mengapa [repo-settings guard](/docs/id/self-hosted-environments-deploy#harden-your-deployment) memindainya terlepas dari flag ini. |58| `--trust-workspace [bool]` | `SELF_HOSTED_RUNNER_TRUST_WORKSPACE` | on | Seed kepercayaan yang bertahan untuk setiap path repositori session sehingga `permissions.allow` dan `additionalDirectories` yang berkomitmen repo dihormati. Atur `false` untuk menghapus hibah izin yang berkomitmen repo dan mengonfigurasi aturan allow dalam `settings.json` konfigurasi host sebagai gantinya; pengaturan `sandbox.*` yang berkomitmen repo masih berlaku baik cara, itulah mengapa [repo-settings guard](/docs/id/self-hosted-environments-deploy#harden-your-deployment) memindainya terlepas dari flag ini. |

58| `--use-anthropic-git-proxy` | `CLAUDE_RUNNER_USE_GIT_PROXY=1` | off | Clone melalui [Anthropic git proxy](/docs/id/self-hosted-environments-deploy#use-the-anthropic-git-proxy) daripada auth git yang dikelola pelanggan. Memerlukan `--capacity 1` dan git 2.32 atau lebih baru; runner menolak untuk memulai sebaliknya. Menggantikan flag rewrite. |59| `--use-anthropic-git-proxy` | `CLAUDE_RUNNER_USE_GIT_PROXY=1` | off | Clone repositori di github.com melalui [Anthropic git proxy](/docs/id/self-hosted-environments-deploy#use-the-anthropic-git-proxy) alih-alih auth git yang dikelola pelanggan. Memerlukan `--capacity 1` dan git 2.32 atau lebih baru; jika tidak, runner menolak untuk dimulai. Menggantikan flag rewrite. |

59 60 

60Sebagian besar flag durasi memiliki maksimum, dipilih untuk menjaga setiap timeout di dalam ceiling timer 32-bit runtime sekitar 24,85 hari. Flag `--*-min` cap pada 10080 menit, 7 hari; `--drain-grace-sec` pada 604800 detik, juga 7 hari; dan `--drain-wait-sec` pada 86400 detik, 24 jam. `--session-stop-grace-sec` dan `--post-session-hook-timeout-sec` tidak terbatas. Melampaui cap berperilaku berbeda per surface:61Sebagian besar flag durasi memiliki maksimum, dipilih untuk menjaga setiap timeout di dalam ceiling timer 32-bit runtime sekitar 24,85 hari. Flag `--*-min` cap pada 10080 menit, 7 hari; `--drain-grace-sec` pada 604800 detik, juga 7 hari; dan `--drain-wait-sec` pada 86400 detik, 24 jam. `--session-stop-grace-sec` dan `--post-session-hook-timeout-sec` tidak terbatas. Melampaui cap berperilaku berbeda per surface:

61 62 

62* **Flag**: startup gagal dengan error.63* **Flag**: startup gagal dengan error.

63* **Variabel lingkungan**: runner menjepit nilai ke ceiling timer daripada menolaknya.64* **Variabel lingkungan**: runner menjepit nilai ke ceiling timer daripada menolaknya.

64 65 

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

67 Daftar aturan auto mode

68</h3>

69 

70`--server-auto-mode-lists` memungkinkan Anda memutuskan aturan pengklasifikasi [auto mode](/docs/id/permission-modes#eliminate-prompts-with-auto-mode) mana dari luar runner yang mencapai sesi di runner Anda. Control plane Anthropic dapat mengirim daftar aturan bersama sebuah sesi dan meminta runner untuk menerapkannya. Beberapa entri mungkin merupakan aturan yang ditulis oleh admin organisasi Anda. Daftarnya adalah `environment`, `soft_deny`, dan `allow`:

71 

72* **`environment`**: sebuah entri dapat membuat pengklasifikasi mengizinkan lebih banyak maupun lebih sedikit.

73* **`soft_deny`**: sebuah entri memblokir tindakan kecuali pengguna secara eksplisit memintanya atau pengecualian `allow` berlaku.

74* **`allow`**: pengecualian terhadap entri `soft_deny`.

75 

76Nilai flag menentukan daftar mana yang diterapkan runner:

77 

78* **`no-allow`**: default. Menerapkan `environment` dan `soft_deny` serta menahan `allow`. Entri `environment` tetap dapat membuat pengklasifikasi mengizinkan lebih banyak, sehingga default tidak mencegah setiap pelonggaran.

79* **`all`**: menerapkan ketiga daftar.

80* **`none`**: tidak menerapkan satu pun. Pilih `none` untuk mencegah setiap pelonggaran dari daftar-daftar ini. Ini juga menghilangkan pembatasan `soft_deny`.

81 

82Tidak ada pengaturan runner yang membuat control plane meminta runner menerapkan daftar tersebut. Ketika control plane tidak meminta, sesi tidak menerima daftar apa pun, apa pun yang Anda atur. Untuk melihat mana yang terjadi, mulai runner dengan `--log-level debug`. Untuk setiap sesi, runner kemudian mencatat ke log baris yang berisi `the server asked this runner to apply`, atau baris yang berisi `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 Flag CLI Orchestrator85 Flag CLI Orchestrator

67</h2>86</h2>


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

73| `--hook-concurrency <n>` | `4` | Maksimum hook `spawn-runner` berjalan secara paralel. Juga membatasi berapa banyak permintaan spawn yang diklaim per poll. |92| `--hook-concurrency <n>` | `4` | Maksimum hook `spawn-runner` berjalan secara paralel. Juga membatasi berapa banyak permintaan spawn yang diklaim per poll. |

74| `--hook-timeout <sec>` | `60` | Hentikan pohon proses hook setelah banyak detik ini. Timeout plus grace kill 5-detiknya harus tetap di bawah `--expected-spawn-seconds`; orchestrator memberlakukan ini saat startup. |93| `--hook-timeout <sec>` | `60` | Hentikan pohon proses hook setelah banyak detik ini. Timeout plus grace kill 5-detiknya harus tetap di bawah `--expected-spawn-seconds`; orchestrator memberlakukan ini saat startup. |

75| `--expected-spawn-seconds <sec>` | `120` | Expected p99 boot time untuk runner yang dihasilkan, dalam range yang diberlakukan server 10 hingga 3600. Dikirim pada setiap poll sebagai lease server-side; jika tidak ada runner yang mendaftar sebelum itu berlalu, session ditawarkan kembali dengan ID pesanan segar. Semua replika harus berbagi nilai ini. |94| `--expected-spawn-seconds <sec>` | `120` | Perkiraan waktu p99 sejak orchestrator menerima permintaan spawn hingga runner mendaftar, termasuk waktu menunggu kapasitas di platform Anda. Server memberlakukan rentang 10 hingga 3600. Dikirim pada setiap poll sebagai lease server-side: jika tidak ada runner yang mendaftar sebelum waktu itu berlalu, sesi ditawarkan kembali dengan ID pesanan baru. Semua replika harus berbagi nilai ini. |

76| `--min-idle <n>` | `0` | Pertahankan setidaknya N slot session idle gratis dengan menghasilkan runner standby secara proaktif. `0` menonaktifkan pre-warming. Pasangkan dengan `--exit-if-unused-min` runner sehingga runner standby surplus merebut diri mereka sendiri. |95| `--min-idle <n>` | `0` | Pertahankan setidaknya N slot session idle gratis dengan menghasilkan runner standby secara proaktif. `0` menonaktifkan pre-warming. Pasangkan dengan `--exit-if-unused-min` runner sehingga runner standby surplus merebut diri mereka sendiri. |

77| `--debug-dir <path>` | unset | Tulis work order setiap permintaan spawn dan hook stderr ke disk. Debug saja; jangan pernah atur dalam produksi. |96| `--debug-dir <path>` | unset | Tulis work order setiap permintaan spawn dan hook stderr ke disk. Debug saja; jangan pernah atur dalam produksi. |

78 97 


108| `SELF_HOSTED_RUNNER_POST_TURN_SETTLE_MS` | `7000` | Batas pada berapa lama runner menghitung session sebagai sibuk untuk drain `--drain-wait-sec` setelah turn selesai, sementara proses session melaporkan akhir turn ke Anthropic. `0` atau nilai yang tidak dapat digunakan kembali ke default, jadi hold tidak dapat dimatikan. Memerlukan Claude Code v2.1.275 atau lebih baru. |127| `SELF_HOSTED_RUNNER_POST_TURN_SETTLE_MS` | `7000` | Batas pada berapa lama runner menghitung session sebagai sibuk untuk drain `--drain-wait-sec` setelah turn selesai, sementara proses session melaporkan akhir turn ke Anthropic. `0` atau nilai yang tidak dapat digunakan kembali ke default, jadi hold tidak dapat dimatikan. Memerlukan Claude Code v2.1.275 atau lebih baru. |

109| `SELF_HOSTED_RUNNER_SIGKILL_GRACE_MS` | `30000` | Berapa lama runner menunggu OS untuk mengirimkan `SIGKILL` ke child yang macet dalam I/O yang tidak dapat diinterupsi sebelum keluar sendiri. Floored pada `--post-session-hook-timeout-sec` plus 15 detik, dan 30 lebih banyak ketika `--push-outcome-on-release` diatur, jadi minimum efektif adalah 75 detik di default. |128| `SELF_HOSTED_RUNNER_SIGKILL_GRACE_MS` | `30000` | Berapa lama runner menunggu OS untuk mengirimkan `SIGKILL` ke child yang macet dalam I/O yang tidak dapat diinterupsi sebelum keluar sendiri. Floored pada `--post-session-hook-timeout-sec` plus 15 detik, dan 30 lebih banyak ketika `--push-outcome-on-release` diatur, jadi minimum efektif adalah 75 detik di default. |

110| `CLAUDE_RUNNER_FETCH_DEPTH` | `50` | Git fetch depth untuk fresh clone. Atur integer positif, atau `full` atau `0` untuk fetch lengkap. Repositori yang sudah ada di workspace menjaga kedalaman yang ada. |129| `CLAUDE_RUNNER_FETCH_DEPTH` | `50` | Git fetch depth untuk fresh clone. Atur integer positif, atau `full` atau `0` untuk fetch lengkap. Repositori yang sudah ada di workspace menjaga kedalaman yang ada. |

130| `CLAUDE_RUNNER_FETCH_SERVER_PROGRESS_CAP_MS` | `600000` | Berapa lama dalam milidetik, per percobaan, sebuah git fetch dapat menunggu data pertamanya sementara angka progres milik server git itu sendiri terus naik, seperti ketika server menyiapkan pack untuk repositori besar. `0` atau `off` mematikan penantian tersebut: fetch seperti itu kemudian dihentikan setelah dua menit tanpa data. Bilangan bulat lainnya dibatasi antara `120000` dan `1800000`, yaitu 2 hingga 30 menit. Memerlukan Claude Code v2.1.295 atau lebih baru. |

111| `CLAUDE_RUNNER_SKIP_GIT_VERIFY` | unset | Ketika `1`, lewati pemeriksaan kehadiran `.git` setelah hook `checkout` berjalan. Atur ini ketika hook Anda materialize sumber non-git. |131| `CLAUDE_RUNNER_SKIP_GIT_VERIFY` | unset | Ketika `1`, lewati pemeriksaan kehadiran `.git` setelah hook `checkout` berjalan. Atur ini ketika hook Anda materialize sumber non-git. |

112| `FORCE_AUTOUPDATE_PLUGINS` | unset | Ketika `1`, biarkan marketplace plugin auto-update meskipun binary dipasang |132| `FORCE_AUTOUPDATE_PLUGINS` | unset | Ketika `1`, biarkan marketplace plugin auto-update meskipun binary dipasang |

113| `CLAUDE_CODE_DISABLE_ARTIFACT` | unset | Ketika `1`, nonaktifkan tool Artifact dalam session terlepas dari pengaturan admin organisasi, dan lepaskan persyaratan egress `*.frame.claudeusercontent.com` |133| `CLAUDE_CODE_DISABLE_ARTIFACT` | unset | Ketika `1`, nonaktifkan tool Artifact dalam session terlepas dari pengaturan admin organisasi, dan lepaskan persyaratan egress `*.frame.claudeusercontent.com` |


178| `claude_code_self_hosted_orchestrator_poll_errors_total{error_kind}` | Kegagalan PollSpawnHints kumulatif berdasarkan jenis: `transport`, `timeout`, `5xx`, `429`, atau `4xx`. Semua lima seri hadir dari proses start; alert pada `rate(...[5m]) > 0`. |198| `claude_code_self_hosted_orchestrator_poll_errors_total{error_kind}` | Kegagalan PollSpawnHints kumulatif berdasarkan jenis: `transport`, `timeout`, `5xx`, `429`, atau `4xx`. Semua lima seri hadir dari proses start; alert pada `rate(...[5m]) > 0`. |

179| `claude_code_self_hosted_orchestrator_queue_pending_sessions` | Spawn request yang dapat diklaim sekarang |199| `claude_code_self_hosted_orchestrator_queue_pending_sessions` | Spawn request yang dapat diklaim sekarang |

180| `claude_code_self_hosted_orchestrator_queue_backing_off_sessions` | Spawn request dalam retry backoff setelah kegagalan hook yang dapat dicoba ulang |200| `claude_code_self_hosted_orchestrator_queue_backing_off_sessions` | Spawn request dalam retry backoff setelah kegagalan hook yang dapat dicoba ulang |

181| `claude_code_self_hosted_orchestrator_queue_circuit_broken_sessions` | Spawn request diblokir sampai Owner mencoba ulang dari tab **Activity** lingkungan; alert jika di atas nol |201| `claude_code_self_hosted_orchestrator_queue_circuit_broken_sessions` | Session yang diblokir dari spawn. Masing-masing tetap diblokir sampai pengguna mengirimkan pesan baru kepadanya atau Owner mencoba ulang dari tab **Activity** lingkungan. Jumlahnya dapat tetap di atas nol setelah Anda memperbaiki penyebabnya. Alert jika di atas nol. |

182| `claude_code_self_hosted_orchestrator_pool_pending_sessions` | Total session menunggu runner untuk lingkungan ini. Agregat environment-wide, identik di setiap instance orchestrator: gunakan `MAX` daripada `SUM` di seluruh instance. |202| `claude_code_self_hosted_orchestrator_pool_pending_sessions` | Total session menunggu runner untuk lingkungan ini. Agregat environment-wide, identik di setiap instance orchestrator: gunakan `MAX` daripada `SUM` di seluruh instance. |

183| `claude_code_self_hosted_orchestrator_pool_active_sessions` | Session yang saat ini ditugaskan ke runner yang hidup dalam lingkungan ini. Agregat environment-wide, identik di setiap instance orchestrator: gunakan `MAX` daripada `SUM` di seluruh instance. |203| `claude_code_self_hosted_orchestrator_pool_active_sessions` | Session yang saat ini ditugaskan ke runner yang hidup dalam lingkungan ini. Agregat environment-wide, identik di setiap instance orchestrator: gunakan `MAX` daripada `SUM` di seluruh instance. |

184| `claude_code_self_hosted_orchestrator_spawn_hooks_total{result}` | Outcome hook `spawn-runner` kumulatif: `ok`, `retryable`, `non_retryable`. Menghitung invokasi hook orchestrator, bukan child session yang dihasilkan runner: tidak dapat dibandingkan dengan `sessions_started_total`, karena kapasitas di atas satu, warm pool, dan runner yang dihasilkan lagi untuk session yang sama semua menyimpang keduanya. |204| `claude_code_self_hosted_orchestrator_spawn_hooks_total{result}` | Outcome hook `spawn-runner` kumulatif: `ok`, `retryable`, `non_retryable`. Menghitung invokasi hook orchestrator, bukan child session yang dihasilkan runner: tidak dapat dibandingkan dengan `sessions_started_total`, karena kapasitas di atas satu, warm pool, dan runner yang dihasilkan lagi untuk session yang sama semua menyimpang keduanya. |


285 for: 1m305 for: 1m

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

287 annotations:307 annotations:

288 summary: "{{ $value }} session circuit-broken — spawn-runner hook berulang kali non-retryable; perbaiki infra kemudian coba ulang dari tab Activity"308 summary: "Session yang diblokir dari spawn: {{ $value }}. Baca error masing-masing di tab Activity, perbaiki penyebabnya, lalu pilih 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 

321Sebelum v2.1.260, runner menghentikan setiap session yang mencapai limit `--kill-session-after-min` dan menghitungnya dalam `sessions_interrupted_total`.341Sebelum v2.1.260, runner menghentikan setiap session yang mencapai limit `--kill-session-after-min` dan menghitungnya dalam `sessions_interrupted_total`.

322 342 

323Hook [`post-session`](/docs/id/self-hosted-environments-configuration#post-session) `CLAUDE_RUNNER_EXIT_REASON` mengklasifikasikan clean handoff secara berbeda. Hook melaporkan release, startup timeout, dan server deassign sebagai `interrupted`, karena runner menghentikan child. Counter ini mencatat event yang sama sebagai `completed`, karena slot diserahkan dengan bersih.343Hook [`post-session`](/docs/id/self-hosted-environments-configuration#post-session) `CLAUDE_RUNNER_EXIT_REASON` mengklasifikasikan clean handoff secara berbeda. Hook melaporkan ini sebagai `interrupted`, karena runner menghentikan child: release, startup timeout, server deassign, serta archive atau delete yang diperhatikan poll terlebih dahulu. Counter ini mencatat event yang sama sebagai `completed`, karena slot diserahkan dengan bersih.

324 344 

325Jika Anda merekonsiliasi penerimaan hook terhadap `sessions_completed_total` secara langsung, Anda kurang menghitung completion. Gunakan hook untuk jaminan per-session dan counter untuk rate agregat.345Jika Anda merekonsiliasi penerimaan hook terhadap `sessions_completed_total` secara langsung, Anda kurang menghitung completion. Gunakan hook untuk jaminan per-session dan counter untuk rate agregat.

326 346 

Details

86 86 

87Flag dispatch `--environment` dan `--ref` memerlukan Claude Code v2.1.224 atau lebih baru pada mesin yang menjalankan skrip, lantai yang sama dengan runner itu sendiri. Dengan hook di tempat dan runner dimulai pada host ini, skrip uji:87Flag dispatch `--environment` dan `--ref` memerlukan Claude Code v2.1.224 atau lebih baru pada mesin yang menjalankan skrip, lantai yang sama dengan runner itu sendiri. Dengan hook di tempat dan runner dimulai pada host ini, skrip uji:

88 88 

891. Membuat sesi pada lingkungan uji dengan `claude -p "<prompt>" --environment <environment-id> --output-format json`, dijalankan dari checkout git sehingga CLI dapat auto-detect repositori dari remote `origin`. `--ref <branch>` opsional mendasarkan checkout sesi pada ref bernama daripada HEAD lokal. Perintah membuat sesi, mencetak satu baris JSON yang berisi `session_id`, dan keluar tanpa menunggu balasan Claude.891. Membuat sesi pada lingkungan uji dengan `claude -p "<prompt>" --environment <environment-id> --output-format json`. Jalankan perintah dari checkout git sehingga CLI dapat mendeteksi repositori secara otomatis dari remote `origin`. `--ref <branch>` opsional mendasarkan checkout sesi pada ref bernama alih-alih HEAD lokal. Perintah keluar tanpa menunggu balasan Claude. Apa yang dicetaknya memberi tahu skrip Anda hasilnya:

90 * **Sesi berhasil dibuat**: satu baris JSON seperti `{"ok":true,"session_id":"session_...","title":"...","url":"...","pool_id":"..."}`

91 * **Pembuatan sesi gagal**: baris `{"ok":false,"error":"..."}`, dan perintah keluar dengan status 1

92 * **Beberapa error yang lebih awal**, seperti sesi cloud yang tidak tersedia untuk organisasi Anda atau prompt yang tidak ada: error di stderr tanpa baris JSON, dan perintah keluar dengan status 1

902. Menunggu balasan muncul di `$E2E_REPLY_DIR/<session_id>.txt`, ditulis oleh hook Stop pada runner setelah giliran selesai.932. Menunggu balasan muncul di `$E2E_REPLY_DIR/<session_id>.txt`, ditulis oleh hook Stop pada runner setelah giliran selesai.

913. Mengirim follow-up dengan `claude -p "<message>" --cloud <session_id> --output-format json` (lihat [Kirim pesan follow-up ke sesi yang berjalan](/docs/id/claude-code-on-the-web#send-follow-ups-from-the-cli)), yang memposting acara pengguna ke sesi yang ada dan keluar.943. Mengirim follow-up dengan `claude -p "<message>" --cloud <session_id> --output-format json` (lihat [Kirim pesan follow-up ke sesi yang berjalan](/docs/id/claude-code-on-the-web#send-follow-ups-from-the-cli)), yang memposting acara pengguna ke sesi yang ada dan keluar.

924. Menunggu balasan follow-up dengan cara yang sama seperti langkah 2.954. Menunggu balasan follow-up dengan cara yang sama seperti langkah 2.


103 Skrip contoh106 Skrip contoh

104</h2>107</h2>

105 108 

106Skrip di bawah menjalankan loop lengkap terhadap `$CLAUDE_TEST_ENVIRONMENT_ID`, ID `ccpool_...` lingkungan uji Anda, ditampilkan dalam dialog detail lingkungan pada halaman admin atau dikembalikan oleh [panggilan create-environment](#create-a-dedicated-test-environment), dan menegaskan pada frasa sentinel di setiap balasan. Jalankan dari checkout git repositori yang ingin dikerjakan sesi, setelah memulai runner pada host ini dengan hook capture terinstal dan `E2E_REPLY_DIR` diekspor. Pertama, masuk dengan akun claude.ai pada mesin yang menjalankan skrip, seperti yang dijelaskan dalam [Autentikasi dari CI](#authenticate-from-ci). Tanpa proses masuk tersebut, dispatch pertama gagal dengan error seperti `Unable to get organization UUID for cloud session creation`.109Skrip contoh berjalan pada mesin yang sama dengan test runner. Sebelum Anda menjalankannya, siapkan mesin tersebut:

110 

111* **Checkout repositori**: jalankan skrip dari checkout git repositori yang ingin dikerjakan sesi.

112* **Runner**: mulai runner pada host ini dengan hook capture terinstal dan `E2E_REPLY_DIR` diekspor.

113* **Masuk**: masuk dengan akun claude.ai pada mesin yang menjalankan skrip, seperti yang dijelaskan dalam [Autentikasi dari CI](#authenticate-from-ci).

114* **ID lingkungan**: atur `CLAUDE_TEST_ENVIRONMENT_ID` ke ID `ccpool_...` lingkungan uji Anda, yang ditampilkan dalam dialog detail lingkungan pada halaman admin atau dikembalikan oleh [panggilan create-environment](#create-a-dedicated-test-environment).

115 

116Skrip di bawah menjalankan loop lengkap terhadap `$CLAUDE_TEST_ENVIRONMENT_ID` dan menegaskan pada frasa sentinel di setiap balasan.

107 117 

108```bash theme={null}118```bash theme={null}

109#!/usr/bin/env bash119#!/usr/bin/env bash


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

152EXPECT1="ok: custom tools are reachable"162EXPECT1="ok: custom tools are reachable"

153create_json=$(claude -p "$TURN1" --environment "$CLAUDE_TEST_ENVIRONMENT_ID" \163create_json=$(claude -p "$TURN1" --environment "$CLAUDE_TEST_ENVIRONMENT_ID" \

154 --ref "$TEST_REPO_REF" --output-format json)164 --ref "$TEST_REPO_REF" --output-format json < /dev/null)

155echo "create: $create_json"165echo "create: $create_json"

156SESSION_ID=$(jq -er '.session_id' <<<"$create_json")166SESSION_ID=$(jq -er '.session_id' <<<"$create_json")

157 167 


162# 3. Posting follow-up melalui CLI.172# 3. Posting follow-up melalui CLI.

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

164EXPECT2="ok: follow-up delivered"174EXPECT2="ok: follow-up delivered"

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

166echo "followup: $followup_json"176echo "followup: $followup_json"

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

168 178 

skills.md +1 −1

Details

235 235 

236Jika skill hanya ada di `~/.claude/skills/` di mesin Anda, Claude Code melaporkan bahwa skill tidak ditemukan saat [routine](/docs/id/routines) memanggilnya, karena setiap eksekusi routine dimulai sebagai sesi cloud baru. Untuk membuat skill personal tersedia di sesi-sesi ini:236Jika skill hanya ada di `~/.claude/skills/` di mesin Anda, Claude Code melaporkan bahwa skill tidak ditemukan saat [routine](/docs/id/routines) memanggilnya, karena setiap eksekusi routine dimulai sebagai sesi cloud baru. Untuk membuat skill personal tersedia di sesi-sesi ini:

237 237 

238* Untuk Cowork dan sesi cloud, aktifkan skill tersebut untuk akun claude.ai Anda.238* Untuk Cowork dan sesi cloud, aktifkan skill tersebut untuk akun claude.ai Anda. [Beberapa sesi di lingkungan self-hosted](/docs/id/self-hosted-environments-configuration#how-each-session’s-config-is-assembled) tidak memuat skill akun Anda.

239* Untuk sesi cloud, Anda dapat melakukan commit skill ke `.claude/skills/` milik repositori sebagai gantinya. Plugin yang dideklarasikan di `.claude/settings.json` milik repositori dan plugin yang hanya diaktifkan di pengaturan pengguna Anda [tidak dimuat di sesi cloud](/docs/id/cloud-environments#what-carries-over-from-your-setup).239* Untuk sesi cloud, Anda dapat melakukan commit skill ke `.claude/skills/` milik repositori sebagai gantinya. Plugin yang dideklarasikan di `.claude/settings.json` milik repositori dan plugin yang hanya diaktifkan di pengaturan pengguna Anda [tidak dimuat di sesi cloud](/docs/id/cloud-environments#what-carries-over-from-your-setup).

240 240 

241[Tugas terjadwal Desktop](/docs/id/desktop-scheduled-tasks) berjalan secara lokal di mesin Anda, sehingga tugas tersebut memuat `~/.claude/skills/`.241[Tugas terjadwal Desktop](/docs/id/desktop-scheduled-tasks) berjalan secara lokal di mesin Anda, sehingga tugas tersebut memuat `~/.claude/skills/`.

vs-code.md +1 −1

Details

479 479 

480Claude membuka tab baru untuk tugas browser dan berbagi status login browser Anda, sehingga dapat mengakses situs apa pun yang sudah Anda masuki.480Claude membuka tab baru untuk tugas browser dan berbagi status login browser Anda, sehingga dapat mengakses situs apa pun yang sudah Anda masuki.

481 481 

482Agar setiap sesi terhubung ke browser Anda saat dimulai, tanpa mengetik `@browser`, lihat [Aktifkan Chrome secara default](/docs/id/chrome#enable-chrome-by-default). Untuk situasi ketika Claude Code meminta persetujuan Anda sebelum tindakan browser dalam sesi yang terhubung dengan cara tersebut, lihat [Permintaan izin dalam sesi VS Code](/docs/id/chrome#permission-prompts-in-vs-code-sessions).482Agar setiap sesi terhubung ke browser Anda saat dimulai, tanpa mengetik `@browser`, lihat [Aktifkan Chrome secara default](/docs/id/chrome#enable-chrome-by-default). Untuk situasi ketika Claude Code meminta persetujuan Anda sebelum tindakan browser, lihat [Permintaan izin dalam sesi VS Code](/docs/id/chrome#permission-prompts-in-vs-code-sessions).

483 483 

484Untuk petunjuk penyiapan, daftar lengkap kemampuan, dan pemecahan masalah, lihat [Gunakan Claude Code dengan Chrome](/docs/id/chrome).484Untuk petunjuk penyiapan, daftar lengkap kemampuan, dan pemecahan masalah, lihat [Gunakan Claude Code dengan Chrome](/docs/id/chrome).

485 485