diff --git a/docs/id/ci.md b/docs/id/ci.md index 15453009a..76e669f9f 100644 --- a/docs/id/ci.md +++ b/docs/id/ci.md @@ -1,75 +1,75 @@ --- read_when: - - Anda perlu memahami mengapa sebuah tugas CI berjalan atau tidak berjalan + - Anda perlu memahami mengapa pekerjaan CI berjalan atau tidak berjalan - Anda sedang men-debug pemeriksaan GitHub Actions yang gagal - - Anda sedang mengoordinasikan pelaksanaan atau pengulangan validasi rilis + - Anda sedang mengoordinasikan pelaksanaan atau pelaksanaan ulang validasi rilis summary: Graf pekerjaan CI, gerbang cakupan, payung rilis, dan padanan perintah lokal title: Alur CI x-i18n: - generated_at: "2026-04-30T09:37:41Z" + generated_at: "2026-04-30T18:38:55Z" model: gpt-5.5 provider: openai - source_hash: a9c18f0801864ca1030aac9ea81117b011bd7936388984a1809ce3ae6e906e62 + source_hash: a24afc27606ac7f4e9ead89acdd319bffa23336610f8a6cd8b576ea1a5b233dd source_path: ci.md workflow: 16 --- -OpenClaw CI berjalan pada setiap push ke `main` dan setiap pull request. Job `preflight` mengklasifikasikan diff dan mematikan lane mahal ketika hanya area yang tidak terkait berubah. Run manual `workflow_dispatch` secara sengaja melewati scope cerdas dan menyebarkan seluruh grafik untuk kandidat rilis dan validasi luas. Lane Android tetap opt-in melalui `include_android`. Cakupan Plugin khusus rilis berada di workflow [`Plugin Prerelease`](#plugin-prerelease) terpisah dan hanya berjalan dari [`Full Release Validation`](#full-release-validation) atau dispatch manual eksplisit. +OpenClaw CI berjalan pada setiap push ke `main` dan setiap pull request. Job `preflight` mengklasifikasikan diff dan menonaktifkan lane mahal ketika hanya area yang tidak terkait yang berubah. Run manual `workflow_dispatch` sengaja melewati smart scoping dan menyebarkan seluruh graph untuk kandidat rilis dan validasi luas. Lane Android tetap opt-in melalui `include_android`. Cakupan Plugin khusus rilis berada di workflow terpisah [`Plugin Prerelease`](#plugin-prerelease) dan hanya berjalan dari [`Full Release Validation`](#full-release-validation) atau dispatch manual eksplisit. -## Ikhtisar pipeline +## Gambaran umum pipeline -| Job | Tujuan | Kapan berjalan | -| -------------------------------- | -------------------------------------------------------------------------------------------- | -------------------------------------- | -| `preflight` | Mendeteksi perubahan khusus docs, scope yang berubah, extension yang berubah, dan membangun manifes CI | Selalu pada push dan PR non-draft | -| `security-scm-fast` | Deteksi kunci privat dan audit workflow melalui `zizmor` | Selalu pada push dan PR non-draft | -| `security-dependency-audit` | Audit lockfile produksi tanpa dependensi terhadap advisory npm | Selalu pada push dan PR non-draft | -| `security-fast` | Agregat wajib untuk job keamanan cepat | Selalu pada push dan PR non-draft | -| `check-dependencies` | Pass khusus dependensi Knip produksi ditambah guard allowlist file tidak terpakai | Perubahan yang relevan dengan Node | -| `build-artifacts` | Membangun `dist/`, Control UI, pemeriksaan artefak build, dan artefak downstream yang dapat digunakan ulang | Perubahan yang relevan dengan Node | -| `checks-fast-core` | Lane kebenaran Linux cepat seperti pemeriksaan bundled/plugin-contract/protocol | Perubahan yang relevan dengan Node | -| `checks-fast-contracts-channels` | Pemeriksaan kontrak channel bershard dengan hasil pemeriksaan agregat stabil | Perubahan yang relevan dengan Node | -| `checks-node-core-test` | Shard pengujian Core Node, mengecualikan lane channel, bundled, contract, dan extension | Perubahan yang relevan dengan Node | -| `check` | Ekuivalen gate lokal utama bershard: tipe prod, lint, guard, tipe pengujian, dan smoke ketat | Perubahan yang relevan dengan Node | -| `check-additional` | Shard arsitektur, boundary, guard permukaan extension, package-boundary, dan gateway-watch | Perubahan yang relevan dengan Node | -| `build-smoke` | Pengujian smoke CLI yang sudah dibuild dan smoke memori startup | Perubahan yang relevan dengan Node | -| `checks` | Verifier untuk pengujian channel artefak build | Perubahan yang relevan dengan Node | -| `checks-node-compat-node22` | Lane build dan smoke kompatibilitas Node 22 | Dispatch CI manual untuk rilis | -| `check-docs` | Pemeriksaan format docs, lint, dan tautan rusak | Docs berubah | -| `skills-python` | Ruff + pytest untuk skill berbasis Python | Perubahan yang relevan dengan skill Python | -| `checks-windows` | Pengujian proses/path khusus Windows ditambah regresi specifier impor runtime bersama | Perubahan yang relevan dengan Windows | -| `macos-node` | Lane pengujian TypeScript macOS menggunakan artefak build bersama | Perubahan yang relevan dengan macOS | -| `macos-swift` | Lint, build, dan pengujian Swift untuk aplikasi macOS | Perubahan yang relevan dengan macOS | -| `android` | Pengujian unit Android untuk kedua flavor ditambah satu build APK debug | Perubahan yang relevan dengan Android | -| `test-performance-agent` | Optimasi pengujian lambat Codex harian setelah aktivitas tepercaya | CI utama sukses atau dispatch manual | +| Job | Tujuan | Kapan berjalan | +| -------------------------------- | -------------------------------------------------------------------------------------------- | ---------------------------------- | +| `preflight` | Mendeteksi perubahan khusus docs, cakupan yang berubah, extension yang berubah, dan membangun manifest CI | Selalu pada push dan PR non-draft | +| `security-scm-fast` | Deteksi private key dan audit workflow melalui `zizmor` | Selalu pada push dan PR non-draft | +| `security-dependency-audit` | Audit lockfile produksi bebas dependensi terhadap advisory npm | Selalu pada push dan PR non-draft | +| `security-fast` | Agregat wajib untuk job keamanan cepat | Selalu pada push dan PR non-draft | +| `check-dependencies` | Pass khusus dependensi Knip produksi plus guard allowlist file yang tidak digunakan | Perubahan yang relevan dengan Node | +| `build-artifacts` | Membangun `dist/`, Control UI, pemeriksaan artefak hasil build, dan artefak downstream yang dapat digunakan ulang | Perubahan yang relevan dengan Node | +| `checks-fast-core` | Lane kebenaran Linux cepat seperti pemeriksaan bundled/plugin-contract/protocol | Perubahan yang relevan dengan Node | +| `checks-fast-contracts-channels` | Pemeriksaan kontrak channel yang di-shard dengan hasil pemeriksaan agregat stabil | Perubahan yang relevan dengan Node | +| `checks-node-core-test` | Shard pengujian Core Node, mengecualikan lane channel, bundled, contract, dan extension | Perubahan yang relevan dengan Node | +| `check` | Ekuivalen gate lokal utama yang di-shard: tipe prod, lint, guard, tipe pengujian, dan smoke ketat | Perubahan yang relevan dengan Node | +| `check-additional` | Shard arsitektur, boundary, guard permukaan extension, package-boundary, dan gateway-watch | Perubahan yang relevan dengan Node | +| `build-smoke` | Pengujian smoke built-CLI dan smoke memori startup | Perubahan yang relevan dengan Node | +| `checks` | Verifier untuk pengujian channel artefak hasil build | Perubahan yang relevan dengan Node | +| `checks-node-compat-node22` | Lane build dan smoke kompatibilitas Node 22 | Dispatch CI manual untuk rilis | +| `check-docs` | Pemformatan docs, lint, dan pemeriksaan link rusak | Docs berubah | +| `skills-python` | Ruff + pytest untuk skills berbasis Python | Perubahan yang relevan dengan skill Python | +| `checks-windows` | Pengujian proses/path khusus Windows plus regresi specifier impor runtime bersama | Perubahan yang relevan dengan Windows | +| `macos-node` | Lane pengujian TypeScript macOS menggunakan artefak hasil build bersama | Perubahan yang relevan dengan macOS | +| `macos-swift` | Swift lint, build, dan pengujian untuk aplikasi macOS | Perubahan yang relevan dengan macOS | +| `android` | Pengujian unit Android untuk kedua flavor plus satu build APK debug | Perubahan yang relevan dengan Android | +| `test-performance-agent` | Optimisasi pengujian lambat Codex harian setelah aktivitas tepercaya | CI main berhasil atau dispatch manual | ## Urutan fail-fast -1. `preflight` menentukan lane mana yang ada sama sekali. Logika `docs-scope` dan `changed-scope` adalah langkah di dalam job ini, bukan job mandiri. -2. `security-scm-fast`, `security-dependency-audit`, `security-fast`, `check`, `check-additional`, `check-docs`, dan `skills-python` gagal dengan cepat tanpa menunggu job artefak dan matriks platform yang lebih berat. -3. `build-artifacts` tumpang tindih dengan lane Linux cepat sehingga konsumen downstream dapat mulai segera setelah build bersama siap. +1. `preflight` menentukan lane mana yang ada sama sekali. Logika `docs-scope` dan `changed-scope` adalah langkah di dalam job ini, bukan job tersendiri. +2. `security-scm-fast`, `security-dependency-audit`, `security-fast`, `check`, `check-additional`, `check-docs`, dan `skills-python` gagal cepat tanpa menunggu job artefak dan matriks platform yang lebih berat. +3. `build-artifacts` berjalan tumpang tindih dengan lane Linux cepat sehingga konsumen downstream dapat mulai segera setelah build bersama siap. 4. Lane platform dan runtime yang lebih berat menyebar setelah itu: `checks-fast-core`, `checks-fast-contracts-channels`, `checks-node-core-test`, `checks`, `checks-windows`, `macos-node`, `macos-swift`, dan `android`. -GitHub dapat menandai job yang tergantikan sebagai `cancelled` ketika push yang lebih baru masuk ke PR atau ref `main` yang sama. Anggap itu sebagai noise CI kecuali run terbaru untuk ref yang sama juga gagal. Pemeriksaan shard agregat menggunakan `!cancelled() && always()` sehingga tetap melaporkan kegagalan shard normal tetapi tidak mengantre setelah seluruh workflow sudah tergantikan. Kunci konkurensi CI otomatis diberi versi (`CI-v7-*`) sehingga zombie sisi GitHub dalam grup antrean lama tidak dapat memblokir run main yang lebih baru tanpa batas. Run full-suite manual menggunakan `CI-manual-v1-*` dan tidak membatalkan run yang sedang berjalan. +GitHub dapat menandai job yang tergantikan sebagai `cancelled` ketika push yang lebih baru masuk ke PR yang sama atau ref `main`. Perlakukan itu sebagai noise CI kecuali run terbaru untuk ref yang sama juga gagal. Pemeriksaan shard agregat menggunakan `!cancelled() && always()` sehingga tetap melaporkan kegagalan shard normal tetapi tidak mengantre setelah seluruh workflow sudah tergantikan. Kunci concurrency CI otomatis diberi versi (`CI-v7-*`) sehingga zombie sisi GitHub dalam grup antrean lama tidak dapat memblokir run main yang lebih baru tanpa batas. Run full-suite manual menggunakan `CI-manual-v1-*` dan tidak membatalkan run yang sedang berjalan. -## Scope dan routing +## Cakupan dan routing -Logika scope berada di `scripts/ci-changed-scope.mjs` dan dicakup oleh pengujian unit di `src/scripts/ci-changed-scope.test.ts`. Dispatch manual melewati deteksi changed-scope dan membuat manifes preflight bertindak seolah setiap area berscope berubah. +Logika cakupan berada di `scripts/ci-changed-scope.mjs` dan dicakup oleh pengujian unit di `src/scripts/ci-changed-scope.test.ts`. Dispatch manual melewati deteksi changed-scope dan membuat manifest preflight bertindak seolah setiap area bercakupan berubah. -- **Edit workflow CI** memvalidasi grafik CI Node ditambah linting workflow, tetapi tidak memaksa build native Windows, Android, atau macOS dengan sendirinya; lane platform tersebut tetap terscope pada perubahan sumber platform. -- **Edit khusus routing CI, edit fixture core-test murah tertentu, dan edit helper/test-routing kontrak Plugin yang sempit** menggunakan jalur manifes cepat khusus Node: `preflight`, keamanan, dan satu tugas `checks-fast-core`. Jalur itu melewati artefak build, kompatibilitas Node 22, kontrak channel, shard core penuh, shard bundled-plugin, dan matriks guard tambahan ketika perubahan terbatas pada permukaan routing atau helper yang diuji langsung oleh tugas cepat. -- **Pemeriksaan Node Windows** terscope pada wrapper proses/path khusus Windows, helper runner npm/pnpm/UI, konfigurasi package manager, dan permukaan workflow CI yang mengeksekusi lane tersebut; perubahan sumber, Plugin, install-smoke, dan khusus pengujian yang tidak terkait tetap berada di lane Linux Node. +- **Edit workflow CI** memvalidasi graph CI Node plus linting workflow, tetapi tidak memaksa build native Windows, Android, atau macOS dengan sendirinya; lane platform tersebut tetap dicakup ke perubahan source platform. +- **Edit khusus routing CI, edit fixture core-test murah tertentu, dan edit helper/test-routing kontrak plugin yang sempit** menggunakan path manifest cepat khusus Node: `preflight`, keamanan, dan satu task `checks-fast-core`. Path tersebut melewati artefak build, kompatibilitas Node 22, kontrak channel, shard core penuh, shard bundled-plugin, dan matriks guard tambahan ketika perubahan terbatas pada permukaan routing atau helper yang langsung diuji task cepat. +- **Pemeriksaan Windows Node** dicakup ke wrapper proses/path khusus Windows, helper runner npm/pnpm/UI, konfigurasi package manager, dan permukaan workflow CI yang mengeksekusi lane tersebut; perubahan source, plugin, install-smoke, dan khusus pengujian yang tidak terkait tetap berada pada lane Linux Node. -Keluarga pengujian Node paling lambat dipecah atau diseimbangkan agar setiap job tetap kecil tanpa memesan runner berlebihan: kontrak channel berjalan sebagai tiga shard berbobot, lane unit core kecil dipasangkan, auto-reply berjalan sebagai empat worker seimbang (dengan subtree reply dipecah menjadi shard agent-runner, dispatch, dan commands/state-routing), dan konfigurasi agentic gateway/plugin disebar di seluruh job Node agentic khusus sumber yang ada alih-alih menunggu artefak build. Pengujian browser, QA, media, dan Plugin lain-lain yang luas menggunakan konfigurasi Vitest khususnya alih-alih catch-all Plugin bersama. Shard include-pattern merekam entri timing menggunakan nama shard CI, sehingga `.artifacts/vitest-shard-timings.json` dapat membedakan seluruh konfigurasi dari shard terfilter. `check-additional` menjaga pekerjaan compile/canary package-boundary tetap bersama dan memisahkan arsitektur topologi runtime dari cakupan gateway watch; shard guard boundary menjalankan guard independen kecilnya secara konkuren di dalam satu job. Gateway watch, pengujian channel, dan shard core support-boundary berjalan secara konkuren di dalam `build-artifacts` setelah `dist/` dan `dist-runtime/` sudah dibuild. +Keluarga pengujian Node paling lambat dibagi atau diseimbangkan agar setiap job tetap kecil tanpa memesan runner berlebihan: kontrak channel berjalan sebagai tiga shard berbobot, lane unit core kecil dipasangkan, auto-reply berjalan sebagai empat worker seimbang (dengan subtree reply dibagi menjadi shard agent-runner, dispatch, dan commands/state-routing), dan konfigurasi agentic gateway/plugin disebar ke seluruh job agentic Node source-only yang ada alih-alih menunggu artefak hasil build. Pengujian plugin browser luas, QA, media, dan miscellaneous menggunakan konfigurasi Vitest khusus masing-masing alih-alih catch-all plugin bersama. Shard include-pattern mencatat entri timing menggunakan nama shard CI, sehingga `.artifacts/vitest-shard-timings.json` dapat membedakan seluruh config dari shard terfilter. `check-additional` menjaga pekerjaan compile/canary package-boundary tetap bersama dan memisahkan arsitektur topologi runtime dari cakupan gateway watch; shard guard boundary menjalankan guard independen kecilnya secara konkuren dalam satu job. Gateway watch, pengujian channel, dan shard support-boundary core berjalan secara konkuren di dalam `build-artifacts` setelah `dist/` dan `dist-runtime/` sudah dibangun. -CI Android menjalankan `testPlayDebugUnitTest` dan `testThirdPartyDebugUnitTest`, lalu membuild APK debug Play. Flavor pihak ketiga tidak memiliki source set atau manifes terpisah; lane pengujian unitnya tetap mengompilasi flavor dengan flag BuildConfig SMS/call-log, sambil menghindari job packaging APK debug duplikat pada setiap push yang relevan dengan Android. +CI Android menjalankan `testPlayDebugUnitTest` dan `testThirdPartyDebugUnitTest` lalu membangun APK debug Play. Flavor third-party tidak memiliki source set atau manifest terpisah; lane pengujian unitnya tetap mengompilasi flavor dengan flag BuildConfig SMS/call-log, sambil menghindari job packaging APK debug duplikat pada setiap push yang relevan dengan Android. -Shard `check-dependencies` menjalankan `pnpm deadcode:dependencies` (pass khusus dependensi Knip produksi yang dipin ke versi Knip terbaru, dengan usia rilis minimum pnpm dinonaktifkan untuk instalasi `dlx`) dan `pnpm deadcode:unused-files`, yang membandingkan temuan file produksi tidak terpakai dari Knip terhadap `scripts/deadcode-unused-files.allowlist.mjs`. Guard file tidak terpakai gagal ketika PR menambahkan file tidak terpakai baru yang belum ditinjau atau meninggalkan entri allowlist usang, sambil mempertahankan permukaan Plugin dinamis yang disengaja, generated, build, live-test, dan package bridge yang tidak dapat diselesaikan Knip secara statis. +Shard `check-dependencies` menjalankan `pnpm deadcode:dependencies` (pass khusus dependensi Knip produksi yang dipin ke versi Knip terbaru, dengan usia rilis minimum pnpm dinonaktifkan untuk instalasi `dlx`) dan `pnpm deadcode:unused-files`, yang membandingkan temuan file produksi tidak digunakan dari Knip dengan `scripts/deadcode-unused-files.allowlist.mjs`. Guard file tidak digunakan gagal ketika PR menambahkan file tidak digunakan baru yang belum ditinjau atau meninggalkan entri allowlist usang, sambil mempertahankan permukaan plugin dinamis, generated, build, live-test, dan bridge package yang disengaja yang tidak dapat diselesaikan Knip secara statis. ## Dispatch manual -Dispatch CI manual menjalankan grafik job yang sama seperti CI normal tetapi memaksa setiap lane berscope non-Android aktif: shard Linux Node, shard bundled-plugin, kontrak channel, kompatibilitas Node 22, `check`, `check-additional`, build smoke, pemeriksaan docs, skill Python, Windows, macOS, dan i18n Control UI. Dispatch CI manual mandiri menjalankan Android hanya dengan `include_android=true`; payung rilis penuh mengaktifkan Android dengan meneruskan `include_android=true`. Pemeriksaan statis prerelease Plugin, shard `agentic-plugins` khusus rilis, sweep batch extension penuh, dan lane Docker prerelease Plugin dikecualikan dari CI. Suite Docker prerelease berjalan hanya ketika `Full Release Validation` mendispatch workflow `Plugin Prerelease` terpisah dengan gate release-validation diaktifkan. +Dispatch CI manual menjalankan graph job yang sama seperti CI normal tetapi memaksa setiap lane bercakupan non-Android aktif: shard Linux Node, shard bundled-plugin, kontrak channel, kompatibilitas Node 22, `check`, `check-additional`, build smoke, pemeriksaan docs, Python skills, Windows, macOS, dan i18n Control UI. Dispatch CI manual mandiri menjalankan Android hanya dengan `include_android=true`; payung rilis penuh mengaktifkan Android dengan meneruskan `include_android=true`. Pemeriksaan statis prerelease plugin, shard `agentic-plugins` khusus rilis, sweep batch extension penuh, dan lane Docker prerelease plugin dikecualikan dari CI. Suite Docker prerelease berjalan hanya ketika `Full Release Validation` men-dispatch workflow `Plugin Prerelease` terpisah dengan gate release-validation diaktifkan. -Run manual menggunakan grup konkurensi unik sehingga suite penuh kandidat rilis tidak dibatalkan oleh push atau run PR lain pada ref yang sama. Input opsional `target_ref` memungkinkan pemanggil tepercaya menjalankan grafik itu terhadap branch, tag, atau SHA commit lengkap sambil menggunakan file workflow dari ref dispatch yang dipilih. +Run manual menggunakan grup concurrency unik sehingga full suite kandidat rilis tidak dibatalkan oleh push atau run PR lain pada ref yang sama. Input opsional `target_ref` memungkinkan pemanggil tepercaya menjalankan graph tersebut terhadap branch, tag, atau full commit SHA sambil menggunakan file workflow dari ref dispatch yang dipilih. ```bash gh workflow run ci.yml --ref release/YYYY.M.D @@ -79,15 +79,15 @@ gh workflow run full-release-validation.yml --ref main -f ref= ## Runner -| Runner | Pekerjaan | -| -------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `ubuntu-24.04` | `preflight`, pekerjaan keamanan cepat dan agregat (`security-scm-fast`, `security-dependency-audit`, `security-fast`), pemeriksaan cepat protokol/kontrak/bundel, pemeriksaan kontrak channel yang di-shard, shard `check` kecuali lint, shard dan agregat `check-additional`, pemverifikasi agregat pengujian Node, pemeriksaan docs, Python skills, workflow-sanity, labeler, auto-response; preflight install-smoke juga memakai Ubuntu yang di-host GitHub agar matriks Blacksmith dapat mengantre lebih awal | -| `blacksmith-4vcpu-ubuntu-2404` | `CodeQL Critical Quality`, shard Plugin berbobot lebih rendah, `checks-fast-core`, `checks-node-compat-node22`, `check-prod-types`, dan `check-test-types` | -| `blacksmith-8vcpu-ubuntu-2404` | `build-artifacts`, build-smoke, shard pengujian Node Linux, shard pengujian Plugin bundel, `android` | -| `blacksmith-16vcpu-ubuntu-2404` | `check-lint` (cukup sensitif CPU sehingga 8 vCPU biayanya lebih besar daripada penghematannya); build Docker install-smoke (biaya waktu antrean 32-vCPU lebih besar daripada penghematannya) | -| `blacksmith-16vcpu-windows-2025` | `checks-windows` | -| `blacksmith-6vcpu-macos-latest` | `macos-node` di `openclaw/openclaw`; fork fallback ke `macos-latest` | -| `blacksmith-12vcpu-macos-latest` | `macos-swift` di `openclaw/openclaw`; fork fallback ke `macos-latest` | +| Pelaksana | Pekerjaan | +| -------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `ubuntu-24.04` | `preflight`, pekerjaan keamanan cepat dan agregat (`security-scm-fast`, `security-dependency-audit`, `security-fast`), pemeriksaan protokol/kontrak/terbundel cepat, pemeriksaan kontrak kanal yang dipecah shard, shard `check` kecuali lint, shard dan agregat `check-additional`, pemverifikasi agregat pengujian Node, pemeriksaan dokumentasi, Python skills, workflow-sanity, labeler, auto-response; preflight install-smoke juga memakai Ubuntu yang di-host GitHub agar matriks Blacksmith dapat mengantre lebih awal | +| `blacksmith-4vcpu-ubuntu-2404` | `CodeQL Critical Quality`, shard plugin berbobot lebih rendah, `checks-fast-core`, `checks-node-compat-node22`, `check-prod-types`, dan `check-test-types` | +| `blacksmith-8vcpu-ubuntu-2404` | `build-artifacts`, build-smoke, shard pengujian Node Linux, shard pengujian Plugin terbundel, `android` | +| `blacksmith-16vcpu-ubuntu-2404` | `check-lint` (cukup sensitif terhadap CPU sehingga 8 vCPU lebih mahal daripada penghematan yang diberikan); build Docker install-smoke (waktu antrean 32-vCPU lebih mahal daripada penghematan yang diberikan) | +| `blacksmith-16vcpu-windows-2025` | `checks-windows` | +| `blacksmith-6vcpu-macos-latest` | `macos-node` pada `openclaw/openclaw`; fork kembali memakai `macos-latest` | +| `blacksmith-12vcpu-macos-latest` | `macos-swift` pada `openclaw/openclaw`; fork kembali memakai `macos-latest` | ## Padanan lokal @@ -115,29 +115,29 @@ pnpm test:perf:groups --full-suite --allow-failures --output .artifacts/test-per pnpm test:perf:groups:compare .artifacts/test-perf/baseline-before.json .artifacts/test-perf/after-agent.json ``` -## Validasi Rilis Penuh +## Validasi Rilis Lengkap -`Full Release Validation` adalah alur kerja payung manual untuk "menjalankan semuanya sebelum rilis." Alur ini menerima branch, tag, atau SHA commit lengkap, men-dispatch alur kerja manual `CI` dengan target tersebut, men-dispatch `Plugin Prerelease` untuk pembuktian khusus rilis bagi Plugin/package/static/Docker, dan men-dispatch `OpenClaw Release Checks` untuk install smoke, package acceptance, suite jalur rilis Docker, live/E2E, OpenWebUI, paritas QA Lab, Matrix, dan lane Telegram. Alur ini juga dapat menjalankan alur kerja pascapublikasi `NPM Telegram Beta E2E` ketika spesifikasi package yang sudah dipublikasikan diberikan. +`Full Release Validation` adalah alur kerja payung manual untuk "menjalankan semuanya sebelum rilis." Ini menerima branch, tag, atau SHA commit lengkap, memicu alur kerja `CI` manual dengan target tersebut, memicu `Plugin Prerelease` untuk bukti Plugin/paket/statis/Docker khusus rilis, dan memicu `OpenClaw Release Checks` untuk smoke instalasi, penerimaan paket, rangkaian jalur rilis Docker, live/E2E, OpenWebUI, paritas QA Lab, Matrix, dan lane Telegram. Ini juga dapat menjalankan alur kerja pascapublikasi `NPM Telegram Beta E2E` ketika spesifikasi paket yang telah dipublikasikan disediakan. -`release_profile` mengontrol keluasan live/provider yang diteruskan ke pemeriksaan rilis: +`release_profile` mengendalikan cakupan live/penyedia yang diteruskan ke pemeriksaan rilis: - `minimum` mempertahankan lane OpenAI/core tercepat yang kritis untuk rilis. -- `stable` menambahkan set provider/backend stabil. -- `full` menjalankan matriks provider/media advisory yang luas. +- `stable` menambahkan kumpulan penyedia/backend stabil. +- `full` menjalankan matriks penyedia/media advisory yang luas. -Payung mencatat id run child yang di-dispatch, dan pekerjaan akhir `Verify full validation` memeriksa ulang conclusion run child saat ini dan menambahkan tabel pekerjaan terlambat untuk setiap run child. Jika alur kerja child dijalankan ulang dan menjadi hijau, jalankan ulang hanya pekerjaan verifier induk untuk menyegarkan hasil payung dan ringkasan waktu. +Payung mencatat id run turunan yang dipicu, dan pekerjaan akhir `Verify full validation` memeriksa ulang kesimpulan run turunan saat ini serta menambahkan tabel pekerjaan terlambat untuk setiap run turunan. Jika sebuah alur kerja turunan dijalankan ulang dan menjadi hijau, jalankan ulang hanya pekerjaan pemverifikasi induk untuk menyegarkan hasil payung dan ringkasan waktunya. -Untuk pemulihan, `Full Release Validation` dan `OpenClaw Release Checks` menerima `rerun_group`. Gunakan `all` untuk kandidat rilis, `ci` hanya untuk child CI penuh normal, `release-checks` untuk setiap child rilis, atau grup yang lebih sempit: `install-smoke`, `cross-os`, `live-e2e`, `package`, `qa`, `qa-parity`, `qa-live`, atau `npm-telegram` pada payung. Ini menjaga rerun kotak rilis yang gagal tetap terbatas setelah perbaikan terfokus. +Untuk pemulihan, baik `Full Release Validation` maupun `OpenClaw Release Checks` menerima `rerun_group`. Gunakan `all` untuk kandidat rilis, `ci` hanya untuk turunan CI penuh normal, `release-checks` untuk setiap turunan rilis, atau grup yang lebih sempit: `install-smoke`, `cross-os`, `live-e2e`, `package`, `qa`, `qa-parity`, `qa-live`, atau `npm-telegram` pada payung. Ini menjaga agar run ulang kotak rilis yang gagal tetap terbatas setelah perbaikan terfokus. -`OpenClaw Release Checks` memakai ref alur kerja tepercaya untuk me-resolve ref yang dipilih sekali menjadi tarball `release-package-under-test`, lalu meneruskan artefak itu ke alur kerja Docker live/E2E jalur rilis dan shard package acceptance. Ini menjaga byte package tetap konsisten di seluruh kotak rilis dan menghindari pemaketan ulang kandidat yang sama di beberapa pekerjaan child. +`OpenClaw Release Checks` memakai ref alur kerja tepercaya untuk menyelesaikan ref yang dipilih sekali menjadi tarball `release-package-under-test`, lalu meneruskan artefak itu ke alur kerja Docker jalur rilis live/E2E dan shard penerimaan paket. Ini menjaga byte paket tetap konsisten di seluruh kotak rilis dan menghindari pengemasan ulang kandidat yang sama di beberapa pekerjaan turunan. ## Shard live dan E2E -Child live/E2E rilis mempertahankan cakupan luas `pnpm test:live` native, tetapi menjalankannya sebagai shard bernama melalui `scripts/test-live-shard.mjs`, bukan satu pekerjaan serial: +Turunan live/E2E rilis mempertahankan cakupan `pnpm test:live` native yang luas, tetapi menjalankannya sebagai shard bernama melalui `scripts/test-live-shard.mjs` alih-alih satu pekerjaan serial: - `native-live-src-agents` - `native-live-src-gateway-core` -- pekerjaan `native-live-src-gateway-profiles` yang difilter provider +- pekerjaan `native-live-src-gateway-profiles` yang difilter penyedia - `native-live-src-gateway-backends` - `native-live-test` - `native-live-extensions-a-k` @@ -145,57 +145,57 @@ Child live/E2E rilis mempertahankan cakupan luas `pnpm test:live` native, tetapi - `native-live-extensions-openai` - `native-live-extensions-o-z-other` - `native-live-extensions-xai` -- shard media audio/video terpisah dan shard musik yang difilter provider +- shard media audio/video terpisah dan shard musik yang difilter penyedia -Ini mempertahankan cakupan file yang sama sekaligus membuat kegagalan provider live yang lambat lebih mudah dijalankan ulang dan didiagnosis. Nama shard agregat `native-live-extensions-o-z`, `native-live-extensions-media`, dan `native-live-extensions-media-music` tetap valid untuk rerun sekali jalan manual. +Ini mempertahankan cakupan file yang sama sambil membuat kegagalan penyedia live yang lambat lebih mudah dijalankan ulang dan didiagnosis. Nama shard agregat `native-live-extensions-o-z`, `native-live-extensions-media`, dan `native-live-extensions-media-music` tetap valid untuk run ulang manual sekali jalan. -Shard media live native berjalan di `ghcr.io/openclaw/openclaw-live-media-runner:ubuntu-24.04`, yang dibangun oleh alur kerja `Live Media Runner Image`. Image tersebut sudah memasang `ffmpeg` dan `ffprobe`; pekerjaan media hanya memverifikasi binary sebelum setup. Pertahankan suite live berbasis Docker pada runner Blacksmith normal — pekerjaan container bukan tempat yang tepat untuk meluncurkan pengujian Docker bersarang. +Shard media live native berjalan di `ghcr.io/openclaw/openclaw-live-media-runner:ubuntu-24.04`, yang dibuat oleh alur kerja `Live Media Runner Image`. Image itu memasang `ffmpeg` dan `ffprobe` sebelumnya; pekerjaan media hanya memverifikasi biner sebelum penyiapan. Pertahankan rangkaian live berbasis Docker pada runner Blacksmith normal — pekerjaan kontainer bukan tempat yang tepat untuk meluncurkan pengujian Docker bersarang. -Shard model/backend live berbasis Docker memakai image bersama terpisah `ghcr.io/openclaw/openclaw-live-test:` per commit yang dipilih. Alur kerja rilis live membangun dan mendorong image tersebut sekali, lalu shard model live Docker, Gateway, backend CLI, bind ACP, dan harness Codex berjalan dengan `OPENCLAW_SKIP_DOCKER_BUILD=1`. Jika shard tersebut membangun ulang target Docker sumber lengkap secara independen, run rilis salah konfigurasi dan akan membuang waktu berjalan untuk build image duplikat. +Shard model/backend live berbasis Docker memakai image bersama terpisah `ghcr.io/openclaw/openclaw-live-test:` per commit yang dipilih. Alur kerja rilis live membuat dan mendorong image itu sekali, lalu shard model live Docker, Gateway, backend CLI, bind ACP, dan harness Codex berjalan dengan `OPENCLAW_SKIP_DOCKER_BUILD=1`. Jika shard tersebut membangun ulang target Docker sumber penuh secara independen, run rilis salah dikonfigurasi dan akan membuang waktu dinding untuk build image duplikat. -## Package Acceptance +## Penerimaan Paket -Gunakan `Package Acceptance` ketika pertanyaannya adalah "apakah package OpenClaw yang dapat diinstal ini berfungsi sebagai produk?" Ini berbeda dari CI normal: CI normal memvalidasi pohon sumber, sedangkan package acceptance memvalidasi satu tarball melalui harness Docker E2E yang sama yang digunakan pengguna setelah instalasi atau pembaruan. +Gunakan `Package Acceptance` ketika pertanyaannya adalah "apakah paket OpenClaw yang dapat diinstal ini berfungsi sebagai produk?" Ini berbeda dari CI normal: CI normal memvalidasi pohon sumber, sedangkan penerimaan paket memvalidasi satu tarball melalui harness Docker E2E yang sama yang digunakan pengguna setelah instalasi atau pembaruan. ### Pekerjaan -1. `resolve_package` melakukan checkout `workflow_ref`, me-resolve satu kandidat package, menulis `.artifacts/docker-e2e-package/openclaw-current.tgz`, menulis `.artifacts/docker-e2e-package/package-candidate.json`, mengunggah keduanya sebagai artefak `package-under-test`, dan mencetak sumber, ref alur kerja, ref package, versi, SHA-256, dan profil dalam ringkasan langkah GitHub. -2. `docker_acceptance` memanggil `openclaw-live-and-e2e-checks-reusable.yml` dengan `ref=workflow_ref` dan `package_artifact_name=package-under-test`. Alur kerja reusable mengunduh artefak itu, memvalidasi inventaris tarball, menyiapkan image Docker package-digest bila diperlukan, dan menjalankan lane Docker yang dipilih terhadap package tersebut alih-alih memaketkan checkout alur kerja. Ketika suatu profil memilih beberapa `docker_lanes` bertarget, alur kerja reusable menyiapkan package dan image bersama sekali, lalu menyebarkan lane tersebut sebagai pekerjaan Docker bertarget paralel dengan artefak unik. -3. `package_telegram` secara opsional memanggil `NPM Telegram Beta E2E`. Ini berjalan ketika `telegram_mode` bukan `none` dan memasang artefak `package-under-test` yang sama ketika Package Acceptance me-resolve satu; dispatch Telegram mandiri tetap dapat memasang spesifikasi npm yang telah dipublikasikan. -4. `summary` menggagalkan alur kerja jika resolusi package, Docker acceptance, atau lane Telegram opsional gagal. +1. `resolve_package` melakukan checkout `workflow_ref`, menyelesaikan satu kandidat paket, menulis `.artifacts/docker-e2e-package/openclaw-current.tgz`, menulis `.artifacts/docker-e2e-package/package-candidate.json`, mengunggah keduanya sebagai artefak `package-under-test`, dan mencetak sumber, ref alur kerja, ref paket, versi, SHA-256, dan profil dalam ringkasan langkah GitHub. +2. `docker_acceptance` memanggil `openclaw-live-and-e2e-checks-reusable.yml` dengan `ref=workflow_ref` dan `package_artifact_name=package-under-test`. Alur kerja yang dapat digunakan ulang mengunduh artefak itu, memvalidasi inventaris tarball, menyiapkan image Docker digest paket saat diperlukan, dan menjalankan lane Docker yang dipilih terhadap paket itu alih-alih mengemas checkout alur kerja. Ketika sebuah profil memilih beberapa `docker_lanes` tertarget, alur kerja yang dapat digunakan ulang menyiapkan paket dan image bersama sekali, lalu menyebarkan lane tersebut sebagai pekerjaan Docker tertarget paralel dengan artefak unik. +3. `package_telegram` secara opsional memanggil `NPM Telegram Beta E2E`. Ini berjalan ketika `telegram_mode` bukan `none` dan memasang artefak `package-under-test` yang sama ketika Package Acceptance menyelesaikan satu paket; dispatch Telegram mandiri masih dapat memasang spesifikasi npm yang dipublikasikan. +4. `summary` menggagalkan alur kerja jika resolusi paket, penerimaan Docker, atau lane Telegram opsional gagal. ### Sumber kandidat -- `source=npm` hanya menerima `openclaw@beta`, `openclaw@latest`, atau versi rilis OpenClaw yang persis seperti `openclaw@2026.4.27-beta.2`. Gunakan ini untuk penerimaan beta/stabil yang telah dipublikasikan. -- `source=ref` mengemas cabang, tag, atau SHA commit penuh `package_ref` tepercaya. Resolver mengambil cabang/tag OpenClaw, memverifikasi bahwa commit yang dipilih dapat dijangkau dari riwayat cabang repositori atau tag rilis, menginstal dependensi di worktree terpisah, dan mengemasnya dengan `scripts/package-openclaw-for-docker.mjs`. +- `source=npm` hanya menerima `openclaw@beta`, `openclaw@latest`, atau versi rilis OpenClaw yang persis seperti `openclaw@2026.4.27-beta.2`. Gunakan ini untuk penerimaan beta/stabil yang dipublikasikan. +- `source=ref` mengemas branch, tag, atau SHA commit lengkap `package_ref` yang tepercaya. Resolver mengambil branch/tag OpenClaw, memverifikasi commit yang dipilih dapat dijangkau dari riwayat branch repositori atau tag rilis, menginstal dependensi di worktree terlepas, dan mengemasnya dengan `scripts/package-openclaw-for-docker.mjs`. - `source=url` mengunduh `.tgz` HTTPS; `package_sha256` wajib. -- `source=artifact` mengunduh satu `.tgz` dari `artifact_run_id` dan `artifact_name`; `package_sha256` opsional tetapi sebaiknya disediakan untuk artefak yang dibagikan secara eksternal. +- `source=artifact` mengunduh satu `.tgz` dari `artifact_run_id` dan `artifact_name`; `package_sha256` opsional tetapi sebaiknya disediakan untuk artifact yang dibagikan secara eksternal. -Pisahkan `workflow_ref` dan `package_ref`. `workflow_ref` adalah kode workflow/harness tepercaya yang menjalankan pengujian. `package_ref` adalah commit sumber yang dikemas ketika `source=ref`. Ini memungkinkan harness pengujian saat ini memvalidasi commit sumber tepercaya yang lebih lama tanpa menjalankan logika workflow lama. +Pisahkan `workflow_ref` dan `package_ref`. `workflow_ref` adalah kode workflow/harness tepercaya yang menjalankan pengujian. `package_ref` adalah commit sumber yang dikemas saat `source=ref`. Ini memungkinkan harness pengujian saat ini memvalidasi commit sumber tepercaya yang lebih lama tanpa menjalankan logika workflow lama. ### Profil suite - `smoke` — `npm-onboard-channel-agent`, `gateway-network`, `config-reload` -- `package` — `npm-onboard-channel-agent`, `doctor-switch`, `update-channel-switch`, `bundled-channel-deps-compat`, `plugins-offline`, `plugin-update` +- `package` — `npm-onboard-channel-agent`, `doctor-switch`, `update-channel-switch`, `upgrade-survivor`, `bundled-channel-deps-compat`, `plugins-offline`, `plugin-update` - `product` — `package` ditambah `mcp-channels`, `cron-mcp-cleanup`, `openai-web-search-minimal`, `openwebui` -- `full` — chunk jalur rilis Docker lengkap dengan OpenWebUI -- `custom` — `docker_lanes` persis; wajib ketika `suite_profile=custom` +- `full` — chunk jalur rilis Docker penuh dengan OpenWebUI +- `custom` — `docker_lanes` persis; wajib saat `suite_profile=custom` -Profil `package` menggunakan cakupan Plugin offline sehingga validasi paket yang dipublikasikan tidak bergantung pada ketersediaan ClawHub live. Lane Telegram opsional menggunakan kembali artefak `package-under-test` di `NPM Telegram Beta E2E`, dengan jalur spesifikasi npm yang dipublikasikan tetap tersedia untuk dispatch mandiri. +Profil `package` menggunakan cakupan Plugin offline sehingga validasi paket yang dipublikasikan tidak bergantung pada ketersediaan ClawHub live. Lane Telegram opsional menggunakan kembali artifact `package-under-test` di `NPM Telegram Beta E2E`, dengan jalur spesifikasi npm yang dipublikasikan tetap dipertahankan untuk dispatch mandiri. -Pemeriksaan rilis memanggil Package Acceptance dengan `source=ref`, `package_ref=`, `workflow_ref=`, `suite_profile=custom`, `docker_lanes='bundled-channel-deps-compat plugins-offline'`, dan `telegram_mode=mock-openai`. Chunk Docker jalur rilis mencakup lane paket/update/Plugin yang tumpang tindih; Package Acceptance mempertahankan bukti kompatibilitas bundled-channel native artefak, Plugin offline, dan Telegram terhadap tarball paket terselesaikan yang sama. Pemeriksaan rilis lintas OS tetap mencakup onboarding, installer, dan perilaku platform spesifik OS; validasi produk paket/update harus dimulai dengan Package Acceptance. Lane paket Windows dan installer fresh juga memverifikasi bahwa paket yang terinstal dapat mengimpor override browser-control dari jalur Windows absolut mentah. Smoke agent-turn lintas OS OpenAI memakai default `OPENCLAW_CROSS_OS_OPENAI_MODEL` ketika disetel, jika tidak `openai/gpt-5.4-mini`, sehingga bukti instalasi dan Gateway tetap cepat dan deterministik. +Pemeriksaan rilis memanggil Package Acceptance dengan `source=ref`, `package_ref=`, `workflow_ref=`, `suite_profile=custom`, `docker_lanes='bundled-channel-deps-compat plugins-offline'`, dan `telegram_mode=mock-openai`. Chunk Docker jalur rilis mencakup lane paket/pembaruan/Plugin yang tumpang tindih; Package Acceptance mempertahankan bukti kompatibilitas bundled-channel native artifact, Plugin offline, dan Telegram terhadap tarball paket terselesaikan yang sama. Pemeriksaan rilis lintas OS tetap mencakup onboarding, penginstal, dan perilaku platform yang spesifik OS; validasi produk paket/pembaruan harus dimulai dengan Package Acceptance. Lane paket Windows dan fresh penginstal juga memverifikasi bahwa paket terinstal dapat mengimpor override kontrol browser dari path Windows absolut mentah. Smoke agent-turn lintas OS OpenAI menggunakan default `OPENCLAW_CROSS_OS_OPENAI_MODEL` saat disetel, jika tidak `openai/gpt-5.4-mini`, sehingga bukti install dan Gateway tetap cepat dan deterministik. -### Jendela kompatibilitas lama +### Jendela kompatibilitas warisan -Package Acceptance memiliki jendela kompatibilitas lama terbatas untuk paket yang sudah dipublikasikan. Paket hingga `2026.4.25`, termasuk `2026.4.25-beta.*`, dapat menggunakan jalur kompatibilitas: +Package Acceptance memiliki jendela kompatibilitas warisan terbatas untuk paket yang sudah dipublikasikan. Paket hingga `2026.4.25`, termasuk `2026.4.25-beta.*`, dapat menggunakan jalur kompatibilitas: - entri QA privat yang dikenal di `dist/postinstall-inventory.json` dapat menunjuk ke file yang dihilangkan dari tarball; -- `doctor-switch` dapat melewati subkasus persistensi `gateway install --wrapper` ketika paket tidak mengekspos flag tersebut; -- `update-channel-switch` dapat memangkas `pnpm.patchedDependencies` yang hilang dari fixture git palsu turunan tarball dan dapat mencatat `update.channel` yang dipersistenkan hilang; -- smoke Plugin dapat membaca lokasi install-record lama atau menerima persistensi install-record marketplace yang hilang; -- `plugin-update` dapat mengizinkan migrasi metadata konfigurasi sambil tetap mewajibkan install record dan perilaku tanpa reinstall tetap tidak berubah. +- `doctor-switch` dapat melewati subkasus persistensi `gateway install --wrapper` saat paket tidak mengekspos flag tersebut; +- `update-channel-switch` dapat memangkas `pnpm.patchedDependencies` yang hilang dari fixture git palsu turunan tarball dan dapat mencatat `update.channel` tersimpan yang hilang; +- smoke Plugin dapat membaca lokasi catatan install warisan atau menerima persistensi catatan install marketplace yang hilang; +- `plugin-update` dapat mengizinkan migrasi metadata konfigurasi sambil tetap mewajibkan catatan install dan perilaku tanpa reinstall tetap tidak berubah. -Paket `2026.4.26` yang dipublikasikan juga dapat memberi peringatan untuk file cap metadata build lokal yang sudah dikirimkan. Paket berikutnya harus memenuhi kontrak modern; kondisi yang sama akan gagal, bukan memberi peringatan atau dilewati. +Paket `2026.4.26` yang dipublikasikan juga dapat memberi peringatan untuk file stempel metadata build lokal yang sudah dikirimkan. Paket yang lebih baru harus memenuhi kontrak modern; kondisi yang sama akan gagal, bukan memperingatkan atau melewati. ### Contoh @@ -238,111 +238,111 @@ gh workflow run package-acceptance.yml \ -f docker_lanes='install-e2e plugin-update' ``` -Saat men-debug run package acceptance yang gagal, mulai dari ringkasan `resolve_package` untuk mengonfirmasi sumber paket, versi, dan SHA-256. Lalu periksa run anak `docker_acceptance` dan artefak Docker-nya: `.artifacts/docker-tests/**/summary.json`, `failures.json`, log lane, timing fase, dan perintah rerun. Lebih baik menjalankan ulang profil paket yang gagal atau lane Docker persis daripada menjalankan ulang validasi rilis penuh. +Saat men-debug run penerimaan paket yang gagal, mulai dari ringkasan `resolve_package` untuk mengonfirmasi sumber paket, versi, dan SHA-256. Lalu periksa child run `docker_acceptance` dan artifact Docker-nya: `.artifacts/docker-tests/**/summary.json`, `failures.json`, log lane, timing fase, dan perintah rerun. Lebih baik menjalankan ulang profil paket yang gagal atau lane Docker yang persis daripada menjalankan ulang validasi rilis penuh. -## Smoke instalasi +## Smoke install -Workflow `Install Smoke` terpisah menggunakan kembali skrip scope yang sama melalui job `preflight` miliknya sendiri. Workflow ini membagi cakupan smoke menjadi `run_fast_install_smoke` dan `run_full_install_smoke`. +Workflow `Install Smoke` yang terpisah menggunakan kembali skrip cakupan yang sama melalui job `preflight` miliknya. Workflow ini membagi cakupan smoke menjadi `run_fast_install_smoke` dan `run_full_install_smoke`. -- **Jalur cepat** berjalan untuk pull request yang menyentuh permukaan Docker/paket, perubahan paket/manifest Plugin bawaan, atau permukaan inti Plugin/channel/Gateway/Plugin SDK yang diuji oleh job smoke Docker. Perubahan Plugin bawaan khusus sumber, edit khusus pengujian, dan edit khusus docs tidak memesan worker Docker. Jalur cepat membangun image Dockerfile root sekali, memeriksa CLI, menjalankan smoke CLI agents delete shared-workspace, menjalankan e2e container gateway-network, memverifikasi arg build ekstensi bawaan, dan menjalankan profil Docker Plugin bawaan terbatas di bawah timeout perintah agregat 240 detik (setiap run Docker skenario dibatasi secara terpisah). -- **Jalur penuh** mempertahankan instalasi paket QR dan cakupan Docker/update installer untuk run terjadwal nightly, dispatch manual, pemeriksaan rilis workflow-call, dan pull request yang benar-benar menyentuh permukaan installer/paket/Docker. Dalam mode penuh, install-smoke menyiapkan atau menggunakan kembali satu image smoke Dockerfile root GHCR target-SHA, lalu menjalankan instalasi paket QR, smoke Dockerfile/Gateway root, smoke installer/update, dan E2E Docker Plugin bawaan cepat sebagai job terpisah sehingga pekerjaan installer tidak menunggu di belakang smoke image root. +- **Jalur cepat** berjalan untuk pull request yang menyentuh permukaan Docker/paket, perubahan paket/manifest Plugin bawaan, atau permukaan Plugin/channel/Gateway/Plugin SDK inti yang dijalankan oleh job smoke Docker. Perubahan Plugin bawaan khusus sumber, edit khusus pengujian, dan edit khusus docs tidak memesan worker Docker. Jalur cepat membangun image Dockerfile root sekali, memeriksa CLI, menjalankan smoke CLI agents delete shared-workspace, menjalankan e2e container gateway-network, memverifikasi arg build ekstensi bawaan, dan menjalankan profil Docker Plugin bawaan terbatas dengan batas waktu perintah agregat 240 detik (setiap Docker run skenario dibatasi secara terpisah). +- **Jalur penuh** mempertahankan cakupan install paket QR dan Docker/pembaruan penginstal untuk run terjadwal malam, dispatch manual, pemeriksaan rilis workflow-call, dan pull request yang benar-benar menyentuh permukaan penginstal/paket/Docker. Dalam mode penuh, install-smoke menyiapkan atau menggunakan kembali satu image smoke Dockerfile root GHCR target-SHA, lalu menjalankan install paket QR, smoke Dockerfile root/Gateway, smoke penginstal/pembaruan, dan E2E Docker Plugin bawaan cepat sebagai job terpisah agar pekerjaan penginstal tidak menunggu di belakang smoke image root. -Push `main` (termasuk merge commit) tidak memaksa jalur penuh; ketika logika changed-scope meminta cakupan penuh pada push, workflow mempertahankan smoke Docker cepat dan menyerahkan smoke instalasi penuh ke validasi nightly atau rilis. +Push `main` (termasuk merge commit) tidak memaksa jalur penuh; saat logika cakupan perubahan akan meminta cakupan penuh pada push, workflow mempertahankan smoke Docker cepat dan menyerahkan smoke install penuh ke validasi malam atau rilis. -Smoke image-provider instalasi global Bun yang lambat digate secara terpisah oleh `run_bun_global_install_smoke`. Ini berjalan pada jadwal nightly dan dari workflow pemeriksaan rilis, dan dispatch manual `Install Smoke` dapat memilih untuk menyertakannya, tetapi pull request dan push `main` tidak. Pengujian Docker QR dan installer mempertahankan Dockerfile khusus instalasi masing-masing. +Smoke image-provider install global Bun yang lambat digate secara terpisah oleh `run_bun_global_install_smoke`. Ini berjalan pada jadwal malam dan dari workflow pemeriksaan rilis, dan dispatch manual `Install Smoke` dapat ikut mengaktifkannya, tetapi pull request dan push `main` tidak. Pengujian Docker QR dan penginstal mempertahankan Dockerfile berfokus install masing-masing. ## E2E Docker lokal `pnpm test:docker:all` melakukan prebuild satu image live-test bersama, mengemas OpenClaw sekali sebagai tarball npm, dan membangun dua image `scripts/e2e/Dockerfile` bersama: -- runner Node/Git polos untuk lane installer/update/dependensi-Plugin; +- runner Node/Git polos untuk lane penginstal/pembaruan/dependensi-Plugin; - image fungsional yang menginstal tarball yang sama ke `/app` untuk lane fungsionalitas normal. -Definisi lane Docker berada di `scripts/lib/docker-e2e-scenarios.mjs`, logika planner berada di `scripts/lib/docker-e2e-plan.mjs`, dan runner hanya mengeksekusi plan yang dipilih. Scheduler memilih image per lane dengan `OPENCLAW_DOCKER_E2E_BARE_IMAGE` dan `OPENCLAW_DOCKER_E2E_FUNCTIONAL_IMAGE`, lalu menjalankan lane dengan `OPENCLAW_SKIP_DOCKER_BUILD=1`. +Definisi lane Docker berada di `scripts/lib/docker-e2e-scenarios.mjs`, logika planner berada di `scripts/lib/docker-e2e-plan.mjs`, dan runner hanya menjalankan plan yang dipilih. Scheduler memilih image per lane dengan `OPENCLAW_DOCKER_E2E_BARE_IMAGE` dan `OPENCLAW_DOCKER_E2E_FUNCTIONAL_IMAGE`, lalu menjalankan lane dengan `OPENCLAW_SKIP_DOCKER_BUILD=1`. -### Tuning +### Pengaturan -| Variabel | Default | Tujuan | +| Variabel | Default | Tujuan | | -------------------------------------- | ------- | --------------------------------------------------------------------------------------------- | -| `OPENCLAW_DOCKER_ALL_PARALLELISM` | 10 | Jumlah slot main-pool untuk lane normal. | +| `OPENCLAW_DOCKER_ALL_PARALLELISM` | 10 | Jumlah slot pool utama untuk lane normal. | | `OPENCLAW_DOCKER_ALL_TAIL_PARALLELISM` | 10 | Jumlah slot tail-pool yang sensitif terhadap provider. | | `OPENCLAW_DOCKER_ALL_LIVE_LIMIT` | 9 | Batas lane live serentak agar provider tidak melakukan throttle. | -| `OPENCLAW_DOCKER_ALL_NPM_LIMIT` | 10 | Batas lane instalasi npm serentak. | -| `OPENCLAW_DOCKER_ALL_SERVICE_LIMIT` | 7 | Batas lane multi-service serentak. | -| `OPENCLAW_DOCKER_ALL_START_STAGGER_MS` | 2000 | Jeda bertahap antar-start lane untuk menghindari badai create daemon Docker; setel `0` untuk tanpa jeda bertahap. | -| `OPENCLAW_DOCKER_ALL_LANE_TIMEOUT_MS` | 7200000 | Timeout fallback per lane (120 menit); lane live/tail terpilih memakai batas yang lebih ketat. | +| `OPENCLAW_DOCKER_ALL_NPM_LIMIT` | 10 | Batas lane install npm serentak. | +| `OPENCLAW_DOCKER_ALL_SERVICE_LIMIT` | 7 | Batas lane multi-layanan serentak. | +| `OPENCLAW_DOCKER_ALL_START_STAGGER_MS` | 2000 | Jeda antar-start lane untuk menghindari lonjakan create daemon Docker; setel `0` untuk tanpa jeda. | +| `OPENCLAW_DOCKER_ALL_LANE_TIMEOUT_MS` | 7200000 | Timeout fallback per lane (120 menit); lane live/tail tertentu menggunakan batas lebih ketat. | | `OPENCLAW_DOCKER_ALL_DRY_RUN` | unset | `1` mencetak plan scheduler tanpa menjalankan lane. | -| `OPENCLAW_DOCKER_ALL_LANES` | unset | Daftar lane persis yang dipisahkan koma; melewati cleanup smoke agar agent dapat mereproduksi satu lane yang gagal. | +| `OPENCLAW_DOCKER_ALL_LANES` | unset | Daftar lane persis yang dipisahkan koma; melewati smoke cleanup agar agent dapat mereproduksi satu lane yang gagal. | -Lane yang lebih berat dari batas efektifnya tetap dapat dimulai dari pool kosong, lalu berjalan sendiri hingga melepas kapasitas. Preflight agregat lokal memeriksa Docker, menghapus container E2E OpenClaw yang usang, menampilkan status lane aktif, mempersistenkan timing lane untuk pengurutan yang terlama lebih dulu, dan secara default berhenti menjadwalkan lane pooled baru setelah kegagalan pertama. +Lane yang lebih berat daripada batas efektifnya tetap dapat dimulai dari pool kosong, lalu berjalan sendiri hingga melepas kapasitas. Agregat lokal melakukan preflight Docker, menghapus container E2E OpenClaw usang, mengeluarkan status lane aktif, menyimpan timing lane untuk pengurutan terlama-terlebih-dahulu, dan secara default berhenti menjadwalkan lane pool baru setelah kegagalan pertama. -### Workflow live/E2E yang dapat digunakan kembali +### Workflow live/E2E yang dapat digunakan ulang -Workflow live/E2E yang dapat digunakan kembali menanyakan `scripts/test-docker-all.mjs --plan-json` tentang paket, jenis image, image live, lane, dan cakupan kredensial yang diperlukan. `scripts/docker-e2e.mjs` lalu mengonversi plan tersebut menjadi output dan ringkasan GitHub. Workflow ini mengemas OpenClaw melalui `scripts/package-openclaw-for-docker.mjs`, mengunduh artefak paket current-run, atau mengunduh artefak paket dari `package_artifact_run_id`; memvalidasi inventaris tarball; membangun dan mendorong image E2E Docker GHCR bare/functional bertag digest paket melalui cache layer Docker Blacksmith ketika plan membutuhkan lane dengan paket terinstal; dan menggunakan kembali input `docker_e2e_bare_image`/`docker_e2e_functional_image` yang disediakan atau image digest paket yang ada alih-alih membangun ulang. Pull image Docker dicoba ulang dengan timeout terbatas 180 detik per percobaan sehingga stream registry/cache yang macet cepat dicoba ulang alih-alih menghabiskan sebagian besar jalur kritis CI. +Workflow live/E2E yang dapat digunakan ulang menanyakan ke `scripts/test-docker-all.mjs --plan-json` paket, jenis image, image live, lane, dan cakupan kredensial apa yang diperlukan. `scripts/docker-e2e.mjs` lalu mengonversi plan tersebut menjadi output dan ringkasan GitHub. Workflow ini mengemas OpenClaw melalui `scripts/package-openclaw-for-docker.mjs`, mengunduh artifact paket run saat ini, atau mengunduh artifact paket dari `package_artifact_run_id`; memvalidasi inventaris tarball; membangun dan mendorong image E2E Docker GHCR bare/fungsional bertag digest paket melalui cache layer Docker Blacksmith saat plan memerlukan lane dengan paket terinstal; dan menggunakan kembali input `docker_e2e_bare_image`/`docker_e2e_functional_image` yang disediakan atau image digest paket yang sudah ada alih-alih membangun ulang. Pull image Docker dicoba ulang dengan timeout terbatas 180 detik per percobaan sehingga stream registry/cache yang macet dicoba ulang dengan cepat alih-alih menghabiskan sebagian besar jalur kritis CI. ### Chunk jalur rilis -Cakupan Docker rilis menjalankan job chunk yang lebih kecil dengan `OPENCLAW_SKIP_DOCKER_BUILD=1` sehingga setiap chunk hanya menarik jenis image yang dibutuhkan dan mengeksekusi beberapa lane melalui scheduler berbobot yang sama: +Cakupan Docker rilis menjalankan job chunk yang lebih kecil dengan `OPENCLAW_SKIP_DOCKER_BUILD=1` sehingga setiap chunk hanya menarik jenis image yang dibutuhkan dan menjalankan beberapa lane melalui scheduler berbobot yang sama: - `OPENCLAW_DOCKER_ALL_PROFILE=release-path` - `OPENCLAW_DOCKER_ALL_CHUNK=core | package-update-openai | package-update-anthropic | package-update-core | plugins-runtime-plugins | plugins-runtime-services | plugins-runtime-install-a..h | bundled-channels` -Chunk Docker rilis saat ini adalah `core`, `package-update-openai`, `package-update-anthropic`, `package-update-core`, `plugins-runtime-plugins`, `plugins-runtime-services`, `plugins-runtime-install-a` hingga `plugins-runtime-install-h`, `bundled-channels-core`, `bundled-channels-update-a`, `bundled-channels-update-discord`, `bundled-channels-update-b`, dan `bundled-channels-contracts`. Chunk agregat `bundled-channels` tetap tersedia untuk rerun manual sekali jalan, dan `plugins-runtime-core`, `plugins-runtime`, serta `plugins-integrations` tetap menjadi alias Plugin/runtime agregat. Alias lane `install-e2e` tetap menjadi alias rerun manual agregat untuk kedua lane penginstal provider. Chunk `bundled-channels` menjalankan lane `bundled-channel-*` dan `bundled-channel-update-*` yang dipecah, bukan lane `bundled-channel-deps` serial yang serba menjadi satu. +Potongan Docker rilis saat ini adalah `core`, `package-update-openai`, `package-update-anthropic`, `package-update-core`, `plugins-runtime-plugins`, `plugins-runtime-services`, `plugins-runtime-install-a` hingga `plugins-runtime-install-h`, `bundled-channels-core`, `bundled-channels-update-a`, `bundled-channels-update-discord`, `bundled-channels-update-b`, dan `bundled-channels-contracts`. Potongan agregat `bundled-channels` tetap tersedia untuk pengulangan manual satu kali, dan `plugins-runtime-core`, `plugins-runtime`, serta `plugins-integrations` tetap menjadi alias Plugin/runtime agregat. Alias lane `install-e2e` tetap menjadi alias pengulangan manual agregat untuk kedua lane penginstal penyedia. Potongan `bundled-channels` menjalankan lane `bundled-channel-*` dan `bundled-channel-update-*` yang dipecah, bukan lane serial serba-satu `bundled-channel-deps`. -OpenWebUI digabungkan ke dalam `plugins-runtime-services` saat cakupan jalur rilis penuh memintanya, dan mempertahankan chunk mandiri `openwebui` hanya untuk dispatch khusus OpenWebUI. Lane pembaruan bundled-channel mencoba ulang sekali untuk kegagalan jaringan npm sementara. +OpenWebUI digabungkan ke dalam `plugins-runtime-services` saat cakupan jalur rilis penuh memintanya, dan mempertahankan potongan mandiri `openwebui` hanya untuk dispatch khusus OpenWebUI. Lane pembaruan channel bawaan mencoba ulang sekali untuk kegagalan jaringan npm yang sementara. -Setiap chunk mengunggah `.artifacts/docker-tests/` dengan log lane, timing, `summary.json`, `failures.json`, timing fase, JSON rencana penjadwal, tabel lane lambat, dan perintah rerun per lane. Input alur kerja `docker_lanes` menjalankan lane yang dipilih terhadap image yang disiapkan, bukan job chunk, sehingga debugging lane gagal tetap terbatas pada satu job Docker tertarget dan menyiapkan, mengunduh, atau menggunakan ulang artefak paket untuk run tersebut; jika lane yang dipilih adalah lane Docker live, job tertarget membangun image live-test secara lokal untuk rerun tersebut. Perintah rerun GitHub per lane yang dihasilkan menyertakan `package_artifact_run_id`, `package_artifact_name`, dan input image yang disiapkan saat nilai tersebut ada, sehingga lane yang gagal dapat menggunakan ulang paket dan image persis dari run yang gagal. +Setiap potongan mengunggah `.artifacts/docker-tests/` dengan log lane, pengukuran waktu, `summary.json`, `failures.json`, pengukuran waktu fase, JSON rencana scheduler, tabel lane lambat, dan perintah pengulangan per lane. Input `docker_lanes` workflow menjalankan lane yang dipilih terhadap image yang sudah disiapkan, bukan job potongan, sehingga debug lane yang gagal tetap terbatas pada satu job Docker yang ditargetkan dan menyiapkan, mengunduh, atau menggunakan ulang artefak paket untuk run tersebut; jika lane yang dipilih adalah lane Docker live, job yang ditargetkan membangun image uji live secara lokal untuk pengulangan itu. Perintah pengulangan GitHub per lane yang dihasilkan menyertakan `package_artifact_run_id`, `package_artifact_name`, dan input image yang disiapkan saat nilai-nilai tersebut ada, sehingga lane yang gagal dapat menggunakan ulang paket dan image persis dari run yang gagal. ```bash pnpm test:docker:rerun # download Docker artifacts and print combined/per-lane targeted rerun commands pnpm test:docker:timings # slow-lane and phase critical-path summaries ``` -Alur kerja live/E2E terjadwal menjalankan suite Docker jalur rilis penuh setiap hari. +Workflow live/E2E terjadwal menjalankan suite Docker jalur rilis penuh setiap hari. ## Prarilis Plugin -`Plugin Prerelease` adalah cakupan produk/paket yang lebih mahal, jadi ini adalah alur kerja terpisah yang di-dispatch oleh `Full Release Validation` atau oleh operator eksplisit. Pull request normal, push `main`, dan dispatch CI manual mandiri membiarkan suite tersebut nonaktif. Suite ini menyeimbangkan pengujian Plugin bawaan di delapan worker ekstensi; job shard ekstensi tersebut menjalankan hingga dua grup konfigurasi Plugin sekaligus dengan satu worker Vitest per grup dan heap Node yang lebih besar agar batch Plugin yang berat impor tidak membuat job CI tambahan. +`Plugin Prerelease` adalah cakupan produk/paket yang lebih mahal, sehingga menjadi workflow terpisah yang di-dispatch oleh `Full Release Validation` atau oleh operator eksplisit. Pull request normal, push `main`, dan dispatch CI manual mandiri tidak menjalankan suite tersebut. Workflow ini menyeimbangkan pengujian Plugin bawaan di delapan worker ekstensi; job shard ekstensi tersebut menjalankan hingga dua grup konfigurasi Plugin sekaligus dengan satu worker Vitest per grup dan heap Node yang lebih besar agar batch Plugin yang berat impor tidak membuat job CI tambahan. ## QA Lab -QA Lab memiliki lane CI khusus di luar alur kerja utama yang dicakup secara cerdas. +QA Lab memiliki lane CI khusus di luar workflow utama yang dicakup cerdas. -- Alur kerja `Parity gate` berjalan pada perubahan PR yang cocok dan dispatch manual; alur kerja ini membangun runtime QA privat dan membandingkan pack agentik mock GPT-5.5 dan Opus 4.6. -- Alur kerja `QA-Lab - All Lanes` berjalan setiap malam pada `main` dan pada dispatch manual; alur kerja ini menyebarkan mock parity gate, lane Matrix live, serta lane Telegram dan Discord live sebagai job paralel. Job live menggunakan environment `qa-live-shared`, dan Telegram/Discord menggunakan lease Convex. +- Workflow `Parity gate` berjalan pada perubahan PR yang cocok dan dispatch manual; workflow ini membangun runtime QA privat dan membandingkan paket agentic GPT-5.5 dan Opus 4.6 tiruan. +- Workflow `QA-Lab - All Lanes` berjalan setiap malam pada `main` dan pada dispatch manual; workflow ini menyebarkan parity gate tiruan, lane Matrix live, serta lane Telegram dan Discord live sebagai job paralel. Job live menggunakan environment `qa-live-shared`, dan Telegram/Discord menggunakan lease Convex. -Pemeriksaan rilis menjalankan lane transport Matrix dan Telegram live dengan provider mock deterministik dan model berkualifikasi mock (`mock-openai/gpt-5.5` dan `mock-openai/gpt-5.5-alt`) sehingga kontrak channel terisolasi dari latensi model live dan startup provider-plugin normal. Gateway transport live menonaktifkan pencarian memori karena paritas QA mencakup perilaku memori secara terpisah; konektivitas provider dicakup oleh suite model live, provider native, dan provider Docker yang terpisah. +Pemeriksaan rilis menjalankan lane transport Matrix dan Telegram live dengan penyedia tiruan deterministik dan model yang memenuhi syarat tiruan (`mock-openai/gpt-5.5` dan `mock-openai/gpt-5.5-alt`) sehingga kontrak channel terisolasi dari latensi model live dan startup Plugin penyedia normal. Gateway transport live menonaktifkan pencarian memori karena paritas QA mencakup perilaku memori secara terpisah; konektivitas penyedia dicakup oleh suite model live, penyedia native, dan penyedia Docker yang terpisah. -Matrix menggunakan `--profile fast` untuk gate terjadwal dan rilis, menambahkan `--fail-fast` hanya ketika CLI yang di-checkout mendukungnya. Default CLI dan input alur kerja manual tetap `all`; dispatch manual `matrix_profile=all` selalu membagi cakupan Matrix penuh menjadi job `transport`, `media`, `e2ee-smoke`, `e2ee-deep`, dan `e2ee-cli`. +Matrix menggunakan `--profile fast` untuk gate terjadwal dan rilis, dengan menambahkan `--fail-fast` hanya saat CLI yang di-checkout mendukungnya. Default CLI dan input workflow manual tetap `all`; dispatch manual `matrix_profile=all` selalu memecah cakupan Matrix penuh ke dalam job `transport`, `media`, `e2ee-smoke`, `e2ee-deep`, dan `e2ee-cli`. -`OpenClaw Release Checks` juga menjalankan lane QA Lab yang kritis untuk rilis sebelum persetujuan rilis; parity gate QA-nya menjalankan pack kandidat dan baseline sebagai job lane paralel, lalu mengunduh kedua artefak ke job laporan kecil untuk perbandingan paritas akhir. +`OpenClaw Release Checks` juga menjalankan lane QA Lab yang kritis untuk rilis sebelum persetujuan rilis; parity gate QA-nya menjalankan paket kandidat dan baseline sebagai job lane paralel, lalu mengunduh kedua artefak ke dalam job laporan kecil untuk perbandingan paritas akhir. -Jangan menempatkan jalur landing PR di balik `Parity gate` kecuali perubahan benar-benar menyentuh runtime QA, paritas model-pack, atau permukaan yang dimiliki alur kerja paritas. Untuk perbaikan channel, konfigurasi, dokumen, atau unit-test normal, perlakukan ini sebagai sinyal opsional dan ikuti bukti CI/check yang dicakup. +Jangan letakkan jalur landing PR di belakang `Parity gate` kecuali perubahan benar-benar menyentuh runtime QA, paritas paket model, atau permukaan yang dimiliki workflow paritas. Untuk perbaikan channel, konfigurasi, dokumentasi, atau unit test normal, perlakukan itu sebagai sinyal opsional dan ikuti bukti CI/pemeriksaan yang dicakup. ## CodeQL -Alur kerja `CodeQL` sengaja menjadi pemindai keamanan pass pertama yang sempit, bukan sweep repositori penuh. Run harian, manual, dan guard pull request non-draft memindai kode alur kerja Actions ditambah permukaan JavaScript/TypeScript berisiko tertinggi dengan kueri keamanan keyakinan tinggi yang difilter ke `security-severity` tinggi/kritis. +Workflow `CodeQL` sengaja merupakan pemindai keamanan tahap pertama yang sempit, bukan sweep repositori penuh. Run harian, manual, dan penjaga pull request non-draft memindai kode workflow Actions ditambah permukaan JavaScript/TypeScript berisiko tertinggi dengan kueri keamanan berkeyakinan tinggi yang difilter ke `security-severity` tinggi/kritis. -Guard pull request tetap ringan: ini hanya dimulai untuk perubahan di bawah `.github/actions`, `.github/codeql`, `.github/workflows`, `packages`, atau `src`, dan menjalankan matriks keamanan keyakinan tinggi yang sama seperti alur kerja terjadwal. CodeQL Android dan macOS tetap di luar default PR. +Penjaga pull request tetap ringan: hanya dimulai untuk perubahan di bawah `.github/actions`, `.github/codeql`, `.github/workflows`, `packages`, atau `src`, dan menjalankan matriks keamanan berkeyakinan tinggi yang sama seperti workflow terjadwal. CodeQL Android dan macOS tetap berada di luar default PR. ### Kategori keamanan | Kategori | Permukaan | | ------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------- | -| `/codeql-security-high/core-auth-secrets` | Auth, rahasia, sandbox, cron, dan baseline gateway | -| `/codeql-security-high/channel-runtime-boundary` | Kontrak implementasi channel inti ditambah runtime Plugin channel, gateway, Plugin SDK, rahasia, titik sentuh audit | -| `/codeql-security-high/network-ssrf-boundary` | Permukaan kebijakan SSRF inti, parsing IP, network guard, web-fetch, dan SSRF Plugin SDK | -| `/codeql-security-high/mcp-process-tool-boundary` | Server MCP, helper eksekusi proses, pengiriman keluar, dan gate eksekusi tool agen | -| `/codeql-security-high/plugin-trust-boundary` | Permukaan kepercayaan kontrak paket instalasi Plugin, loader, manifest, registry, staging dependensi runtime, pemuatan sumber, dan Plugin SDK | +| `/codeql-security-high/core-auth-secrets` | Auth, secret, sandbox, cron, dan baseline gateway | +| `/codeql-security-high/channel-runtime-boundary` | Kontrak implementasi channel inti ditambah runtime Plugin channel, Gateway, Plugin SDK, secret, titik sentuh audit | +| `/codeql-security-high/network-ssrf-boundary` | Permukaan SSRF inti, parsing IP, penjaga jaringan, web-fetch, dan kebijakan SSRF Plugin SDK | +| `/codeql-security-high/mcp-process-tool-boundary` | Server MCP, helper eksekusi proses, pengiriman keluar, dan gate eksekusi tool agent | +| `/codeql-security-high/plugin-trust-boundary` | Permukaan trust instalasi Plugin, loader, manifes, registry, staging dependensi runtime, pemuatan sumber, dan kontrak paket Plugin SDK | ### Shard keamanan khusus platform -- `CodeQL Android Critical Security` — shard keamanan Android terjadwal. Membangun aplikasi Android secara manual untuk CodeQL pada runner Blacksmith Linux terkecil yang diterima oleh sanity alur kerja. Mengunggah di bawah `/codeql-critical-security/android`. -- `CodeQL macOS Critical Security` — shard keamanan macOS mingguan/manual. Membangun aplikasi macOS secara manual untuk CodeQL di Blacksmith macOS, memfilter hasil build dependensi keluar dari SARIF yang diunggah, dan mengunggah di bawah `/codeql-critical-security/macos`. Disimpan di luar default harian karena build macOS mendominasi runtime bahkan saat bersih. +- `CodeQL Android Critical Security` — shard keamanan Android terjadwal. Membangun aplikasi Android secara manual untuk CodeQL pada runner Blacksmith Linux terkecil yang diterima oleh kewajaran workflow. Mengunggah di bawah `/codeql-critical-security/android`. +- `CodeQL macOS Critical Security` — shard keamanan macOS mingguan/manual. Membangun aplikasi macOS secara manual untuk CodeQL pada Blacksmith macOS, memfilter hasil build dependensi dari SARIF yang diunggah, dan mengunggah di bawah `/codeql-critical-security/macos`. Dipertahankan di luar default harian karena build macOS mendominasi runtime bahkan saat bersih. -### Kategori Critical Quality +### Kategori Kualitas Kritis -`CodeQL Critical Quality` adalah shard non-keamanan yang sepadan. Ini hanya menjalankan kueri kualitas JavaScript/TypeScript non-keamanan dengan severity error di atas permukaan bernilai tinggi yang sempit pada runner Blacksmith Linux yang lebih kecil. Guard pull request-nya sengaja lebih kecil daripada profil terjadwal: PR non-draft hanya menjalankan shard `agent-runtime-boundary`, `config-boundary`, `core-auth-secrets`, `channel-runtime-boundary`, `gateway-runtime-boundary`, `memory-runtime-boundary`, `mcp-process-runtime-boundary`, `provider-runtime-boundary`, `session-diagnostics-boundary`, `plugin-boundary`, `plugin-sdk-package-contract`, dan `plugin-sdk-reply-runtime` yang cocok untuk perubahan kode eksekusi command/model/tool agen dan dispatch balasan, kode skema/migrasi/IO konfigurasi, kode auth/rahasia/sandbox/keamanan, runtime channel inti dan Plugin channel bawaan, protokol Gateway/server-method, glue runtime memori/SDK, MCP/proses/pengiriman keluar, runtime provider/katalog model, diagnostik sesi/antrean pengiriman, loader Plugin, kontrak paket/Plugin SDK, atau runtime balasan Plugin SDK. Perubahan konfigurasi CodeQL dan alur kerja kualitas menjalankan semua dua belas shard kualitas PR. +`CodeQL Critical Quality` adalah shard non-keamanan yang sepadan. Shard ini hanya menjalankan kueri kualitas JavaScript/TypeScript non-keamanan dengan tingkat error-severity di atas permukaan sempit bernilai tinggi pada runner Blacksmith Linux yang lebih kecil. Penjaga pull request-nya sengaja lebih kecil daripada profil terjadwal: PR non-draft hanya menjalankan shard `agent-runtime-boundary`, `config-boundary`, `core-auth-secrets`, `channel-runtime-boundary`, `gateway-runtime-boundary`, `memory-runtime-boundary`, `mcp-process-runtime-boundary`, `provider-runtime-boundary`, `session-diagnostics-boundary`, `plugin-boundary`, `plugin-sdk-package-contract`, dan `plugin-sdk-reply-runtime` yang cocok untuk perubahan kode eksekusi perintah/model/tool agent dan dispatch balasan, kode skema/migrasi/IO konfigurasi, kode auth/secret/sandbox/keamanan, runtime channel inti dan Plugin channel bawaan, protokol/metode server Gateway, perekat runtime/SDK memori, MCP/proses/pengiriman keluar, katalog model/runtime penyedia, diagnostik sesi/antrian pengiriman, loader Plugin, kontrak paket/Plugin SDK, atau runtime balasan Plugin SDK. Perubahan konfigurasi CodeQL dan workflow kualitas menjalankan seluruh dua belas shard kualitas PR. Dispatch manual menerima: @@ -352,38 +352,38 @@ profile=all|agent-runtime-boundary|config-boundary|core-auth-secrets|channel-run Profil sempit adalah hook pengajaran/iterasi untuk menjalankan satu shard kualitas secara terisolasi. -| Kategori | Permukaan | -| ------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `/codeql-critical-quality/core-auth-secrets` | Auth, secret, sandbox, cron, dan kode batas keamanan gateway | -| `/codeql-critical-quality/config-boundary` | Skema konfigurasi, migrasi, normalisasi, dan kontrak IO | -| `/codeql-critical-quality/gateway-runtime-boundary` | Skema protokol Gateway dan kontrak metode server | -| `/codeql-critical-quality/channel-runtime-boundary` | Kontrak implementasi kanal inti dan Plugin kanal bawaan | -| `/codeql-critical-quality/agent-runtime-boundary` | Eksekusi perintah, dispatch model/provider, dispatch dan antrean balasan otomatis, serta kontrak runtime control-plane ACP | -| `/codeql-critical-quality/mcp-process-runtime-boundary` | Server MCP dan bridge tool, helper supervisi proses, dan kontrak pengiriman keluar | -| `/codeql-critical-quality/memory-runtime-boundary` | SDK host memori, facade runtime memori, alias SDK Plugin memori, glue aktivasi runtime memori, dan perintah doctor memori | -| `/codeql-critical-quality/session-diagnostics-boundary` | Internal antrean balasan, antrean pengiriman sesi, helper binding/pengiriman sesi keluar, permukaan bundel event/log diagnostik, dan kontrak CLI doctor sesi | -| `/codeql-critical-quality/plugin-sdk-reply-runtime` | Dispatch balasan masuk SDK Plugin, helper payload/chunking/runtime balasan, opsi balasan kanal, antrean pengiriman, dan helper binding sesi/thread | -| `/codeql-critical-quality/provider-runtime-boundary` | Normalisasi katalog model, auth dan discovery provider, registrasi runtime provider, default/katalog provider, serta registry web/search/fetch/embedding | -| `/codeql-critical-quality/ui-control-plane` | Bootstrap UI kontrol, persistensi lokal, alur kontrol Gateway, dan kontrak runtime control-plane tugas | -| `/codeql-critical-quality/web-media-runtime-boundary` | Kontrak runtime fetch/search web inti, IO media, pemahaman media, pembuatan gambar, dan pembuatan media | -| `/codeql-critical-quality/plugin-boundary` | Kontrak loader, registry, permukaan publik, dan entrypoint SDK Plugin | -| `/codeql-critical-quality/plugin-sdk-package-contract` | Sumber SDK Plugin sisi paket yang dipublikasikan dan helper kontrak paket Plugin | +| Kategori | Permukaan | +| ------------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `/codeql-critical-quality/core-auth-secrets` | Kode batas keamanan autentikasi, rahasia, sandbox, Cron, dan Gateway | +| `/codeql-critical-quality/config-boundary` | Skema konfigurasi, migrasi, normalisasi, dan kontrak IO | +| `/codeql-critical-quality/gateway-runtime-boundary` | Skema protokol Gateway dan kontrak metode server | +| `/codeql-critical-quality/channel-runtime-boundary` | Kontrak implementasi kanal inti dan Plugin kanal bawaan | +| `/codeql-critical-quality/agent-runtime-boundary` | Eksekusi perintah, dispatch model/penyedia, dispatch dan antrean balasan otomatis, serta kontrak runtime bidang kontrol ACP | +| `/codeql-critical-quality/mcp-process-runtime-boundary` | Server MCP dan jembatan alat, pembantu pengawasan proses, serta kontrak pengiriman keluar | +| `/codeql-critical-quality/memory-runtime-boundary` | SDK host memori, fasad runtime memori, alias SDK Plugin memori, perekat aktivasi runtime memori, dan perintah doctor memori | +| `/codeql-critical-quality/session-diagnostics-boundary` | Internal antrean balasan, antrean pengiriman sesi, pembantu pengikatan/pengiriman sesi keluar, permukaan bundel peristiwa/log diagnostik, dan kontrak CLI doctor sesi | +| `/codeql-critical-quality/plugin-sdk-reply-runtime` | Dispatch balasan masuk SDK Plugin, pembantu payload/pemotongan/runtime balasan, opsi balasan kanal, antrean pengiriman, dan pembantu pengikatan sesi/thread | +| `/codeql-critical-quality/provider-runtime-boundary` | Normalisasi katalog model, autentikasi dan penemuan penyedia, pendaftaran runtime penyedia, default/katalog penyedia, serta registri web/pencarian/fetch/embedding | +| `/codeql-critical-quality/ui-control-plane` | Bootstrap UI kontrol, persistensi lokal, alur kontrol Gateway, dan kontrak runtime bidang kontrol tugas | +| `/codeql-critical-quality/web-media-runtime-boundary` | Fetch/pencarian web inti, IO media, pemahaman media, pembuatan gambar, dan kontrak runtime pembuatan media | +| `/codeql-critical-quality/plugin-boundary` | Kontrak loader, registri, permukaan publik, dan entrypoint SDK Plugin | +| `/codeql-critical-quality/plugin-sdk-package-contract` | Sumber SDK Plugin sisi paket yang dipublikasikan dan pembantu kontrak paket Plugin | -Kualitas tetap dipisahkan dari keamanan agar temuan kualitas dapat dijadwalkan, diukur, dinonaktifkan, atau diperluas tanpa mengaburkan sinyal keamanan. Ekspansi CodeQL untuk Swift, Python, dan Plugin bawaan harus ditambahkan kembali sebagai pekerjaan lanjutan yang berscope atau dishard hanya setelah profil sempit memiliki runtime dan sinyal yang stabil. +Kualitas tetap terpisah dari keamanan agar temuan kualitas dapat dijadwalkan, diukur, dinonaktifkan, atau diperluas tanpa mengaburkan sinyal keamanan. Perluasan CodeQL untuk Swift, Python, dan Plugin bawaan sebaiknya ditambahkan kembali sebagai pekerjaan lanjutan yang terskop atau di-shard hanya setelah profil sempit memiliki runtime dan sinyal yang stabil. ## Alur kerja pemeliharaan -### Docs Agent +### Agen Docs -Workflow `Docs Agent` adalah lane pemeliharaan Codex berbasis event untuk menjaga dokumen yang ada tetap selaras dengan perubahan yang baru landed. Ini tidak memiliki jadwal murni: run CI push non-bot yang berhasil di `main` dapat memicunya, dan dispatch manual dapat menjalankannya langsung. Invokasi workflow-run dilewati ketika `main` sudah bergerak maju atau ketika run Docs Agent non-skipped lain dibuat dalam satu jam terakhir. Saat berjalan, workflow ini meninjau rentang commit dari SHA sumber Docs Agent non-skipped sebelumnya hingga `main` saat ini, sehingga satu run per jam dapat mencakup semua perubahan main yang terkumpul sejak pass dokumen terakhir. +Alur kerja `Docs Agent` adalah jalur pemeliharaan Codex berbasis peristiwa untuk menjaga dokumen yang ada tetap selaras dengan perubahan yang baru saja masuk. Alur ini tidak memiliki jadwal murni: run CI push non-bot yang berhasil di `main` dapat memicunya, dan dispatch manual dapat menjalankannya langsung. Invokasi workflow-run dilewati ketika `main` sudah bergerak maju atau ketika run Docs Agent non-dilewati lain dibuat dalam satu jam terakhir. Saat berjalan, alur ini meninjau rentang commit dari SHA sumber Docs Agent non-dilewati sebelumnya hingga `main` saat ini, sehingga satu run per jam dapat mencakup semua perubahan main yang terkumpul sejak pemeriksaan dokumen terakhir. -### Test Performance Agent +### Agen Performa Pengujian -Workflow `Test Performance Agent` adalah lane pemeliharaan Codex berbasis event untuk pengujian lambat. Ini tidak memiliki jadwal murni: run CI push non-bot yang berhasil di `main` dapat memicunya, tetapi akan dilewati jika invokasi workflow-run lain sudah berjalan atau sedang berjalan pada hari UTC tersebut. Dispatch manual melewati gate aktivitas harian itu. Lane ini membuat laporan performa Vitest full-suite yang dikelompokkan, mengizinkan Codex hanya membuat perbaikan performa pengujian kecil yang mempertahankan coverage alih-alih refactor luas, lalu menjalankan ulang laporan full-suite dan menolak perubahan yang mengurangi jumlah baseline pengujian yang lulus. Jika baseline memiliki pengujian yang gagal, Codex hanya boleh memperbaiki kegagalan yang jelas dan laporan full-suite setelah agent harus lulus sebelum apa pun di-commit. Saat `main` maju sebelum push bot landed, lane ini me-rebase patch yang sudah divalidasi, menjalankan ulang `pnpm check:changed`, dan mencoba ulang push; patch stale yang konflik dilewati. Lane ini menggunakan Ubuntu yang di-host GitHub sehingga action Codex dapat mempertahankan postur keselamatan drop-sudo yang sama seperti docs agent. +Alur kerja `Test Performance Agent` adalah jalur pemeliharaan Codex berbasis peristiwa untuk pengujian yang lambat. Alur ini tidak memiliki jadwal murni: run CI push non-bot yang berhasil di `main` dapat memicunya, tetapi alur ini melewati eksekusi jika invokasi workflow-run lain sudah berjalan atau sedang berjalan pada hari UTC tersebut. Dispatch manual melewati gerbang aktivitas harian itu. Jalur ini membangun laporan performa Vitest full-suite yang dikelompokkan, membiarkan Codex hanya membuat perbaikan performa pengujian kecil yang mempertahankan cakupan, bukan refactor luas, lalu menjalankan ulang laporan full-suite dan menolak perubahan yang mengurangi jumlah baseline pengujian yang lulus. Jika baseline memiliki pengujian yang gagal, Codex hanya boleh memperbaiki kegagalan yang jelas dan laporan full-suite setelah agen harus lulus sebelum apa pun di-commit. Ketika `main` maju sebelum push bot masuk, jalur ini melakukan rebase pada patch yang telah divalidasi, menjalankan ulang `pnpm check:changed`, dan mencoba ulang push; patch basi yang konflik dilewati. Alur ini menggunakan Ubuntu yang di-host GitHub sehingga action Codex dapat mempertahankan postur keamanan drop-sudo yang sama seperti agen docs. ### PR Duplikat Setelah Merge -Workflow `Duplicate PRs After Merge` adalah workflow maintainer manual untuk pembersihan duplikat pasca-land. Default-nya adalah dry-run dan hanya menutup PR yang dicantumkan secara eksplisit ketika `apply=true`. Sebelum mengubah GitHub, workflow ini memverifikasi bahwa PR yang landed sudah di-merge dan setiap duplikat memiliki issue rujukan bersama atau hunk perubahan yang tumpang tindih. +Alur kerja `Duplicate PRs After Merge` adalah alur kerja maintainer manual untuk pembersihan duplikat setelah land. Default-nya adalah dry-run dan hanya menutup PR yang tercantum secara eksplisit saat `apply=true`. Sebelum memutasi GitHub, alur ini memverifikasi bahwa PR yang di-land sudah di-merge dan setiap duplikat memiliki issue rujukan bersama atau hunk perubahan yang tumpang tindih. ```bash gh workflow run duplicate-after-merge.yml \ @@ -392,29 +392,29 @@ gh workflow run duplicate-after-merge.yml \ -f apply=true ``` -## Gate pemeriksaan lokal dan routing perubahan +## Gerbang pemeriksaan lokal dan routing perubahan -Logika changed-lane lokal berada di `scripts/changed-lanes.mjs` dan dieksekusi oleh `scripts/check-changed.mjs`. Gate pemeriksaan lokal itu lebih ketat terhadap batas arsitektur daripada cakupan platform CI yang luas: +Logika changed-lane lokal berada di `scripts/changed-lanes.mjs` dan dieksekusi oleh `scripts/check-changed.mjs`. Gerbang pemeriksaan lokal tersebut lebih ketat tentang batas arsitektur dibandingkan cakupan platform CI yang luas: - perubahan produksi inti menjalankan typecheck prod inti dan pengujian inti plus lint/guard inti; -- perubahan khusus pengujian inti hanya menjalankan typecheck pengujian inti plus lint inti; +- perubahan hanya pengujian inti hanya menjalankan typecheck pengujian inti plus lint inti; - perubahan produksi ekstensi menjalankan typecheck prod ekstensi dan pengujian ekstensi plus lint ekstensi; -- perubahan khusus pengujian ekstensi menjalankan typecheck pengujian ekstensi plus lint ekstensi; -- perubahan SDK Plugin publik atau kontrak Plugin meluas ke typecheck ekstensi karena ekstensi bergantung pada kontrak inti tersebut (sweep ekstensi Vitest tetap menjadi pekerjaan pengujian eksplisit); -- bump versi metadata-only rilis menjalankan pemeriksaan versi/konfigurasi/dependensi-root yang tertarget; -- perubahan root/konfigurasi yang tidak diketahui fail safe ke semua lane pemeriksaan. +- perubahan hanya pengujian ekstensi menjalankan typecheck pengujian ekstensi plus lint ekstensi; +- perubahan SDK Plugin publik atau kontrak plugin meluas ke typecheck ekstensi karena ekstensi bergantung pada kontrak inti tersebut (sweep ekstensi Vitest tetap menjadi pekerjaan pengujian eksplisit); +- bump versi metadata rilis saja menjalankan pemeriksaan versi/konfigurasi/dependensi-root yang ditargetkan; +- perubahan root/konfigurasi yang tidak diketahui fail safe ke semua jalur pemeriksaan. -Routing changed-test lokal berada di `scripts/test-projects.test-support.mjs` dan sengaja lebih murah daripada `check:changed`: edit pengujian langsung menjalankan dirinya sendiri, edit sumber mengutamakan pemetaan eksplisit, lalu pengujian sibling dan dependent import-graph. Konfigurasi pengiriman group-room bersama adalah salah satu pemetaan eksplisit: perubahan pada konfigurasi balasan yang terlihat grup, mode pengiriman balasan sumber, atau prompt sistem message-tool diarahkan melalui pengujian balasan inti plus regresi pengiriman Discord dan Slack sehingga perubahan default bersama gagal sebelum push PR pertama. Gunakan `OPENCLAW_TEST_CHANGED_BROAD=1 pnpm test:changed` hanya ketika perubahan cukup luas pada harness sehingga set terpetakan murah bukan proxy yang tepercaya. +Routing changed-test lokal berada di `scripts/test-projects.test-support.mjs` dan secara sengaja lebih murah daripada `check:changed`: edit pengujian langsung menjalankan dirinya sendiri, edit sumber mengutamakan pemetaan eksplisit, lalu pengujian saudara dan dependen grafik impor. Konfigurasi pengiriman group-room bersama adalah salah satu pemetaan eksplisit: perubahan pada konfigurasi balasan terlihat grup, mode pengiriman balasan sumber, atau prompt sistem alat pesan dirutekan melalui pengujian balasan inti plus regresi pengiriman Discord dan Slack sehingga perubahan default bersama gagal sebelum push PR pertama. Gunakan `OPENCLAW_TEST_CHANGED_BROAD=1 pnpm test:changed` hanya ketika perubahan cukup luas di seluruh harness sehingga set murah yang dipetakan bukan proksi yang dapat dipercaya. ## Validasi Testbox -Jalankan Testbox dari root repo dan utamakan box warmed baru untuk bukti luas. Sebelum menghabiskan gate lambat pada box yang digunakan ulang, kedaluwarsa, atau baru saja melaporkan sync yang sangat besar, jalankan `pnpm testbox:sanity` di dalam box terlebih dahulu. +Jalankan Testbox dari root repo dan utamakan box baru yang sudah dihangatkan untuk bukti luas. Sebelum menghabiskan gerbang lambat pada box yang digunakan ulang, kedaluwarsa, atau baru melaporkan sinkronisasi yang sangat besar, jalankan `pnpm testbox:sanity` di dalam box terlebih dahulu. -Pemeriksaan sanity gagal cepat ketika file root wajib seperti `pnpm-lock.yaml` menghilang atau ketika `git status --short` menunjukkan setidaknya 200 penghapusan terlacak. Itu biasanya berarti status sync remote bukan salinan PR yang tepercaya; hentikan box itu dan warm box baru alih-alih men-debug kegagalan pengujian produk. Untuk PR penghapusan besar yang disengaja, setel `OPENCLAW_TESTBOX_ALLOW_MASS_DELETIONS=1` untuk run sanity tersebut. +Pemeriksaan sanity gagal cepat ketika file root yang diperlukan seperti `pnpm-lock.yaml` hilang atau ketika `git status --short` menampilkan setidaknya 200 penghapusan terlacak. Itu biasanya berarti status sinkronisasi jarak jauh bukan salinan PR yang dapat dipercaya; hentikan box tersebut dan hangatkan yang baru, alih-alih men-debug kegagalan pengujian produk. Untuk PR penghapusan besar yang disengaja, setel `OPENCLAW_TESTBOX_ALLOW_MASS_DELETIONS=1` untuk run sanity tersebut. -`pnpm testbox:run` juga menghentikan invokasi CLI Blacksmith lokal yang tetap berada di fase sync selama lebih dari lima menit tanpa output pasca-sync. Setel `OPENCLAW_TESTBOX_SYNC_TIMEOUT_MS=0` untuk menonaktifkan guard itu, atau gunakan nilai milidetik yang lebih besar untuk diff lokal yang sangat besar. +`pnpm testbox:run` juga menghentikan invokasi CLI Blacksmith lokal yang tetap berada dalam fase sinkronisasi selama lebih dari lima menit tanpa output pasca-sinkronisasi. Setel `OPENCLAW_TESTBOX_SYNC_TIMEOUT_MS=0` untuk menonaktifkan guard tersebut, atau gunakan nilai milidetik yang lebih besar untuk diff lokal yang luar biasa besar. ## Terkait -- [Ringkasan instalasi](/id/install) +- [Ikhtisar instalasi](/id/install) - [Kanal pengembangan](/id/install/development-channels) diff --git a/docs/id/concepts/agent-loop.md b/docs/id/concepts/agent-loop.md index c572fd710..27d33f221 100644 --- a/docs/id/concepts/agent-loop.md +++ b/docs/id/concepts/agent-loop.md @@ -1,24 +1,24 @@ --- read_when: - - Anda membutuhkan panduan langkah demi langkah yang tepat tentang perulangan agen atau peristiwa siklus hidup - - Anda mengubah pengantrean sesi, penulisan transkrip, atau perilaku kunci tulis sesi -summary: Siklus hidup perulangan agen, aliran, dan semantik menunggu + - Anda membutuhkan panduan langkah demi langkah yang tepat tentang loop agen atau peristiwa siklus hidup + - Anda sedang mengubah antrean sesi, penulisan transkrip, atau perilaku kunci tulis sesi +summary: Siklus hidup loop agen, aliran, dan semantik menunggu title: Siklus agen x-i18n: - generated_at: "2026-04-30T09:42:14Z" + generated_at: "2026-04-30T18:38:55Z" model: gpt-5.5 provider: openai - source_hash: 902d543bd71dd517a810d825cbe92e244fe89230f47eeada72477c657a2bec32 + source_hash: 5466893253e1f82482284ff82db56f4c3fca018bf12e4114fad76d37cad954df source_path: concepts/agent-loop.md workflow: 16 --- -Loop agentik adalah keseluruhan eksekusi “nyata” sebuah agen: penerimaan → perakitan konteks → inferensi model → -eksekusi alat → balasan streaming → persistensi. Ini adalah jalur otoritatif yang mengubah pesan +Loop agentik adalah proses jalan “nyata” penuh dari sebuah agen: penerimaan → perakitan konteks → inferensi model → +eksekusi alat → balasan streaming → persistensi. Ini adalah jalur otoritatif yang mengubah sebuah pesan menjadi tindakan dan balasan akhir, sambil menjaga status sesi tetap konsisten. -Di OpenClaw, loop adalah satu eksekusi terserialisasi per sesi yang memancarkan peristiwa siklus hidup dan stream -saat model berpikir, memanggil alat, dan men-stream keluaran. Dokumen ini menjelaskan bagaimana loop autentik itu +Di OpenClaw, sebuah loop adalah satu proses jalan terserialisasi per sesi yang memancarkan peristiwa siklus hidup dan stream +saat model berpikir, memanggil alat, dan melakukan streaming keluaran. Dokumen ini menjelaskan bagaimana loop autentik tersebut dirangkai dari ujung ke ujung. ## Titik masuk @@ -28,55 +28,56 @@ dirangkai dari ujung ke ujung. ## Cara kerjanya (tingkat tinggi) -1. RPC `agent` memvalidasi parameter, me-resolve sesi (sessionKey/sessionId), mempersistenkan metadata sesi, mengembalikan `{ runId, acceptedAt }` segera. +1. RPC `agent` memvalidasi parameter, menyelesaikan sesi (sessionKey/sessionId), mempersistensikan metadata sesi, dan langsung mengembalikan `{ runId, acceptedAt }`. 2. `agentCommand` menjalankan agen: - - me-resolve default model + thinking/verbose/trace - - memuat snapshot Skills + - menyelesaikan model + default thinking/verbose/trace + - memuat snapshot skills - memanggil `runEmbeddedPiAgent` (runtime pi-agent-core) - - memancarkan **akhir/kesalahan siklus hidup** jika loop tersemat tidak memancarkannya + - memancarkan **lifecycle end/error** jika loop tertanam tidak memancarkannya 3. `runEmbeddedPiAgent`: - - menserialisasi eksekusi melalui antrean per-sesi + global - - me-resolve model + profil auth dan membangun sesi pi - - berlangganan peristiwa pi dan men-stream delta asisten/alat - - menerapkan timeout -> membatalkan eksekusi jika terlampaui + - menserialkan proses jalan melalui antrean per sesi + global + - menyelesaikan model + profil autentikasi dan membangun sesi pi + - berlangganan ke peristiwa pi dan melakukan streaming delta asisten/alat + - menerapkan timeout -> membatalkan proses jalan jika terlampaui + - untuk giliran server aplikasi Codex, membatalkan giliran yang diterima jika berhenti menghasilkan progres server aplikasi sebelum peristiwa terminal - mengembalikan payload + metadata penggunaan 4. `subscribeEmbeddedPiSession` menjembatani peristiwa pi-agent-core ke stream `agent` OpenClaw: - peristiwa alat => `stream: "tool"` - delta asisten => `stream: "assistant"` - peristiwa siklus hidup => `stream: "lifecycle"` (`phase: "start" | "end" | "error"`) 5. `agent.wait` menggunakan `waitForAgentRun`: - - menunggu **akhir/kesalahan siklus hidup** untuk `runId` + - menunggu **lifecycle end/error** untuk `runId` - mengembalikan `{ status: ok|error|timeout, startedAt, endedAt, error? }` ## Antrean + konkurensi -- Eksekusi diserialisasi per kunci sesi (jalur sesi) dan secara opsional melalui jalur global. +- Proses jalan diserialkan per kunci sesi (jalur sesi) dan secara opsional melalui jalur global. - Ini mencegah race alat/sesi dan menjaga riwayat sesi tetap konsisten. -- Kanal pesan dapat memilih mode antrean (collect/steer/followup) yang memberi masukan ke sistem jalur ini. +- Kanal perpesanan dapat memilih mode antrean (collect/steer/followup) yang masuk ke sistem jalur ini. Lihat [Antrean Perintah](/id/concepts/queue). -- Penulisan transkrip juga dilindungi oleh kunci tulis sesi pada file sesi. Kunci tersebut - sadar proses dan berbasis file, sehingga menangkap penulis yang melewati antrean dalam-proses atau berasal dari +- Penulisan transkrip juga dilindungi oleh kunci tulis sesi pada file sesi. Kunci ini + sadar proses dan berbasis file, sehingga dapat menangkap penulis yang melewati antrean dalam proses atau berasal dari proses lain. -- Kunci tulis sesi secara default tidak reentrant. Jika helper sengaja menumpuk akuisisi +- Kunci tulis sesi secara default tidak reentrant. Jika helper secara sengaja menumpuk akuisisi kunci yang sama sambil mempertahankan satu penulis logis, helper tersebut harus ikut serta secara eksplisit dengan `allowReentrant: true`. ## Persiapan sesi + workspace -- Workspace di-resolve dan dibuat; eksekusi sandbox dapat diarahkan ulang ke root workspace sandbox. -- Skills dimuat (atau digunakan ulang dari snapshot) dan disuntikkan ke env dan prompt. -- File bootstrap/konteks di-resolve dan disuntikkan ke laporan prompt sistem. -- Kunci tulis sesi diambil; `SessionManager` dibuka dan disiapkan sebelum streaming. Setiap - jalur penulisan ulang transkrip, Compaction, atau pemangkasan berikutnya harus mengambil kunci yang sama sebelum membuka atau +- Workspace diselesaikan dan dibuat; proses jalan sandbox dapat dialihkan ke root workspace sandbox. +- Skills dimuat (atau digunakan ulang dari snapshot) dan diinjeksi ke env dan prompt. +- File bootstrap/konteks diselesaikan dan diinjeksi ke laporan prompt sistem. +- Kunci tulis sesi diperoleh; `SessionManager` dibuka dan disiapkan sebelum streaming. Setiap + jalur penulisan ulang transkrip, compaction, atau pemotongan berikutnya harus mengambil kunci yang sama sebelum membuka atau memutasi file transkrip. ## Perakitan prompt + prompt sistem -- Prompt sistem dibangun dari prompt dasar OpenClaw, prompt Skills, konteks bootstrap, dan override per-eksekusi. -- Batas khusus model dan token cadangan Compaction diterapkan. +- Prompt sistem dibangun dari prompt dasar OpenClaw, prompt skills, konteks bootstrap, dan override per proses jalan. +- Batas spesifik model dan token cadangan compaction diterapkan. - Lihat [Prompt sistem](/id/concepts/system-prompt) untuk apa yang dilihat model. -## Titik hook (tempat Anda dapat mengintersepsi) +## Titik hook (tempat Anda dapat mengintersep) OpenClaw memiliki dua sistem hook: @@ -95,66 +96,66 @@ Lihat [Hook](/id/automation/hooks) untuk penyiapan dan contoh. Ini berjalan di dalam loop agen atau pipeline gateway: -- **`before_model_resolve`**: berjalan pra-sesi (tanpa `messages`) untuk meng-override penyedia/model secara deterministik sebelum resolusi model. -- **`before_prompt_build`**: berjalan setelah pemuatan sesi (dengan `messages`) untuk menyuntikkan `prependContext`, `systemPrompt`, `prependSystemContext`, atau `appendSystemContext` sebelum pengiriman prompt. Gunakan `prependContext` untuk teks dinamis per-giliran dan field konteks sistem untuk panduan stabil yang harus berada di ruang prompt sistem. -- **`before_agent_start`**: hook kompatibilitas lama yang dapat berjalan di salah satu fase; lebih pilih hook eksplisit di atas. -- **`before_agent_reply`**: berjalan setelah tindakan inline dan sebelum panggilan LLM, memungkinkan Plugin mengklaim giliran dan mengembalikan balasan sintetis atau membungkam giliran sepenuhnya. -- **`agent_end`**: memeriksa daftar pesan akhir dan metadata eksekusi setelah selesai. -- **`before_compaction` / `after_compaction`**: mengamati atau menganotasi siklus Compaction. -- **`before_tool_call` / `after_tool_call`**: mengintersepsi parameter/hasil alat. +- **`before_model_resolve`**: berjalan sebelum sesi (tanpa `messages`) untuk secara deterministik meng-override penyedia/model sebelum resolusi model. +- **`before_prompt_build`**: berjalan setelah sesi dimuat (dengan `messages`) untuk menginjeksi `prependContext`, `systemPrompt`, `prependSystemContext`, atau `appendSystemContext` sebelum pengiriman prompt. Gunakan `prependContext` untuk teks dinamis per giliran dan kolom konteks sistem untuk panduan stabil yang harus berada di ruang prompt sistem. +- **`before_agent_start`**: hook kompatibilitas lama yang dapat berjalan di salah satu fase; utamakan hook eksplisit di atas. +- **`before_agent_reply`**: berjalan setelah tindakan inline dan sebelum panggilan LLM, memungkinkan Plugin mengklaim giliran dan mengembalikan balasan sintetis atau sepenuhnya membisukan giliran. +- **`agent_end`**: memeriksa daftar pesan akhir dan metadata proses jalan setelah selesai. +- **`before_compaction` / `after_compaction`**: mengamati atau menganotasi siklus compaction. +- **`before_tool_call` / `after_tool_call`**: mengintersep parameter/hasil alat. - **`before_install`**: memeriksa temuan pemindaian bawaan dan secara opsional memblokir pemasangan skill atau Plugin. -- **`tool_result_persist`**: mentransformasi hasil alat secara sinkron sebelum ditulis ke transkrip sesi milik OpenClaw. +- **`tool_result_persist`**: secara sinkron mentransformasi hasil alat sebelum ditulis ke transkrip sesi milik OpenClaw. - **`message_received` / `message_sending` / `message_sent`**: hook pesan masuk + keluar. - **`session_start` / `session_end`**: batas siklus hidup sesi. - **`gateway_start` / `gateway_stop`**: peristiwa siklus hidup gateway. -Aturan keputusan hook untuk penjaga keluar/alat: +Aturan keputusan hook untuk guard keluar/alat: - `before_tool_call`: `{ block: true }` bersifat terminal dan menghentikan handler berprioritas lebih rendah. -- `before_tool_call`: `{ block: false }` adalah no-op dan tidak menghapus blok sebelumnya. +- `before_tool_call`: `{ block: false }` adalah no-op dan tidak menghapus blokir sebelumnya. - `before_install`: `{ block: true }` bersifat terminal dan menghentikan handler berprioritas lebih rendah. -- `before_install`: `{ block: false }` adalah no-op dan tidak menghapus blok sebelumnya. +- `before_install`: `{ block: false }` adalah no-op dan tidak menghapus blokir sebelumnya. - `message_sending`: `{ cancel: true }` bersifat terminal dan menghentikan handler berprioritas lebih rendah. - `message_sending`: `{ cancel: false }` adalah no-op dan tidak menghapus pembatalan sebelumnya. Lihat [Hook Plugin](/id/plugins/hooks) untuk API hook dan detail pendaftaran. -Harness dapat mengadaptasi hook ini secara berbeda. Harness app-server Codex mempertahankan -hook Plugin OpenClaw sebagai kontrak kompatibilitas untuk surface tercermin yang terdokumentasi, +Harness dapat mengadaptasi hook ini secara berbeda. Harness server aplikasi Codex mempertahankan +hook Plugin OpenClaw sebagai kontrak kompatibilitas untuk permukaan tercermin yang terdokumentasi, sementara hook native Codex tetap menjadi mekanisme Codex tingkat lebih rendah yang terpisah. ## Streaming + balasan parsial -- Delta asisten di-stream dari pi-agent-core dan dipancarkan sebagai peristiwa `assistant`. +- Delta asisten di-streaming dari pi-agent-core dan dipancarkan sebagai peristiwa `assistant`. - Streaming blok dapat memancarkan balasan parsial baik pada `text_end` maupun `message_end`. -- Streaming reasoning dapat dipancarkan sebagai stream terpisah atau sebagai balasan blok. +- Streaming penalaran dapat dipancarkan sebagai stream terpisah atau sebagai balasan blok. - Lihat [Streaming](/id/concepts/streaming) untuk perilaku chunking dan balasan blok. -## Eksekusi alat + alat pesan +## Eksekusi alat + alat perpesanan - Peristiwa mulai/perbarui/akhir alat dipancarkan pada stream `tool`. - Hasil alat disanitasi untuk ukuran dan payload gambar sebelum dicatat/dipancarkan. -- Pengiriman alat pesan dilacak untuk menekan konfirmasi asisten duplikat. +- Pengiriman alat perpesanan dilacak untuk menekan konfirmasi asisten yang duplikat. -## Pembentukan balasan + penekanan +## Pembentukan balasan + supresi - Payload akhir dirakit dari: - - teks asisten (dan reasoning opsional) + - teks asisten (dan penalaran opsional) - ringkasan alat inline (ketika verbose + diizinkan) - teks kesalahan asisten ketika model mengalami kesalahan - Token senyap persis `NO_REPLY` / `no_reply` difilter dari payload keluar. -- Duplikat alat pesan dihapus dari daftar payload akhir. -- Jika tidak ada payload yang dapat dirender tersisa dan alat mengalami kesalahan, balasan fallback kesalahan alat dipancarkan - (kecuali alat pesan sudah mengirim balasan yang terlihat pengguna). +- Duplikat alat perpesanan dihapus dari daftar payload akhir. +- Jika tidak ada payload yang dapat dirender tersisa dan sebuah alat mengalami kesalahan, balasan kesalahan alat fallback dipancarkan + (kecuali alat perpesanan sudah mengirim balasan yang terlihat oleh pengguna). ## Compaction + percobaan ulang -- Auto-Compaction memancarkan peristiwa stream `compaction` dan dapat memicu percobaan ulang. -- Saat percobaan ulang, buffer dalam memori dan ringkasan alat direset untuk menghindari keluaran duplikat. -- Lihat [Compaction](/id/concepts/compaction) untuk pipeline Compaction. +- Compaction otomatis memancarkan peristiwa stream `compaction` dan dapat memicu percobaan ulang. +- Pada percobaan ulang, buffer dalam memori dan ringkasan alat direset untuk menghindari keluaran duplikat. +- Lihat [Compaction](/id/concepts/compaction) untuk pipeline compaction. -## Stream peristiwa (hari ini) +## Stream peristiwa (saat ini) - `lifecycle`: dipancarkan oleh `subscribeEmbeddedPiSession` (dan sebagai fallback oleh `agentCommand`) - `assistant`: delta streaming dari pi-agent-core @@ -162,29 +163,29 @@ sementara hook native Codex tetap menjadi mekanisme Codex tingkat lebih rendah y ## Penanganan kanal chat -- Delta asisten di-buffer ke dalam pesan `delta` chat. -- `final` chat dipancarkan pada **akhir/kesalahan siklus hidup**. +- Delta asisten di-buffer menjadi pesan chat `delta`. +- Chat `final` dipancarkan pada **lifecycle end/error**. ## Timeout -- Default `agent.wait`: 30 dtk (hanya penantian). Parameter `timeoutMs` meng-override. +- Default `agent.wait`: 30 dtk (hanya waktu tunggu). Parameter `timeoutMs` meng-override. - Runtime agen: default `agents.defaults.timeoutSeconds` 172800 dtk (48 jam); diterapkan di timer batal `runEmbeddedPiAgent`. -- Runtime Cron: `timeoutSeconds` giliran agen terisolasi dimiliki oleh cron. Scheduler memulai timer itu saat eksekusi dimulai, membatalkan eksekusi dasar pada tenggat yang dikonfigurasi, lalu menjalankan pembersihan berbatas sebelum mencatat timeout sehingga sesi anak yang stale tidak dapat membuat jalur macet. -- Pemulihan sesi macet: dengan diagnostik diaktifkan, `diagnostics.stuckSessionWarnMs` mendeteksi sesi `processing` yang lama. Eksekusi tersemat aktif, operasi balasan aktif, dan tugas jalur sesi aktif tetap hanya-peringatan secara default; jika diagnostik menunjukkan tidak ada pekerjaan aktif untuk sesi, watchdog melepaskan jalur sesi terdampak agar pekerjaan startup yang mengantre dapat mengalir. -- Timeout idle model: OpenClaw membatalkan permintaan model ketika tidak ada chunk respons yang tiba sebelum jendela idle. `models.providers..timeoutSeconds` memperpanjang watchdog idle ini untuk penyedia lokal/self-hosted yang lambat; jika tidak, OpenClaw menggunakan `agents.defaults.timeoutSeconds` ketika dikonfigurasi, dibatasi pada 120 dtk secara default. Eksekusi yang dipicu Cron tanpa timeout model atau agen eksplisit menonaktifkan watchdog idle dan mengandalkan timeout luar cron. -- Timeout permintaan HTTP penyedia: `models.providers..timeoutSeconds` berlaku untuk fetch HTTP model penyedia tersebut, termasuk connect, header, body, timeout permintaan SDK, penanganan batal guarded-fetch total, dan watchdog idle stream model. Gunakan ini untuk penyedia lokal/self-hosted yang lambat seperti Ollama sebelum menaikkan timeout runtime seluruh agen. +- Runtime Cron: `timeoutSeconds` giliran agen terisolasi dimiliki oleh cron. Scheduler memulai timer tersebut ketika eksekusi dimulai, membatalkan proses jalan dasar pada tenggat yang dikonfigurasi, lalu menjalankan pembersihan berbatas sebelum mencatat timeout sehingga sesi anak yang basi tidak dapat membuat jalur macet. +- Pemulihan sesi macet: dengan diagnostik diaktifkan, `diagnostics.stuckSessionWarnMs` mendeteksi sesi `processing` yang panjang. Proses jalan tertanam aktif, operasi balasan aktif, dan tugas jalur sesi aktif tetap hanya peringatan secara default; jika diagnostik tidak menunjukkan pekerjaan aktif untuk sesi tersebut, watchdog melepaskan jalur sesi yang terdampak agar pekerjaan startup yang mengantre dapat terkuras. +- Timeout idle model: OpenClaw membatalkan permintaan model ketika tidak ada chunk respons yang tiba sebelum jendela idle. `models.providers..timeoutSeconds` memperpanjang watchdog idle ini untuk penyedia lokal/self-hosted yang lambat; jika tidak, OpenClaw menggunakan `agents.defaults.timeoutSeconds` ketika dikonfigurasi, dibatasi pada 120 dtk secara default. Proses jalan yang dipicu Cron tanpa timeout model atau agen eksplisit menonaktifkan watchdog idle dan mengandalkan timeout luar cron. +- Timeout permintaan HTTP penyedia: `models.providers..timeoutSeconds` berlaku untuk fetch HTTP model penyedia tersebut, termasuk connect, header, body, timeout permintaan SDK, penanganan abort guarded-fetch total, dan watchdog idle stream model. Gunakan ini untuk penyedia lokal/self-hosted yang lambat seperti Ollama sebelum menaikkan timeout runtime agen secara keseluruhan. ## Tempat hal dapat berakhir lebih awal - Timeout agen (batal) - AbortSignal (batal) -- Gateway terputus atau timeout RPC -- Timeout `agent.wait` (hanya penantian, tidak menghentikan agen) +- Putusnya Gateway atau timeout RPC +- Timeout `agent.wait` (hanya menunggu, tidak menghentikan agen) ## Terkait - [Alat](/id/tools) — alat agen yang tersedia - [Hook](/id/automation/hooks) — skrip berbasis peristiwa yang dipicu oleh peristiwa siklus hidup agen -- [Compaction](/id/concepts/compaction) — bagaimana percakapan panjang diringkas +- [Compaction](/id/concepts/compaction) — cara percakapan panjang dirangkum - [Persetujuan Exec](/id/tools/exec-approvals) — gerbang persetujuan untuk perintah shell -- [Thinking](/id/tools/thinking) — konfigurasi tingkat thinking/reasoning +- [Thinking](/id/tools/thinking) — konfigurasi tingkat thinking/penalaran diff --git a/docs/id/concepts/queue.md b/docs/id/concepts/queue.md index 9f55b6c0c..2bd86cdb7 100644 --- a/docs/id/concepts/queue.md +++ b/docs/id/concepts/queue.md @@ -5,32 +5,32 @@ read_when: summary: Mode antrean balasan otomatis, nilai default, dan penggantian per sesi title: Antrean perintah x-i18n: - generated_at: "2026-04-30T09:45:45Z" + generated_at: "2026-04-30T18:38:50Z" model: gpt-5.5 provider: openai - source_hash: 2ac0c0ded9558b080714fa4b8be0d552f985911bf19b427020f9654ae4955b2d + source_hash: fbf1bb1ffd4ce06fa138f63e31651b8821226d9c95dd6b93d68326a5fb91fdd0 source_path: concepts/queue.md workflow: 16 --- -Kami menserialisasi eksekusi auto-reply masuk (semua kanal) melalui antrean kecil dalam proses untuk mencegah beberapa eksekusi agen saling bertabrakan, sambil tetap memungkinkan paralelisme yang aman di seluruh sesi. +Kami menserialkan run balasan otomatis masuk (semua kanal) melalui antrean kecil dalam proses untuk mencegah beberapa run agent bertabrakan, sambil tetap memungkinkan paralelisme aman lintas sesi. ## Mengapa -- Eksekusi auto-reply bisa mahal (panggilan LLM) dan dapat bertabrakan ketika beberapa pesan masuk tiba berdekatan. -- Serialisasi menghindari perebutan sumber daya bersama (file sesi, log, stdin CLI) dan mengurangi kemungkinan terkena batas laju upstream. +- Run balasan otomatis bisa mahal (panggilan LLM) dan bisa bertabrakan ketika beberapa pesan masuk tiba berdekatan. +- Serialisasi menghindari persaingan untuk sumber daya bersama (file sesi, log, stdin CLI) dan mengurangi kemungkinan batas laju upstream. ## Cara kerjanya -- Antrean FIFO yang sadar lajur mengosongkan setiap lajur dengan batas konkurensi yang dapat dikonfigurasi (default 1 untuk lajur yang tidak dikonfigurasi; main default ke 4, subagent ke 8). -- `runEmbeddedPiAgent` mengantrekan berdasarkan **kunci sesi** (lajur `session:`) untuk menjamin hanya ada satu eksekusi aktif per sesi. -- Setiap eksekusi sesi kemudian diantrekan ke **lajur global** (`main` secara default) sehingga paralelisme keseluruhan dibatasi oleh `agents.defaults.maxConcurrent`. -- Ketika logging verbose diaktifkan, eksekusi yang diantrekan mengeluarkan pemberitahuan singkat jika menunggu lebih dari ~2 d sebelum mulai. -- Indikator mengetik tetap aktif segera saat masuk antrean (jika didukung oleh kanal) sehingga pengalaman pengguna tidak berubah saat kita menunggu giliran. +- Antrean FIFO yang sadar lane mengosongkan setiap lane dengan batas konkurensi yang dapat dikonfigurasi (default 1 untuk lane yang tidak dikonfigurasi; main default ke 4, subagent ke 8). +- `runEmbeddedPiAgent` mengantre berdasarkan **kunci sesi** (lane `session:`) untuk menjamin hanya ada satu run aktif per sesi. +- Setiap run sesi kemudian diantrekan ke **lane global** (`main` secara default) sehingga paralelisme keseluruhan dibatasi oleh `agents.defaults.maxConcurrent`. +- Ketika logging verbose diaktifkan, run yang mengantre memancarkan pemberitahuan singkat jika menunggu lebih dari ~2 detik sebelum mulai. +- Indikator mengetik tetap menyala segera saat masuk antrean (ketika didukung oleh kanal) sehingga pengalaman pengguna tidak berubah saat kita menunggu giliran. ## Default -Jika tidak disetel, semua permukaan kanal masuk menggunakan: +Ketika tidak diatur, semua surface kanal masuk menggunakan: - `mode: "steer"` - `debounceMs: 500` @@ -38,26 +38,26 @@ Jika tidak disetel, semua permukaan kanal masuk menggunakan: - `drop: "summarize"` `steer` adalah default karena menjaga giliran model aktif tetap responsif tanpa -memulai eksekusi sesi kedua. Mode ini mengosongkan semua pesan pengarahan yang tiba -sebelum batas model berikutnya. Jika eksekusi saat ini tidak dapat menerima pengarahan, -OpenClaw beralih ke entri antrean tindak lanjut. +memulai run sesi kedua. Mode ini mengosongkan semua pesan pengarahan yang tiba +sebelum batas model berikutnya. Jika run saat ini tidak dapat menerima pengarahan, +OpenClaw kembali ke entri antrean followup. ## Mode antrean -Pesan masuk dapat mengarahkan eksekusi saat ini, menunggu giliran tindak lanjut, atau melakukan keduanya: +Pesan masuk dapat mengarahkan run saat ini, menunggu giliran followup, atau melakukan keduanya: -- `steer`: antrekan pesan pengarahan ke runtime aktif. Pi mengirimkan semua pesan pengarahan tertunda **setelah giliran asisten saat ini selesai menjalankan pemanggilan tool**, sebelum panggilan LLM berikutnya; Codex app-server menerima satu `turn/steer` yang dibatch. Jika eksekusi tidak aktif melakukan streaming atau pengarahan tidak tersedia, OpenClaw beralih ke entri antrean tindak lanjut. -- `queue` (legacy): pengarahan satu per satu yang lama. Pi mengirimkan satu pesan pengarahan yang diantrekan pada setiap batas model; Codex app-server menerima permintaan `turn/steer` terpisah. Utamakan `steer` kecuali Anda memerlukan perilaku serial sebelumnya. -- `followup`: antrekan setiap pesan untuk giliran agen berikutnya setelah eksekusi saat ini berakhir. -- `collect`: gabungkan pesan yang diantrekan menjadi giliran tindak lanjut **tunggal** setelah jendela hening. Jika pesan menargetkan kanal/thread yang berbeda, pesan dikosongkan secara individual untuk mempertahankan routing. -- `steer-backlog` (alias `steer+backlog`): arahkan sekarang **dan** pertahankan pesan yang sama untuk giliran tindak lanjut. -- `interrupt` (legacy): batalkan eksekusi aktif untuk sesi tersebut, lalu jalankan pesan terbaru. +- `steer`: antrekan pesan pengarahan ke runtime aktif. Pi mengirim semua pesan pengarahan tertunda **setelah giliran asisten saat ini selesai menjalankan panggilan tool-nya**, sebelum panggilan LLM berikutnya; Codex app-server menerima satu `turn/steer` yang dibatch. Jika run tidak aktif streaming atau pengarahan tidak tersedia, OpenClaw kembali ke entri antrean followup. +- `queue` (lama): pengarahan lama satu per satu. Pi mengirim satu pesan pengarahan yang diantrekan pada setiap batas model; Codex app-server menerima permintaan `turn/steer` terpisah. Lebih pilih `steer` kecuali Anda memerlukan perilaku terserialisasi sebelumnya. +- `followup`: antrekan setiap pesan untuk giliran agent berikutnya setelah run saat ini berakhir. +- `collect`: gabungkan pesan yang diantrekan menjadi giliran followup **tunggal** setelah jendela hening. Jika pesan menargetkan kanal/thread berbeda, pesan dikosongkan satu per satu untuk mempertahankan routing. +- `steer-backlog` (alias `steer+backlog`): arahkan sekarang **dan** pertahankan pesan yang sama untuk giliran followup. +- `interrupt` (lama): batalkan run aktif untuk sesi tersebut, lalu jalankan pesan terbaru. -Steer-backlog berarti Anda bisa mendapatkan respons tindak lanjut setelah eksekusi yang diarahkan, sehingga -permukaan streaming dapat terlihat seperti duplikat. Utamakan `collect`/`steer` jika Anda menginginkan +Steer-backlog berarti Anda bisa mendapatkan respons followup setelah run yang diarahkan, sehingga +surface streaming dapat terlihat seperti duplikat. Lebih pilih `collect`/`steer` jika Anda menginginkan satu respons per pesan masuk. -Untuk perilaku timing dan dependensi khusus runtime, lihat +Untuk timing spesifik runtime dan perilaku dependensi, lihat [Antrean pengarahan](/id/concepts/queue-steering). Konfigurasikan secara global atau per kanal melalui `messages.queue`: @@ -78,12 +78,12 @@ Konfigurasikan secara global atau per kanal melalui `messages.queue`: ## Opsi antrean -Opsi berlaku untuk `followup`, `collect`, dan `steer-backlog` (serta untuk `steer` atau `queue` legacy ketika pengarahan beralih ke tindak lanjut): +Opsi berlaku untuk `followup`, `collect`, dan `steer-backlog` (serta untuk `steer` atau `queue` lama ketika pengarahan kembali ke followup): -- `debounceMs`: jendela hening sebelum mengosongkan tindak lanjut yang diantrekan. Angka polos adalah milidetik; satuan `ms`, `s`, `m`, `h`, dan `d` diterima oleh opsi `/queue`. +- `debounceMs`: jendela hening sebelum mengosongkan followup yang diantrekan. Angka polos adalah milidetik; satuan `ms`, `s`, `m`, `h`, dan `d` diterima oleh opsi `/queue`. - `cap`: jumlah maksimum pesan yang diantrekan per sesi. Nilai di bawah `1` diabaikan. -- `drop: "summarize"`: default. Hapus entri antrean terlama sesuai kebutuhan, simpan ringkasan ringkas, dan injeksikan sebagai prompt tindak lanjut sintetis. -- `drop: "old"`: hapus entri antrean terlama sesuai kebutuhan, tanpa mempertahankan ringkasan. +- `drop: "summarize"`: default. Jatuhkan entri antrean tertua sesuai kebutuhan, simpan ringkasan padat, dan sisipkan sebagai prompt followup sintetis. +- `drop: "old"`: jatuhkan entri antrean tertua sesuai kebutuhan, tanpa mempertahankan ringkasan. - `drop: "new"`: tolak pesan terbaru ketika antrean sudah penuh. Default: `debounceMs: 500`, `cap: 20`, `drop: summarize`. @@ -92,16 +92,15 @@ Default: `debounceMs: 500`, `cap: 20`, `drop: summarize`. Untuk pemilihan mode, OpenClaw menyelesaikan: -1. Override `/queue` inline atau tersimpan per sesi. +1. Override `/queue` per sesi inline atau tersimpan. 2. `messages.queue.byChannel.`. 3. `messages.queue.mode`. 4. Default `steer`. Untuk opsi, opsi `/queue` inline atau tersimpan menang atas konfigurasi. Lalu debounce khusus kanal (`messages.queue.debounceMsByChannel`), default debounce -Plugin, opsi global `messages.queue`, dan default bawaan -diterapkan. `cap` dan `drop` adalah opsi global/sesi, bukan kunci konfigurasi -per kanal. +Plugin, opsi global `messages.queue`, dan default bawaan diterapkan. `cap` dan +`drop` adalah opsi global/sesi, bukan kunci konfigurasi per kanal. ## Override per sesi @@ -111,17 +110,18 @@ per kanal. ## Cakupan dan jaminan -- Berlaku untuk eksekusi agen auto-reply di semua kanal masuk yang menggunakan pipeline balasan gateway (WhatsApp web, Telegram, Slack, Discord, Signal, iMessage, webchat, dll.). -- Lajur default (`main`) berlaku di seluruh proses untuk inbound + heartbeat utama; setel `agents.defaults.maxConcurrent` untuk mengizinkan beberapa sesi berjalan paralel. -- Lajur tambahan mungkin ada (mis. `cron`, `cron-nested`, `nested`, `subagent`) sehingga job latar belakang dapat berjalan paralel tanpa memblokir balasan masuk. Giliran agen cron terisolasi menahan slot `cron` sementara eksekusi agen dalamnya menggunakan `cron-nested`; keduanya menggunakan `cron.maxConcurrentRuns`. Alur `nested` non-cron bersama mempertahankan perilaku lajurnya sendiri. Eksekusi terlepas ini dilacak sebagai [tugas latar belakang](/id/automation/tasks). -- Lajur per sesi menjamin bahwa hanya satu eksekusi agen menyentuh sesi tertentu pada satu waktu. -- Tanpa dependensi eksternal atau thread worker latar belakang; TypeScript + promise murni. +- Berlaku untuk run agent balasan otomatis di semua kanal masuk yang menggunakan pipeline balasan Gateway (WhatsApp web, Telegram, Slack, Discord, Signal, iMessage, webchat, dll.). +- Lane default (`main`) berlaku di seluruh proses untuk inbound + Heartbeat utama; atur `agents.defaults.maxConcurrent` untuk mengizinkan beberapa sesi berjalan paralel. +- Lane tambahan mungkin ada (mis. `cron`, `cron-nested`, `nested`, `subagent`) sehingga pekerjaan latar belakang dapat berjalan paralel tanpa memblokir balasan masuk. Giliran agent Cron terisolasi memegang slot `cron` sementara eksekusi agent bagian dalamnya menggunakan `cron-nested`; keduanya menggunakan `cron.maxConcurrentRuns`. Alur `nested` non-cron bersama mempertahankan perilaku lane masing-masing. Run terlepas ini dilacak sebagai [tugas latar belakang](/id/automation/tasks). +- Lane per sesi menjamin bahwa hanya satu run agent menyentuh sesi tertentu pada satu waktu. +- Tanpa dependensi eksternal atau thread worker latar belakang; TypeScript murni + promise. ## Pemecahan masalah - Jika perintah tampak macet, aktifkan log verbose dan cari baris “queued for …ms” untuk memastikan antrean sedang dikosongkan. - Jika Anda memerlukan kedalaman antrean, aktifkan log verbose dan pantau baris timing antrean. -- Ketika diagnostik diaktifkan, sesi yang tetap berada di `processing` melewati `diagnostics.stuckSessionWarnMs` mencatat peringatan sesi macet. Eksekusi embedded aktif, operasi balasan aktif, dan tugas lajur aktif tetap hanya berupa peringatan secara default; pembukuan startup yang basi tanpa pekerjaan sesi aktif dapat melepas lajur sesi terdampak sehingga pekerjaan yang diantrekan dikosongkan. +- Run Codex app-server yang menerima sebuah giliran lalu berhenti memancarkan progres diinterupsi oleh adapter Codex sehingga lane sesi aktif dapat dilepas alih-alih menunggu timeout run luar. +- Ketika diagnostik diaktifkan, sesi yang tetap berada dalam `processing` melewati `diagnostics.stuckSessionWarnMs` mencatat peringatan sesi macet. Run embedded aktif, operasi balasan aktif, dan tugas lane aktif tetap hanya berupa peringatan secara default; bookkeeping startup yang stale tanpa pekerjaan sesi aktif dapat melepas lane sesi yang terpengaruh sehingga pekerjaan yang diantrekan dapat dikosongkan. ## Terkait diff --git a/docs/id/help/testing.md b/docs/id/help/testing.md index 8bfc155d0..99678b403 100644 --- a/docs/id/help/testing.md +++ b/docs/id/help/testing.md @@ -2,94 +2,95 @@ read_when: - Menjalankan pengujian secara lokal atau di CI - Menambahkan uji regresi untuk bug model/penyedia - - Men-debug perilaku Gateway + agen -summary: 'Kit pengujian: suite unit/e2e/live, runner Docker, dan cakupan setiap pengujian' + - Mendiagnosis perilaku Gateway + agen +summary: 'Kit pengujian: rangkaian unit/e2e/live, runner Docker, dan cakupan setiap pengujian' title: Pengujian x-i18n: - generated_at: "2026-04-30T09:54:23Z" + generated_at: "2026-04-30T18:38:57Z" model: gpt-5.5 provider: openai - source_hash: c7b506350f11431195cb55c84cb10e99efb5f43b934079528b982627024d1ffc + source_hash: 470a96c6b47c2708950d05adc4a4efba5fe290f0675a131e2888d2d0032d5953 source_path: help/testing.md workflow: 16 --- -OpenClaw memiliki tiga suite Vitest (unit/integrasi, e2e, langsung) dan sejumlah kecil penjalan Docker. Dokumen ini adalah panduan "cara kami menguji": +OpenClaw memiliki tiga suite Vitest (unit/integrasi, e2e, live) dan sekumpulan kecil +runner Docker. Dokumen ini adalah panduan "cara kami menguji": - Apa yang dicakup setiap suite (dan apa yang sengaja _tidak_ dicakup). -- Perintah mana yang dijalankan untuk alur kerja umum (lokal, prapush, debugging). -- Cara pengujian langsung menemukan kredensial dan memilih model/penyedia. -- Cara menambahkan regresi untuk masalah model/penyedia dunia nyata. +- Perintah mana yang dijalankan untuk alur kerja umum (lokal, pra-push, debugging). +- Bagaimana pengujian live menemukan kredensial dan memilih model/penyedia. +- Bagaimana menambahkan regresi untuk masalah model/penyedia dunia nyata. -**Tumpukan QA (qa-lab, qa-channel, jalur transport langsung)** didokumentasikan secara terpisah: +**Tumpukan QA (qa-lab, qa-channel, jalur transport live)** didokumentasikan secara terpisah: - [Ikhtisar QA](/id/concepts/qa-e2e-automation) — arsitektur, permukaan perintah, penulisan skenario. -- [QA matriks](/id/concepts/qa-matrix) — referensi untuk `pnpm openclaw qa matrix`. -- [Kanal QA](/id/channels/qa-channel) — Plugin transport sintetis yang digunakan oleh skenario berbasis repo. +- [QA Matriks](/id/concepts/qa-matrix) — referensi untuk `pnpm openclaw qa matrix`. +- [Kanal QA](/id/channels/qa-channel) — plugin transport sintetis yang digunakan oleh skenario berbasis repo. -Halaman ini mencakup menjalankan suite pengujian reguler dan penjalan Docker/Parallels. Bagian penjalan khusus QA di bawah ([Penjalan khusus QA](#qa-specific-runners)) mencantumkan pemanggilan `qa` konkret dan merujuk kembali ke referensi di atas. +Halaman ini mencakup menjalankan suite pengujian reguler dan runner Docker/Parallels. Bagian runner khusus QA di bawah ([Runner khusus QA](#qa-specific-runners)) mencantumkan pemanggilan `qa` yang konkret dan merujuk kembali ke referensi di atas. ## Mulai cepat -Hampir setiap hari: +Sebagian besar hari: -- Gerbang penuh (diharapkan sebelum push): `pnpm build && pnpm check && pnpm check:test-types && pnpm test` -- Jalankan suite penuh lokal lebih cepat pada mesin yang lapang: `pnpm test:max` -- Loop pengamatan Vitest langsung: `pnpm test:watch` -- Penargetan berkas langsung kini juga merutekan path ekstensi/kanal: `pnpm test extensions/discord/src/monitor/message-handler.preflight.test.ts` -- Utamakan menjalankan target spesifik terlebih dahulu saat Anda mengiterasi satu kegagalan. +- Gate penuh (diharapkan sebelum push): `pnpm build && pnpm check && pnpm check:test-types && pnpm test` +- Jalankan suite penuh lokal lebih cepat di mesin yang lapang: `pnpm test:max` +- Loop watch Vitest langsung: `pnpm test:watch` +- Penargetan file langsung kini juga merutekan path ekstensi/kanal: `pnpm test extensions/discord/src/monitor/message-handler.preflight.test.ts` +- Utamakan run tertarget terlebih dahulu saat Anda sedang mengiterasi satu kegagalan. - Situs QA berbasis Docker: `pnpm qa:lab:up` - Jalur QA berbasis VM Linux: `pnpm openclaw qa suite --runner multipass --scenario channel-chat-baseline` -Saat Anda menyentuh pengujian atau menginginkan keyakinan tambahan: +Saat Anda menyentuh pengujian atau ingin keyakinan ekstra: -- Gerbang cakupan: `pnpm test:coverage` +- Gate cakupan: `pnpm test:coverage` - Suite E2E: `pnpm test:e2e` Saat men-debug penyedia/model nyata (memerlukan kredensial nyata): -- Suite langsung (model + probe alat/gambar Gateway): `pnpm test:live` -- Targetkan satu berkas langsung secara senyap: `pnpm test:live -- src/agents/models.profiles.live.test.ts` -- Sapuan model langsung Docker: `pnpm test:docker:live-models` - - Setiap model yang dipilih kini menjalankan satu giliran teks plus probe kecil bergaya pembacaan berkas. - Model yang metadatanya mengiklankan input `image` juga menjalankan satu giliran gambar kecil. - Nonaktifkan probe tambahan dengan `OPENCLAW_LIVE_MODEL_FILE_PROBE=0` atau +- Suite live (model + probe alat/gambar gateway): `pnpm test:live` +- Targetkan satu file live secara senyap: `pnpm test:live -- src/agents/models.profiles.live.test.ts` +- Sweep model live Docker: `pnpm test:docker:live-models` + - Setiap model yang dipilih kini menjalankan giliran teks plus probe kecil bergaya pembacaan file. + Model yang metadatanya mengiklankan input `image` juga menjalankan giliran gambar kecil. + Nonaktifkan probe ekstra dengan `OPENCLAW_LIVE_MODEL_FILE_PROBE=0` atau `OPENCLAW_LIVE_MODEL_IMAGE_PROBE=0` saat mengisolasi kegagalan penyedia. - Cakupan CI: `OpenClaw Scheduled Live And E2E Checks` harian dan - `OpenClaw Release Checks` manual sama-sama memanggil alur kerja langsung/E2E yang dapat dipakai ulang dengan - `include_live_suites: true`, yang mencakup job matriks model langsung Docker terpisah - yang dibagi berdasarkan penyedia. - - Untuk menjalankan ulang CI yang terfokus, dispatch `OpenClaw Live And E2E Checks (Reusable)` + `OpenClaw Release Checks` manual sama-sama memanggil workflow live/E2E yang dapat digunakan ulang dengan + `include_live_suites: true`, yang mencakup job matriks model live Docker terpisah + yang di-shard berdasarkan penyedia. + - Untuk rerun CI terfokus, dispatch `OpenClaw Live And E2E Checks (Reusable)` dengan `include_live_suites: true` dan `live_models_only: true`. - - Tambahkan rahasia penyedia bernilai sinyal tinggi baru ke `scripts/ci-hydrate-live-auth.sh` + - Tambahkan secret penyedia baru bernilai sinyal tinggi ke `scripts/ci-hydrate-live-auth.sh` plus `.github/workflows/openclaw-live-and-e2e-checks-reusable.yml` dan pemanggil terjadwal/rilisnya. - Smoke chat terikat Codex native: `pnpm test:docker:live-codex-bind` - - Menjalankan jalur langsung Docker terhadap path server aplikasi Codex, mengikat DM + - Menjalankan jalur live Docker terhadap path app-server Codex, mengikat DM Slack sintetis dengan `/codex bind`, menjalankan `/codex fast` dan `/codex permissions`, lalu memverifikasi balasan biasa dan lampiran gambar - dirutekan melalui pengikatan Plugin native, bukan ACP. -- Smoke harness server aplikasi Codex: `pnpm test:docker:live-codex-harness` - - Menjalankan giliran agen Gateway melalui harness server aplikasi Codex milik Plugin, + dirutekan melalui binding Plugin native alih-alih ACP. +- Smoke harness app-server Codex: `pnpm test:docker:live-codex-harness` + - Menjalankan giliran agen gateway melalui harness app-server Codex milik Plugin, memverifikasi `/codex status` dan `/codex models`, dan secara default menjalankan probe gambar, - Cron MCP, subagen, dan Guardian. Nonaktifkan probe subagen dengan - `OPENCLAW_LIVE_CODEX_HARNESS_SUBAGENT_PROBE=0` saat mengisolasi kegagalan server aplikasi Codex - lainnya. Untuk pemeriksaan subagen yang terfokus, nonaktifkan probe lain: + MCP cron, sub-agen, dan Guardian. Nonaktifkan probe sub-agen dengan + `OPENCLAW_LIVE_CODEX_HARNESS_SUBAGENT_PROBE=0` saat mengisolasi kegagalan app-server Codex + lain. Untuk pemeriksaan sub-agen terfokus, nonaktifkan probe lain: `OPENCLAW_LIVE_CODEX_HARNESS_IMAGE_PROBE=0 OPENCLAW_LIVE_CODEX_HARNESS_MCP_PROBE=0 OPENCLAW_LIVE_CODEX_HARNESS_GUARDIAN_PROBE=0 OPENCLAW_LIVE_CODEX_HARNESS_SUBAGENT_PROBE=1 pnpm test:docker:live-codex-harness`. - Ini keluar setelah probe subagen kecuali + Ini keluar setelah probe sub-agen kecuali `OPENCLAW_LIVE_CODEX_HARNESS_SUBAGENT_ONLY=0` disetel. - Smoke perintah penyelamatan Crestodian: `pnpm test:live:crestodian-rescue-channel` - - Pemeriksaan ikut serta berlapis untuk permukaan perintah penyelamatan kanal pesan. - Ini menjalankan `/crestodian status`, mengantre perubahan model persisten, + - Pemeriksaan opt-in berlapis untuk permukaan perintah penyelamatan kanal pesan. + Ini menjalankan `/crestodian status`, mengantrekan perubahan model persisten, membalas `/crestodian yes`, dan memverifikasi path tulis audit/konfigurasi. -- Smoke Docker perencana Crestodian: `pnpm test:docker:crestodian-planner` - - Menjalankan Crestodian dalam kontainer tanpa konfigurasi dengan CLI Claude palsu di `PATH` - dan memverifikasi fallback perencana fuzzy diterjemahkan menjadi penulisan konfigurasi bertipe +- Smoke Docker planner Crestodian: `pnpm test:docker:crestodian-planner` + - Menjalankan Crestodian dalam kontainer tanpa konfigurasi dengan Claude CLI palsu di `PATH` + dan memverifikasi fallback planner fuzzy diterjemahkan menjadi penulisan konfigurasi bertipe yang diaudit. -- Smoke Docker pertama kali Crestodian: `pnpm test:docker:crestodian-first-run` - - Memulai dari direktori state OpenClaw kosong, merutekan `openclaw` polos ke +- Smoke Docker first-run Crestodian: `pnpm test:docker:crestodian-first-run` + - Dimulai dari direktori state OpenClaw kosong, merutekan `openclaw` polos ke Crestodian, menerapkan penulisan setup/model/agen/Plugin Discord + SecretRef, memvalidasi konfigurasi, dan memverifikasi entri audit. Path setup Ring 0 yang sama juga dicakup di QA Lab oleh @@ -97,110 +98,111 @@ Saat men-debug penyedia/model nyata (memerlukan kredensial nyata): - Smoke biaya Moonshot/Kimi: dengan `MOONSHOT_API_KEY` disetel, jalankan `openclaw models list --provider moonshot --json`, lalu jalankan `openclaw agent --local --session-id live-kimi-cost --message 'Reply exactly: KIMI_LIVE_OK' --thinking off --json` - terisolasi terhadap `moonshot/kimi-k2.6`. Verifikasi JSON melaporkan Moonshot/K2.6 dan + yang terisolasi terhadap `moonshot/kimi-k2.6`. Verifikasi JSON melaporkan Moonshot/K2.6 dan transkrip asisten menyimpan `usage.cost` yang dinormalisasi. -Saat Anda hanya membutuhkan satu kasus gagal, utamakan mempersempit pengujian langsung melalui variabel lingkungan daftar izin yang dijelaskan di bawah. +Saat Anda hanya membutuhkan satu kasus yang gagal, utamakan mempersempit pengujian live melalui variabel env allowlist yang dijelaskan di bawah. -## Penjalan khusus QA +## Runner khusus QA -Perintah ini berada di samping suite pengujian utama saat Anda membutuhkan realisme QA Lab: +Perintah-perintah ini berada di samping suite pengujian utama saat Anda memerlukan realisme QA-lab: -CI menjalankan QA Lab dalam alur kerja khusus. `Parity gate` berjalan pada PR yang cocok dan +CI menjalankan QA Lab dalam workflow khusus. `Parity gate` berjalan pada PR yang cocok dan dari dispatch manual dengan penyedia mock. `QA-Lab - All Lanes` berjalan setiap malam di -`main` dan dari dispatch manual dengan gerbang paritas mock, jalur Matrix langsung, -jalur Telegram langsung yang dikelola Convex, dan jalur Discord langsung yang dikelola Convex sebagai +`main` dan dari dispatch manual dengan gate paritas mock, jalur Matrix live, +jalur Telegram live yang dikelola Convex, dan jalur Discord live yang dikelola Convex sebagai job paralel. QA terjadwal dan pemeriksaan rilis meneruskan Matrix `--profile fast` -secara eksplisit, sementara masukan default CLI Matrix dan alur kerja manual tetap -`all`; dispatch manual dapat membagi `all` menjadi job `transport`, `media`, `e2ee-smoke`, +secara eksplisit, sementara default input CLI Matrix dan workflow manual tetap +`all`; dispatch manual dapat men-shard `all` menjadi job `transport`, `media`, `e2ee-smoke`, `e2ee-deep`, dan `e2ee-cli`. `OpenClaw Release Checks` menjalankan paritas plus -jalur Matrix cepat dan Telegram sebelum persetujuan rilis, menggunakan +jalur Matrix dan Telegram cepat sebelum persetujuan rilis, menggunakan `mock-openai/gpt-5.5` untuk pemeriksaan transport rilis agar tetap deterministik -dan menghindari startup Plugin penyedia normal. Gateway transport langsung ini menonaktifkan +dan menghindari startup Plugin penyedia normal. Gateway transport live ini menonaktifkan pencarian memori; perilaku memori tetap dicakup oleh suite paritas QA. -Shard media langsung rilis penuh menggunakan +Shard media live rilis penuh menggunakan `ghcr.io/openclaw/openclaw-live-media-runner:ubuntu-24.04`, yang sudah memiliki -`ffmpeg` dan `ffprobe`. Shard model/backend langsung Docker menggunakan image bersama +`ffmpeg` dan `ffprobe`. Shard model/backend live Docker menggunakan image bersama `ghcr.io/openclaw/openclaw-live-test:` yang dibangun sekali per commit yang dipilih, -lalu menariknya dengan `OPENCLAW_SKIP_DOCKER_BUILD=1`, bukan membangun ulang +lalu menariknya dengan `OPENCLAW_SKIP_DOCKER_BUILD=1` alih-alih membangun ulang di dalam setiap shard. - `pnpm openclaw qa suite` - Menjalankan skenario QA berbasis repo langsung di host. - - Menjalankan beberapa skenario yang dipilih secara paralel secara default dengan worker - Gateway terisolasi. `qa-channel` default ke konkurensi 4 (dibatasi oleh - jumlah skenario yang dipilih). Gunakan `--concurrency ` untuk menyesuaikan jumlah worker, - atau `--concurrency 1` untuk jalur serial lama. - - Keluar bukan nol saat skenario apa pun gagal. Gunakan `--allow-failures` saat Anda + - Menjalankan beberapa skenario terpilih secara paralel secara default dengan worker + gateway terisolasi. `qa-channel` default ke konkurensi 4 (dibatasi oleh + jumlah skenario terpilih). Gunakan `--concurrency ` untuk menyetel jumlah + worker, atau `--concurrency 1` untuk jalur serial lama. + - Keluar non-zero saat ada skenario yang gagal. Gunakan `--allow-failures` saat Anda menginginkan artefak tanpa kode keluar gagal. - Mendukung mode penyedia `live-frontier`, `mock-openai`, dan `aimock`. - `aimock` memulai server penyedia lokal berbasis AIMock untuk cakupan fixture eksperimental - dan mock protokol tanpa menggantikan jalur `mock-openai` yang sadar skenario. + `aimock` memulai server penyedia lokal berbasis AIMock untuk cakupan fixture + dan mock protokol eksperimental tanpa menggantikan jalur `mock-openai` + yang sadar skenario. - `pnpm test:gateway:cpu-scenarios` - - Menjalankan benchmark startup Gateway plus paket kecil skenario mock QA Lab + - Menjalankan bench startup gateway plus paket kecil skenario QA Lab mock (`channel-chat-baseline`, `memory-failure-fallback`, `gateway-restart-inflight-run`) dan menulis ringkasan observasi CPU gabungan di bawah `.artifacts/gateway-cpu-scenarios/`. - - Menandai hanya observasi CPU panas yang berkelanjutan secara default (`--cpu-core-warn` + - Secara default hanya menandai observasi CPU panas yang berkelanjutan (`--cpu-core-warn` plus `--hot-wall-warn-ms`), sehingga lonjakan startup singkat dicatat sebagai metrik - tanpa terlihat seperti regresi Gateway yang terpaku selama beberapa menit. - - Menggunakan artefak `dist` yang telah dibangun; jalankan build terlebih dahulu saat checkout belum - memiliki keluaran runtime yang segar. + tanpa terlihat seperti regresi gateway yang mematok CPU selama beberapa menit. + - Menggunakan artefak `dist` yang sudah dibangun; jalankan build terlebih dahulu saat checkout belum + memiliki output runtime segar. - `pnpm openclaw qa suite --runner multipass` - Menjalankan suite QA yang sama di dalam VM Linux Multipass sekali pakai. - Mempertahankan perilaku pemilihan skenario yang sama seperti `qa suite` di host. - Menggunakan ulang flag pemilihan penyedia/model yang sama seperti `qa suite`. - - Eksekusi langsung meneruskan masukan auth QA yang didukung dan praktis untuk tamu: - kunci penyedia berbasis env, path konfigurasi penyedia langsung QA, dan `CODEX_HOME` - jika ada. - - Direktori keluaran harus tetap berada di bawah root repo agar tamu dapat menulis balik melalui - workspace yang dipasang. + - Run live meneruskan input auth QA yang didukung dan praktis untuk guest: + kunci penyedia berbasis env, path konfigurasi penyedia live QA, dan `CODEX_HOME` + saat ada. + - Direktori output harus tetap berada di bawah root repo agar guest dapat menulis balik melalui + workspace yang di-mount. - Menulis laporan + ringkasan QA normal plus log Multipass di bawah `.artifacts/qa-e2e/...`. - `pnpm qa:lab:up` - Memulai situs QA berbasis Docker untuk pekerjaan QA bergaya operator. - `pnpm test:docker:npm-onboard-channel-agent` - Membangun tarball npm dari checkout saat ini, menginstalnya secara global di - Docker, menjalankan onboarding kunci API OpenAI noninteraktif, mengonfigurasi Telegram + Docker, menjalankan onboarding kunci API OpenAI non-interaktif, mengonfigurasi Telegram secara default, memverifikasi bahwa mengaktifkan Plugin menginstal dependensi runtime sesuai - permintaan, menjalankan doctor, dan menjalankan satu giliran agen lokal terhadap endpoint OpenAI - yang dimock. - - Gunakan `OPENCLAW_NPM_ONBOARD_CHANNEL=discord` untuk menjalankan jalur instalasi paket yang sama - dengan Discord. + kebutuhan, menjalankan doctor, dan menjalankan satu giliran agen lokal terhadap endpoint OpenAI + yang di-mock. + - Gunakan `OPENCLAW_NPM_ONBOARD_CHANNEL=discord` untuk menjalankan jalur packaged-install + yang sama dengan Discord. - `pnpm test:docker:session-runtime-context` - Menjalankan smoke Docker aplikasi terbangun yang deterministik untuk transkrip konteks runtime tertanam. Ini memverifikasi konteks runtime OpenClaw tersembunyi dipersistenkan sebagai - pesan kustom non-tampilan, bukan bocor ke giliran pengguna yang terlihat, - lalu menyemai JSONL sesi rusak yang terdampak dan memverifikasi + pesan kustom non-tampilan alih-alih bocor ke giliran pengguna yang terlihat, + lalu men-seed JSONL sesi rusak yang terdampak dan memverifikasi `openclaw doctor --fix` menulis ulangnya ke cabang aktif dengan cadangan. - `pnpm test:docker:npm-telegram-live` - Menginstal kandidat paket OpenClaw di Docker, menjalankan onboarding paket terinstal, - mengonfigurasi Telegram melalui CLI terinstal, lalu menggunakan ulang jalur QA Telegram - langsung dengan paket terinstal itu sebagai Gateway SUT. + mengonfigurasi Telegram melalui CLI terinstal, lalu menggunakan ulang jalur QA Telegram live + dengan paket terinstal tersebut sebagai Gateway SUT. - Default ke `OPENCLAW_NPM_TELEGRAM_PACKAGE_SPEC=openclaw@beta`; setel `OPENCLAW_NPM_TELEGRAM_PACKAGE_TGZ=/path/to/openclaw-current.tgz` atau - `OPENCLAW_CURRENT_PACKAGE_TGZ` untuk menguji tarball lokal yang telah di-resolve, bukan + `OPENCLAW_CURRENT_PACKAGE_TGZ` untuk menguji tarball lokal yang sudah di-resolve alih-alih menginstal dari registry. - - Menggunakan kredensial env Telegram yang sama atau sumber kredensial Convex seperti + - Menggunakan kredensial env Telegram atau sumber kredensial Convex yang sama seperti `pnpm openclaw qa telegram`. Untuk otomatisasi CI/rilis, setel `OPENCLAW_NPM_TELEGRAM_CREDENTIAL_SOURCE=convex` plus - `OPENCLAW_QA_CONVEX_SITE_URL` dan rahasia peran. Jika - `OPENCLAW_QA_CONVEX_SITE_URL` dan rahasia peran Convex ada di CI, - pembungkus Docker memilih Convex secara otomatis. - - `OPENCLAW_NPM_TELEGRAM_CREDENTIAL_ROLE=ci|maintainer` menggantikan + `OPENCLAW_QA_CONVEX_SITE_URL` dan secret peran. Jika + `OPENCLAW_QA_CONVEX_SITE_URL` dan secret peran Convex ada di CI, + wrapper Docker memilih Convex secara otomatis. + - `OPENCLAW_NPM_TELEGRAM_CREDENTIAL_ROLE=ci|maintainer` menimpa `OPENCLAW_QA_CREDENTIAL_ROLE` bersama hanya untuk jalur ini. - - GitHub Actions mengekspos jalur ini sebagai alur kerja maintainer manual - `NPM Telegram Beta E2E`. Ini tidak berjalan saat merge. Alur kerja menggunakan - lingkungan `qa-live-shared` dan lease kredensial CI Convex. -- GitHub Actions juga mengekspos `Package Acceptance` untuk bukti produk sampingan + - GitHub Actions mengekspos jalur ini sebagai workflow maintainer manual + `NPM Telegram Beta E2E`. Ini tidak berjalan saat merge. Workflow menggunakan environment + `qa-live-shared` dan lease kredensial CI Convex. +- GitHub Actions juga mengekspos `Package Acceptance` untuk bukti produk side-run terhadap satu paket kandidat. Ini menerima ref tepercaya, spec npm terpublikasi, URL tarball HTTPS plus SHA-256, atau artefak tarball dari run lain, mengunggah `openclaw-current.tgz` yang dinormalisasi sebagai `package-under-test`, lalu menjalankan - penjadwal E2E Docker yang ada dengan profil jalur smoke, package, product, full, atau custom. - Setel `telegram_mode=mock-openai` atau `live-frontier` untuk menjalankan alur kerja QA + scheduler Docker E2E yang ada dengan profil jalur smoke, package, product, full, atau custom. + Setel `telegram_mode=mock-openai` atau `live-frontier` untuk menjalankan workflow QA Telegram terhadap artefak `package-under-test` yang sama. - Bukti produk beta terbaru: @@ -222,7 +224,7 @@ gh workflow run package-acceptance.yml --ref main \ -f suite_profile=package ``` -- Bukti artefak mengunduh artefak tarball dari run Actions lain: +- Bukti artefak mengunduh artefak tarball dari proses Actions lain: ```bash gh workflow run package-acceptance.yml --ref main \ @@ -234,29 +236,29 @@ gh workflow run package-acceptance.yml --ref main \ - `pnpm test:docker:bundled-channel-deps` - Mengemas dan menginstal build OpenClaw saat ini di Docker, memulai Gateway - dengan OpenAI yang dikonfigurasi, lalu mengaktifkan channel/Plugin bawaan melalui edit + dengan OpenAI yang dikonfigurasi, lalu mengaktifkan channel/plugin bawaan melalui pengeditan konfigurasi. - Memverifikasi bahwa penemuan penyiapan membiarkan dependensi runtime Plugin - yang belum dikonfigurasi tetap tidak ada, run Gateway atau doctor pertama yang - dikonfigurasi menginstal dependensi runtime setiap Plugin bawaan sesuai kebutuhan, - dan restart kedua tidak menginstal ulang dependensi yang sudah diaktifkan. + yang belum dikonfigurasi tetap tidak ada, proses Gateway atau doctor pertama yang dikonfigurasi menginstal dependensi runtime setiap Plugin bawaan sesuai kebutuhan, dan restart kedua tidak + menginstal ulang dependensi yang sudah diaktifkan. - Juga menginstal baseline npm lama yang diketahui, mengaktifkan Telegram sebelum menjalankan - `openclaw update --tag `, dan memverifikasi bahwa doctor pasca-pembaruan - kandidat memperbaiki dependensi runtime channel bawaan tanpa perbaikan postinstall + `openclaw update --tag `, dan memverifikasi bahwa doctor pascapembaruan kandidat + memperbaiki dependensi runtime channel bawaan tanpa perbaikan postinstall dari sisi harness. - `pnpm test:parallels:npm-update` - - Menjalankan smoke pembaruan instalasi terpaket native di seluruh tamu Parallels. Setiap - platform yang dipilih pertama-tama menginstal paket baseline yang diminta, lalu menjalankan + - Menjalankan smoke pembaruan instalasi paket native di seluruh tamu Parallels. Setiap + platform yang dipilih terlebih dahulu menginstal paket baseline yang diminta, lalu menjalankan perintah `openclaw update` yang terinstal di tamu yang sama dan memverifikasi - versi yang terinstal, status pembaruan, kesiapan gateway, dan satu giliran agen + versi terinstal, status pembaruan, kesiapan Gateway, dan satu giliran agen lokal. - Gunakan `--platform macos`, `--platform windows`, atau `--platform linux` saat - mengiterasi satu tamu. Gunakan `--json` untuk jalur artefak ringkasan dan + mengiterasi pada satu tamu. Gunakan `--json` untuk jalur artefak ringkasan dan status per-lane. - Lane OpenAI menggunakan `openai/gpt-5.5` untuk bukti giliran agen live secara - default. Berikan `--model ` atau setel - `OPENCLAW_PARALLELS_OPENAI_MODEL` saat sengaja memvalidasi model OpenAI lain. - - Bungkus run lokal yang panjang dalam timeout host agar macet transport Parallels tidak + default. Teruskan `--model ` atau atur + `OPENCLAW_PARALLELS_OPENAI_MODEL` saat sengaja memvalidasi model + OpenAI lain. + - Bungkus proses lokal yang panjang dengan timeout host agar macetnya transport Parallels tidak menghabiskan sisa jendela pengujian: ```bash @@ -266,43 +268,43 @@ gh workflow run package-acceptance.yml --ref main \ - Skrip menulis log lane bersarang di bawah `/tmp/openclaw-parallels-npm-update.*`. Periksa `windows-update.log`, `macos-update.log`, atau `linux-update.log` - sebelum menganggap wrapper luar macet. + sebelum mengasumsikan wrapper luar macet. - Pembaruan Windows dapat menghabiskan 10 hingga 15 menit dalam perbaikan dependensi - doctor/runtime pasca-pembaruan pada tamu dingin; itu masih sehat saat log debug + doctor/runtime pascapembaruan pada tamu cold; itu masih sehat saat log debug npm bersarang terus bergerak. - - Jangan jalankan wrapper agregat ini secara paralel dengan lane smoke Parallels - macOS, Windows, atau Linux individual. Mereka berbagi status VM dan dapat bertabrakan pada - pemulihan snapshot, penyajian paket, atau status gateway tamu. - - Bukti pasca-pembaruan menjalankan permukaan Plugin bawaan normal karena + - Jangan menjalankan wrapper agregat ini secara paralel dengan lane smoke Parallels + macOS, Windows, atau Linux individual. Mereka berbagi status VM dan dapat bertabrakan saat + pemulihan snapshot, penyajian paket, atau status Gateway tamu. + - Bukti pascapembaruan menjalankan permukaan Plugin bawaan normal karena facade kapabilitas seperti speech, pembuatan gambar, dan pemahaman media - dimuat melalui API runtime bawaan meskipun giliran agen itu sendiri hanya - memeriksa respons teks sederhana. + dimuat melalui API runtime bawaan bahkan saat giliran agen + itu sendiri hanya memeriksa respons teks sederhana. - `pnpm openclaw qa aimock` - - Hanya memulai server penyedia AIMock lokal untuk pengujian smoke protokol - langsung. + - Hanya memulai server penyedia AIMock lokal untuk pengujian smoke + protokol langsung. - `pnpm openclaw qa matrix` - - Menjalankan lane QA live Matrix terhadap homeserver Tuwunel sekali pakai yang didukung Docker. Hanya checkout sumber — instalasi terpaket tidak mengirimkan `qa-lab`. + - Menjalankan lane QA live Matrix terhadap homeserver Tuwunel sekali pakai yang didukung Docker. Hanya checkout sumber — instalasi paket tidak mengirimkan `qa-lab`. - CLI lengkap, katalog profil/skenario, variabel env, dan tata letak artefak: [QA Matrix](/id/concepts/qa-matrix). - `pnpm openclaw qa telegram` - Menjalankan lane QA live Telegram terhadap grup privat nyata menggunakan token bot driver dan SUT dari env. - - Memerlukan `OPENCLAW_QA_TELEGRAM_GROUP_ID`, `OPENCLAW_QA_TELEGRAM_DRIVER_BOT_TOKEN`, dan `OPENCLAW_QA_TELEGRAM_SUT_BOT_TOKEN`. ID grup harus berupa ID obrolan Telegram numerik. - - Mendukung `--credential-source convex` untuk kredensial pool bersama. Gunakan mode env secara default, atau setel `OPENCLAW_QA_CREDENTIAL_SOURCE=convex` untuk ikut memakai lease pool. - - Keluar non-nol saat skenario apa pun gagal. Gunakan `--allow-failures` saat Anda + - Memerlukan `OPENCLAW_QA_TELEGRAM_GROUP_ID`, `OPENCLAW_QA_TELEGRAM_DRIVER_BOT_TOKEN`, dan `OPENCLAW_QA_TELEGRAM_SUT_BOT_TOKEN`. Id grup harus berupa id chat Telegram numerik. + - Mendukung `--credential-source convex` untuk kredensial pooled bersama. Gunakan mode env secara default, atau atur `OPENCLAW_QA_CREDENTIAL_SOURCE=convex` untuk ikut memakai lease pooled. + - Keluar non-nol saat skenario mana pun gagal. Gunakan `--allow-failures` saat Anda menginginkan artefak tanpa kode keluar gagal. - Memerlukan dua bot berbeda dalam grup privat yang sama, dengan bot SUT mengekspos nama pengguna Telegram. - - Untuk observasi bot-ke-bot yang stabil, aktifkan Mode Komunikasi Bot-ke-Bot di `@BotFather` untuk kedua bot dan pastikan bot driver dapat mengamati lalu lintas bot grup. - - Menulis laporan QA Telegram, ringkasan, dan artefak pesan-teramati di bawah `.artifacts/qa-e2e/...`. Skenario balasan mencakup RTT dari permintaan kirim driver hingga balasan SUT yang teramati. + - Untuk observasi bot-ke-bot yang stabil, aktifkan Bot-to-Bot Communication Mode di `@BotFather` untuk kedua bot dan pastikan bot driver dapat mengamati lalu lintas bot grup. + - Menulis laporan QA Telegram, ringkasan, dan artefak pesan yang diamati di bawah `.artifacts/qa-e2e/...`. Skenario balasan menyertakan RTT dari permintaan kirim driver hingga balasan SUT yang diamati. -Lane transport live berbagi satu kontrak standar agar transport baru tidak menyimpang; matriks cakupan per-lane berada di [ikhtisar QA → Cakupan transport live](/id/concepts/qa-e2e-automation#live-transport-coverage). `qa-channel` adalah suite sintetis luas dan bukan bagian dari matriks itu. +Lane transport live berbagi satu kontrak standar sehingga transport baru tidak menyimpang; matriks cakupan per-lane berada di [ikhtisar QA → Cakupan transport live](/id/concepts/qa-e2e-automation#live-transport-coverage). `qa-channel` adalah suite sintetis luas dan bukan bagian dari matriks tersebut. -### Kredensial Telegram bersama melalui Convex (v1) +### Kredensial Telegram Bersama melalui Convex (v1) Saat `--credential-source convex` (atau `OPENCLAW_QA_CREDENTIAL_SOURCE=convex`) diaktifkan untuk -`openclaw qa telegram`, lab QA memperoleh lease eksklusif dari pool yang didukung Convex, mengirim Heartbeat -untuk lease itu selama lane berjalan, dan merilis lease saat shutdown. +`openclaw qa telegram`, QA lab memperoleh lease eksklusif dari pool yang didukung Convex, mengirim Heartbeat +untuk lease tersebut saat lane berjalan, dan melepas lease saat shutdown. -Scaffold proyek Convex referensi: +Scaffold proyek referensi Convex: - `qa/convex-credential-broker/` @@ -314,7 +316,7 @@ Variabel env wajib: - `OPENCLAW_QA_CONVEX_SECRET_CI` untuk `ci` - Pemilihan peran kredensial: - CLI: `--credential-role maintainer|ci` - - Default env: `OPENCLAW_QA_CREDENTIAL_ROLE` (default ke `ci` di CI, selain itu `maintainer`) + - Default env: `OPENCLAW_QA_CREDENTIAL_ROLE` (default ke `ci` di CI, `maintainer` selain itu) Variabel env opsional: @@ -323,12 +325,12 @@ Variabel env opsional: - `OPENCLAW_QA_CREDENTIAL_ACQUIRE_TIMEOUT_MS` (default `90000`) - `OPENCLAW_QA_CREDENTIAL_HTTP_TIMEOUT_MS` (default `15000`) - `OPENCLAW_QA_CONVEX_ENDPOINT_PREFIX` (default `/qa-credentials/v1`) -- `OPENCLAW_QA_CREDENTIAL_OWNER_ID` (ID jejak opsional) -- `OPENCLAW_QA_ALLOW_INSECURE_HTTP=1` mengizinkan URL Convex loopback `http://` untuk pengembangan khusus lokal. +- `OPENCLAW_QA_CREDENTIAL_OWNER_ID` (id jejak opsional) +- `OPENCLAW_QA_ALLOW_INSECURE_HTTP=1` mengizinkan URL Convex `http://` loopback untuk pengembangan khusus lokal. -`OPENCLAW_QA_CONVEX_SITE_URL` sebaiknya menggunakan `https://` dalam operasi normal. +`OPENCLAW_QA_CONVEX_SITE_URL` harus menggunakan `https://` dalam operasi normal. -Perintah admin maintainer (pool tambah/hapus/daftar) secara khusus memerlukan +Perintah admin maintainer (tambah/hapus/daftar pool) secara khusus memerlukan `OPENCLAW_QA_CONVEX_SECRET_MAINTAINER`. Helper CLI untuk maintainer: @@ -340,56 +342,56 @@ pnpm openclaw qa credentials list --kind telegram pnpm openclaw qa credentials remove --credential-id ``` -Gunakan `doctor` sebelum run live untuk memeriksa URL situs Convex, secret broker, +Gunakan `doctor` sebelum proses live untuk memeriksa URL situs Convex, secret broker, prefiks endpoint, timeout HTTP, dan keterjangkauan admin/daftar tanpa mencetak -nilai secret. Gunakan `--json` untuk output yang dapat dibaca mesin dalam skrip dan -utilitas CI. +nilai secret. Gunakan `--json` untuk output yang dapat dibaca mesin dalam skrip dan utilitas +CI. Kontrak endpoint default (`OPENCLAW_QA_CONVEX_SITE_URL` + `/qa-credentials/v1`): - `POST /acquire` - Permintaan: `{ kind, ownerId, actorRole, leaseTtlMs, heartbeatIntervalMs }` - - Berhasil: `{ status: "ok", credentialId, leaseToken, payload, leaseTtlMs?, heartbeatIntervalMs? }` + - Sukses: `{ status: "ok", credentialId, leaseToken, payload, leaseTtlMs?, heartbeatIntervalMs? }` - Habis/dapat dicoba ulang: `{ status: "error", code: "POOL_EXHAUSTED" | "NO_CREDENTIAL_AVAILABLE", ... }` - `POST /heartbeat` - Permintaan: `{ kind, ownerId, actorRole, credentialId, leaseToken, leaseTtlMs }` - - Berhasil: `{ status: "ok" }` (atau `2xx` kosong) + - Sukses: `{ status: "ok" }` (atau `2xx` kosong) - `POST /release` - Permintaan: `{ kind, ownerId, actorRole, credentialId, leaseToken }` - - Berhasil: `{ status: "ok" }` (atau `2xx` kosong) + - Sukses: `{ status: "ok" }` (atau `2xx` kosong) - `POST /admin/add` (hanya secret maintainer) - Permintaan: `{ kind, actorId, payload, note?, status? }` - - Berhasil: `{ status: "ok", credential }` + - Sukses: `{ status: "ok", credential }` - `POST /admin/remove` (hanya secret maintainer) - Permintaan: `{ credentialId, actorId }` - - Berhasil: `{ status: "ok", changed, credential }` + - Sukses: `{ status: "ok", changed, credential }` - Pelindung lease aktif: `{ status: "error", code: "LEASE_ACTIVE", ... }` - `POST /admin/list` (hanya secret maintainer) - Permintaan: `{ kind?, status?, includePayload?, limit? }` - - Berhasil: `{ status: "ok", credentials, count }` + - Sukses: `{ status: "ok", credentials, count }` Bentuk payload untuk jenis Telegram: - `{ groupId: string, driverToken: string, sutToken: string }` -- `groupId` harus berupa string ID obrolan Telegram numerik. +- `groupId` harus berupa string id chat Telegram numerik. - `admin/add` memvalidasi bentuk ini untuk `kind: "telegram"` dan menolak payload yang salah bentuk. ### Menambahkan channel ke QA -Nama arsitektur dan helper skenario untuk adaptor channel baru berada di [ikhtisar QA → Menambahkan channel](/id/concepts/qa-e2e-automation#adding-a-channel). Ambang minimum: implementasikan runner transport pada seam host `qa-lab` bersama, deklarasikan `qaRunners` dalam manifes Plugin, pasang sebagai `openclaw qa `, dan tulis skenario di bawah `qa/scenarios/`. +Nama arsitektur dan helper skenario untuk adapter channel baru berada di [ikhtisar QA → Menambahkan channel](/id/concepts/qa-e2e-automation#adding-a-channel). Batas minimum: implementasikan runner transport pada seam host `qa-lab` bersama, deklarasikan `qaRunners` dalam manifest Plugin, mount sebagai `openclaw qa `, dan tulis skenario di bawah `qa/scenarios/`. -## Suite pengujian (apa yang berjalan di mana) +## Suite pengujian (apa berjalan di mana) -Pikirkan suite sebagai “realisme yang meningkat” (dan flakiness/biaya yang meningkat): +Anggap suite sebagai “realisme yang meningkat” (dan flakiness/biaya yang meningkat): ### Unit / integrasi (default) - Perintah: `pnpm test` -- Konfigurasi: run tanpa target menggunakan set shard `vitest.full-*.config.ts` dan dapat memperluas shard multi-proyek menjadi konfigurasi per-proyek untuk penjadwalan paralel +- Konfigurasi: proses tanpa target menggunakan set shard `vitest.full-*.config.ts` dan dapat memperluas shard multiproyek menjadi konfigurasi per proyek untuk penjadwalan paralel - File: inventaris core/unit di bawah `src/**/*.test.ts`, `packages/**/*.test.ts`, dan `test/**/*.test.ts`; pengujian unit UI berjalan di shard khusus `unit-ui` - Cakupan: - Pengujian unit murni - - Pengujian integrasi dalam-proses (autentikasi gateway, routing, tooling, parsing, konfigurasi) + - Pengujian integrasi dalam proses (auth Gateway, routing, tooling, parsing, config) - Regresi deterministik untuk bug yang diketahui - Ekspektasi: - Berjalan di CI @@ -397,107 +399,143 @@ Pikirkan suite sebagai “realisme yang meningkat” (dan flakiness/biaya yang m - Harus cepat dan stabil - Pengujian resolver dan loader permukaan publik harus membuktikan perilaku fallback `api.js` dan `runtime-api.js` yang luas dengan fixture Plugin kecil yang dihasilkan, bukan - API sumber Plugin bawaan nyata. Load API Plugin nyata berada dalam + API sumber Plugin bawaan nyata. Muatan API Plugin nyata termasuk dalam suite kontrak/integrasi milik Plugin. - - `pnpm test` tanpa target menjalankan dua belas konfigurasi shard yang lebih kecil (`core-unit-fast`, `core-unit-src`, `core-unit-security`, `core-unit-ui`, `core-unit-support`, `core-support-boundary`, `core-contracts`, `core-bundled`, `core-runtime`, `agentic`, `auto-reply`, `extensions`) alih-alih satu proses root-project native yang sangat besar. Ini memangkas puncak RSS pada mesin berbeban dan mencegah pekerjaan auto-reply/ekstensi membuat suite yang tidak terkait kekurangan sumber daya. - - `pnpm test --watch` tetap menggunakan grafik proyek native root `vitest.config.ts`, karena loop watch multi-shard tidak praktis. - - `pnpm test`, `pnpm test:watch`, dan `pnpm test:perf:imports` merutekan target file/direktori eksplisit melalui lane berscope terlebih dahulu, sehingga `pnpm test extensions/discord/src/monitor/message-handler.preflight.test.ts` menghindari biaya startup proyek root penuh. - - `pnpm test:changed` memperluas path git yang berubah menjadi lane berscope murah secara default: edit pengujian langsung, file sibling `*.test.ts`, pemetaan sumber eksplisit, dan dependen grafik impor lokal. Edit config/setup/package tidak menjalankan pengujian luas kecuali Anda secara eksplisit menggunakan `OPENCLAW_TEST_CHANGED_BROAD=1 pnpm test:changed`. - - `pnpm check:changed` adalah gate pemeriksaan lokal cerdas normal untuk pekerjaan sempit. Ini mengklasifikasikan diff ke core, pengujian core, ekstensi, pengujian ekstensi, app, dokumentasi, metadata rilis, tooling Docker live, dan tooling, lalu menjalankan typecheck, lint, dan perintah guard yang sesuai. Ini tidak menjalankan pengujian Vitest; panggil `pnpm test:changed` atau `pnpm test ` eksplisit untuk bukti pengujian. Kenaikan versi khusus metadata rilis menjalankan pemeriksaan versi/config/dependensi-root tertarget, dengan guard yang menolak perubahan package di luar field versi tingkat atas. + - `pnpm test` tanpa target menjalankan dua belas konfigurasi shard yang lebih kecil (`core-unit-fast`, `core-unit-src`, `core-unit-security`, `core-unit-ui`, `core-unit-support`, `core-support-boundary`, `core-contracts`, `core-bundled`, `core-runtime`, `agentic`, `auto-reply`, `extensions`) alih-alih satu proses root-project native yang sangat besar. Ini mengurangi puncak RSS pada mesin yang sibuk dan mencegah pekerjaan auto-reply/extension menghambat suite yang tidak terkait. + - `pnpm test --watch` tetap menggunakan grafik proyek root native `vitest.config.ts`, karena loop watch multi-shard tidak praktis. + - `pnpm test`, `pnpm test:watch`, dan `pnpm test:perf:imports` merutekan target file/direktori eksplisit melalui lane berscope terlebih dahulu, sehingga `pnpm test extensions/discord/src/monitor/message-handler.preflight.test.ts` menghindari biaya startup penuh proyek root. + - `pnpm test:changed` memperluas path git yang berubah menjadi lane berscope murah secara default: edit test langsung, file saudara `*.test.ts`, pemetaan sumber eksplisit, dan dependensi grafik impor lokal. Edit config/setup/package tidak menjalankan test secara luas kecuali Anda secara eksplisit menggunakan `OPENCLAW_TEST_CHANGED_BROAD=1 pnpm test:changed`. + - `pnpm check:changed` adalah gate pemeriksaan lokal cerdas normal untuk pekerjaan sempit. Perintah ini mengklasifikasikan diff menjadi core, test core, extensions, test extension, apps, docs, metadata rilis, tooling Docker live, dan tooling, lalu menjalankan typecheck, lint, dan perintah guard yang sesuai. Perintah ini tidak menjalankan test Vitest; panggil `pnpm test:changed` atau `pnpm test ` eksplisit untuk bukti test. Kenaikan versi khusus metadata rilis menjalankan pemeriksaan versi/config/dependensi-root tertarget, dengan guard yang menolak perubahan package di luar field versi tingkat atas. - Edit harness ACP Docker live menjalankan pemeriksaan terfokus: sintaks shell untuk skrip auth Docker live dan dry-run scheduler Docker live. Perubahan `package.json` hanya disertakan ketika diff terbatas pada `scripts["test:docker:live-*"]`; edit dependensi, export, versi, dan permukaan package lain tetap menggunakan guard yang lebih luas. - - Pengujian unit ringan-impor dari agents, commands, plugins, helper auto-reply, `plugin-sdk`, dan area utilitas murni serupa dirutekan melalui lane `unit-fast`, yang melewati `test/setup-openclaw-runtime.ts`; file yang stateful/berat-runtime tetap pada lane yang ada. - - File sumber helper `plugin-sdk` dan `commands` terpilih juga memetakan run mode berubah ke pengujian sibling eksplisit di lane ringan tersebut, sehingga edit helper menghindari menjalankan ulang seluruh suite berat untuk direktori itu. - - `auto-reply` memiliki bucket khusus untuk helper core tingkat atas, pengujian integrasi `reply.*` tingkat atas, dan subtree `src/auto-reply/reply/**`. CI memecah lagi subtree reply menjadi shard agent-runner, dispatch, dan commands/state-routing sehingga satu bucket berat-impor tidak menguasai seluruh ekor Node. - - CI PR/main normal sengaja melewati sweep batch ekstensi dan shard `agentic-plugins` khusus rilis. Validasi Rilis Penuh menjalankan workflow turunan `Plugin Prerelease` terpisah untuk suite berat Plugin/ekstensi tersebut pada kandidat rilis. + - Test unit ringan impor dari agents, commands, plugins, helper auto-reply, `plugin-sdk`, dan area utilitas murni serupa dirutekan melalui lane `unit-fast`, yang melewati `test/setup-openclaw-runtime.ts`; file stateful/berat-runtime tetap pada lane yang ada. + - File sumber helper `plugin-sdk` dan `commands` terpilih juga memetakan run mode-berubah ke test saudara eksplisit di lane ringan tersebut, sehingga edit helper menghindari menjalankan ulang suite berat penuh untuk direktori itu. + - `auto-reply` memiliki bucket khusus untuk helper core tingkat atas, test integrasi `reply.*` tingkat atas, dan subtree `src/auto-reply/reply/**`. CI juga memecah subtree reply menjadi shard agent-runner, dispatch, dan commands/state-routing sehingga satu bucket berat-impor tidak memikul seluruh ekor Node. + - CI PR/main normal secara sengaja melewati sweep batch extension dan shard `agentic-plugins` khusus rilis. Full Release Validation menjalankan workflow anak `Plugin Prerelease` terpisah untuk suite yang berat plugin/extension tersebut pada kandidat rilis. - - Saat Anda mengubah input discovery message-tool atau konteks runtime compaction, pertahankan kedua tingkat cakupan. - - Tambahkan regresi helper terfokus untuk batas routing dan normalisasi murni. - - Jaga suite integrasi runner tertanam tetap sehat: + - Saat Anda mengubah input penemuan message-tool atau konteks runtime compaction, + pertahankan kedua tingkat cakupan. + - Tambahkan regresi helper terfokus untuk batas routing dan normalisasi + murni. + - Jaga agar suite integrasi runner tertanam tetap sehat: `src/agents/pi-embedded-runner/compact.hooks.test.ts`, `src/agents/pi-embedded-runner/run.overflow-compaction.test.ts`, dan `src/agents/pi-embedded-runner/run.overflow-compaction.loop.test.ts`. - - Suite tersebut memverifikasi bahwa id berscope dan perilaku compaction tetap mengalir melalui path `run.ts` / `compact.ts` nyata; pengujian khusus helper bukan pengganti yang memadai untuk path integrasi tersebut. + - Suite tersebut memverifikasi bahwa id berscope dan perilaku compaction tetap mengalir + melalui path `run.ts` / `compact.ts` yang nyata; test khusus helper + bukan pengganti yang memadai untuk path integrasi tersebut. - - Config Vitest dasar default ke `threads`. - - Config Vitest bersama menetapkan `isolate: false` dan menggunakan runner non-terisolasi di seluruh proyek root, e2e, dan config live. - - Lane UI root mempertahankan setup dan optimizer `jsdom` miliknya, tetapi juga berjalan pada runner non-terisolasi bersama. - - Setiap shard `pnpm test` mewarisi default `threads` + `isolate: false` yang sama dari config Vitest bersama. - - `scripts/run-vitest.mjs` menambahkan `--no-maglev` untuk proses Node turunan Vitest secara default untuk mengurangi churn kompilasi V8 selama run lokal besar. Setel `OPENCLAW_VITEST_ENABLE_MAGLEV=1` untuk membandingkan dengan perilaku V8 bawaan. + - Config dasar Vitest default ke `threads`. + - Config Vitest bersama menetapkan `isolate: false` dan menggunakan runner + non-terisolasi di seluruh proyek root, config e2e, dan live. + - Lane UI root mempertahankan setup dan optimizer `jsdom`-nya, tetapi juga berjalan pada + runner non-terisolasi bersama. + - Setiap shard `pnpm test` mewarisi default `threads` + `isolate: false` + yang sama dari config Vitest bersama. + - `scripts/run-vitest.mjs` menambahkan `--no-maglev` untuk proses Node anak + Vitest secara default guna mengurangi churn kompilasi V8 selama run lokal besar. + Setel `OPENCLAW_VITEST_ENABLE_MAGLEV=1` untuk membandingkan dengan perilaku + V8 bawaan. - - `pnpm changed:lanes` menampilkan lane arsitektural mana yang dipicu oleh diff. - - Hook pre-commit hanya untuk pemformatan. Hook ini melakukan stage ulang file yang diformat dan tidak menjalankan lint, typecheck, atau pengujian. - - Jalankan `pnpm check:changed` secara eksplisit sebelum handoff atau push ketika Anda membutuhkan gate pemeriksaan lokal cerdas. - - `pnpm test:changed` dirutekan melalui lane berscope murah secara default. Gunakan `OPENCLAW_TEST_CHANGED_BROAD=1 pnpm test:changed` hanya ketika agent memutuskan bahwa edit harness, config, package, atau kontrak benar-benar membutuhkan cakupan Vitest yang lebih luas. - - `pnpm test:max` dan `pnpm test:changed:max` mempertahankan perilaku routing yang sama, hanya dengan batas worker yang lebih tinggi. - - Auto-scaling worker lokal sengaja konservatif dan mengurangi beban ketika rata-rata beban host sudah tinggi, sehingga beberapa run Vitest bersamaan secara default menimbulkan dampak yang lebih kecil. - - Config Vitest dasar menandai proyek/file config sebagai `forceRerunTriggers` sehingga rerun mode berubah tetap benar ketika wiring pengujian berubah. - - Config menjaga `OPENCLAW_VITEST_FS_MODULE_CACHE` tetap aktif pada host yang didukung; setel `OPENCLAW_VITEST_FS_MODULE_CACHE_PATH=/abs/path` jika Anda menginginkan satu lokasi cache eksplisit untuk profiling langsung. + - `pnpm changed:lanes` menampilkan lane arsitektural mana yang dipicu oleh sebuah diff. + - Hook pre-commit hanya untuk formatting. Hook ini melakukan restage file yang diformat dan + tidak menjalankan lint, typecheck, atau test. + - Jalankan `pnpm check:changed` secara eksplisit sebelum handoff atau push ketika Anda + memerlukan gate pemeriksaan lokal cerdas. + - `pnpm test:changed` dirutekan melalui lane berscope murah secara default. Gunakan + `OPENCLAW_TEST_CHANGED_BROAD=1 pnpm test:changed` hanya ketika agent + memutuskan bahwa edit harness, config, package, atau kontrak benar-benar memerlukan + cakupan Vitest yang lebih luas. + - `pnpm test:max` dan `pnpm test:changed:max` mempertahankan perilaku routing + yang sama, hanya dengan batas worker yang lebih tinggi. + - Auto-scaling worker lokal sengaja konservatif dan mundur + ketika load average host sudah tinggi, sehingga beberapa run Vitest + bersamaan secara default menimbulkan dampak lebih kecil. + - Config dasar Vitest menandai proyek/file config sebagai + `forceRerunTriggers` sehingga rerun mode-berubah tetap benar ketika wiring + test berubah. + - Config mempertahankan `OPENCLAW_VITEST_FS_MODULE_CACHE` aktif pada host yang didukung; + setel `OPENCLAW_VITEST_FS_MODULE_CACHE_PATH=/abs/path` jika Anda menginginkan + satu lokasi cache eksplisit untuk profiling langsung. - - `pnpm test:perf:imports` mengaktifkan pelaporan durasi impor Vitest plus output rincian impor. - - `pnpm test:perf:imports:changed` membatasi tampilan profiling yang sama ke file yang berubah sejak `origin/main`. - - Data waktu shard ditulis ke `.artifacts/vitest-shard-timings.json`. Run seluruh config menggunakan path config sebagai key; shard CI include-pattern menambahkan nama shard sehingga shard terfilter dapat dilacak secara terpisah. - - Ketika satu pengujian panas masih menghabiskan sebagian besar waktunya pada impor startup, simpan dependensi berat di balik seam `*.runtime.ts` lokal yang sempit dan mock seam itu secara langsung alih-alih melakukan deep-import helper runtime hanya untuk meneruskannya melalui `vi.mock(...)`. - - `pnpm test:perf:changed:bench -- --ref ` membandingkan `test:changed` yang dirutekan dengan path root-project native untuk diff yang sudah dikomit tersebut dan mencetak wall time plus RSS maksimum macOS. - - `pnpm test:perf:changed:bench -- --worktree` melakukan benchmark pada tree kotor saat ini dengan merutekan daftar file yang berubah melalui `scripts/test-projects.mjs` dan config Vitest root. - - `pnpm test:perf:profile:main` menulis profil CPU main-thread untuk overhead startup dan transform Vitest/Vite. - - `pnpm test:perf:profile:runner` menulis profil CPU+heap runner untuk suite unit dengan paralelisme file dinonaktifkan. + - `pnpm test:perf:imports` mengaktifkan pelaporan durasi impor Vitest plus + output import-breakdown. + - `pnpm test:perf:imports:changed` membatasi tampilan profiling yang sama ke + file yang berubah sejak `origin/main`. + - Data timing shard ditulis ke `.artifacts/vitest-shard-timings.json`. + Run seluruh-config menggunakan path config sebagai kunci; shard CI include-pattern + menambahkan nama shard sehingga shard terfilter dapat dilacak + secara terpisah. + - Ketika satu test panas masih menghabiskan sebagian besar waktunya pada impor startup, + pertahankan dependensi berat di balik seam lokal `*.runtime.ts` yang sempit dan + mock seam itu langsung alih-alih melakukan deep-import helper runtime hanya + untuk meneruskannya melalui `vi.mock(...)`. + - `pnpm test:perf:changed:bench -- --ref ` membandingkan + `test:changed` yang dirutekan dengan path root-project native untuk diff commit + tersebut dan mencetak wall time plus RSS maksimum macOS. + - `pnpm test:perf:changed:bench -- --worktree` melakukan benchmark pada tree + kotor saat ini dengan merutekan daftar file yang berubah melalui + `scripts/test-projects.mjs` dan config root Vitest. + - `pnpm test:perf:profile:main` menulis profil CPU main-thread untuk + overhead startup dan transform Vitest/Vite. + - `pnpm test:perf:profile:runner` menulis profil CPU+heap runner untuk + suite unit dengan paralelisme file dinonaktifkan. -### Stabilitas (Gateway) +### Stabilitas (gateway) - Perintah: `pnpm test:stability:gateway` - Config: `vitest.gateway.config.ts`, dipaksa ke satu worker - Scope: - - Memulai Gateway loopback nyata dengan diagnostik aktif secara default - - Mendorong churn pesan Gateway sintetis, memori, dan payload besar melalui path event diagnostik + - Memulai Gateway local loopback nyata dengan diagnostik aktif secara default + - Mendorong churn pesan gateway sintetis, memori, dan payload besar melalui path event diagnostik - Mengkueri `diagnostics.stability` melalui RPC WS Gateway - - Mencakup helper persistensi bundel stabilitas diagnostik - - Menegaskan recorder tetap berbatas, sampel RSS sintetis tetap di bawah anggaran tekanan, dan kedalaman antrean per sesi terkuras kembali ke nol + - Mencakup helper persistensi bundle stabilitas diagnostik + - Memastikan recorder tetap berbatas, sampel RSS sintetis tetap di bawah anggaran tekanan, dan kedalaman antrean per sesi kembali terkuras ke nol - Ekspektasi: - Aman untuk CI dan tanpa key - Lane sempit untuk tindak lanjut regresi stabilitas, bukan pengganti suite Gateway penuh -### E2E (smoke Gateway) +### E2E (gateway smoke) - Perintah: `pnpm test:e2e` - Config: `vitest.e2e.config.ts` -- File: `src/**/*.e2e.test.ts`, `test/**/*.e2e.test.ts`, dan pengujian E2E bundled-plugin di bawah `extensions/` +- File: `src/**/*.e2e.test.ts`, `test/**/*.e2e.test.ts`, dan test E2E bundled-plugin di bawah `extensions/` - Default runtime: - - Menggunakan `threads` Vitest dengan `isolate: false`, sesuai dengan bagian repo lainnya. - - Menggunakan worker adaptif (CI: hingga 2, lokal: default 1). - - Berjalan dalam mode senyap secara default untuk mengurangi overhead I/O konsol. -- Override yang berguna: + - Menggunakan Vitest `threads` dengan `isolate: false`, sesuai dengan bagian repo lainnya. + - Menggunakan worker adaptif (CI: hingga 2, lokal: 1 secara default). + - Berjalan dalam mode silent secara default untuk mengurangi overhead I/O console. +- Override berguna: - `OPENCLAW_E2E_WORKERS=` untuk memaksa jumlah worker (dibatasi pada 16). - - `OPENCLAW_E2E_VERBOSE=1` untuk mengaktifkan ulang output konsol verbose. + - `OPENCLAW_E2E_VERBOSE=1` untuk mengaktifkan kembali output console verbose. - Scope: - - Perilaku end-to-end gateway multi-instans + - Perilaku end-to-end gateway multi-instance - Permukaan WebSocket/HTTP, pairing node, dan jaringan yang lebih berat - Ekspektasi: - Berjalan di CI (ketika diaktifkan dalam pipeline) - Tidak memerlukan key nyata - - Lebih banyak komponen bergerak daripada pengujian unit (bisa lebih lambat) + - Lebih banyak bagian bergerak dibanding test unit (bisa lebih lambat) ### E2E: smoke backend OpenShell @@ -506,277 +544,278 @@ Pikirkan suite sebagai “realisme yang meningkat” (dan flakiness/biaya yang m - Scope: - Memulai gateway OpenShell terisolasi pada host melalui Docker - Membuat sandbox dari Dockerfile lokal sementara - - Menguji backend OpenShell OpenClaw melalui `sandbox ssh-config` nyata + exec SSH + - Menguji backend OpenShell OpenClaw melalui `sandbox ssh-config` nyata + eksekusi SSH - Memverifikasi perilaku filesystem remote-canonical melalui bridge fs sandbox - Ekspektasi: - Hanya opt-in; bukan bagian dari run default `pnpm test:e2e` - Memerlukan CLI `openshell` lokal plus daemon Docker yang berfungsi - - Menggunakan `HOME` / `XDG_CONFIG_HOME` terisolasi, lalu menghancurkan gateway dan sandbox pengujian -- Override yang berguna: - - `OPENCLAW_E2E_OPENSHELL=1` untuk mengaktifkan pengujian ketika menjalankan suite e2e yang lebih luas secara manual - - `OPENCLAW_E2E_OPENSHELL_COMMAND=/path/to/openshell` untuk menunjuk ke biner CLI non-default atau skrip wrapper + - Menggunakan `HOME` / `XDG_CONFIG_HOME` terisolasi, lalu menghancurkan gateway dan sandbox test +- Override berguna: + - `OPENCLAW_E2E_OPENSHELL=1` untuk mengaktifkan test saat menjalankan suite e2e yang lebih luas secara manual + - `OPENCLAW_E2E_OPENSHELL_COMMAND=/path/to/openshell` untuk menunjuk ke binary CLI non-default atau skrip wrapper ### Live (provider nyata + model nyata) - Perintah: `pnpm test:live` - Config: `vitest.live.config.ts` -- File: `src/**/*.live.test.ts`, `test/**/*.live.test.ts`, dan pengujian live bundled-plugin di bawah `extensions/` -- Default: **aktif** oleh `pnpm test:live` (menetapkan `OPENCLAW_LIVE_TEST=1`) +- File: `src/**/*.live.test.ts`, `test/**/*.live.test.ts`, dan test live bundled-plugin di bawah `extensions/` +- Default: **diaktifkan** oleh `pnpm test:live` (menetapkan `OPENCLAW_LIVE_TEST=1`) - Scope: - “Apakah provider/model ini benar-benar berfungsi _hari ini_ dengan kredensial nyata?” - - Menangkap perubahan format provider, keunikan tool-calling, masalah auth, dan perilaku batas rate + - Menangkap perubahan format provider, keunikan tool-calling, masalah auth, dan perilaku rate limit - Ekspektasi: - Secara desain tidak stabil untuk CI (jaringan nyata, kebijakan provider nyata, kuota, outage) - - Menghabiskan uang / menggunakan batas rate + - Memerlukan biaya / menggunakan rate limit - Lebih baik menjalankan subset yang dipersempit daripada “semuanya” -- Run live mengambil sumber `~/.profile` untuk mengambil API key yang hilang. -- Secara default, run live tetap mengisolasi `HOME` dan menyalin material config/auth ke home pengujian sementara sehingga fixture unit tidak dapat mengubah `~/.openclaw` nyata Anda. -- Setel `OPENCLAW_LIVE_USE_REAL_HOME=1` hanya ketika Anda secara sengaja memerlukan pengujian live untuk menggunakan direktori home nyata Anda. -- `pnpm test:live` sekarang default ke mode yang lebih senyap: mode ini mempertahankan output progres `[live] ...`, tetapi menekan pemberitahuan ekstra `~/.profile` dan membisukan log bootstrap gateway/obrolan Bonjour. Setel `OPENCLAW_LIVE_TEST_QUIET=0` jika Anda ingin log startup penuh kembali. -- Rotasi API key (khusus provider): setel `*_API_KEYS` dengan format koma/titik koma atau `*_API_KEY_1`, `*_API_KEY_2` (misalnya `OPENAI_API_KEYS`, `ANTHROPIC_API_KEYS`, `GEMINI_API_KEYS`) atau override per-live melalui `OPENCLAW_LIVE_*_KEY`; pengujian mencoba ulang pada respons batas rate. +- Run live melakukan source `~/.profile` untuk mengambil API key yang hilang. +- Secara default, run live tetap mengisolasi `HOME` dan menyalin material config/auth ke home test sementara sehingga fixture unit tidak dapat memutasi `~/.openclaw` nyata Anda. +- Setel `OPENCLAW_LIVE_USE_REAL_HOME=1` hanya ketika Anda sengaja membutuhkan test live menggunakan direktori home nyata Anda. +- `pnpm test:live` kini default ke mode yang lebih senyap: mempertahankan output progres `[live] ...`, tetapi menekan pemberitahuan tambahan `~/.profile` dan membisukan log bootstrap gateway/obrolan Bonjour. Setel `OPENCLAW_LIVE_TEST_QUIET=0` jika Anda ingin log startup lengkap kembali. +- Rotasi API key (spesifik provider): setel `*_API_KEYS` dengan format koma/titik koma atau `*_API_KEY_1`, `*_API_KEY_2` (misalnya `OPENAI_API_KEYS`, `ANTHROPIC_API_KEYS`, `GEMINI_API_KEYS`) atau override per-live melalui `OPENCLAW_LIVE_*_KEY`; test mencoba ulang pada respons rate limit. - Output progres/heartbeat: - - Suite live sekarang memancarkan baris progres ke stderr sehingga panggilan provider yang panjang terlihat aktif bahkan ketika capture konsol Vitest senyap. - - `vitest.live.config.ts` menonaktifkan intersepsi konsol Vitest sehingga baris progres provider/gateway mengalir langsung selama run live. - - Setel heartbeat direct-model dengan `OPENCLAW_LIVE_HEARTBEAT_MS`. - - Setel heartbeat gateway/probe dengan `OPENCLAW_LIVE_GATEWAY_HEARTBEAT_MS`. + - Suite live kini memancarkan baris progres ke stderr sehingga panggilan provider panjang terlihat aktif bahkan ketika tangkapan console Vitest senyap. + - `vitest.live.config.ts` menonaktifkan intersepsi console Vitest sehingga baris progres provider/gateway langsung stream selama run live. + - Sesuaikan heartbeat direct-model dengan `OPENCLAW_LIVE_HEARTBEAT_MS`. + - Sesuaikan heartbeat gateway/probe dengan `OPENCLAW_LIVE_GATEWAY_HEARTBEAT_MS`. ## Suite mana yang harus saya jalankan? Gunakan tabel keputusan ini: -- Logika/pengujian penyuntingan: jalankan `pnpm test` (dan `pnpm test:coverage` jika Anda mengubah banyak hal) -- Menyentuh jaringan Gateway / protokol WS / pemasangan: tambahkan `pnpm test:e2e` -- Men-debug “bot saya mati” / kegagalan khusus penyedia / pemanggilan alat: jalankan `pnpm test:live` yang dipersempit +- Mengedit logika/pengujian: jalankan `pnpm test` (dan `pnpm test:coverage` jika Anda mengubah banyak hal) +- Menyentuh jaringan Gateway / protokol WS / pairing: tambahkan `pnpm test:e2e` +- Men-debug “bot saya down” / kegagalan khusus provider / pemanggilan tool: jalankan `pnpm test:live` yang dipersempit -## Pengujian langsung (menyentuh jaringan) +## Pengujian live (menyentuh jaringan) -Untuk matriks model langsung, smoke backend CLI, smoke ACP, harness server aplikasi Codex, dan semua pengujian langsung penyedia media (Deepgram, BytePlus, ComfyUI, gambar, musik, video, harness media) — plus penanganan kredensial untuk run langsung — lihat [Pengujian — suite langsung](/id/help/testing-live). +Untuk matriks model live, smoke backend CLI, smoke ACP, harness app-server Codex, dan semua pengujian live provider media (Deepgram, BytePlus, ComfyUI, gambar, musik, video, harness media) — plus penanganan kredensial untuk run live — lihat [Pengujian — suite live](/id/help/testing-live). -## Runner Docker (pemeriksaan opsional "berjalan di Linux") +## Runner Docker (pemeriksaan opsional "berfungsi di Linux") Runner Docker ini terbagi menjadi dua kelompok: -- Runner model langsung: `test:docker:live-models` dan `test:docker:live-gateway` hanya menjalankan file langsung kunci profil yang cocok di dalam image Docker repo (`src/agents/models.profiles.live.test.ts` dan `src/gateway/gateway-models.profiles.live.test.ts`), dengan me-mount direktori konfigurasi lokal dan workspace Anda (serta mengambil sumber `~/.profile` jika di-mount). Entry point lokal yang cocok adalah `test:live:models-profiles` dan `test:live:gateway-profiles`. -- Runner langsung Docker secara default memakai batas smoke yang lebih kecil agar sweep Docker penuh tetap praktis: +- Runner model live: `test:docker:live-models` dan `test:docker:live-gateway` hanya menjalankan file live profile-key yang cocok di dalam image Docker repo (`src/agents/models.profiles.live.test.ts` dan `src/gateway/gateway-models.profiles.live.test.ts`), dengan me-mount direktori konfigurasi lokal dan workspace Anda (dan mengambil sumber `~/.profile` jika di-mount). Entrypoint lokal yang cocok adalah `test:live:models-profiles` dan `test:live:gateway-profiles`. +- Runner live Docker default ke batas smoke yang lebih kecil agar sweep Docker penuh tetap praktis: `test:docker:live-models` default ke `OPENCLAW_LIVE_MAX_MODELS=12`, dan `test:docker:live-gateway` default ke `OPENCLAW_LIVE_GATEWAY_SMOKE=1`, `OPENCLAW_LIVE_GATEWAY_MAX_MODELS=8`, `OPENCLAW_LIVE_GATEWAY_STEP_TIMEOUT_MS=45000`, dan - `OPENCLAW_LIVE_GATEWAY_MODEL_TIMEOUT_MS=90000`. Timpa variabel env tersebut saat Anda + `OPENCLAW_LIVE_GATEWAY_MODEL_TIMEOUT_MS=90000`. Override env var tersebut saat Anda secara eksplisit menginginkan pemindaian menyeluruh yang lebih besar. -- `test:docker:all` membangun image Docker langsung sekali melalui `test:docker:live-build`, mengemas OpenClaw sekali sebagai tarball npm lewat `scripts/package-openclaw-for-docker.mjs`, lalu membangun/menggunakan ulang dua image `scripts/e2e/Dockerfile`. Image polos hanya runner Node/Git untuk lane install/update/dependensi Plugin; lane tersebut me-mount tarball yang sudah dibangun. Image fungsional menginstal tarball yang sama ke `/app` untuk lane fungsionalitas aplikasi yang sudah dibangun. Definisi lane Docker berada di `scripts/lib/docker-e2e-scenarios.mjs`; logika perencana berada di `scripts/lib/docker-e2e-plan.mjs`; `scripts/test-docker-all.mjs` mengeksekusi rencana yang dipilih. Agregat memakai penjadwal lokal berbobot: `OPENCLAW_DOCKER_ALL_PARALLELISM` mengontrol slot proses, sedangkan batas sumber daya mencegah lane langsung berat, install npm, dan multi-layanan mulai sekaligus. Jika satu lane lebih berat daripada batas aktif, penjadwal tetap dapat memulainya saat pool kosong lalu membiarkannya berjalan sendiri sampai kapasitas tersedia lagi. Default-nya 10 slot, `OPENCLAW_DOCKER_ALL_LIVE_LIMIT=9`, `OPENCLAW_DOCKER_ALL_NPM_LIMIT=10`, dan `OPENCLAW_DOCKER_ALL_SERVICE_LIMIT=7`; setel `OPENCLAW_DOCKER_ALL_WEIGHT_LIMIT` atau `OPENCLAW_DOCKER_ALL_DOCKER_LIMIT` hanya saat host Docker memiliki ruang kapasitas lebih besar. Runner melakukan preflight Docker secara default, menghapus kontainer E2E OpenClaw yang usang, mencetak status setiap 30 detik, menyimpan timing lane yang berhasil di `.artifacts/docker-tests/lane-timings.json`, dan memakai timing tersebut untuk memulai lane yang lebih lama terlebih dahulu pada run berikutnya. Gunakan `OPENCLAW_DOCKER_ALL_DRY_RUN=1` untuk mencetak manifes lane berbobot tanpa membangun atau menjalankan Docker, atau `node scripts/test-docker-all.mjs --plan-json` untuk mencetak rencana CI bagi lane yang dipilih, kebutuhan paket/image, dan kredensial. -- `Package Acceptance` adalah gate paket native GitHub untuk "apakah tarball yang dapat diinstal ini berfungsi sebagai produk?" Gate ini menyelesaikan satu paket kandidat dari `source=npm`, `source=ref`, `source=url`, atau `source=artifact`, mengunggahnya sebagai `package-under-test`, lalu menjalankan lane E2E Docker reusable terhadap tarball persis tersebut alih-alih mengemas ulang ref yang dipilih. `workflow_ref` memilih workflow/skrip harness tepercaya, sedangkan `package_ref` memilih commit/branch/tag sumber untuk dikemas saat `source=ref`; ini memungkinkan logika acceptance saat ini memvalidasi commit tepercaya yang lebih lama. Profil diurutkan berdasarkan cakupan: `smoke` adalah install/channel/agent cepat plus gateway/config, `package` adalah kontrak package/update/Plugin dan pengganti native default untuk sebagian besar cakupan paket/update Parallels, `product` menambahkan channel MCP, pembersihan cron/subagen, pencarian web OpenAI, dan OpenWebUI, serta `full` menjalankan potongan Docker jalur rilis dengan OpenWebUI. Validasi rilis menjalankan delta paket kustom (`bundled-channel-deps-compat plugins-offline`) plus QA paket Telegram karena potongan Docker jalur rilis sudah mencakup lane package/update/Plugin yang tumpang tindih. Perintah rerun Docker GitHub tertarget yang dihasilkan dari artefak menyertakan artefak paket sebelumnya dan input image yang telah disiapkan bila tersedia, sehingga lane yang gagal dapat menghindari pembangunan ulang paket dan image. -- Pemeriksaan build dan rilis menjalankan `scripts/check-cli-bootstrap-imports.mjs` setelah tsdown. Guard menelusuri grafik build statis dari `dist/entry.js` dan `dist/cli/run-main.js` dan gagal jika startup pra-dispatch mengimpor dependensi paket seperti Commander, UI prompt, undici, atau logging sebelum dispatch perintah; guard juga menjaga chunk run Gateway yang dibundel tetap di bawah anggaran dan menolak impor statis jalur Gateway dingin yang diketahui. Smoke CLI terpaket juga mencakup bantuan root, bantuan onboard, bantuan doctor, status, skema konfigurasi, dan perintah daftar model. -- Kompatibilitas lama Package Acceptance dibatasi pada `2026.4.25` (termasuk `2026.4.25-beta.*`). Sampai batas tersebut, harness hanya menoleransi celah metadata paket yang sudah dikirim: entri inventaris QA privat yang dihilangkan, `gateway install --wrapper` yang hilang, file patch yang hilang di fixture git turunan tarball, `update.channel` tersimpan yang hilang, lokasi install-record Plugin lama, persistensi install-record marketplace yang hilang, dan migrasi metadata konfigurasi selama `plugins update`. Untuk paket setelah `2026.4.25`, jalur tersebut menjadi kegagalan ketat. -- Runner smoke kontainer: `test:docker:openwebui`, `test:docker:onboard`, `test:docker:npm-onboard-channel-agent`, `test:docker:update-channel-switch`, `test:docker:session-runtime-context`, `test:docker:agents-delete-shared-workspace`, `test:docker:gateway-network`, `test:docker:browser-cdp-snapshot`, `test:docker:mcp-channels`, `test:docker:pi-bundle-mcp-tools`, `test:docker:cron-mcp-cleanup`, `test:docker:plugins`, `test:docker:plugin-update`, dan `test:docker:config-reload` mem-boot satu atau beberapa kontainer nyata dan memverifikasi jalur integrasi tingkat lebih tinggi. +- `test:docker:all` membangun image Docker live sekali melalui `test:docker:live-build`, mengemas OpenClaw sekali sebagai tarball npm melalui `scripts/package-openclaw-for-docker.mjs`, lalu membangun/menggunakan ulang dua image `scripts/e2e/Dockerfile`. Image bare hanya runner Node/Git untuk lane install/update/plugin-dependency; lane tersebut me-mount tarball yang sudah dibangun. Image fungsional menginstal tarball yang sama ke `/app` untuk lane fungsionalitas built-app. Definisi lane Docker berada di `scripts/lib/docker-e2e-scenarios.mjs`; logika planner berada di `scripts/lib/docker-e2e-plan.mjs`; `scripts/test-docker-all.mjs` menjalankan plan yang dipilih. Agregat menggunakan scheduler lokal berbobot: `OPENCLAW_DOCKER_ALL_PARALLELISM` mengontrol slot proses, sementara batas resource mencegah lane live berat, npm-install, dan multi-service semuanya dimulai sekaligus. Jika satu lane lebih berat daripada batas aktif, scheduler masih dapat memulainya saat pool kosong lalu membiarkannya berjalan sendiri sampai kapasitas tersedia lagi. Default-nya adalah 10 slot, `OPENCLAW_DOCKER_ALL_LIVE_LIMIT=9`, `OPENCLAW_DOCKER_ALL_NPM_LIMIT=10`, dan `OPENCLAW_DOCKER_ALL_SERVICE_LIMIT=7`; sesuaikan `OPENCLAW_DOCKER_ALL_WEIGHT_LIMIT` atau `OPENCLAW_DOCKER_ALL_DOCKER_LIMIT` hanya saat host Docker memiliki headroom lebih besar. Runner melakukan preflight Docker secara default, menghapus container OpenClaw E2E yang usang, mencetak status setiap 30 detik, menyimpan timing lane yang berhasil di `.artifacts/docker-tests/lane-timings.json`, dan menggunakan timing tersebut untuk memulai lane yang lebih panjang terlebih dahulu pada run berikutnya. Gunakan `OPENCLAW_DOCKER_ALL_DRY_RUN=1` untuk mencetak manifest lane berbobot tanpa membangun atau menjalankan Docker, atau `node scripts/test-docker-all.mjs --plan-json` untuk mencetak plan CI untuk lane terpilih, kebutuhan package/image, dan kredensial. +- `Package Acceptance` adalah gate package native GitHub untuk "apakah tarball yang dapat diinstal ini berfungsi sebagai produk?" Gate ini me-resolve satu kandidat package dari `source=npm`, `source=ref`, `source=url`, atau `source=artifact`, mengunggahnya sebagai `package-under-test`, lalu menjalankan lane Docker E2E reusable terhadap tarball persis tersebut, bukan mengemas ulang ref yang dipilih. `workflow_ref` memilih workflow/skrip harness tepercaya, sementara `package_ref` memilih commit/branch/tag sumber untuk dikemas saat `source=ref`; ini memungkinkan logika acceptance saat ini memvalidasi commit tepercaya yang lebih lama. Profil diurutkan berdasarkan cakupan: `smoke` adalah install/channel/agent cepat plus Gateway/config, `package` adalah kontrak package/update/Plugin plus fixture keyless upgrade-survivor dan pengganti native default untuk sebagian besar cakupan package/update Parallels, `product` menambahkan channel MCP, pembersihan Cron/subagent, pencarian web OpenAI, dan OpenWebUI, dan `full` menjalankan chunk Docker jalur rilis dengan OpenWebUI. Validasi rilis menjalankan delta package khusus (`bundled-channel-deps-compat plugins-offline`) plus QA package Telegram karena chunk Docker jalur rilis sudah mencakup lane package/update/Plugin yang tumpang tindih. Perintah rerun Docker GitHub tertarget yang dihasilkan dari artifact menyertakan artifact package sebelumnya dan input image yang disiapkan jika tersedia, sehingga lane yang gagal dapat menghindari pembangunan ulang package dan image. +- Pemeriksaan build dan rilis menjalankan `scripts/check-cli-bootstrap-imports.mjs` setelah tsdown. Guard menelusuri grafik build statis dari `dist/entry.js` dan `dist/cli/run-main.js` dan gagal jika startup pra-dispatch mengimpor dependensi package seperti Commander, prompt UI, undici, atau logging sebelum dispatch perintah; guard juga menjaga chunk run Gateway yang dibundel tetap di bawah anggaran dan menolak impor statis dari jalur Gateway dingin yang diketahui. Smoke CLI terpaket juga mencakup bantuan root, bantuan onboard, bantuan doctor, status, skema config, dan perintah daftar model. +- Kompatibilitas legacy Package Acceptance dibatasi pada `2026.4.25` (`2026.4.25-beta.*` disertakan). Hingga cutoff tersebut, harness hanya menoleransi celah metadata shipped-package: entri inventaris QA private yang dihilangkan, `gateway install --wrapper` yang hilang, file patch yang hilang di fixture git turunan tarball, `update.channel` persisten yang hilang, lokasi install-record Plugin legacy, persistensi install-record marketplace yang hilang, dan migrasi metadata config selama `plugins update`. Untuk package setelah `2026.4.25`, jalur tersebut menjadi kegagalan ketat. +- Runner smoke container: `test:docker:openwebui`, `test:docker:onboard`, `test:docker:npm-onboard-channel-agent`, `test:docker:update-channel-switch`, `test:docker:upgrade-survivor`, `test:docker:session-runtime-context`, `test:docker:agents-delete-shared-workspace`, `test:docker:gateway-network`, `test:docker:browser-cdp-snapshot`, `test:docker:mcp-channels`, `test:docker:pi-bundle-mcp-tools`, `test:docker:cron-mcp-cleanup`, `test:docker:plugins`, `test:docker:plugin-update`, dan `test:docker:config-reload` mem-boot satu atau lebih container nyata dan memverifikasi jalur integrasi tingkat lebih tinggi. -Runner Docker model langsung juga hanya bind-mount home auth CLI yang diperlukan (atau semua yang didukung saat run tidak dipersempit), lalu menyalinnya ke home kontainer sebelum run sehingga OAuth CLI eksternal dapat menyegarkan token tanpa mengubah penyimpanan auth host: +Runner Docker model live juga hanya bind-mount home auth CLI yang diperlukan (atau semua yang didukung saat run tidak dipersempit), lalu menyalinnya ke home container sebelum run agar OAuth CLI eksternal dapat menyegarkan token tanpa memutasi store auth host: - Model langsung: `pnpm test:docker:live-models` (skrip: `scripts/test-live-models-docker.sh`) -- Uji smoke pengikatan ACP: `pnpm test:docker:live-acp-bind` (skrip: `scripts/test-live-acp-bind-docker.sh`; mencakup Claude, Codex, dan Gemini secara default, dengan cakupan Droid/OpenCode yang ketat melalui `pnpm test:docker:live-acp-bind:droid` dan `pnpm test:docker:live-acp-bind:opencode`) -- Uji smoke backend CLI: `pnpm test:docker:live-cli-backend` (skrip: `scripts/test-live-cli-backend-docker.sh`) -- Uji smoke harness server aplikasi Codex: `pnpm test:docker:live-codex-harness` (skrip: `scripts/test-live-codex-harness-docker.sh`) +- Smoke bind ACP: `pnpm test:docker:live-acp-bind` (skrip: `scripts/test-live-acp-bind-docker.sh`; mencakup Claude, Codex, dan Gemini secara default, dengan cakupan Droid/OpenCode yang ketat melalui `pnpm test:docker:live-acp-bind:droid` dan `pnpm test:docker:live-acp-bind:opencode`) +- Smoke backend CLI: `pnpm test:docker:live-cli-backend` (skrip: `scripts/test-live-cli-backend-docker.sh`) +- Smoke harness server aplikasi Codex: `pnpm test:docker:live-codex-harness` (skrip: `scripts/test-live-codex-harness-docker.sh`) - Gateway + agen dev: `pnpm test:docker:live-gateway` (skrip: `scripts/test-live-gateway-models-docker.sh`) -- Uji smoke observabilitas: `pnpm qa:otel:smoke` adalah jalur pemeriksaan sumber QA privat. Ini sengaja bukan bagian dari jalur rilis Docker paket karena tarball npm tidak menyertakan QA Lab. -- Uji smoke live Open WebUI: `pnpm test:docker:openwebui` (skrip: `scripts/e2e/openwebui-docker.sh`) -- Wizard onboarding (TTY, scaffolding lengkap): `pnpm test:docker:onboard` (skrip: `scripts/e2e/onboard-docker.sh`) -- Uji smoke tarball npm untuk onboarding/kanal/agen: `pnpm test:docker:npm-onboard-channel-agent` memasang tarball OpenClaw yang telah dipaketkan secara global di Docker, mengonfigurasi OpenAI melalui onboarding env-ref plus Telegram secara default, memverifikasi bahwa doctor memperbaiki dependensi runtime Plugin yang diaktifkan, dan menjalankan satu giliran agen OpenAI yang di-mock. Gunakan ulang tarball yang telah dibuat dengan `OPENCLAW_CURRENT_PACKAGE_TGZ=/path/to/openclaw-*.tgz`, lewati rebuild host dengan `OPENCLAW_NPM_ONBOARD_HOST_BUILD=0`, atau ganti kanal dengan `OPENCLAW_NPM_ONBOARD_CHANNEL=discord`. -- Uji smoke pengalihan kanal pembaruan: `pnpm test:docker:update-channel-switch` memasang tarball OpenClaw yang telah dipaketkan secara global di Docker, beralih dari paket `stable` ke git `dev`, memverifikasi kanal yang tersimpan dan pekerjaan pascapembaruan Plugin, lalu beralih kembali ke paket `stable` dan memeriksa status pembaruan. -- Uji smoke konteks runtime sesi: `pnpm test:docker:session-runtime-context` memverifikasi persistensi transkrip konteks runtime tersembunyi plus perbaikan doctor untuk cabang prompt-rewrite duplikat yang terdampak. -- Uji smoke pemasangan global Bun: `bash scripts/e2e/bun-global-install-smoke.sh` mengemas tree saat ini, memasangnya dengan `bun install -g` di home yang terisolasi, dan memverifikasi `openclaw infer image providers --json` mengembalikan penyedia gambar bawaan alih-alih macet. Gunakan ulang tarball yang telah dibuat dengan `OPENCLAW_BUN_GLOBAL_SMOKE_PACKAGE_TGZ=/path/to/openclaw-*.tgz`, lewati build host dengan `OPENCLAW_BUN_GLOBAL_SMOKE_HOST_BUILD=0`, atau salin `dist/` dari image Docker yang telah dibangun dengan `OPENCLAW_BUN_GLOBAL_SMOKE_DIST_IMAGE=openclaw-dockerfile-smoke:local`. -- Uji smoke Docker pemasang: `bash scripts/test-install-sh-docker.sh` berbagi satu cache npm di seluruh kontainer root, update, dan direct-npm. Uji smoke update default ke npm `latest` sebagai baseline stable sebelum meningkatkan ke tarball kandidat. Override dengan `OPENCLAW_INSTALL_SMOKE_UPDATE_BASELINE=2026.4.22` secara lokal, atau dengan input `update_baseline_version` workflow Install Smoke di GitHub. Pemeriksaan pemasang non-root mempertahankan cache npm terisolasi agar entri cache milik root tidak menutupi perilaku pemasangan lokal pengguna. Setel `OPENCLAW_INSTALL_SMOKE_NPM_CACHE_DIR=/path/to/cache` untuk menggunakan ulang cache root/update/direct-npm di rerun lokal. -- CI Install Smoke melewati pembaruan global direct-npm duplikat dengan `OPENCLAW_INSTALL_SMOKE_SKIP_NPM_GLOBAL=1`; jalankan skrip secara lokal tanpa env tersebut saat cakupan langsung `npm install -g` diperlukan. -- Uji smoke CLI penghapusan workspace bersama agen: `pnpm test:docker:agents-delete-shared-workspace` (skrip: `scripts/e2e/agents-delete-shared-workspace-docker.sh`) membangun image Dockerfile root secara default, menyiapkan dua agen dengan satu workspace di home kontainer terisolasi, menjalankan `agents delete --json`, dan memverifikasi JSON valid plus perilaku workspace yang dipertahankan. Gunakan ulang image install-smoke dengan `OPENCLAW_AGENTS_DELETE_SHARED_WORKSPACE_E2E_IMAGE=openclaw-dockerfile-smoke:local OPENCLAW_AGENTS_DELETE_SHARED_WORKSPACE_E2E_SKIP_BUILD=1`. -- Jaringan Gateway (dua kontainer, auth WS + kesehatan): `pnpm test:docker:gateway-network` (skrip: `scripts/e2e/gateway-network-docker.sh`) -- Uji smoke snapshot CDP browser: `pnpm test:docker:browser-cdp-snapshot` (skrip: `scripts/e2e/browser-cdp-snapshot-docker.sh`) membangun image E2E sumber plus lapisan Chromium, memulai Chromium dengan CDP mentah, menjalankan `browser doctor --deep`, dan memverifikasi snapshot peran CDP mencakup URL tautan, clickable yang dipromosikan kursor, ref iframe, dan metadata frame. -- Regresi penalaran minimal OpenAI Responses web_search: `pnpm test:docker:openai-web-search-minimal` (skrip: `scripts/e2e/openai-web-search-minimal-docker.sh`) menjalankan server OpenAI yang di-mock melalui Gateway, memverifikasi `web_search` menaikkan `reasoning.effort` dari `minimal` ke `low`, lalu memaksa penolakan skema penyedia dan memeriksa detail mentah muncul di log Gateway. -- Bridge kanal MCP (Gateway yang disiapkan + bridge stdio + uji smoke frame notifikasi Claude mentah): `pnpm test:docker:mcp-channels` (skrip: `scripts/e2e/mcp-channels-docker.sh`) -- Alat MCP bundle Pi (server MCP stdio nyata + uji smoke allow/deny profil Pi tertanam): `pnpm test:docker:pi-bundle-mcp-tools` (skrip: `scripts/e2e/pi-bundle-mcp-tools-docker.sh`) +- Smoke observabilitas: `pnpm qa:otel:smoke` adalah lane checkout sumber QA privat. Ini sengaja bukan bagian dari lane rilis Docker paket karena tarball npm tidak menyertakan QA Lab. +- Smoke langsung Open WebUI: `pnpm test:docker:openwebui` (skrip: `scripts/e2e/openwebui-docker.sh`) +- Wizard onboarding (TTY, scaffolding penuh): `pnpm test:docker:onboard` (skrip: `scripts/e2e/onboard-docker.sh`) +- Smoke onboarding/channel/agen tarball Npm: `pnpm test:docker:npm-onboard-channel-agent` menginstal tarball OpenClaw yang sudah dipaketkan secara global di Docker, mengonfigurasi OpenAI melalui onboarding env-ref plus Telegram secara default, memverifikasi doctor memperbaiki dependensi runtime Plugin yang diaktifkan, dan menjalankan satu giliran agen OpenAI tiruan. Gunakan ulang tarball yang sudah dibuat dengan `OPENCLAW_CURRENT_PACKAGE_TGZ=/path/to/openclaw-*.tgz`, lewati pembangunan ulang host dengan `OPENCLAW_NPM_ONBOARD_HOST_BUILD=0`, atau ganti channel dengan `OPENCLAW_NPM_ONBOARD_CHANNEL=discord`. +- Smoke peralihan channel pembaruan: `pnpm test:docker:update-channel-switch` menginstal tarball OpenClaw yang sudah dipaketkan secara global di Docker, beralih dari paket `stable` ke git `dev`, memverifikasi channel yang dipersistenkan dan pekerjaan pascapembaruan Plugin, lalu beralih kembali ke paket `stable` dan memeriksa status pembaruan. +- Smoke penyintas upgrade: `pnpm test:docker:upgrade-survivor` menginstal tarball OpenClaw yang sudah dipaketkan di atas fixture pengguna lama yang kotor dengan agen, config channel, allowlist Plugin, status dependensi runtime Plugin yang basi, serta file workspace/sesi yang sudah ada. Ini menjalankan pembaruan paket plus doctor non-interaktif tanpa provider langsung atau kunci channel, lalu memulai Gateway loopback dan memeriksa preservasi config/status serta anggaran startup/status. +- Smoke konteks runtime sesi: `pnpm test:docker:session-runtime-context` memverifikasi persistensi transkrip konteks runtime tersembunyi plus perbaikan doctor untuk cabang penulisan ulang prompt terduplikasi yang terdampak. +- Smoke instal global Bun: `bash scripts/e2e/bun-global-install-smoke.sh` memaketkan tree saat ini, menginstalnya dengan `bun install -g` di home terisolasi, dan memverifikasi `openclaw infer image providers --json` mengembalikan provider gambar bawaan alih-alih macet. Gunakan ulang tarball yang sudah dibuat dengan `OPENCLAW_BUN_GLOBAL_SMOKE_PACKAGE_TGZ=/path/to/openclaw-*.tgz`, lewati build host dengan `OPENCLAW_BUN_GLOBAL_SMOKE_HOST_BUILD=0`, atau salin `dist/` dari image Docker yang sudah dibuat dengan `OPENCLAW_BUN_GLOBAL_SMOKE_DIST_IMAGE=openclaw-dockerfile-smoke:local`. +- Smoke Docker installer: `bash scripts/test-install-sh-docker.sh` berbagi satu cache npm di antara kontainer root, pembaruan, dan direct-npm. Smoke pembaruan secara default memakai npm `latest` sebagai baseline stable sebelum upgrade ke tarball kandidat. Timpa dengan `OPENCLAW_INSTALL_SMOKE_UPDATE_BASELINE=2026.4.22` secara lokal, atau dengan input `update_baseline_version` milik workflow Install Smoke di GitHub. Pemeriksaan installer non-root mempertahankan cache npm terisolasi agar entri cache milik root tidak menyamarkan perilaku instal lokal pengguna. Tetapkan `OPENCLAW_INSTALL_SMOKE_NPM_CACHE_DIR=/path/to/cache` untuk menggunakan ulang cache root/update/direct-npm di seluruh rerun lokal. +- CI Install Smoke melewati pembaruan global direct-npm duplikat dengan `OPENCLAW_INSTALL_SMOKE_SKIP_NPM_GLOBAL=1`; jalankan skrip secara lokal tanpa env itu ketika cakupan direct `npm install -g` diperlukan. +- Smoke CLI hapus workspace bersama agen: `pnpm test:docker:agents-delete-shared-workspace` (skrip: `scripts/e2e/agents-delete-shared-workspace-docker.sh`) secara default membangun image Dockerfile root, menyemai dua agen dengan satu workspace di home kontainer terisolasi, menjalankan `agents delete --json`, dan memverifikasi JSON yang valid plus perilaku workspace yang dipertahankan. Gunakan ulang image install-smoke dengan `OPENCLAW_AGENTS_DELETE_SHARED_WORKSPACE_E2E_IMAGE=openclaw-dockerfile-smoke:local OPENCLAW_AGENTS_DELETE_SHARED_WORKSPACE_E2E_SKIP_BUILD=1`. +- Jaringan Gateway (dua kontainer, auth WS + health): `pnpm test:docker:gateway-network` (skrip: `scripts/e2e/gateway-network-docker.sh`) +- Smoke snapshot CDP browser: `pnpm test:docker:browser-cdp-snapshot` (skrip: `scripts/e2e/browser-cdp-snapshot-docker.sh`) membangun image E2E sumber plus layer Chromium, memulai Chromium dengan CDP mentah, menjalankan `browser doctor --deep`, dan memverifikasi snapshot peran CDP mencakup URL tautan, elemen dapat diklik yang dipromosikan kursor, ref iframe, dan metadata frame. +- Regresi reasoning minimal OpenAI Responses web_search: `pnpm test:docker:openai-web-search-minimal` (skrip: `scripts/e2e/openai-web-search-minimal-docker.sh`) menjalankan server OpenAI tiruan melalui Gateway, memverifikasi `web_search` menaikkan `reasoning.effort` dari `minimal` ke `low`, lalu memaksa skema provider menolak dan memeriksa detail mentah muncul di log Gateway. +- Bridge channel MCP (Gateway tersemai + bridge stdio + smoke notification-frame Claude mentah): `pnpm test:docker:mcp-channels` (skrip: `scripts/e2e/mcp-channels-docker.sh`) +- Tool MCP bundle Pi (server MCP stdio nyata + smoke allow/deny profil Pi tertanam): `pnpm test:docker:pi-bundle-mcp-tools` (skrip: `scripts/e2e/pi-bundle-mcp-tools-docker.sh`) - Pembersihan MCP Cron/subagen (Gateway nyata + teardown anak MCP stdio setelah cron terisolasi dan run subagen sekali jalan): `pnpm test:docker:cron-mcp-cleanup` (skrip: `scripts/e2e/cron-mcp-cleanup-docker.sh`) -- Plugin (uji smoke pemasangan, pemasangan/pencopotan kitchen-sink ClawHub, pembaruan marketplace, dan pengaktifan/inspeksi bundle Claude): `pnpm test:docker:plugins` (skrip: `scripts/e2e/plugins-docker.sh`) - Setel `OPENCLAW_PLUGINS_E2E_CLAWHUB=0` untuk melewati blok ClawHub, atau override pasangan package/runtime kitchen-sink default dengan `OPENCLAW_PLUGINS_E2E_CLAWHUB_SPEC` dan `OPENCLAW_PLUGINS_E2E_CLAWHUB_ID`. Tanpa `OPENCLAW_CLAWHUB_URL`/`CLAWHUB_URL`, pengujian menggunakan server fixture ClawHub lokal yang hermetik. -- Uji smoke pembaruan Plugin tanpa perubahan: `pnpm test:docker:plugin-update` (skrip: `scripts/e2e/plugin-update-unchanged-docker.sh`) -- Uji smoke metadata pemuatan ulang konfigurasi: `pnpm test:docker:config-reload` (skrip: `scripts/e2e/config-reload-source-docker.sh`) -- Dependensi runtime Plugin bawaan: `pnpm test:docker:bundled-channel-deps` membangun image runner Docker kecil secara default, membangun dan mengemas OpenClaw sekali di host, lalu memasang tarball itu ke setiap skenario pemasangan Linux. Gunakan ulang image dengan `OPENCLAW_SKIP_DOCKER_BUILD=1`, lewati rebuild host setelah build lokal baru dengan `OPENCLAW_BUNDLED_CHANNEL_HOST_BUILD=0`, atau arahkan ke tarball yang ada dengan `OPENCLAW_CURRENT_PACKAGE_TGZ=/path/to/openclaw-*.tgz`. Agregat Docker penuh dan chunk bundled-channel jalur rilis melakukan pra-paket tarball ini sekali, lalu men-shard pemeriksaan kanal bawaan ke jalur independen, termasuk jalur pembaruan terpisah untuk Telegram, Discord, Slack, Feishu, memory-lancedb, dan ACPX. Chunk rilis memisahkan smoke kanal, target pembaruan, dan kontrak setup/runtime menjadi `bundled-channels-core`, `bundled-channels-update-a`, `bundled-channels-update-b`, dan `bundled-channels-contracts`; chunk agregat `bundled-channels` tetap tersedia untuk rerun manual. Workflow rilis juga memisahkan chunk pemasang penyedia dan chunk pemasangan/pencopotan Plugin bawaan; chunk lama `package-update`, `plugins-runtime`, dan `plugins-integrations` tetap menjadi alias agregat untuk rerun manual. Gunakan `OPENCLAW_BUNDLED_CHANNELS=telegram,slack` untuk mempersempit matriks kanal saat menjalankan jalur bawaan secara langsung, atau `OPENCLAW_BUNDLED_CHANNEL_UPDATE_TARGETS=telegram,acpx` untuk mempersempit skenario pembaruan. Run Docker per skenario default ke `OPENCLAW_BUNDLED_CHANNEL_DOCKER_RUN_TIMEOUT=900s`; skenario pembaruan multi-target default ke `OPENCLAW_BUNDLED_CHANNEL_UPDATE_DOCKER_RUN_TIMEOUT=2400s`. Jalur ini juga memverifikasi bahwa `channels..enabled=false` dan `plugins.entries..enabled=false` menekan perbaikan dependensi doctor/runtime. +- Plugin (smoke instal, instal/uninstal ClawHub kitchen-sink, pembaruan marketplace, dan aktifkan/inspeksi bundle Claude): `pnpm test:docker:plugins` (skrip: `scripts/e2e/plugins-docker.sh`) + Tetapkan `OPENCLAW_PLUGINS_E2E_CLAWHUB=0` untuk melewati blok ClawHub, atau timpa pasangan paket/runtime kitchen-sink default dengan `OPENCLAW_PLUGINS_E2E_CLAWHUB_SPEC` dan `OPENCLAW_PLUGINS_E2E_CLAWHUB_ID`. Tanpa `OPENCLAW_CLAWHUB_URL`/`CLAWHUB_URL`, pengujian memakai server fixture ClawHub lokal yang hermetik. +- Smoke pembaruan Plugin tidak berubah: `pnpm test:docker:plugin-update` (skrip: `scripts/e2e/plugin-update-unchanged-docker.sh`) +- Smoke metadata muat ulang config: `pnpm test:docker:config-reload` (skrip: `scripts/e2e/config-reload-source-docker.sh`) +- Dependensi runtime Plugin bawaan: `pnpm test:docker:bundled-channel-deps` secara default membangun image runner Docker kecil, membangun dan memaketkan OpenClaw sekali di host, lalu me-mount tarball itu ke setiap skenario instal Linux. Gunakan ulang image dengan `OPENCLAW_SKIP_DOCKER_BUILD=1`, lewati pembangunan ulang host setelah build lokal baru dengan `OPENCLAW_BUNDLED_CHANNEL_HOST_BUILD=0`, atau arahkan ke tarball yang sudah ada dengan `OPENCLAW_CURRENT_PACKAGE_TGZ=/path/to/openclaw-*.tgz`. Agregat Docker penuh dan chunk bundled-channel jalur rilis mempra-paketkan tarball ini sekali, lalu men-shard pemeriksaan channel bawaan ke lane independen, termasuk lane pembaruan terpisah untuk Telegram, Discord, Slack, Feishu, memory-lancedb, dan ACPX. Chunk rilis memisahkan smoke channel, target pembaruan, dan kontrak setup/runtime menjadi `bundled-channels-core`, `bundled-channels-update-a`, `bundled-channels-update-b`, dan `bundled-channels-contracts`; chunk agregat `bundled-channels` tetap tersedia untuk rerun manual. Workflow rilis juga memisahkan chunk installer provider dan chunk instal/uninstal Plugin bawaan; chunk lama `package-update`, `plugins-runtime`, dan `plugins-integrations` tetap menjadi alias agregat untuk rerun manual. Gunakan `OPENCLAW_BUNDLED_CHANNELS=telegram,slack` untuk mempersempit matriks channel saat menjalankan lane bawaan secara langsung, atau `OPENCLAW_BUNDLED_CHANNEL_UPDATE_TARGETS=telegram,acpx` untuk mempersempit skenario pembaruan. Run Docker per skenario secara default memakai `OPENCLAW_BUNDLED_CHANNEL_DOCKER_RUN_TIMEOUT=900s`; skenario pembaruan multi-target secara default memakai `OPENCLAW_BUNDLED_CHANNEL_UPDATE_DOCKER_RUN_TIMEOUT=2400s`. Lane ini juga memverifikasi bahwa `channels..enabled=false` dan `plugins.entries..enabled=false` menekan perbaikan doctor/dependensi runtime. - Persempit dependensi runtime Plugin bawaan saat iterasi dengan menonaktifkan skenario yang tidak terkait, misalnya: `OPENCLAW_BUNDLED_CHANNEL_SCENARIOS=0 OPENCLAW_BUNDLED_CHANNEL_UPDATE_SCENARIO=0 OPENCLAW_BUNDLED_CHANNEL_ROOT_OWNED_SCENARIO=0 OPENCLAW_BUNDLED_CHANNEL_SETUP_ENTRY_SCENARIO=0 pnpm test:docker:bundled-channel-deps`. -Untuk melakukan prebuild dan menggunakan ulang image fungsional bersama secara manual: +Untuk membangun lebih dulu dan menggunakan ulang image fungsional bersama secara manual: ```bash OPENCLAW_DOCKER_E2E_IMAGE=openclaw-docker-e2e-functional:local pnpm test:docker:e2e-build OPENCLAW_DOCKER_E2E_IMAGE=openclaw-docker-e2e-functional:local OPENCLAW_SKIP_DOCKER_BUILD=1 pnpm test:docker:mcp-channels ``` -Override image khusus suite seperti `OPENCLAW_GATEWAY_NETWORK_E2E_IMAGE` tetap menang saat disetel. Saat `OPENCLAW_SKIP_DOCKER_BUILD=1` mengarah ke image bersama jarak jauh, skrip akan menariknya jika belum ada secara lokal. Pengujian Docker QR dan pemasang mempertahankan Dockerfile masing-masing karena pengujian tersebut memvalidasi perilaku paket/pemasangan, bukan runtime aplikasi bawaan bersama. +Timpa image khusus suite seperti `OPENCLAW_GATEWAY_NETWORK_E2E_IMAGE` tetap menang ketika ditetapkan. Ketika `OPENCLAW_SKIP_DOCKER_BUILD=1` menunjuk ke image bersama jarak jauh, skrip menariknya jika belum ada secara lokal. Pengujian Docker QR dan installer mempertahankan Dockerfile sendiri karena keduanya memvalidasi perilaku paket/instal, bukan runtime aplikasi-terbangun bersama. -Runner Docker live-model juga melakukan bind-mount checkout saat ini secara read-only dan -menyiapkannya ke workdir sementara di dalam kontainer. Ini menjaga image runtime -tetap ramping sambil tetap menjalankan Vitest terhadap sumber/konfigurasi lokal persis milik Anda. -Langkah staging melewati cache lokal besar dan output build aplikasi seperti +Runner Docker model langsung juga melakukan bind-mount checkout saat ini secara read-only dan +men-stage-nya ke workdir sementara di dalam container. Ini menjaga image runtime +tetap ramping sambil tetap menjalankan Vitest terhadap sumber/konfigurasi lokal persis Anda. +Langkah staging melewati cache lokal-saja berukuran besar dan output build aplikasi seperti `.pnpm-store`, `.worktrees`, `__openclaw_vitest__`, serta direktori output `.build` lokal aplikasi atau -Gradle agar run live Docker tidak menghabiskan menit untuk menyalin +Gradle agar run Docker langsung tidak menghabiskan menit-menit untuk menyalin artefak khusus mesin. -Runner tersebut juga menyetel `OPENCLAW_SKIP_CHANNELS=1` agar probe live gateway tidak memulai -worker kanal Telegram/Discord/dll. nyata di dalam kontainer. -`test:docker:live-models` tetap menjalankan `pnpm test:live`, jadi teruskan -`OPENCLAW_LIVE_GATEWAY_*` juga saat Anda perlu mempersempit atau mengecualikan cakupan -live gateway dari jalur Docker tersebut. -`test:docker:openwebui` adalah uji smoke kompatibilitas tingkat lebih tinggi: ini memulai -kontainer gateway OpenClaw dengan endpoint HTTP kompatibel OpenAI yang diaktifkan, -memulai kontainer Open WebUI yang dipin terhadap gateway tersebut, masuk melalui +Runner tersebut juga menetapkan `OPENCLAW_SKIP_CHANNELS=1` sehingga probe langsung gateway tidak memulai +worker saluran Telegram/Discord/dll. sungguhan di dalam container. +`test:docker:live-models` tetap menjalankan `pnpm test:live`, jadi teruskan juga +`OPENCLAW_LIVE_GATEWAY_*` saat Anda perlu mempersempit atau mengecualikan cakupan langsung gateway +dari lane Docker tersebut. +`test:docker:openwebui` adalah smoke kompatibilitas tingkat lebih tinggi: ini memulai +container gateway OpenClaw dengan endpoint HTTP yang kompatibel dengan OpenAI diaktifkan, +memulai container Open WebUI yang di-pin terhadap gateway tersebut, masuk melalui Open WebUI, memverifikasi `/api/models` mengekspos `openclaw/default`, lalu mengirim -permintaan chat nyata melalui proxy `/api/chat/completions` milik Open WebUI. -Run pertama bisa terasa lebih lambat karena Docker mungkin perlu menarik image -Open WebUI dan Open WebUI mungkin perlu menyelesaikan setup cold-start-nya sendiri. -Jalur ini mengharapkan kunci model live yang dapat digunakan, dan `OPENCLAW_PROFILE_FILE` -(`~/.profile` secara default) adalah cara utama untuk menyediakannya dalam run terdokerisasi. +permintaan chat sungguhan melalui proxy `/api/chat/completions` Open WebUI. +Run pertama bisa terasa jauh lebih lambat karena Docker mungkin perlu menarik image +Open WebUI dan Open WebUI mungkin perlu menyelesaikan penyiapan cold-start-nya sendiri. +Lane ini mengharapkan kunci model langsung yang dapat digunakan, dan `OPENCLAW_PROFILE_FILE` +(`~/.profile` secara default) adalah cara utama untuk menyediakannya dalam run yang di-Docker-kan. Run yang berhasil mencetak payload JSON kecil seperti `{ "ok": true, "model": "openclaw/default", ... }`. -`test:docker:mcp-channels` sengaja deterministik dan tidak memerlukan akun -Telegram, Discord, atau iMessage nyata. Ini mem-boot kontainer Gateway yang telah disiapkan, -memulai kontainer kedua yang memunculkan `openclaw mcp serve`, lalu +`test:docker:mcp-channels` sengaja deterministik dan tidak membutuhkan akun +Telegram, Discord, atau iMessage sungguhan. Ini mem-boot container Gateway ber-seed, +memulai container kedua yang men-spawn `openclaw mcp serve`, lalu memverifikasi penemuan percakapan yang dirutekan, pembacaan transkrip, metadata lampiran, -perilaku antrean peristiwa live, routing pengiriman keluar, dan notifikasi kanal bergaya Claude + -izin melalui bridge MCP stdio nyata. Pemeriksaan notifikasi -menginspeksi frame MCP stdio mentah secara langsung sehingga uji smoke memvalidasi apa yang -benar-benar dipancarkan bridge, bukan hanya apa yang kebetulan ditampilkan oleh SDK klien tertentu. -`test:docker:pi-bundle-mcp-tools` bersifat deterministik dan tidak memerlukan kunci model live. -Ini membangun image Docker repo, memulai server probe MCP stdio nyata -di dalam kontainer, mematerialisasikan server tersebut melalui runtime MCP bundle Pi tertanam, -mengeksekusi alat, lalu memverifikasi `coding` dan `messaging` mempertahankan -alat `bundle-mcp` sementara `minimal` dan `tools.deny: ["bundle-mcp"]` memfilternya. -`test:docker:cron-mcp-cleanup` bersifat deterministik dan tidak memerlukan kunci model live. -Ini memulai Gateway yang telah disiapkan dengan server probe MCP stdio nyata, menjalankan -giliran cron terisolasi dan giliran anak sekali jalan `/subagents spawn`, lalu memverifikasi +perilaku antrean peristiwa langsung, perutean kirim keluar, serta notifikasi saluran + +izin bergaya Claude melalui bridge MCP stdio sungguhan. Pemeriksaan notifikasi +memeriksa frame MCP stdio mentah secara langsung sehingga smoke memvalidasi apa yang +benar-benar dipancarkan bridge, bukan hanya apa yang kebetulan diekspos oleh SDK klien tertentu. +`test:docker:pi-bundle-mcp-tools` bersifat deterministik dan tidak membutuhkan kunci +model langsung. Ini membangun image Docker repo, memulai server probe MCP stdio sungguhan +di dalam container, mewujudkan server tersebut melalui runtime MCP bundle Pi tertanam, +mengeksekusi tool, lalu memverifikasi `coding` dan `messaging` mempertahankan +tool `bundle-mcp` sementara `minimal` dan `tools.deny: ["bundle-mcp"]` memfilternya. +`test:docker:cron-mcp-cleanup` bersifat deterministik dan tidak membutuhkan kunci model +langsung. Ini memulai Gateway ber-seed dengan server probe MCP stdio sungguhan, menjalankan +giliran cron terisolasi dan giliran anak one-shot `/subagents spawn`, lalu memverifikasi proses anak MCP keluar setelah setiap run. -Uji smoke thread bahasa biasa ACP manual (bukan CI): +Smoke thread bahasa biasa ACP manual (bukan CI): - `bun scripts/dev/discord-acp-plain-language-smoke.ts --channel ...` -- Simpan skrip ini untuk alur kerja regresi/debug. Skrip ini mungkin diperlukan lagi untuk validasi perutean thread ACP, jadi jangan hapus. +- Pertahankan skrip ini untuk alur kerja regresi/debug. Skrip ini mungkin diperlukan lagi untuk validasi perutean thread ACP, jadi jangan hapus. -Variabel env yang berguna: +Env var yang berguna: -- `OPENCLAW_CONFIG_DIR=...` (default: `~/.openclaw`) dipasang ke `/home/node/.openclaw` -- `OPENCLAW_WORKSPACE_DIR=...` (default: `~/.openclaw/workspace`) dipasang ke `/home/node/.openclaw/workspace` -- `OPENCLAW_PROFILE_FILE=...` (default: `~/.profile`) dipasang ke `/home/node/.profile` dan di-source sebelum menjalankan pengujian -- `OPENCLAW_DOCKER_PROFILE_ENV_ONLY=1` untuk memverifikasi hanya variabel env yang di-source dari `OPENCLAW_PROFILE_FILE`, menggunakan direktori konfigurasi/ruang kerja sementara dan tanpa pemasangan autentikasi CLI eksternal -- `OPENCLAW_DOCKER_CLI_TOOLS_DIR=...` (default: `~/.cache/openclaw/docker-cli-tools`) dipasang ke `/home/node/.npm-global` untuk instalasi CLI yang di-cache di dalam Docker -- Direktori/file autentikasi CLI eksternal di bawah `$HOME` dipasang hanya-baca di bawah `/host-auth...`, lalu disalin ke `/home/node/...` sebelum pengujian dimulai +- `OPENCLAW_CONFIG_DIR=...` (default: `~/.openclaw`) di-mount ke `/home/node/.openclaw` +- `OPENCLAW_WORKSPACE_DIR=...` (default: `~/.openclaw/workspace`) di-mount ke `/home/node/.openclaw/workspace` +- `OPENCLAW_PROFILE_FILE=...` (default: `~/.profile`) di-mount ke `/home/node/.profile` dan di-source sebelum menjalankan test +- `OPENCLAW_DOCKER_PROFILE_ENV_ONLY=1` untuk memverifikasi hanya env var yang di-source dari `OPENCLAW_PROFILE_FILE`, menggunakan direktori konfigurasi/workspace sementara dan tanpa mount auth CLI eksternal +- `OPENCLAW_DOCKER_CLI_TOOLS_DIR=...` (default: `~/.cache/openclaw/docker-cli-tools`) di-mount ke `/home/node/.npm-global` untuk instalasi CLI yang di-cache di dalam Docker +- Direktori/file auth CLI eksternal di bawah `$HOME` di-mount read-only di bawah `/host-auth...`, lalu disalin ke `/home/node/...` sebelum test dimulai - Direktori default: `.minimax` - File default: `~/.codex/auth.json`, `~/.codex/config.toml`, `.claude.json`, `~/.claude/.credentials.json`, `~/.claude/settings.json`, `~/.claude/settings.local.json` - - Proses provider yang dipersempit hanya memasang direktori/file yang diperlukan, yang disimpulkan dari `OPENCLAW_LIVE_PROVIDERS` / `OPENCLAW_LIVE_GATEWAY_PROVIDERS` - - Timpa secara manual dengan `OPENCLAW_DOCKER_AUTH_DIRS=all`, `OPENCLAW_DOCKER_AUTH_DIRS=none`, atau daftar koma seperti `OPENCLAW_DOCKER_AUTH_DIRS=.claude,.codex` -- `OPENCLAW_LIVE_GATEWAY_MODELS=...` / `OPENCLAW_LIVE_MODELS=...` untuk mempersempit proses -- `OPENCLAW_LIVE_GATEWAY_PROVIDERS=...` / `OPENCLAW_LIVE_PROVIDERS=...` untuk memfilter provider di dalam kontainer -- `OPENCLAW_SKIP_DOCKER_BUILD=1` untuk menggunakan kembali image `openclaw:local-live` yang sudah ada untuk proses ulang yang tidak memerlukan pembangunan ulang + - Run penyedia yang dipersempit hanya me-mount direktori/file yang dibutuhkan yang disimpulkan dari `OPENCLAW_LIVE_PROVIDERS` / `OPENCLAW_LIVE_GATEWAY_PROVIDERS` + - Override secara manual dengan `OPENCLAW_DOCKER_AUTH_DIRS=all`, `OPENCLAW_DOCKER_AUTH_DIRS=none`, atau daftar koma seperti `OPENCLAW_DOCKER_AUTH_DIRS=.claude,.codex` +- `OPENCLAW_LIVE_GATEWAY_MODELS=...` / `OPENCLAW_LIVE_MODELS=...` untuk mempersempit run +- `OPENCLAW_LIVE_GATEWAY_PROVIDERS=...` / `OPENCLAW_LIVE_PROVIDERS=...` untuk memfilter penyedia di dalam container +- `OPENCLAW_SKIP_DOCKER_BUILD=1` untuk menggunakan ulang image `openclaw:local-live` yang sudah ada untuk rerun yang tidak membutuhkan rebuild - `OPENCLAW_LIVE_REQUIRE_PROFILE_KEYS=1` untuk memastikan kredensial berasal dari penyimpanan profil (bukan env) -- `OPENCLAW_OPENWEBUI_MODEL=...` untuk memilih model yang diekspos oleh Gateway untuk smoke Open WebUI -- `OPENCLAW_OPENWEBUI_PROMPT=...` untuk menimpa prompt pemeriksaan nonce yang digunakan oleh smoke Open WebUI -- `OPENWEBUI_IMAGE=...` untuk menimpa tag image Open WebUI yang dipin +- `OPENCLAW_OPENWEBUI_MODEL=...` untuk memilih model yang diekspos oleh gateway untuk smoke Open WebUI +- `OPENCLAW_OPENWEBUI_PROMPT=...` untuk mengganti prompt pemeriksaan nonce yang digunakan oleh smoke Open WebUI +- `OPENWEBUI_IMAGE=...` untuk mengganti tag image Open WebUI yang di-pin -## Pemeriksaan dokumentasi +## Sanity docs -Jalankan pemeriksaan dokumentasi setelah pengeditan dokumen: `pnpm check:docs`. -Jalankan validasi anchor Mintlify penuh ketika Anda juga memerlukan pemeriksaan heading dalam halaman: `pnpm docs:check-links:anchors`. +Jalankan pemeriksaan docs setelah edit docs: `pnpm check:docs`. +Jalankan validasi anchor Mintlify penuh saat Anda juga membutuhkan pemeriksaan heading dalam halaman: `pnpm docs:check-links:anchors`. ## Regresi offline (aman untuk CI) -Ini adalah regresi “pipeline nyata” tanpa provider nyata: +Ini adalah regresi “pipeline sungguhan” tanpa penyedia sungguhan: -- Pemanggilan alat Gateway (mock OpenAI, Gateway nyata + loop agen): `src/gateway/gateway.test.ts` (kasus: "runs a mock OpenAI tool call end-to-end via gateway agent loop") -- Wizard Gateway (WS `wizard.start`/`wizard.next`, menulis konfigurasi + autentikasi diberlakukan): `src/gateway/gateway.test.ts` (kasus: "runs wizard over ws and writes auth token config") +- Pemanggilan tool Gateway (mock OpenAI, gateway sungguhan + loop agen): `src/gateway/gateway.test.ts` (kasus: "runs a mock OpenAI tool call end-to-end via gateway agent loop") +- Wizard Gateway (WS `wizard.start`/`wizard.next`, menulis konfigurasi + auth ditegakkan): `src/gateway/gateway.test.ts` (kasus: "runs wizard over ws and writes auth token config") -## Evaluasi keandalan agen (Skills) +## Evaluasi keandalan agen (skills) -Kita sudah memiliki beberapa pengujian aman untuk CI yang berperilaku seperti “evaluasi keandalan agen”: +Kita sudah memiliki beberapa test aman-CI yang berperilaku seperti “evaluasi keandalan agen”: -- Pemanggilan alat mock melalui Gateway nyata + loop agen (`src/gateway/gateway.test.ts`). +- Pemanggilan tool mock melalui gateway sungguhan + loop agen (`src/gateway/gateway.test.ts`). - Alur wizard end-to-end yang memvalidasi wiring sesi dan efek konfigurasi (`src/gateway/gateway.test.ts`). -Yang masih belum ada untuk Skills (lihat [Skills](/id/tools/skills)): +Yang masih kurang untuk skills (lihat [Skills](/id/tools/skills)): -- **Pengambilan keputusan:** ketika Skills tercantum dalam prompt, apakah agen memilih skill yang tepat (atau menghindari yang tidak relevan)? -- **Kepatuhan:** apakah agen membaca `SKILL.md` sebelum digunakan dan mengikuti langkah/argumen yang diwajibkan? -- **Kontrak alur kerja:** skenario multi-giliran yang menegaskan urutan alat, penerusan riwayat sesi, dan batas sandbox. +- **Pengambilan keputusan:** ketika skills dicantumkan dalam prompt, apakah agen memilih skill yang tepat (atau menghindari yang tidak relevan)? +- **Kepatuhan:** apakah agen membaca `SKILL.md` sebelum digunakan dan mengikuti langkah/arg yang diwajibkan? +- **Kontrak alur kerja:** skenario multi-turn yang meng-assert urutan tool, penerusan riwayat sesi, dan batas sandbox. -Evaluasi mendatang harus tetap deterministik terlebih dahulu: +Evaluasi mendatang sebaiknya tetap deterministik terlebih dahulu: -- Runner skenario menggunakan provider mock untuk menegaskan pemanggilan alat + urutan, pembacaan file skill, dan wiring sesi. -- Suite kecil skenario yang berfokus pada skill (gunakan vs hindari, gating, injeksi prompt). -- Evaluasi live opsional (opt-in, dijaga env) hanya setelah suite aman untuk CI tersedia. +- Runner skenario yang menggunakan penyedia mock untuk meng-assert pemanggilan tool + urutan, pembacaan file skill, dan wiring sesi. +- Suite kecil skenario yang berfokus pada skill (gunakan vs hindari, gating, prompt injection). +- Evaluasi langsung opsional (opt-in, env-gated) hanya setelah suite aman-CI tersedia. -## Pengujian kontrak (bentuk plugin dan channel) +## Test kontrak (bentuk Plugin dan saluran) -Pengujian kontrak memverifikasi bahwa setiap plugin dan channel terdaftar mematuhi -kontrak antarmukanya. Pengujian ini mengiterasi semua plugin yang ditemukan dan menjalankan suite -asersi bentuk dan perilaku. Lane unit `pnpm test` default dengan sengaja +Test kontrak memverifikasi bahwa setiap Plugin dan saluran yang terdaftar mematuhi +kontrak antarmukanya. Test ini mengiterasi semua Plugin yang ditemukan dan menjalankan suite +assertion bentuk dan perilaku. Lane unit `pnpm test` default sengaja melewati file smoke dan seam bersama ini; jalankan perintah kontrak secara eksplisit -ketika Anda menyentuh permukaan channel atau provider bersama. +saat Anda menyentuh permukaan saluran atau penyedia bersama. ### Perintah - Semua kontrak: `pnpm test:contracts` -- Hanya kontrak channel: `pnpm test:contracts:channels` -- Hanya kontrak provider: `pnpm test:contracts:plugins` +- Kontrak saluran saja: `pnpm test:contracts:channels` +- Kontrak penyedia saja: `pnpm test:contracts:plugins` -### Kontrak channel +### Kontrak saluran Terletak di `src/channels/plugins/contracts/*.contract.test.ts`: -- **plugin** - Bentuk plugin dasar (id, nama, kapabilitas) +- **plugin** - Bentuk Plugin dasar (id, name, capabilities) - **setup** - Kontrak wizard penyiapan -- **session-binding** - Perilaku pengikatan sesi +- **session-binding** - Perilaku binding sesi - **outbound-payload** - Struktur payload pesan - **inbound** - Penanganan pesan masuk -- **actions** - Handler aksi channel +- **actions** - Handler aksi saluran - **threading** - Penanganan ID thread - **directory** - API direktori/roster - **group-policy** - Penegakan kebijakan grup -### Kontrak status provider +### Kontrak status penyedia Terletak di `src/plugins/contracts/*.contract.test.ts`. -- **status** - Probe status channel -- **registry** - Bentuk registri Plugin +- **status** - Probe status saluran +- **registry** - Bentuk registry Plugin -### Kontrak provider +### Kontrak penyedia Terletak di `src/plugins/contracts/*.contract.test.ts`: -- **auth** - Kontrak alur autentikasi -- **auth-choice** - Pilihan/seleksi autentikasi +- **auth** - Kontrak alur auth +- **auth-choice** - Pilihan/seleksi auth - **catalog** - API katalog model - **discovery** - Penemuan Plugin - **loader** - Pemuatan Plugin -- **runtime** - Runtime provider +- **runtime** - Runtime penyedia - **shape** - Bentuk/antarmuka Plugin - **wizard** - Wizard penyiapan -### Kapan menjalankan +### Kapan dijalankan - Setelah mengubah ekspor atau subpath plugin-sdk -- Setelah menambahkan atau memodifikasi plugin channel atau provider -- Setelah merombak pendaftaran atau penemuan plugin +- Setelah menambahkan atau memodifikasi Plugin saluran atau penyedia +- Setelah me-refactor pendaftaran atau penemuan Plugin -Pengujian kontrak berjalan di CI dan tidak memerlukan kunci API nyata. +Test kontrak berjalan di CI dan tidak memerlukan kunci API sungguhan. ## Menambahkan regresi (panduan) -Ketika Anda memperbaiki masalah provider/model yang ditemukan secara live: +Saat Anda memperbaiki masalah penyedia/model yang ditemukan secara langsung: -- Tambahkan regresi aman untuk CI jika memungkinkan (provider mock/stub, atau tangkap transformasi bentuk permintaan yang tepat) -- Jika secara inheren hanya live (batas laju, kebijakan autentikasi), jaga pengujian live tetap sempit dan opt-in melalui variabel env -- Pilih lapisan terkecil yang menangkap bug: - - bug konversi/replay permintaan provider → pengujian model langsung - - bug pipeline sesi/riwayat/alat Gateway → smoke live Gateway atau pengujian mock Gateway aman untuk CI +- Tambahkan regresi aman-CI jika memungkinkan (penyedia mock/stub, atau tangkap transformasi bentuk permintaan yang persis) +- Jika secara inheren hanya langsung (rate limit, kebijakan auth), jaga test langsung tetap sempit dan opt-in via env var +- Lebih baik targetkan layer terkecil yang menangkap bug: + - bug konversi/replay permintaan penyedia → test model langsung + - bug pipeline sesi/riwayat/tool gateway → smoke langsung gateway atau test mock gateway aman-CI - Guardrail traversal SecretRef: - - `src/secrets/exec-secret-ref-id-parity.test.ts` menurunkan satu target sampel per kelas SecretRef dari metadata registri (`listSecretTargetRegistryEntries()`), lalu menegaskan bahwa id exec segmen traversal ditolak. - - Jika Anda menambahkan keluarga target SecretRef `includeInPlan` baru di `src/secrets/target-registry-data.ts`, perbarui `classifyTargetClass` dalam pengujian itu. Pengujian ini sengaja gagal pada id target yang tidak terklasifikasi agar kelas baru tidak dapat dilewati diam-diam. + - `src/secrets/exec-secret-ref-id-parity.test.ts` menurunkan satu target sampel per kelas SecretRef dari metadata registry (`listSecretTargetRegistryEntries()`), lalu meng-assert id exec segmen traversal ditolak. + - Jika Anda menambahkan family target SecretRef `includeInPlan` baru di `src/secrets/target-registry-data.ts`, perbarui `classifyTargetClass` dalam test tersebut. Test sengaja gagal pada id target yang belum diklasifikasikan agar kelas baru tidak dapat dilewati diam-diam. ## Terkait -- [Pengujian live](/id/help/testing-live) +- [Testing live](/id/help/testing-live) - [CI](/id/ci) diff --git a/docs/id/reference/test.md b/docs/id/reference/test.md index 6d77f913b..f984ae36e 100644 --- a/docs/id/reference/test.md +++ b/docs/id/reference/test.md @@ -4,55 +4,56 @@ read_when: summary: Cara menjalankan pengujian secara lokal (vitest) dan kapan menggunakan mode force/coverage title: Pengujian x-i18n: - generated_at: "2026-04-30T10:11:15Z" + generated_at: "2026-04-30T18:38:40Z" model: gpt-5.5 provider: openai - source_hash: 9328d6f0383b5067fa8bb5d0f1bf22a3b9048a267908bf85167842ddc3d12e42 + source_hash: 131f2bad3b2806d28394213cec38d632d106ddbf8ff04d06345ab8046fb8bcf2 source_path: reference/test.md workflow: 16 --- -- Kit pengujian lengkap (suite, langsung, Docker): [Pengujian](/id/help/testing) +- Kit pengujian lengkap (rangkaian pengujian, pengujian langsung, Docker): [Pengujian](/id/help/testing) -- `pnpm test:force`: Mematikan proses gateway tersisa yang menahan port kontrol default, lalu menjalankan rangkaian lengkap Vitest dengan port Gateway terisolasi agar pengujian server tidak bertabrakan dengan instance yang sedang berjalan. Gunakan ini ketika proses Gateway sebelumnya membuat port 18789 tetap terpakai. -- `pnpm test:coverage`: Menjalankan rangkaian unit dengan cakupan V8 (melalui `vitest.unit.config.ts`). Ini adalah gate cakupan unit untuk file yang dimuat, bukan cakupan semua file seluruh repo. Ambangnya adalah 70% baris/fungsi/pernyataan dan 55% cabang. Karena `coverage.all` bernilai false, gate ini mengukur file yang dimuat oleh rangkaian cakupan unit, bukan memperlakukan setiap file sumber split-lane sebagai tidak tercakup. +- `pnpm test:force`: Menghentikan paksa proses Gateway yang masih tersisa dan menahan port kontrol default, lalu menjalankan seluruh rangkaian Vitest dengan port Gateway terisolasi agar pengujian server tidak bertabrakan dengan instans yang sedang berjalan. Gunakan ini ketika proses Gateway sebelumnya membuat port 18789 tetap terpakai. +- `pnpm test:coverage`: Menjalankan rangkaian unit dengan cakupan V8 (melalui `vitest.unit.config.ts`). Ini adalah gate cakupan unit untuk file yang dimuat, bukan cakupan semua file seluruh repo. Ambangnya adalah 70% untuk baris/fungsi/pernyataan dan 55% untuk cabang. Karena `coverage.all` bernilai false, gate ini mengukur file yang dimuat oleh rangkaian cakupan unit, alih-alih memperlakukan setiap file sumber split-lane sebagai tidak tercakup. - `pnpm test:coverage:changed`: Menjalankan cakupan unit hanya untuk file yang berubah sejak `origin/main`. -- `pnpm test:changed`: proses pengujian perubahan pintar yang murah. Ini menjalankan target presisi dari pengeditan pengujian langsung, file sibling `*.test.ts`, pemetaan sumber eksplisit, dan grafik impor lokal. Perubahan luas/config/package dilewati kecuali dipetakan ke pengujian presisi. -- `OPENCLAW_TEST_CHANGED_BROAD=1 pnpm test:changed`: proses pengujian perubahan luas eksplisit. Gunakan ketika pengeditan harness/config/package pengujian harus kembali ke perilaku changed-test Vitest yang lebih luas. +- `pnpm test:changed`: proses pengujian perubahan cerdas yang murah. Ini menjalankan target presisi dari edit pengujian langsung, file sibling `*.test.ts`, pemetaan sumber eksplisit, dan grafik impor lokal. Perubahan luas/konfigurasi/paket dilewati kecuali dipetakan ke pengujian yang presisi. +- `OPENCLAW_TEST_CHANGED_BROAD=1 pnpm test:changed`: proses pengujian perubahan luas eksplisit. Gunakan ini ketika edit harness/konfigurasi/paket pengujian harus kembali ke perilaku pengujian perubahan Vitest yang lebih luas. - `pnpm changed:lanes`: menampilkan lane arsitektural yang dipicu oleh diff terhadap `origin/main`. -- `pnpm check:changed`: menjalankan gate pemeriksaan perubahan pintar untuk diff terhadap `origin/main`. Ini menjalankan typecheck, lint, dan perintah guard untuk lane arsitektural yang terdampak, tetapi tidak menjalankan pengujian Vitest. Gunakan `pnpm test:changed` atau `pnpm test ` eksplisit untuk bukti pengujian. -- `pnpm test`: merutekan target file/direktori eksplisit melalui lane Vitest terskop. Proses tanpa target menggunakan grup shard tetap dan memperluas ke config leaf untuk eksekusi paralel lokal; grup ekstensi selalu diperluas ke config shard per ekstensi, bukan satu proses root-project raksasa. -- Proses wrapper pengujian diakhiri dengan ringkasan singkat `[test] passed|failed|skipped ... in ...`. Baris durasi bawaan Vitest tetap menjadi detail per-shard. -- State pengujian OpenClaw bersama: gunakan `src/test-utils/openclaw-test-state.ts` dari Vitest ketika pengujian membutuhkan `HOME`, `OPENCLAW_STATE_DIR`, `OPENCLAW_CONFIG_PATH`, fixture config, workspace, direktori agent, atau penyimpanan auth-profile yang terisolasi. -- Helper E2E proses: gunakan `test/helpers/openclaw-test-instance.ts` ketika pengujian E2E tingkat proses Vitest membutuhkan Gateway berjalan, env CLI, penangkapan log, dan pembersihan di satu tempat. -- Helper E2E Docker/Bash: lane yang melakukan source `scripts/lib/docker-e2e-image.sh` dapat meneruskan `docker_e2e_test_state_shell_b64