extensions/qa-channel: синтетичний канал повідомлень із поверхнями DM, каналу, треду, реакцій, редагування та видалення.extensions/qa-lab: UI налагодження та шина QA для спостереження за транскриптом, інʼєкції вхідних повідомлень та експорту Markdown-звіту.qa/: ресурси початкових даних на основі репозиторію для стартового завдання та базових QA- сценаріїв.
- Ліворуч: панель Gateway (Control UI) з агентом.
- Праворуч: QA Lab, що показує транскрипт у стилі Slack і план сценарію.
qa:lab:up:fast утримує Docker-сервіси на попередньо зібраному образі та bind-mount’ить
extensions/qa-lab/web/dist у контейнер qa-lab. qa:lab:watch
перебудовує цей bundle при змінах, а браузер автоматично перезавантажується,
коли змінюється хеш ресурсу QA Lab.
Для smoke lane Matrix із реальним транспортом виконайте:
qa-channel у дочірній
конфігурації. Він записує структуровані артефакти звіту та обʼєднаний лог
stdout/stderr у вибраний вихідний каталог Matrix QA. Щоб також захопити
зовнішній вивід збірки/запускача scripts/run-node.mjs, установіть
OPENCLAW_RUN_NODE_OUTPUT_LOG=<path> на локальний щодо репозиторію файл логу.
Для smoke lane Telegram із реальним транспортом виконайте:
OPENCLAW_QA_TELEGRAM_GROUP_ID,
OPENCLAW_QA_TELEGRAM_DRIVER_BOT_TOKEN і
OPENCLAW_QA_TELEGRAM_SUT_BOT_TOKEN, а також два різні боти в одній
приватній групі. Бот SUT повинен мати імʼя користувача Telegram, а
спостереження bot-to-bot працює найкраще, коли для обох ботів увімкнено
режим Bot-to-Bot Communication Mode в @BotFather.
Команда завершується ненульовим кодом, якщо будь-який сценарій не пройшов. Використовуйте --allow-failures, якщо
вам потрібні артефакти без коду завершення з помилкою.
Звіт і підсумок Telegram включають RTT для кожної відповіді — від запиту
надсилання повідомлення driver до спостережуваної відповіді SUT, починаючи з canary.
Для smoke lane Discord із реальним транспортом виконайте:
OPENCLAW_QA_DISCORD_GUILD_ID, OPENCLAW_QA_DISCORD_CHANNEL_ID,
OPENCLAW_QA_DISCORD_DRIVER_BOT_TOKEN, OPENCLAW_QA_DISCORD_SUT_BOT_TOKEN
і OPENCLAW_QA_DISCORD_SUT_APPLICATION_ID у разі використання облікових даних env.
Lane перевіряє обробку згадок у каналі та перевіряє, що бот SUT
зареєстрував нативну команду /help у Discord.
Команда завершується ненульовим кодом, якщо будь-який сценарій не пройшов. Використовуйте --allow-failures, якщо
вам потрібні артефакти без коду завершення з помилкою.
Тепер lane із живим транспортом використовують один менший контракт замість того,
щоб кожен вигадував власну форму списку сценаріїв:
qa-channel залишається широким синтетичним набором перевірок поведінки продукту і не входить
до матриці покриття live transport.
| Lane | Canary | Гейтінг згадок | Блокування allowlist | Відповідь верхнього рівня | Відновлення після перезапуску | Подальше повідомлення в треді | Ізоляція тредів | Спостереження за реакціями | Команда help | Реєстрація нативної команди |
|---|---|---|---|---|---|---|---|---|---|---|
| Matrix | x | x | x | x | x | x | x | x | ||
| Telegram | x | x | x | |||||||
| Discord | x | x | x |
qa-channel як широкий набір перевірок поведінки продукту, тоді як Matrix,
Telegram і майбутні живі транспорти спільно використовують один явний контрольний список
транспортного контракту.
Для lane з тимчасовою Linux VM без використання Docker у QA-шляху виконайте:
qa suite, а потім копіює звичайний QA-звіт і
підсумок назад у .artifacts/qa-e2e/... на хості.
Він повторно використовує ту саму поведінку вибору сценаріїв, що й qa suite на хості.
Запуски suite на хості та в Multipass за замовчуванням виконують кілька вибраних
сценаріїв паралельно з ізольованими worker Gateway. Для qa-channel
типове значення concurrency — 4, обмежене кількістю вибраних сценаріїв. Використовуйте --concurrency <count>, щоб налаштувати
кількість worker, або --concurrency 1 для послідовного виконання.
Команда завершується ненульовим кодом, якщо будь-який сценарій не пройшов. Використовуйте --allow-failures, якщо
вам потрібні артефакти без коду завершення з помилкою.
Живі запуски передають підтримувані вхідні дані автентифікації QA, які практичні для
гостьової машини: ключі провайдерів на основі env, шлях до конфігурації live provider QA і
CODEX_HOME, якщо він присутній. Тримайте --output-dir у межах кореня репозиторію, щоб гість
міг записувати назад через змонтований workspace.
Початкові дані на основі репозиторію
Ресурси початкових даних знаходяться вqa/:
qa/scenarios/index.mdqa/scenarios/<theme>/*.md
qa-lab має залишатися загальним runner для markdown. Кожен markdown-файл сценарію є
джерелом істини для одного тестового запуску й має визначати:
- метадані сценарію
- необовʼязкові метадані category, capability, lane і risk
- посилання на docs і код
- необовʼязкові вимоги до Plugin
- необовʼязковий patch конфігурації gateway
- виконуваний
qa-flow
qa-flow, може залишатися загальною
і наскрізною. Наприклад, markdown-сценарії можуть поєднувати transport-side
допоміжні засоби з browser-side допоміжними засобами, які керують вбудованим Control UI через
seam Gateway browser.request, не додаючи спеціалізований runner.
Файли сценаріїв слід групувати за можливостями продукту, а не за папкою
вихідного дерева. Зберігайте стабільність ID сценаріїв під час переміщення файлів; використовуйте docsRefs і codeRefs
для трасованості реалізації.
Базовий список має залишатися достатньо широким, щоб охоплювати:
- чат у DM і каналі
- поведінку тредів
- життєвий цикл дій із повідомленнями
- Cron callbacks
- виклик памʼяті
- перемикання моделей
- передачу підзадачі субагенту
- читання репозиторію та документації
- одне невелике завдання на збірку, наприклад Lobster Invaders
Mock lanes провайдерів
qa suite має два локальні mock lanes провайдерів:
mock-openai— це обізнаний про сценарії mock OpenClaw. Він залишається типовим детермінованим mock lane для QA на основі репозиторію та перевірок паритету.aimockзапускає сервер провайдера на основі AIMock для експериментального покриття протоколу, фікстур, record/replay і chaos. Він є доповненням і не замінює dispatcher сценаріївmock-openai.
extensions/qa-lab/src/providers/.
Кожен провайдер володіє своїми значеннями за замовчуванням, запуском локального сервера,
конфігурацією моделі gateway, потребами staging auth-profile і прапорцями live/mock capability. Спільний код suite і gateway
має маршрутизувати через registry провайдерів замість розгалуження за іменами провайдерів.
Адаптери транспорту
qa-lab володіє загальним seam транспорту для markdown QA-сценаріїв.
qa-channel — перший адаптер на цьому seam, але ціль дизайну ширша:
майбутні реальні або синтетичні канали мають підключатися до того самого runner suite
замість додавання transport-specific QA runner.
На рівні архітектури поділ такий:
qa-labвідповідає за загальне виконання сценаріїв, concurrency worker, запис артефактів і звітність.- адаптер транспорту відповідає за конфігурацію gateway, готовність, спостереження за вхідними та вихідними даними, транспортні дії та нормалізований стан транспорту.
- markdown-файли сценаріїв у
qa/scenarios/визначають тестовий запуск;qa-labнадає повторно використовувану поверхню runtime, яка їх виконує.
Звітність
qa-lab експортує Markdown-звіт протоколу зі спостережуваної часової шкали шини.
Звіт має відповідати на такі запитання:
- Що спрацювало
- Що не спрацювало
- Що залишилося заблокованим
- Які подальші сценарії варто додати
SOUL.md, а потім виконувати звичайні ходи користувача,
такі як чат, допомога з workspace і невеликі файлові завдання. Моделі-кандидату
не слід повідомляти, що її оцінюють. Команда зберігає кожен повний
транскрипт, записує базову статистику запуску, а потім просить моделі-судді в fast mode з
xhigh reasoning, де це підтримується, ранжувати запуски за природністю, вайбом і гумором.
Використовуйте --blind-judge-models при порівнянні провайдерів: промпт судді все одно отримує
кожен транскрипт і статус запуску, але посилання кандидатів замінюються нейтральними
мітками на кшталт candidate-01; після парсингу звіт зіставляє ранжування назад із реальними ref.
Для запусків кандидатів за замовчуванням використовується thinking рівня high, із medium для GPT-5.4 та xhigh
для старіших OpenAI eval ref, які це підтримують. Перевизначте конкретного кандидата прямо в рядку через
--model provider/model,thinking=<level>. --thinking <level> як і раніше задає
глобальне резервне значення, а старіша форма --model-thinking <provider/model=level> збережена
для сумісності.
OpenAI candidate ref за замовчуванням використовують fast mode, щоб застосовувалася пріоритетна обробка там,
де провайдер це підтримує. Додайте ,fast, ,no-fast або ,fast=false прямо в рядку, коли
одному кандидату або судді потрібне перевизначення. Передавайте --fast лише тоді, коли хочете
примусово ввімкнути fast mode для кожної моделі-кандидата. Тривалість роботи кандидатів і суддів
записується у звіт для аналізу бенчмарків, але в промптах для суддів явно сказано
не ранжувати за швидкістю.
Для запусків моделей-кандидатів і моделей-суддів за замовчуванням використовується concurrency 16. Зменшуйте
--concurrency або --judge-concurrency, коли ліміти провайдера або навантаження на локальний gateway
роблять запуск надто шумним.
Якщо не передано жодного кандидата через --model, для character eval за замовчуванням використовуються
openai/gpt-5.4, openai/gpt-5.2, openai/gpt-5, anthropic/claude-opus-4-6,
anthropic/claude-sonnet-4-6, zai/glm-5.1,
moonshot/kimi-k2.5 і
google/gemini-3.1-pro-preview, якщо не передано --model.
Якщо не передано --judge-model, за замовчуванням використовуються судді
openai/gpt-5.4,thinking=xhigh,fast і
anthropic/claude-opus-4-6,thinking=high.