89 KiB
| read_when | summary | title | x-i18n | |||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
Набір для тестування: unit/e2e/live-набори, Docker-ранери та що покриває кожен тест | Тестування |
|
OpenClaw має три набори тестів Vitest (модульні/інтеграційні, e2e, live) і невеликий набір Docker-ранерів. Цей документ є посібником «як ми тестуємо»:
- Що покриває кожен набір тестів (і що він навмисно не покриває).
- Які команди запускати для типових робочих процесів (локально, перед push, під час налагодження).
- Як live-тести виявляють облікові дані та вибирають моделі/провайдерів.
- Як додавати регресійні тести для реальних проблем із моделями/провайдерами.
- Огляд QA — архітектура, поверхня команд, створення сценаріїв.
- Matrix QA — довідник для
pnpm openclaw qa matrix. - QA channel — синтетичний транспортний Plugin, який використовується сценаріями з репозиторію.
Ця сторінка описує запуск звичайних наборів тестів і Docker/Parallels-ранерів. Розділ про QA-специфічні ранери нижче (QA-специфічні ранери) перелічує конкретні виклики qa і повертає до наведених вище довідників.
Швидкий старт
У більшість днів:
- Повний gate (очікується перед push):
pnpm build && pnpm check && pnpm check:test-types && pnpm test - Швидший локальний запуск повного набору тестів на просторій машині:
pnpm test:max - Прямий цикл Vitest watch:
pnpm test:watch - Пряме націлювання на файл тепер також маршрутизує шляхи розширень/каналів:
pnpm test extensions/discord/src/monitor/message-handler.preflight.test.ts - Спершу надавайте перевагу цільовим запускам, коли ітеруєте над одним падінням.
- QA-сайт на базі Docker:
pnpm qa:lab:up - QA-смуга на базі Linux VM:
pnpm openclaw qa suite --runner multipass --scenario channel-chat-baseline
Коли ви торкаєтеся тестів або хочете додаткової впевненості:
- Gate покриття:
pnpm test:coverage - Набір E2E:
pnpm test:e2e
Під час налагодження реальних провайдерів/моделей (потрібні реальні облікові дані):
- Live-набір (моделі + перевірки інструментів/зображень Gateway):
pnpm test:live - Тихо націлити один live-файл:
pnpm test:live -- src/agents/models.profiles.live.test.ts - Звіти про продуктивність під час виконання: запустіть
OpenClaw Performanceзlive_gpt54=trueдля реального ходу агентаopenai/gpt-5.4абоdeep_profile=trueдля артефактів CPU/heap/trace Kova. Щоденні заплановані запуски публікують артефакти смуг mock-provider, deep-profile і GPT 5.4 доopenclaw/clawgrit-reports, коли налаштованоCLAWGRIT_REPORTS_TOKEN. Звіт mock-provider також включає показники завантаження Gateway на рівні джерел, пам’яті, Plugin-pressure, повторюваного fake-model hello-loop і старту CLI. - Docker live model sweep:
pnpm test:docker:live-models- Кожна вибрана модель тепер виконує текстовий хід і невелику перевірку в стилі читання файлу.
Моделі, метадані яких оголошують вхід
image, також виконують крихітний хід із зображенням. Вимкніть додаткові перевірки черезOPENCLAW_LIVE_MODEL_FILE_PROBE=0абоOPENCLAW_LIVE_MODEL_IMAGE_PROBE=0, коли ізолюєте падіння провайдера. - Покриття CI: щоденні
OpenClaw Scheduled Live And E2E Checksі ручніOpenClaw Release Checksобидва викликають багаторазовий live/E2E workflow зinclude_live_suites: true, що включає окремі Docker live model matrix jobs, розбиті за провайдером. - Для сфокусованих повторних запусків CI запустіть
OpenClaw Live And E2E Checks (Reusable)зinclude_live_suites: trueіlive_models_only: true. - Додайте нові високосигнальні секрети провайдера до
scripts/ci-hydrate-live-auth.shплюс.github/workflows/openclaw-live-and-e2e-checks-reusable.ymlта його запланованих/release-викликачів.
- Кожна вибрана модель тепер виконує текстовий хід і невелику перевірку в стилі читання файлу.
Моделі, метадані яких оголошують вхід
- Native Codex bound-chat smoke:
pnpm test:docker:live-codex-bind- Запускає Docker live lane проти шляху app-server Codex, прив’язує синтетичний
Slack DM через
/codex bind, виконує/codex fastі/codex permissions, потім перевіряє, що звичайна відповідь і вкладення зображення проходять через нативну прив’язку Plugin замість ACP.
- Запускає Docker live lane проти шляху app-server Codex, прив’язує синтетичний
Slack DM через
- Codex app-server harness smoke:
pnpm test:docker:live-codex-harness- Запускає ходи агента Gateway через harness app-server Codex, який належить Plugin,
перевіряє
/codex statusі/codex models, а за замовчуванням виконує перевірки image, cron MCP, sub-agent і Guardian. Вимкніть перевірку sub-agent черезOPENCLAW_LIVE_CODEX_HARNESS_SUBAGENT_PROBE=0, коли ізолюєте інші падіння Codex app-server. Для сфокусованої перевірки sub-agent вимкніть інші перевірки: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. Це завершується після перевірки sub-agent, якщо не встановленоOPENCLAW_LIVE_CODEX_HARNESS_SUBAGENT_ONLY=0.
- Запускає ходи агента Gateway через harness app-server Codex, який належить Plugin,
перевіряє
- Crestodian rescue command smoke:
pnpm test:live:crestodian-rescue-channel- Додаткова ретельна перевірка поверхні rescue-команди каналу повідомлень.
Вона виконує
/crestodian status, ставить у чергу постійну зміну моделі, відповідає/crestodian yesі перевіряє шлях запису audit/config.
- Додаткова ретельна перевірка поверхні rescue-команди каналу повідомлень.
Вона виконує
- Crestodian planner Docker smoke:
pnpm test:docker:crestodian-planner- Запускає Crestodian у контейнері без конфігурації з підробленим Claude CLI у
PATHі перевіряє, що нечіткий fallback планувальника перетворюється на аудитований типізований запис конфігурації.
- Запускає Crestodian у контейнері без конфігурації з підробленим Claude CLI у
- Crestodian first-run Docker smoke:
pnpm test:docker:crestodian-first-run- Починає з порожнього каталогу стану OpenClaw, маршрутизує голий
openclawдо Crestodian, застосовує записи setup/model/agent/Discord Plugin + SecretRef, перевіряє конфігурацію й перевіряє audit entries. Той самий шлях налаштування Ring 0 також покрито в QA Lab черезpnpm openclaw qa suite --scenario crestodian-ring-zero-setup.
- Починає з порожнього каталогу стану OpenClaw, маршрутизує голий
- Moonshot/Kimi cost smoke: з установленим
MOONSHOT_API_KEYзапустітьopenclaw models list --provider moonshot --json, потім запустіть ізольованийopenclaw agent --local --session-id live-kimi-cost --message 'Reply exactly: KIMI_LIVE_OK' --thinking off --jsonпротиmoonshot/kimi-k2.6. Перевірте, що JSON повідомляє Moonshot/K2.6, а транскрипт асистента зберігає нормалізованийusage.cost.
QA-специфічні ранери
Ці команди розташовані поруч із головними наборами тестів, коли потрібен реалізм QA-lab:
CI запускає QA Lab у dedicated workflows. Agentic parity вкладено під
QA-Lab - All Lanes і release validation, а не в окремий PR workflow.
Для широкої валідації слід використовувати Full Release Validation з
rerun_group=qa-parity або групу QA release-checks. Стабільні/типові release
checks тримають exhaustive live/Docker soak за run_release_soak=true; профіль
full примусово вмикає soak. QA-Lab - All Lanes
запускається щоночі на main і з ручного dispatch із mock parity lane, live
Matrix lane, Convex-managed live Telegram lane і Convex-managed live Discord
lane як паралельними jobs. Заплановані QA та release checks явно передають Matrix
--profile fast, тоді як Matrix CLI і manual workflow input
за замовчуванням лишаються all; ручний dispatch може розбити all на jobs
transport, media, e2ee-smoke, e2ee-deep і e2ee-cli. OpenClaw Release Checks запускає parity плюс fast Matrix і Telegram lanes перед release
approval, використовуючи mock-openai/gpt-5.5 для release transport checks, щоб вони лишалися
детермінованими та уникали звичайного запуску provider-plugin. Ці live transport
gateways вимикають memory search; поведінка пам’яті лишається покритою QA parity
suites.
Full release live media shards використовують
ghcr.io/openclaw/openclaw-live-media-runner:ubuntu-24.04, який уже має
ffmpeg і ffprobe. Docker live model/backend shards використовують спільний
образ ghcr.io/openclaw/openclaw-live-test:<sha>, зібраний один раз для вибраного
коміту, а потім отримують його через OPENCLAW_SKIP_DOCKER_BUILD=1 замість повторної збірки
всередині кожного shard.
pnpm openclaw qa suite- Запускає QA-сценарії, підтримані репозиторієм, безпосередньо на хості.
- За замовчуванням запускає кілька вибраних сценаріїв паралельно з ізольованими
Gateway-працівниками.
qa-channelза замовчуванням має паралельність 4 (обмежену кількістю вибраних сценаріїв). Використовуйте--concurrency <count>, щоб налаштувати кількість працівників, або--concurrency 1для старішої послідовної гілки. - Завершується з ненульовим кодом, якщо будь-який сценарій не вдається. Використовуйте
--allow-failures, коли потрібні артефакти без коду виходу, що позначає помилку. - Підтримує режими провайдера
live-frontier,mock-openaiіaimock.aimockзапускає локальний сервер провайдера на базі AIMock для експериментального покриття фікстур і моків протоколу без заміни гілкиmock-openai, обізнаної зі сценаріями.
pnpm test:plugins:kitchen-sink-live- Запускає живий набір випробувань OpenAI Kitchen Sink Plugin через QA Lab. Він
установлює зовнішній пакет Kitchen Sink, перевіряє інвентар поверхні SDK Plugin,
зондує
/healthzі/readyz, записує докази CPU/RSS Gateway, виконує живий хід OpenAI і перевіряє змагальну діагностику. Потребує живої автентифікації OpenAI, наприкладOPENAI_API_KEY. У гідратованих сеансах Testbox він автоматично підвантажує профіль live-auth Testbox, коли наявний помічникopenclaw-testbox-env.
- Запускає живий набір випробувань OpenAI Kitchen Sink Plugin через QA Lab. Він
установлює зовнішній пакет Kitchen Sink, перевіряє інвентар поверхні SDK Plugin,
зондує
pnpm test:gateway:cpu-scenarios- Запускає бенч запуску Gateway плюс невеликий пакет мок-сценаріїв QA Lab
(
channel-chat-baseline,memory-failure-fallback,gateway-restart-inflight-run) і записує зведений підсумок спостережень CPU у.artifacts/gateway-cpu-scenarios/. - За замовчуванням позначає лише сталі спостереження гарячого CPU (
--cpu-core-warnплюс--hot-wall-warn-ms), тому короткі сплески під час запуску записуються як метрики і не виглядають як регресія з багатохвилинним навантаженням Gateway. - Використовує зібрані артефакти
dist; спершу запустіть збірку, якщо checkout ще не має свіжого runtime-виводу.
- Запускає бенч запуску Gateway плюс невеликий пакет мок-сценаріїв QA Lab
(
pnpm openclaw qa suite --runner multipass- Запускає той самий QA-набір усередині одноразової Linux-VM Multipass.
- Зберігає ту саму поведінку вибору сценаріїв, що й
qa suiteна хості. - Повторно використовує ті самі прапорці вибору провайдера/моделі, що й
qa suite. - Живі запуски передають підтримувані вхідні дані автентифікації QA, практичні для гостя:
ключі провайдера на базі env, шлях до конфігурації живого провайдера QA та
CODEX_HOME, коли він наявний. - Каталоги виводу мають залишатися в корені репозиторію, щоб гість міг записувати назад через змонтований робочий простір.
- Записує звичайний QA-звіт + підсумок, а також журнали Multipass у
.artifacts/qa-e2e/....
pnpm qa:lab:up- Запускає Docker-підтриманий QA-сайт для операторської QA-роботи.
pnpm test:docker:npm-onboard-channel-agent- Збирає npm tarball із поточного checkout, установлює його глобально в Docker, запускає неінтерактивний onboarding із API-ключем OpenAI, за замовчуванням налаштовує Telegram, перевіряє, що запакований Plugin runtime завантажується без відновлення залежностей під час запуску, запускає doctor і виконує один локальний хід агента проти замоканого endpoint OpenAI.
- Використовуйте
OPENCLAW_NPM_ONBOARD_CHANNEL=discord, щоб запустити ту саму гілку packaged-install з Discord.
pnpm test:docker:session-runtime-context- Запускає детермінований Docker smoke зібраного застосунку для вбудованих транскриптів runtime-контексту.
Він перевіряє, що прихований runtime-контекст OpenClaw зберігається як
custom message, який не відображається, замість витоку у видимий хід користувача,
потім засіває зачеплений зламаний session JSONL і перевіряє, що
openclaw doctor --fixпереписує його на активну гілку з резервною копією.
- Запускає детермінований Docker smoke зібраного застосунку для вбудованих транскриптів runtime-контексту.
Він перевіряє, що прихований runtime-контекст OpenClaw зберігається як
custom message, який не відображається, замість витоку у видимий хід користувача,
потім засіває зачеплений зламаний session JSONL і перевіряє, що
pnpm test:docker:npm-telegram-live- Установлює candidate-пакет OpenClaw у Docker, запускає onboarding установленого пакета, налаштовує Telegram через установлений CLI, а потім повторно використовує живу Telegram QA-гілку з цим установленим пакетом як SUT Gateway.
- За замовчуванням використовує
OPENCLAW_NPM_TELEGRAM_PACKAGE_SPEC=openclaw@beta; задайтеOPENCLAW_NPM_TELEGRAM_PACKAGE_TGZ=/path/to/openclaw-current.tgzабоOPENCLAW_CURRENT_PACKAGE_TGZ, щоб тестувати розв’язаний локальний tarball замість установлення з registry. - Використовує ті самі env-облікові дані Telegram або джерело облікових даних Convex, що й
pnpm openclaw qa telegram. Для CI/release-автоматизації задайтеOPENCLAW_NPM_TELEGRAM_CREDENTIAL_SOURCE=convexплюсOPENCLAW_QA_CONVEX_SITE_URLі секрет ролі. ЯкщоOPENCLAW_QA_CONVEX_SITE_URLі секрет ролі Convex наявні в CI, Docker-обгортка автоматично вибирає Convex. - Обгортка перевіряє env облікових даних Telegram або Convex на хості перед
роботою Docker build/install. Задавайте
OPENCLAW_NPM_TELEGRAM_SKIP_CREDENTIAL_PREFLIGHT=1лише під час навмисного налагодження підготовки до облікових даних. OPENCLAW_NPM_TELEGRAM_CREDENTIAL_ROLE=ci|maintainerперевизначає спільнуOPENCLAW_QA_CREDENTIAL_ROLEлише для цієї гілки.- GitHub Actions надає цю гілку як ручний maintainer workflow
NPM Telegram Beta E2E. Він не запускається під час merge. Workflow використовує середовищеqa-live-sharedі lease-и CI-облікових даних Convex.
- GitHub Actions також надає
Package Acceptanceдля побічного product proof проти одного candidate-пакета. Він приймає довірений ref, опубліковану npm spec, HTTPS tarball URL плюс SHA-256 або tarball artifact з іншого запуску, завантажує нормалізованийopenclaw-current.tgzякpackage-under-test, а потім запускає наявний Docker E2E scheduler із профілями гілок smoke, package, product, full або custom. Задайтеtelegram_mode=mock-openaiабоlive-frontier, щоб запустити Telegram QA workflow проти того самого артефактуpackage-under-test.- Доказ останньої beta продукту:
gh workflow run package-acceptance.yml --ref main \
-f source=npm \
-f package_spec=openclaw@beta \
-f suite_profile=product \
-f telegram_mode=mock-openai
- Доказ точного tarball URL потребує digest:
gh workflow run package-acceptance.yml --ref main \
-f source=url \
-f package_url=https://registry.npmjs.org/openclaw/-/openclaw-VERSION.tgz \
-f package_sha256=<sha256> \
-f suite_profile=package
- Доказ артефакту завантажує tarball artifact з іншого запуску Actions:
gh workflow run package-acceptance.yml --ref main \
-f source=artifact \
-f artifact_run_id=<run-id> \
-f artifact_name=<artifact-name> \
-f suite_profile=smoke
-
pnpm test:docker:plugins- Пакує та встановлює поточну збірку OpenClaw у Docker, запускає Gateway з налаштованим OpenAI, а потім вмикає bundled channel/plugins через редагування конфігурації.
- Перевіряє, що setup discovery залишає неналаштовані downloadable plugins відсутніми, перше налаштоване відновлення doctor явно встановлює кожен відсутній downloadable plugin, а другий перезапуск не виконує прихованого відновлення залежностей.
- Також установлює відому старішу npm baseline, вмикає Telegram перед запуском
openclaw update --tag <candidate>і перевіряє, що post-update doctor candidate очищає залишки застарілих залежностей Plugin без postinstall-відновлення з боку harness.
-
pnpm test:parallels:npm-update-
Запускає native packaged-install update smoke на гостьових системах Parallels. Кожна вибрана платформа спочатку встановлює запитаний baseline-пакет, потім запускає встановлену команду
openclaw updateу тому самому гості та перевіряє встановлену версію, статус оновлення, готовність Gateway і один локальний хід агента. -
Використовуйте
--platform macos,--platform windowsабо--platform linuxпід час ітерацій на одному гості. Використовуйте--jsonдля шляху артефакту підсумку та статусу кожної гілки. -
Гілка OpenAI за замовчуванням використовує
openai/gpt-5.5для живого доказу ходу агента. Передайте--model <provider/model>або задайтеOPENCLAW_PARALLELS_OPENAI_MODEL, коли навмисно перевіряєте іншу модель OpenAI. -
Обгортайте довгі локальні запуски timeout на хості, щоб зависання транспорту Parallels не могли витратити решту вікна тестування:
timeout --foreground 150m pnpm test:parallels:npm-update -- --json timeout --foreground 90m pnpm test:parallels:npm-update -- --platform windows --json -
Скрипт записує вкладені журнали гілок у
/tmp/openclaw-parallels-npm-update.*. Перегляньтеwindows-update.log,macos-update.logабоlinux-update.log, перш ніж припускати, що зовнішня обгортка зависла. -
Windows update може витрачати 10-15 хвилин на post-update doctor і роботу оновлення пакета на cold guest; це все ще нормально, коли вкладений npm debug log просувається.
-
Не запускайте цю агрегатну обгортку паралельно з окремими Parallels macOS, Windows або Linux smoke-гілками. Вони спільно використовують стан VM і можуть конфліктувати під час відновлення snapshot, обслуговування пакета або стану гостьового Gateway.
-
Post-update proof запускає звичайну поверхню bundled Plugin, тому що фасади можливостей, як-от speech, image generation і media understanding, завантажуються через bundled runtime APIs, навіть коли сам хід агента перевіряє лише просту текстову відповідь.
-
-
pnpm openclaw qa aimock- Запускає лише локальний сервер провайдера AIMock для прямого protocol smoke testing.
-
pnpm openclaw qa matrix- Запускає живу QA-гілку Matrix проти одноразового Docker-підтриманого Tuwunel homeserver. Лише source-checkout — packaged installs не постачають
qa-lab. - Повний CLI, каталог profile/scenario, env vars і layout артефактів: Matrix QA.
- Запускає живу QA-гілку Matrix проти одноразового Docker-підтриманого Tuwunel homeserver. Лише source-checkout — packaged installs не постачають
-
pnpm openclaw qa telegram- Запускає живу QA-гілку Telegram проти реальної приватної групи з використанням токенів driver і SUT bot з env.
- Потребує
OPENCLAW_QA_TELEGRAM_GROUP_ID,OPENCLAW_QA_TELEGRAM_DRIVER_BOT_TOKENіOPENCLAW_QA_TELEGRAM_SUT_BOT_TOKEN. Group id має бути числовим Telegram chat id. - Підтримує
--credential-source convexдля спільних pooled credentials. За замовчуванням використовуйте env mode або задайтеOPENCLAW_QA_CREDENTIAL_SOURCE=convex, щоб увімкнути pooled leases. - Завершується з ненульовим кодом, якщо будь-який сценарій не вдається. Використовуйте
--allow-failures, коли потрібні артефакти без коду виходу, що позначає помилку. - Потребує двох окремих bot в одній приватній групі, причому SUT bot має надавати Telegram username.
- Для стабільного bot-to-bot спостереження увімкніть Bot-to-Bot Communication Mode у
@BotFatherдля обох bot і переконайтеся, що driver bot може спостерігати груповий bot traffic. - Записує Telegram QA report, summary і артефакт observed-messages у
.artifacts/qa-e2e/.... Replying scenarios включають RTT від driver send request до observed SUT reply.
Живі транспортні гілки мають один стандартний контракт, щоб нові транспорти не розходилися; матриця покриття кожної гілки міститься в огляді QA → Покриття живого транспорту. qa-channel є широким синтетичним набором і не входить до цієї матриці.
Спільні облікові дані Telegram через Convex (v1)
Коли для openclaw qa telegram увімкнено --credential-source convex (або OPENCLAW_QA_CREDENTIAL_SOURCE=convex),
QA lab отримує ексклюзивний lease з pool на базі Convex, надсилає heartbeats
для цього lease, поки гілка виконується, і звільняє lease під час shutdown.
Еталонний scaffold проєкту Convex:
qa/convex-credential-broker/
Обов’язкові env vars:
OPENCLAW_QA_CONVEX_SITE_URL(наприклад,https://your-deployment.convex.site)- Один секрет для вибраної ролі:
OPENCLAW_QA_CONVEX_SECRET_MAINTAINERдляmaintainerOPENCLAW_QA_CONVEX_SECRET_CIдляci
- Вибір ролі облікових даних:
- CLI:
--credential-role maintainer|ci - Env default:
OPENCLAW_QA_CREDENTIAL_ROLE(за замовчуваннямciу CI, інакшеmaintainer)
- CLI:
Необов’язкові env vars:
OPENCLAW_QA_CREDENTIAL_LEASE_TTL_MS(за замовчуванням1200000)OPENCLAW_QA_CREDENTIAL_HEARTBEAT_INTERVAL_MS(за замовчуванням30000)OPENCLAW_QA_CREDENTIAL_ACQUIRE_TIMEOUT_MS(за замовчуванням90000)OPENCLAW_QA_CREDENTIAL_HTTP_TIMEOUT_MS(за замовчуванням15000)OPENCLAW_QA_CONVEX_ENDPOINT_PREFIX(за замовчуванням/qa-credentials/v1)OPENCLAW_QA_CREDENTIAL_OWNER_ID(необов’язковий trace id)OPENCLAW_QA_ALLOW_INSECURE_HTTP=1дозволяє loopbackhttp://Convex URLs лише для локальної розробки.
OPENCLAW_QA_CONVEX_SITE_URL має використовувати https:// у звичайній роботі.
Адміністративні команди супровідників (pool add/remove/list) вимагають саме
OPENCLAW_QA_CONVEX_SECRET_MAINTAINER.
CLI-помічники для супровідників:
pnpm openclaw qa credentials doctor
pnpm openclaw qa credentials add --kind telegram --payload-file qa/telegram-credential.json
pnpm openclaw qa credentials list --kind telegram
pnpm openclaw qa credentials remove --credential-id <credential-id>
Використовуйте doctor перед live-запусками, щоб перевірити URL сайту Convex, секрети брокера,
префікс endpoint, HTTP-тайм-аут і доступність admin/list без виведення
значень секретів. Використовуйте --json для машинозчитуваного виводу в скриптах та CI
утилітах.
Стандартний контракт endpoint (OPENCLAW_QA_CONVEX_SITE_URL + /qa-credentials/v1):
POST /acquire- Запит:
{ kind, ownerId, actorRole, leaseTtlMs, heartbeatIntervalMs } - Успіх:
{ status: "ok", credentialId, leaseToken, payload, leaseTtlMs?, heartbeatIntervalMs? } - Вичерпано/можна повторити:
{ status: "error", code: "POOL_EXHAUSTED" | "NO_CREDENTIAL_AVAILABLE", ... }
- Запит:
POST /heartbeat- Запит:
{ kind, ownerId, actorRole, credentialId, leaseToken, leaseTtlMs } - Успіх:
{ status: "ok" }(або порожній2xx)
- Запит:
POST /release- Запит:
{ kind, ownerId, actorRole, credentialId, leaseToken } - Успіх:
{ status: "ok" }(або порожній2xx)
- Запит:
POST /admin/add(лише секрет супровідника)- Запит:
{ kind, actorId, payload, note?, status? } - Успіх:
{ status: "ok", credential }
- Запит:
POST /admin/remove(лише секрет супровідника)- Запит:
{ credentialId, actorId } - Успіх:
{ status: "ok", changed, credential } - Захист активної оренди:
{ status: "error", code: "LEASE_ACTIVE", ... }
- Запит:
POST /admin/list(лише секрет супровідника)- Запит:
{ kind?, status?, includePayload?, limit? } - Успіх:
{ status: "ok", credentials, count }
- Запит:
Форма payload для типу Telegram:
{ groupId: string, driverToken: string, sutToken: string }groupIdмає бути рядком із числовим id чату Telegram.admin/addперевіряє цю форму дляkind: "telegram"і відхиляє некоректні payload.
Додавання каналу до QA
Архітектура й назви scenario-helper для нових адаптерів каналів описані в огляді QA → Додавання каналу. Мінімальна вимога: реалізуйте transport runner на спільному host seam qa-lab, оголосіть qaRunners у маніфесті Plugin, змонтуйте як openclaw qa <runner> і створіть сценарії в qa/scenarios/.
Набори тестів (що де запускається)
Сприймайте набори як “зростання реалістичності” (і зростання нестабільності/вартості):
Unit / integration (за замовчуванням)
- Команда:
pnpm test - Конфіг: нецільові запуски використовують набір шардів
vitest.full-*.config.tsі можуть розгортати багатопроєктні шарди в окремі конфіги проєктів для паралельного планування - Файли: інвентарі core/unit у
src/**/*.test.ts,packages/**/*.test.tsіtest/**/*.test.ts; unit-тести UI запускаються у виділеному шардіunit-ui - Область:
- Чисті unit-тести
- In-process integration-тести (автентифікація Gateway, маршрутизація, інструменти, парсинг, конфіг)
- Детерміновані регресії для відомих багів
- Очікування:
- Запускається в CI
- Реальні ключі не потрібні
- Має бути швидким і стабільним
- Тести резолвера й завантажувача публічної поверхні мають доводити широку fallback-поведінку
api.jsіruntime-api.jsзгенерованими крихітними Plugin fixture, а не реальними API вихідного коду bundled Plugin. Реальні завантаження API Plugin належать до contract/integration-наборів, якими володіє Plugin.
- Нецільовий `pnpm test` запускає дванадцять менших конфігів шардів (`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`) замість одного величезного native root-project процесу. Це зменшує піковий RSS на навантажених машинах і не дає auto-reply/extension роботі виснажувати непов’язані набори.
- `pnpm test --watch` і далі використовує native root граф проєктів `vitest.config.ts`, бо multi-shard watch loop непрактичний.
- `pnpm test`, `pnpm test:watch` і `pnpm test:perf:imports` спершу спрямовують явні цілі файлів/директорій через scoped lanes, тож `pnpm test extensions/discord/src/monitor/message-handler.preflight.test.ts` уникає повної вартості запуску root project.
- `pnpm test:changed` за замовчуванням розгортає змінені git-шляхи в дешеві scoped lanes: прямі правки тестів, сусідні файли `*.test.ts`, явні мапінги source і локальні залежні вузли import-graph. Правки config/setup/package не запускають широкі тести, якщо ви явно не використаєте `OPENCLAW_TEST_CHANGED_BROAD=1 pnpm test:changed`.
- `pnpm check:changed` є звичайним розумним локальним check gate для вузької роботи. Він класифікує diff на core, core tests, extensions, extension tests, apps, docs, release metadata, live Docker tooling і tooling, а потім запускає відповідні команди typecheck, lint і guard. Він не запускає тести Vitest; викликайте `pnpm test:changed` або явний `pnpm test <target>` для тестового доказу. Зміни версій лише в release metadata запускають цільові перевірки version/config/root-dependency із guard, який відхиляє package-зміни поза верхньорівневим полем version.
- Правки live Docker ACP harness запускають фокусовані перевірки: синтаксис shell для live Docker auth scripts і dry-run live Docker scheduler. Зміни `package.json` включаються лише тоді, коли diff обмежений `scripts["test:docker:live-*"]`; dependency, export, version та інші правки package-surface і далі використовують ширші guards.
- Import-light unit-тести з agents, commands, plugins, auto-reply helpers, `plugin-sdk` та подібних чистих utility-зон спрямовуються через lane `unit-fast`, який пропускає `test/setup-openclaw-runtime.ts`; stateful/runtime-heavy файли залишаються на наявних lanes.
- Вибрані helper source-файли `plugin-sdk` і `commands` також маплять changed-mode запуски на явні сусідні тести в цих light lanes, тож правки helper не перезапускають повний важкий набір для цієї директорії.
- `auto-reply` має виділені buckets для top-level core helpers, top-level integration-тестів `reply.*` і піддерева `src/auto-reply/reply/**`. CI додатково розділяє піддерево reply на шарди agent-runner, dispatch і commands/state-routing, щоб один import-heavy bucket не володів повним Node tail.
- Звичайний PR/main CI навмисно пропускає пакетний sweep extension і release-only шард `agentic-plugins`. Full Release Validation запускає окремий дочірній workflow `Plugin Prerelease` для цих важких plugin/extension-наборів на release candidates.
- Коли ви змінюєте вхідні дані виявлення message-tool або runtime
context compaction, зберігайте обидва рівні покриття.
- Додайте фокусовані helper-регресії для меж чистої маршрутизації та нормалізації.
- Підтримуйте здоровими integration-набори embedded runner:
`src/agents/pi-embedded-runner/compact.hooks.test.ts`,
`src/agents/pi-embedded-runner/run.overflow-compaction.test.ts` і
`src/agents/pi-embedded-runner/run.overflow-compaction.loop.test.ts`.
- Ці набори перевіряють, що scoped ids і поведінка compaction і далі проходять
через реальні шляхи `run.ts` / `compact.ts`; helper-only тести не є
достатньою заміною цих integration-шляхів.
- Базовий конфіг Vitest за замовчуванням використовує `threads`.
- Спільний конфіг Vitest фіксує `isolate: false` і використовує
non-isolated runner у root projects, e2e і live configs.
- Root UI lane зберігає свій setup і optimizer `jsdom`, але також запускається на
спільному non-isolated runner.
- Кожен шард `pnpm test` успадковує ті самі стандартні значення `threads` + `isolate: false`
зі спільного конфіга Vitest.
- `scripts/run-vitest.mjs` за замовчуванням додає `--no-maglev` для дочірніх Node
процесів Vitest, щоб зменшити V8 compile churn під час великих локальних запусків.
Установіть `OPENCLAW_VITEST_ENABLE_MAGLEV=1`, щоб порівняти зі стандартною поведінкою V8.
- `pnpm changed:lanes` показує, які архітектурні lanes запускає diff.
- Pre-commit hook виконує лише форматування. Він повторно stage-ить відформатовані файли й
не запускає lint, typecheck або тести.
- Запускайте `pnpm check:changed` явно перед handoff або push, коли вам
потрібен smart local check gate.
- `pnpm test:changed` за замовчуванням проходить через дешеві scoped lanes. Використовуйте
`OPENCLAW_TEST_CHANGED_BROAD=1 pnpm test:changed` лише тоді, коли агент
вирішує, що правка harness, config, package або contract справді потребує ширшого
покриття Vitest.
- `pnpm test:max` і `pnpm test:changed:max` зберігають ту саму поведінку маршрутизації,
лише з вищим лімітом worker.
- Автомасштабування локальних worker навмисно консервативне й відступає,
коли середнє навантаження host уже високе, тож кілька паралельних
запусків Vitest за замовчуванням завдають менше шкоди.
- Базовий конфіг Vitest позначає проєкти/config files як
`forceRerunTriggers`, щоб changed-mode перезапуски залишалися коректними, коли змінюється
test wiring.
- Конфіг залишає `OPENCLAW_VITEST_FS_MODULE_CACHE` увімкненим на підтримуваних
hosts; задайте `OPENCLAW_VITEST_FS_MODULE_CACHE_PATH=/abs/path`, якщо хочете
одну явну cache location для прямого profiling.
- `pnpm test:perf:imports` вмикає звітування Vitest про import-duration плюс
import-breakdown output.
- `pnpm test:perf:imports:changed` обмежує той самий profiling view
файлами, зміненими відносно `origin/main`.
- Дані shard timing записуються в `.artifacts/vitest-shard-timings.json`.
Whole-config запуски використовують шлях config як key; include-pattern CI
shards додають назву shard, щоб filtered shards можна було відстежувати
окремо.
- Коли один hot test і далі витрачає більшість часу на startup imports,
тримайте важкі залежності за вузьким локальним seam `*.runtime.ts` і
мокайте цей seam напряму, замість deep-importing runtime helpers лише
для передавання їх через `vi.mock(...)`.
- `pnpm test:perf:changed:bench -- --ref <git-ref>` порівнює routed
`test:changed` із native root-project path для цього committed
diff і виводить wall time плюс macOS max RSS.
- `pnpm test:perf:changed:bench -- --worktree` виконує benchmark поточного
dirty tree, спрямовуючи список змінених файлів через
`scripts/test-projects.mjs` і root конфіг Vitest.
- `pnpm test:perf:profile:main` записує CPU profile main-thread для
startup Vitest/Vite і transform overhead.
- `pnpm test:perf:profile:runner` записує CPU+heap profiles runner для
unit suite з вимкненим file parallelism.
Стабільність (Gateway)
- Команда:
pnpm test:stability:gateway - Конфіг:
vitest.gateway.config.ts, примусово один worker - Область:
- Запускає реальний loopback Gateway із diagnostics, увімкненими за замовчуванням
- Проганяє synthetic gateway message, memory і large-payload churn через diagnostic event path
- Запитує
diagnostics.stabilityчерез Gateway WS RPC - Покриває diagnostic stability bundle persistence helpers
- Перевіряє, що recorder залишається обмеженим, synthetic RSS samples лишаються нижче pressure budget, а per-session queue depths повертаються до нуля
- Очікування:
- Безпечно для CI і без ключів
- Вузький lane для stability-regression follow-up, не заміна повного Gateway suite
E2E (gateway smoke)
- Команда:
pnpm test:e2e - Конфіг:
vitest.e2e.config.ts - Файли:
src/**/*.e2e.test.ts,test/**/*.e2e.test.tsі E2E-тести вбудованих Plugin уextensions/ - Типові налаштування середовища виконання:
- Використовує Vitest
threadsзisolate: false, як і решта репозиторію. - Використовує адаптивні воркери (CI: до 2, локально: типово 1).
- Типово запускається в тихому режимі, щоб зменшити накладні витрати console I/O.
- Використовує Vitest
- Корисні перевизначення:
OPENCLAW_E2E_WORKERS=<n>для примусового встановлення кількості воркерів (обмежено 16).OPENCLAW_E2E_VERBOSE=1для повторного ввімкнення докладного виводу в консоль.
- Обсяг:
- End-to-end поведінка Gateway з кількома екземплярами
- Поверхні WebSocket/HTTP, сполучення Node і важчі мережеві сценарії
- Очікування:
- Запускається в CI (коли ввімкнено в пайплайні)
- Реальні ключі не потрібні
- Більше рухомих частин, ніж у unit-тестах (може бути повільніше)
E2E: димовий тест бекенда OpenShell
- Команда:
pnpm test:e2e:openshell - Файл:
extensions/openshell/src/backend.e2e.test.ts - Обсяг:
- Запускає ізольований OpenShell Gateway на хості через Docker
- Створює sandbox із тимчасового локального Dockerfile
- Перевіряє бекенд OpenShell в OpenClaw через реальні
sandbox ssh-config+ виконання SSH - Перевіряє remote-canonical поведінку файлової системи через sandbox fs bridge
- Очікування:
- Лише opt-in; не входить до типового запуску
pnpm test:e2e - Потребує локального CLI
openshellі робочого Docker daemon - Використовує ізольовані
HOME/XDG_CONFIG_HOME, а потім знищує тестовий Gateway і sandbox
- Лише opt-in; не входить до типового запуску
- Корисні перевизначення:
OPENCLAW_E2E_OPENSHELL=1для ввімкнення тесту під час ручного запуску ширшого e2e-наборуOPENCLAW_E2E_OPENSHELL_COMMAND=/path/to/openshellдля вказання нестандартного CLI-бінарника або wrapper script
Live (реальні провайдери + реальні моделі)
- Команда:
pnpm test:live - Конфіг:
vitest.live.config.ts - Файли:
src/**/*.live.test.ts,test/**/*.live.test.tsі live-тести вбудованих Plugin уextensions/ - Типово: увімкнено через
pnpm test:live(встановлюєOPENCLAW_LIVE_TEST=1) - Обсяг:
- “Чи цей провайдер/модель справді працює сьогодні з реальними обліковими даними?”
- Виявлення змін формату провайдера, особливостей виклику інструментів, проблем автентифікації та поведінки rate limit
- Очікування:
- За задумом не є стабільним для CI (реальні мережі, реальні політики провайдерів, квоти, збої)
- Коштує грошей / використовує rate limits
- Надавайте перевагу запуску звужених піднаборів замість “усього”
- Live-запуски підвантажують
~/.profile, щоб отримати відсутні API-ключі. - Типово live-запуски все ще ізолюють
HOMEі копіюють конфігурацію/автентифікаційні матеріали в тимчасову тестову домашню директорію, щоб unit-фікстури не могли змінити ваш реальний~/.openclaw. - Встановлюйте
OPENCLAW_LIVE_USE_REAL_HOME=1лише тоді, коли навмисно потрібно, щоб live-тести використовували вашу реальну домашню директорію. pnpm test:liveтепер типово працює в тихішому режимі: він зберігає прогрес-вивід[live] ..., але приглушує додаткове повідомлення~/.profileі вимикає логи bootstrap Gateway/Bonjour chatter. ВстановітьOPENCLAW_LIVE_TEST_QUIET=0, якщо хочете повернути повні стартові логи.- Ротація API-ключів (залежно від провайдера): встановіть
*_API_KEYSу форматі з комами/крапками з комою або*_API_KEY_1,*_API_KEY_2(наприклад,OPENAI_API_KEYS,ANTHROPIC_API_KEYS,GEMINI_API_KEYS) або per-live перевизначення черезOPENCLAW_LIVE_*_KEY; тести повторюють спробу при відповідях rate limit. - Вивід прогресу/Heartbeat:
- Live-набори тепер виводять рядки прогресу в stderr, тож довгі виклики провайдерів видимо активні навіть коли захоплення консолі Vitest тихе.
vitest.live.config.tsвимикає перехоплення консолі Vitest, щоб рядки прогресу провайдера/Gateway одразу транслювалися під час live-запусків.- Налаштовуйте direct-model Heartbeat через
OPENCLAW_LIVE_HEARTBEAT_MS. - Налаштовуйте Heartbeat для Gateway/probe через
OPENCLAW_LIVE_GATEWAY_HEARTBEAT_MS.
Який набір мені запускати?
Скористайтеся цією таблицею рішень:
- Редагування логіки/тестів: запускайте
pnpm test(іpnpm test:coverage, якщо змінили багато) - Зміни мережевої частини Gateway / протоколу WS / сполучення: додайте
pnpm test:e2e - Налагодження “мій бот не працює” / провайдер-специфічних збоїв / виклику інструментів: запускайте звужений
pnpm test:live
Live (мережеві) тести
Для live-матриці моделей, димових тестів CLI-бекенда, димових тестів ACP, harness сервера застосунку Codex і всіх live-тестів медіапровайдерів (Deepgram, BytePlus, ComfyUI, зображення, музика, відео, media harness) — а також обробки облікових даних для live-запусків — див. Тестування live-наборів. Для спеціального чекліста оновлень і перевірки Plugin див. Тестування оновлень і Plugin.
Docker runners (необов’язкові перевірки "працює в Linux")
Ці Docker runners поділяються на дві групи:
- Live-model runners:
test:docker:live-modelsіtest:docker:live-gatewayзапускають лише відповідний live-файл profile-key всередині Docker-образу репозиторію (src/agents/models.profiles.live.test.tsіsrc/gateway/gateway-models.profiles.live.test.ts), монтують вашу локальну директорію конфігурації та робочу область (і підвантажують~/.profile, якщо змонтовано). Відповідні локальні entrypoints:test:live:models-profilesіtest:live:gateway-profiles. - Docker live runners типово мають менший smoke-ліміт, щоб повний Docker sweep лишався практичним:
test:docker:live-modelsтипово встановлюєOPENCLAW_LIVE_MAX_MODELS=12, аtest:docker:live-gatewayтипово встановлюєOPENCLAW_LIVE_GATEWAY_SMOKE=1,OPENCLAW_LIVE_GATEWAY_MAX_MODELS=8,OPENCLAW_LIVE_GATEWAY_STEP_TIMEOUT_MS=45000іOPENCLAW_LIVE_GATEWAY_MODEL_TIMEOUT_MS=90000. Перевизначайте ці env vars, коли ви явно хочете більший вичерпний scan. test:docker:allодин раз збирає live Docker image черезtest:docker:live-build, один раз пакує OpenClaw як npm tarball черезscripts/package-openclaw-for-docker.mjs, а потім збирає/повторно використовує два образиscripts/e2e/Dockerfile. Bare image є лише Node/Git runner для install/update/plugin-dependency lanes; ці lanes монтують попередньо зібраний tarball. Functional image встановлює той самий tarball у/appдля built-app functionality lanes. Визначення Docker lane містяться вscripts/lib/docker-e2e-scenarios.mjs; логіка planner міститься вscripts/lib/docker-e2e-plan.mjs;scripts/test-docker-all.mjsвиконує вибраний plan. Агрегат використовує зважений локальний scheduler:OPENCLAW_DOCKER_ALL_PARALLELISMкерує process slots, а resource caps не дають важким live, npm-install і multi-service lanes стартувати одночасно. Якщо окрема lane важча за активні caps, scheduler усе ще може запустити її, коли pool порожній, а потім тримає її самостійно, доки знову не буде доступна ємність. Типові значення: 10 slots,OPENCLAW_DOCKER_ALL_LIVE_LIMIT=9,OPENCLAW_DOCKER_ALL_NPM_LIMIT=10іOPENCLAW_DOCKER_ALL_SERVICE_LIMIT=7; налаштовуйтеOPENCLAW_DOCKER_ALL_WEIGHT_LIMITабоOPENCLAW_DOCKER_ALL_DOCKER_LIMITлише коли Docker host має більше запасу. Runner типово виконує Docker preflight, видаляє застарілі OpenClaw E2E containers, друкує статус кожні 30 секунд, зберігає timings успішних lanes у.artifacts/docker-tests/lane-timings.jsonі використовує ці timings, щоб у наступних запусках спершу стартували довші lanes. ВикористовуйтеOPENCLAW_DOCKER_ALL_DRY_RUN=1, щоб надрукувати weighted lane manifest без збирання або запуску Docker, абоnode scripts/test-docker-all.mjs --plan-json, щоб надрукувати CI plan для вибраних lanes, потреб package/image та облікових даних.Package Acceptance— це GitHub-native package gate для "чи цей installable tarball працює як продукт?" Він визначає один candidate package ізsource=npm,source=ref,source=urlабоsource=artifact, завантажує його якpackage-under-test, а потім запускає reusable Docker E2E lanes проти саме цього tarball замість повторного пакування вибраного ref. Профілі впорядковані за широтою:smoke,package,productіfull. Див. Тестування оновлень і Plugin щодо package/update/plugin contract, матриці published-upgrade survivor, release defaults і triage збоїв.- Перевірки build і release запускають
scripts/check-cli-bootstrap-imports.mjsпісля tsdown. Guard обходить static built graph відdist/entry.jsіdist/cli/run-main.jsі завершується з помилкою, якщо pre-dispatch startup імпортує package dependencies, як-от Commander, prompt UI, undici або logging, до dispatch команди; він також утримує bundled gateway run chunk у межах бюджету і відхиляє static imports відомих cold gateway paths. Packaged CLI smoke також охоплює root help, onboard help, doctor help, status, config schema і команду model-list. - Legacy-сумісність Package Acceptance обмежена
2026.4.25(включно з2026.4.25-beta.*). До цього cutoff harness допускає лише прогалини metadata shipped-package: пропущені private QA inventory entries, відсутнійgateway install --wrapper, відсутні patch files у tarball-derived git fixture, відсутній persistedupdate.channel, застарілі plugin install-record locations, відсутня marketplace install-record persistence і міграція config metadata під часplugins update. Для пакетів після2026.4.25ці paths є строгими помилками. - Container smoke runners:
test:docker:openwebui,test:docker:onboard,test:docker:npm-onboard-channel-agent,test:docker:update-channel-switch,test:docker:upgrade-survivor,test:docker:published-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,test:docker:plugin-lifecycle-matrixіtest:docker:config-reloadзапускають один або кілька реальних containers і перевіряють інтеграційні paths вищого рівня.
Live-model Docker runners також bind-mount лише потрібні CLI auth homes (або всі підтримувані, коли запуск не звужений), а потім копіюють їх у домашню директорію контейнера перед запуском, щоб external-CLI OAuth міг оновлювати tokens без зміни auth store хоста:
- Прямі моделі:
pnpm test:docker:live-models(скрипт:scripts/test-live-models-docker.sh) - Димовий тест прив’язки ACP:
pnpm test:docker:live-acp-bind(скрипт:scripts/test-live-acp-bind-docker.sh; за замовчуванням охоплює Claude, Codex і Gemini, зі строгим покриттям Droid/OpenCode черезpnpm test:docker:live-acp-bind:droidіpnpm test:docker:live-acp-bind:opencode) - Димовий тест бекенду CLI:
pnpm test:docker:live-cli-backend(скрипт:scripts/test-live-cli-backend-docker.sh) - Димовий тест обв’язки сервера застосунку Codex:
pnpm test:docker:live-codex-harness(скрипт:scripts/test-live-codex-harness-docker.sh) - Gateway + агент розробки:
pnpm test:docker:live-gateway(скрипт:scripts/test-live-gateway-models-docker.sh) - Димовий тест спостережуваності:
pnpm qa:otel:smoke— це приватна QA-смуга для перевірки checkout із вихідного коду. Її навмисно не включено до Docker-смуг релізу пакета, оскільки npm-архів не містить QA Lab. - Димовий тест Open WebUI наживо:
pnpm test:docker:openwebui(скрипт:scripts/e2e/openwebui-docker.sh) - Майстер онбордингу (TTY, повне риштування):
pnpm test:docker:onboard(скрипт:scripts/e2e/onboard-docker.sh) - Димовий тест онбордингу/каналу/агента для npm-архіву:
pnpm test:docker:npm-onboard-channel-agentглобально встановлює запакований архів OpenClaw у Docker, налаштовує OpenAI через онбординг із посиланням на змінну середовища та Telegram за замовчуванням, запускає doctor і виконує один змокований хід агента OpenAI. Повторно використовуйте попередньо зібраний архів за допомогоюOPENCLAW_CURRENT_PACKAGE_TGZ=/path/to/openclaw-*.tgz, пропускайте перебудову на хості черезOPENCLAW_NPM_ONBOARD_HOST_BUILD=0або перемикайте канал черезOPENCLAW_NPM_ONBOARD_CHANNEL=discordчиOPENCLAW_NPM_ONBOARD_CHANNEL=slack. - Димовий тест перемикання каналу оновлень:
pnpm test:docker:update-channel-switchглобально встановлює запакований архів OpenClaw у Docker, перемикає з пакетаstableна gitdev, перевіряє збережений канал і роботу Plugin після оновлення, потім перемикає назад на пакетstableі перевіряє статус оновлення. - Димовий тест виживання після оновлення:
pnpm test:docker:upgrade-survivorвстановлює запакований архів OpenClaw поверх забрудненого фікстура старого користувача з агентами, конфігурацією каналу, allowlist Plugin, застарілим станом залежностей Plugin і наявними файлами робочого простору/сесій. Він запускає оновлення пакета й неінтерактивний doctor без live-ключів провайдера або каналу, потім запускає loopback Gateway і перевіряє збереження конфігурації/стану та бюджети запуску/статусу. - Димовий тест виживання після оновлення опублікованої версії:
pnpm test:docker:published-upgrade-survivorза замовчуванням встановлюєopenclaw@latest, засіває реалістичні файли наявного користувача, налаштовує цю базову версію за вбудованим рецептом команд, перевіряє отриману конфігурацію, оновлює цю опубліковану інсталяцію до кандидатного архіву, запускає неінтерактивний doctor, записує.artifacts/upgrade-survivor/summary.json, потім запускає loopback Gateway і перевіряє налаштовані наміри, збереження стану, запуск,/healthz,/readyzі бюджети статусу RPC. Перевизначте одну базову версію черезOPENCLAW_UPGRADE_SURVIVOR_BASELINE_SPEC, попросіть агрегований планувальник розгорнути точні базові версії черезOPENCLAW_UPGRADE_SURVIVOR_BASELINE_SPECS, наприкладall-since-2026.4.23, і розгорніть фікстури у формі issue черезOPENCLAW_UPGRADE_SURVIVOR_SCENARIOS, наприкладreported-issues; набір reported-issues міститьconfigured-plugin-installsдля автоматичного виправлення встановлення зовнішнього OpenClaw Plugin. Package Acceptance надає їх якpublished_upgrade_survivor_baseline,published_upgrade_survivor_baselinesіpublished_upgrade_survivor_scenarios; Full Release Validation використовує стандартну базову версію latest у блокувальному шляху й розгортає до all-since/reported-issues лише дляrun_release_soak=trueабоrelease_profile=full. - Димовий тест runtime-контексту сесії:
pnpm test:docker:session-runtime-contextперевіряє збереження прихованого runtime-контексту в транскрипті та repair від doctor для зачеплених дубльованих гілок переписування prompt. - Димовий тест глобального встановлення Bun:
bash scripts/e2e/bun-global-install-smoke.shпакує поточне дерево, встановлює його черезbun install -gв ізольованому домашньому каталозі й перевіряє, щоopenclaw infer image providers --jsonповертає вбудованих провайдерів зображень замість зависання. Повторно використовуйте попередньо зібраний архів черезOPENCLAW_BUN_GLOBAL_SMOKE_PACKAGE_TGZ=/path/to/openclaw-*.tgz, пропускайте збірку на хості черезOPENCLAW_BUN_GLOBAL_SMOKE_HOST_BUILD=0або копіюйтеdist/зі зібраного Docker-образу черезOPENCLAW_BUN_GLOBAL_SMOKE_DIST_IMAGE=openclaw-dockerfile-smoke:local. - Димовий тест інсталятора Docker:
bash scripts/test-install-sh-docker.shспільно використовує один npm-кеш для своїх root-, update- і direct-npm-контейнерів. Димовий тест оновлення за замовчуванням використовує npmlatestяк стабільну базу перед оновленням до кандидатного архіву. Перевизначте черезOPENCLAW_INSTALL_SMOKE_UPDATE_BASELINE=2026.4.22локально або через вхідupdate_baseline_versionworkflow Install Smoke на GitHub. Перевірки інсталятора без root зберігають ізольований npm-кеш, щоб записи кешу, власником яких є root, не приховували поведінку встановлення в локальному просторі користувача. УстановітьOPENCLAW_INSTALL_SMOKE_NPM_CACHE_DIR=/path/to/cache, щоб повторно використовувати кеш root/update/direct-npm між локальними повторними запусками. - Install Smoke CI пропускає дубльоване пряме глобальне оновлення npm через
OPENCLAW_INSTALL_SMOKE_SKIP_NPM_GLOBAL=1; запускайте скрипт локально без цієї змінної середовища, коли потрібне покриття прямогоnpm install -g. - Димовий тест CLI видалення агентами спільного робочого простору:
pnpm test:docker:agents-delete-shared-workspace(скрипт:scripts/e2e/agents-delete-shared-workspace-docker.sh) за замовчуванням збирає образ root Dockerfile, засіває двох агентів з одним робочим простором в ізольованому домашньому каталозі контейнера, запускаєagents delete --jsonі перевіряє валідний JSON та поведінку збереженого робочого простору. Повторно використовуйте образ install-smoke черезOPENCLAW_AGENTS_DELETE_SHARED_WORKSPACE_E2E_IMAGE=openclaw-dockerfile-smoke:local OPENCLAW_AGENTS_DELETE_SHARED_WORKSPACE_E2E_SKIP_BUILD=1. - Мережа Gateway (два контейнери, WS-автентифікація + health):
pnpm test:docker:gateway-network(скрипт:scripts/e2e/gateway-network-docker.sh) - Димовий тест знімка Browser CDP:
pnpm test:docker:browser-cdp-snapshot(скрипт:scripts/e2e/browser-cdp-snapshot-docker.sh) збирає вихідний E2E-образ і шар Chromium, запускає Chromium із raw CDP, виконуєbrowser doctor --deepі перевіряє, що знімки ролей CDP охоплюють URL посилань, клікабельні елементи, підвищені курсором, iframe-посилання та метадані фреймів. - Регресія мінімального reasoning для OpenAI Responses web_search:
pnpm test:docker:openai-web-search-minimal(скрипт:scripts/e2e/openai-web-search-minimal-docker.sh) запускає змокований сервер OpenAI через Gateway, перевіряє, щоweb_searchпідвищуєreasoning.effortзminimalдоlow, потім примусово спричиняє відхилення схеми провайдером і перевіряє, що сирі деталі з’являються в логах Gateway. - Міст MCP-каналів (засіяний Gateway + stdio-міст + димовий тест raw Claude notification-frame):
pnpm test:docker:mcp-channels(скрипт:scripts/e2e/mcp-channels-docker.sh) - MCP-інструменти Pi-бандла (реальний stdio MCP-сервер + димовий тест allow/deny для вбудованого Pi-профілю):
pnpm test:docker:pi-bundle-mcp-tools(скрипт:scripts/e2e/pi-bundle-mcp-tools-docker.sh) - Очищення Cron/subagent MCP (реальний Gateway + демонтаж stdio MCP-дочірнього процесу після ізольованих запусків cron і одноразового subagent):
pnpm test:docker:cron-mcp-cleanup(скрипт:scripts/e2e/cron-mcp-cleanup-docker.sh) - Plugins (димовий тест встановлення/оновлення для локального шляху,
file:, npm-реєстру з hoisted-залежностями, рухомих git-посилань, ClawHub kitchen-sink, оновлень marketplace і ввімкнення/інспектування Claude-бандла):pnpm test:docker:plugins(скрипт:scripts/e2e/plugins-docker.sh) УстановітьOPENCLAW_PLUGINS_E2E_CLAWHUB=0, щоб пропустити блок ClawHub, або перевизначте стандартну пару пакета/runtime kitchen-sink черезOPENCLAW_PLUGINS_E2E_CLAWHUB_SPECіOPENCLAW_PLUGINS_E2E_CLAWHUB_ID. БезOPENCLAW_CLAWHUB_URL/CLAWHUB_URLтест використовує герметичний локальний фікстурний сервер ClawHub. - Димовий тест незмінного оновлення Plugin:
pnpm test:docker:plugin-update(скрипт:scripts/e2e/plugin-update-unchanged-docker.sh) - Димовий тест матриці життєвого циклу Plugin:
pnpm test:docker:plugin-lifecycle-matrixвстановлює запакований архів OpenClaw у порожній контейнер, встановлює npm Plugin, перемикає ввімкнення/вимкнення, оновлює та понижує його через локальний npm-реєстр, видаляє встановлений код, а потім перевіряє, що uninstall усе ще прибирає застарілий стан, одночасно логуючи метрики RSS/CPU для кожної фази життєвого циклу. - Димовий тест метаданих перезавантаження конфігурації:
pnpm test:docker:config-reload(скрипт:scripts/e2e/config-reload-source-docker.sh) - Plugins:
pnpm test:docker:pluginsохоплює димовий тест встановлення/оновлення для локального шляху,file:, npm-реєстру з hoisted-залежностями, рухомих git-посилань, фікстур ClawHub, оновлень marketplace і ввімкнення/інспектування Claude-бандла.pnpm test:docker:plugin-updateохоплює поведінку незмінного оновлення для встановлених plugins.pnpm test:docker:plugin-lifecycle-matrixохоплює встановлення npm Plugin із відстеженням ресурсів, увімкнення, вимкнення, оновлення, пониження версії та uninstall за відсутнього коду.
Щоб вручну попередньо зібрати й повторно використовувати спільний функціональний образ:
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
Специфічні для набору перевизначення образів, як-от OPENCLAW_GATEWAY_NETWORK_E2E_IMAGE, усе одно мають пріоритет, коли їх задано. Коли OPENCLAW_SKIP_DOCKER_BUILD=1 вказує на віддалений спільний образ, скрипти завантажують його, якщо він ще не є локальним. QR- і Docker-тести інсталятора зберігають власні Dockerfile, оскільки вони перевіряють поведінку пакета/встановлення, а не спільний runtime зібраного застосунку.
Запускачі Docker з live-моделями також монтують поточний checkout лише для читання та
розгортають його в тимчасовий робочий каталог усередині контейнера. Це зберігає runtime-образ
компактним, водночас запускаючи Vitest саме з вашим локальним source/config.
Крок розгортання пропускає великі локальні кеші та вихідні дані складання застосунків, як-от
.pnpm-store, .worktrees, __openclaw_vitest__, а також локальні для застосунків .build або
каталоги виводу Gradle, щоб Docker live-запуски не витрачали хвилини на копіювання
артефактів, специфічних для машини.
Вони також задають OPENCLAW_SKIP_CHANNELS=1, щоб live-перевірки Gateway не запускали
реальні воркери каналів Telegram/Discord/тощо всередині контейнера.
test:docker:live-models усе ще запускає pnpm test:live, тож також передавайте
OPENCLAW_LIVE_GATEWAY_*, коли потрібно звузити або виключити live-покриття Gateway
з цієї Docker-лінії.
test:docker:openwebui — це smoke-перевірка сумісності вищого рівня: вона запускає
контейнер Gateway OpenClaw з увімкненими OpenAI-сумісними HTTP-ендпоїнтами,
запускає закріплений контейнер Open WebUI проти цього Gateway, входить через
Open WebUI, перевіряє, що /api/models відкриває openclaw/default, а потім надсилає
реальний chat-запит через проксі /api/chat/completions Open WebUI.
Перший запуск може бути помітно повільнішим, оскільки Docker може знадобитися отримати
образ Open WebUI, а Open WebUI може знадобитися завершити власне налаштування холодного старту.
Ця лінія очікує придатний ключ live-моделі, а OPENCLAW_PROFILE_FILE
(~/.profile за замовчуванням) є основним способом надати його в Dockerизованих запусках.
Успішні запуски друкують невеликий JSON payload на кшталт { "ok": true, "model": "openclaw/default", ... }.
test:docker:mcp-channels навмисно детермінований і не потребує
реального облікового запису Telegram, Discord або iMessage. Він завантажує засіяний контейнер Gateway,
запускає другий контейнер, який породжує openclaw mcp serve, а потім
перевіряє маршрутизоване виявлення розмов, читання transcript, метадані вкладень,
поведінку черги live-подій, маршрутизацію вихідного надсилання та Claude-style channel +
сповіщення про дозволи через реальний stdio MCP bridge. Перевірка сповіщень
інспектує сирі stdio MCP frames напряму, щоб smoke перевіряв те, що
bridge фактично випромінює, а не лише те, що випадково показує конкретний client SDK.
test:docker:pi-bundle-mcp-tools детермінований і не потребує live-ключа
моделі. Він збирає Docker-образ репозиторію, запускає реальний stdio MCP probe server
усередині контейнера, матеріалізує цей server через вбудований Pi bundle
MCP runtime, виконує tool, а потім перевіряє, що coding і messaging зберігають
tools bundle-mcp, тоді як minimal і tools.deny: ["bundle-mcp"] їх фільтрують.
test:docker:cron-mcp-cleanup детермінований і не потребує live-ключа моделі.
Він запускає засіяний Gateway з реальним stdio MCP probe server, виконує
ізольований cron turn і одноразовий child turn /subagents spawn, а потім перевіряє,
що child-процес MCP завершується після кожного запуску.
Ручний ACP plain-language thread smoke (не CI):
bun scripts/dev/discord-acp-plain-language-smoke.ts --channel <discord-channel-id> ...- Зберігайте цей script для workflow регресії/debug. Він може знову знадобитися для перевірки маршрутизації ACP thread, тому не видаляйте його.
Корисні env vars:
OPENCLAW_CONFIG_DIR=...(за замовчуванням:~/.openclaw) монтується в/home/node/.openclawOPENCLAW_WORKSPACE_DIR=...(за замовчуванням:~/.openclaw/workspace) монтується в/home/node/.openclaw/workspaceOPENCLAW_PROFILE_FILE=...(за замовчуванням:~/.profile) монтується в/home/node/.profileі source-иться перед запуском testsOPENCLAW_DOCKER_PROFILE_ENV_ONLY=1для перевірки лише env vars, отриманих ізOPENCLAW_PROFILE_FILE, з використанням тимчасових каталогів config/workspace і без зовнішніх монтувань CLI authOPENCLAW_DOCKER_CLI_TOOLS_DIR=...(за замовчуванням:~/.cache/openclaw/docker-cli-tools) монтується в/home/node/.npm-globalдля кешованих установлень CLI всередині Docker- Зовнішні CLI auth dirs/files під
$HOMEмонтуються лише для читання під/host-auth..., потім копіюються в/home/node/...перед стартом tests- Каталоги за замовчуванням:
.minimax - Файли за замовчуванням:
~/.codex/auth.json,~/.codex/config.toml,.claude.json,~/.claude/.credentials.json,~/.claude/settings.json,~/.claude/settings.local.json - Звужені provider-запуски монтують лише потрібні dirs/files, виведені з
OPENCLAW_LIVE_PROVIDERS/OPENCLAW_LIVE_GATEWAY_PROVIDERS - Перевизначте вручну через
OPENCLAW_DOCKER_AUTH_DIRS=all,OPENCLAW_DOCKER_AUTH_DIRS=noneабо comma list на кшталтOPENCLAW_DOCKER_AUTH_DIRS=.claude,.codex
- Каталоги за замовчуванням:
OPENCLAW_LIVE_GATEWAY_MODELS=.../OPENCLAW_LIVE_MODELS=...для звуження запускуOPENCLAW_LIVE_GATEWAY_PROVIDERS=.../OPENCLAW_LIVE_PROVIDERS=...для фільтрації providers у контейнеріOPENCLAW_SKIP_DOCKER_BUILD=1для повторного використання наявного образуopenclaw:local-liveу reruns, які не потребують повторного buildOPENCLAW_LIVE_REQUIRE_PROFILE_KEYS=1щоб гарантувати, що creds надходять із profile store (а не env)OPENCLAW_OPENWEBUI_MODEL=...для вибору моделі, яку Gateway відкриває для smoke Open WebUIOPENCLAW_OPENWEBUI_PROMPT=...для перевизначення nonce-check prompt, що використовується smoke Open WebUIOPENWEBUI_IMAGE=...для перевизначення закріпленого image tag Open WebUI
Перевірка документації
Запускайте перевірки docs після редагувань документації: pnpm check:docs.
Запускайте повну перевірку anchors Mintlify, коли також потрібні перевірки in-page headings: pnpm docs:check-links:anchors.
Offline-регресія (CI-safe)
Це регресії “real pipeline” без реальних providers:
- Gateway tool calling (mock OpenAI, реальний gateway + agent loop):
src/gateway/gateway.test.ts(case: "runs a mock OpenAI tool call end-to-end via gateway agent loop") - Gateway wizard (WS
wizard.start/wizard.next, записує config + auth enforced):src/gateway/gateway.test.ts(case: "runs wizard over ws and writes auth token config")
Evals надійності agent (skills)
У нас уже є кілька CI-safe tests, які поводяться як “agent reliability evals”:
- Mock tool-calling через реальний gateway + agent loop (
src/gateway/gateway.test.ts). - End-to-end wizard flows, які перевіряють session wiring і config effects (
src/gateway/gateway.test.ts).
Чого ще бракує для skills (див. Skills):
- Decisioning: коли skills перелічені в prompt, чи вибирає agent правильний skill (або уникає нерелевантних)?
- Compliance: чи читає agent
SKILL.mdперед використанням і чи дотримується required steps/args? - Workflow contracts: multi-turn scenarios, які перевіряють tool order, session history carryover і sandbox boundaries.
Майбутні evals мають насамперед залишатися детермінованими:
- Scenario runner з mock providers для перевірки tool calls + order, читання skill file і session wiring.
- Невеликий suite сценаріїв, сфокусованих на skills (use vs avoid, gating, prompt injection).
- Необов’язкові live evals (opt-in, env-gated) лише після того, як CI-safe suite буде готовий.
Contract tests (plugin і shape каналу)
Contract tests перевіряють, що кожен зареєстрований plugin і канал відповідає своєму
interface contract. Вони проходять усі виявлені plugins і запускають suite
перевірок shape і behavior. Стандартна unit-лінія pnpm test навмисно
пропускає ці спільні seam і smoke files; запускайте contract-команди явно,
коли торкаєтеся спільних поверхонь channel або provider.
Команди
- Усі contracts:
pnpm test:contracts - Лише channel contracts:
pnpm test:contracts:channels - Лише provider contracts:
pnpm test:contracts:plugins
Channel contracts
Розташовані в src/channels/plugins/contracts/*.contract.test.ts:
- plugin - Базовий shape plugin (id, name, capabilities)
- setup - Contract setup wizard
- session-binding - Поведінка session binding
- outbound-payload - Структура message payload
- inbound - Обробка inbound message
- actions - Channel action handlers
- threading - Обробка Thread ID
- directory - Directory/roster API
- group-policy - Застосування group policy
Provider status contracts
Розташовані в src/plugins/contracts/*.contract.test.ts.
- status - Channel status probes
- registry - Shape Plugin registry
Provider contracts
Розташовані в src/plugins/contracts/*.contract.test.ts:
- auth - Contract auth flow
- auth-choice - Auth choice/selection
- catalog - Model catalog API
- discovery - Виявлення Plugin
- loader - Завантаження Plugin
- runtime - Provider runtime
- shape - Shape/interface Plugin
- wizard - Setup wizard
Коли запускати
- Після зміни exports або subpaths plugin-sdk
- Після додавання або модифікації channel чи provider plugin
- Після рефакторингу plugin registration або discovery
Contract tests запускаються в CI і не потребують реальних API keys.
Додавання регресій (настанови)
Коли ви виправляєте проблему provider/model, виявлену в live:
- Додайте CI-safe regression, якщо можливо (mock/stub provider або зафіксуйте точну request-shape transformation)
- Якщо вона за своєю суттю лише live-only (rate limits, auth policies), тримайте live test вузьким і opt-in через env vars
- Надавайте перевагу таргетуванню найменшого шару, який ловить bug:
- bug перетворення/відтворення provider request → direct models test
- bug gateway session/history/tool pipeline → gateway live smoke або CI-safe gateway mock test
- Guardrail обходу SecretRef:
src/secrets/exec-secret-ref-id-parity.test.tsвиводить одну sampled target для кожного класу SecretRef з registry metadata (listSecretTargetRegistryEntries()), а потім перевіряє, що exec ids із traversal-segment відхиляються.- Якщо ви додаєте нову target family SecretRef
includeInPlanуsrc/secrets/target-registry-data.ts, оновітьclassifyTargetClassу цьому test. Test навмисно падає на некласифікованих target ids, щоб нові classes не можна було мовчки пропустити.