diff --git a/docs/uk/refactor/qa.md b/docs/uk/refactor/qa.md index 238690b71..1580f6fbd 100644 --- a/docs/uk/refactor/qa.md +++ b/docs/uk/refactor/qa.md @@ -1,38 +1,38 @@ --- x-i18n: - generated_at: "2026-04-07T22:41:54Z" + generated_at: "2026-04-08T02:02:07Z" model: gpt-5.4 provider: openai - source_hash: 3a13a050574d3fbd7a9a935aa57aa260a92975029b64418633df55159fd7cb29 + source_hash: 0e156cc8e2fe946a0423862f937754a7caa1fe7e6863b50a80bff49a1c86e1e8 source_path: refactor/qa.md workflow: 15 --- # Рефакторинг QA -Статус: базову міграцію завершено. +Статус: базова міграція завершена. ## Мета -Перевести QA OpenClaw із моделі з розділеними визначеннями на єдине джерело істини: +Перевести QA OpenClaw з моделі розділених визначень на єдине джерело істини: - метадані сценаріїв -- підказки, що надсилаються моделі +- промпти, що надсилаються моделі - налаштування та очищення - логіка harness - перевірки та критерії успіху -- артефакти та підказки для звітів +- артефакти та підказки для звіту -Бажаний кінцевий стан — це універсальний QA harness, який завантажує потужні файли визначень сценаріїв замість жорсткого кодування більшості поведінки в TypeScript. +Бажаний кінцевий стан — універсальний QA harness, який завантажує потужні файли визначень сценаріїв замість жорсткого кодування більшості поведінки в TypeScript. ## Поточний стан -Основне джерело істини тепер міститься в `qa/scenarios.md`. +Основне джерело істини тепер знаходиться в `qa/scenarios.md`. Реалізовано: - `qa/scenarios.md` - - канонічний пакет QA + - канонічний набір QA - ідентичність оператора - стартова місія - метадані сценаріїв @@ -45,71 +45,71 @@ x-i18n: - заповнює згенеровані файли сумісності плюс `QA_SCENARIOS.md` - `extensions/qa-lab/src/suite.ts` - вибирає виконувані сценарії через визначені в markdown прив’язки обробників -- QA bus protocol + UI - - універсальні вбудовані вкладення для рендерингу image/video/audio/file +- протокол шини QA + UI + - універсальні вбудовані вкладення для рендерингу зображень/відео/аудіо/файлів -Поверхні, що ще залишаються розділеними: +Поверхні, що залишаються розділеними: - `extensions/qa-lab/src/suite.ts` - - усе ще містить більшість виконуваної логіки кастомних обробників + - досі містить більшість виконуваної логіки спеціальних обробників - `extensions/qa-lab/src/report.ts` - - усе ще виводить структуру звіту з результатів виконання + - досі виводить структуру звіту з результатів часу виконання -Отже, розділення джерела істини вже виправлено, але виконання все ще здебільшого спирається на обробники, а не є повністю декларативним. +Тож розділення джерела істини усунуто, але виконання все ще переважно спирається на обробники, а не є повністю декларативним. ## Як виглядає реальна поверхня сценаріїв -Ознайомлення з поточним suite показує кілька окремих класів сценаріїв. +Перегляд поточного suite показує кілька різних класів сценаріїв. ### Проста взаємодія -- базова перевірка каналу -- базова перевірка DM -- продовження в треді +- базовий сценарій каналу +- базовий сценарій DM +- подальша взаємодія в треді - перемикання моделі -- проходження підтвердження +- проходження після схвалення - реакція/редагування/видалення -### Зміна конфігурації та runtime +### Мутація конфігурації та runtime - вимкнення skill через patch конфігурації -- пробудження після restart через apply конфігурації -- перемикання можливостей після restart конфігурації -- перевірка розходження inventory runtime +- пробудження після перезапуску через застосування конфігурації +- перемикання можливостей після перезапуску конфігурації +- перевірка розходження інвентаря runtime ### Перевірки файлової системи та репозиторію - звіт про виявлення source/docs - збірка Lobster Invaders -- пошук артефакта згенерованого image +- пошук артефакта згенерованого зображення ### Оркестрація пам’яті -- відтворення з пам’яті +- відновлення з пам’яті - інструменти пам’яті в контексті каналу - резервний сценарій при збої пам’яті - ранжування пам’яті сесії -- ізоляція пам’яті тредів -- sweep dreaming пам’яті +- ізоляція пам’яті треду +- sweep мрій пам’яті -### Інтеграція інструментів і plugin +### Інтеграція інструментів і плагінів -- виклик MCP plugin-tools +- виклик plugin-tools MCP - видимість skill - гаряче встановлення skill -- нативна генерація image -- круговий цикл image -- розпізнавання image із вкладення +- нативна генерація зображень +- повний цикл зображення +- розуміння зображення з вкладення -### Багатоходові та багатосуб’єктні +### Багатокрокові та багатосуб’єктні сценарії -- передача підзадачі субагенту -- fanout-синтез субагента -- потоки у стилі відновлення після restart +- передача підагенту +- fanout synthesis підагента +- сценарії відновлення після перезапуску -Ці категорії важливі, тому що вони визначають вимоги до DSL. Плоского списку prompt + очікуваного тексту недостатньо. +Ці категорії важливі, оскільки вони визначають вимоги до DSL. Плоского списку промпт + очікуваний текст недостатньо. -## Напрям +## Напрямок ### Єдине джерело істини @@ -117,18 +117,18 @@ x-i18n: Пакет має залишатися: -- зручним для читання під час review -- придатним для машинного розбору +- зрозумілим для читання під час рев’ю +- придатним для машинного парсингу - достатньо насиченим, щоб керувати: - виконанням suite - - bootstrap робочого простору QA + - bootstrap QA workspace - метаданими UI QA Lab - - підказками для docs/discovery + - промптами для docs/discovery - генерацією звітів ### Бажаний формат авторингу -Використовувати markdown як формат верхнього рівня зі структурованим YAML всередині. +Використовувати markdown як формат верхнього рівня зі структурованим YAML усередині. Рекомендована форма: @@ -139,7 +139,7 @@ x-i18n: - tags - docs refs - code refs - - overrides для model/provider + - model/provider overrides - prerequisites - прозові секції - objective @@ -155,9 +155,9 @@ x-i18n: - кращу читабельність PR, ніж гігантський JSON - багатший контекст, ніж чистий YAML -- строгий розбір і валідацію zod +- суворий парсинг і валідацію zod -Чистий JSON прийнятний лише як проміжна згенерована форма. +Сирий JSON прийнятний лише як проміжна згенерована форма. ## Запропонована форма файлу сценарію @@ -184,7 +184,7 @@ codeRefs: # Objective -Перевірити, що згенероване медіа повторно прикріплюється на наступному ході. +Verify generated media is reattached on the follow-up turn. # Setup @@ -198,7 +198,6 @@ codeRefs: - action: session.create key: agent:qa:image-roundtrip ``` -```` # Steps @@ -206,15 +205,15 @@ codeRefs: - action: agent.send session: agent:qa:image-roundtrip message: | - Перевірка генерації image: згенеруй QA-зображення маяка та опиши його одним коротким реченням. + Image generation check: generate a QA lighthouse image and summarize it in one short sentence. - action: artifact.capture kind: generated-image - promptSnippet: Перевірка генерації image + promptSnippet: Image generation check saveAs: lighthouseImage - action: agent.send session: agent:qa:image-roundtrip message: | - Перевірка roundtrip image: опиши вкладення із зображенням маяка одним коротким реченням. + Roundtrip image inspection check: describe the generated lighthouse attachment in one short sentence. attachments: - fromArtifact: lighthouseImage ``` @@ -226,17 +225,16 @@ codeRefs: value: lighthouse - assert: requestLog.matches where: - promptIncludes: Перевірка roundtrip image + promptIncludes: Roundtrip image inspection check imageInputCountGte: 1 - assert: artifact.exists ref: lighthouseImage ``` - ```` ## Можливості runner, які має покривати DSL -На основі поточного suite універсальний runner потребує більшого, ніж просто виконання prompt. +На основі поточного suite універсальний runner потребує більшого, ніж просто виконання промптів. ### Дії середовища та налаштування @@ -310,40 +308,40 @@ DSL має підтримувати збережені результати та - створити тред, а потім повторно використати `threadId` - створити сесію, а потім повторно використати `sessionKey` -- згенерувати image, а потім прикріпити файл на наступному ході +- згенерувати зображення, а потім прикріпити файл на наступному ході - згенерувати рядок-маркер пробудження, а потім перевірити, що він з’являється пізніше -Потрібні можливості: +Необхідні можливості: - `saveAs` - `${vars.name}` - `${artifacts.name}` -- типізовані посилання для path, session key, thread id, marker, результатів tool +- типізовані посилання для шляхів, ключів сесій, id тредів, маркерів, результатів інструментів -Без підтримки змінних harness і далі повертатиме логіку сценаріїв назад у TypeScript. +Без підтримки змінних harness і надалі буде пропускати логіку сценаріїв назад у TypeScript. -## Що має залишитися як escape hatch +## Що має залишитися як escape hatches Повністю чистий декларативний runner нереалістичний на фазі 1. -Деякі сценарії за своєю природою вимагають складної оркестрації: +Деякі сценарії за своєю природою потребують складної оркестрації: -- sweep dreaming пам’яті -- пробудження після restart через apply конфігурації -- перемикання можливостей після restart конфігурації -- визначення артефакта згенерованого image за timestamp/path -- оцінювання discovery-report +- sweep мрій пам’яті +- пробудження після перезапуску через застосування конфігурації +- перемикання можливостей після перезапуску конфігурації +- визначення артефактів згенерованих зображень за timestamp/шляхом +- оцінка discovery-report -Наразі для них слід використовувати явні кастомні обробники. +Поки що вони мають використовувати явні спеціальні обробники. Рекомендоване правило: - 85-90% декларативно - явні кроки `customHandler` для складного залишку -- лише іменовані та документовані кастомні обробники -- жодного анонімного вбудованого коду у файлі сценарію +- лише іменовані та задокументовані custom handlers +- жодного анонімного inline-коду у файлі сценарію -Це збереже універсальний рушій чистим і водночас дозволить рухатися вперед. +Це зберігає чистоту універсального рушія й водночас дає змогу рухатися вперед. ## Архітектурна зміна @@ -352,30 +350,30 @@ DSL має підтримувати збережені результати та Markdown сценаріїв уже є джерелом істини для: - виконання suite -- bootstrap-файлів робочого простору +- bootstrap-файлів workspace - каталогу сценаріїв UI QA Lab - метаданих звітів -- discovery prompts +- промптів discovery Згенерована сумісність: -- заповнений робочий простір усе ще містить `QA_KICKOFF_TASK.md` -- заповнений робочий простір усе ще містить `QA_SCENARIO_PLAN.md` -- заповнений робочий простір тепер також містить `QA_SCENARIOS.md` +- workspace із початковими даними все ще містить `QA_KICKOFF_TASK.md` +- workspace із початковими даними все ще містить `QA_SCENARIO_PLAN.md` +- workspace із початковими даними тепер також містить `QA_SCENARIOS.md` ## План рефакторингу ### Фаза 1: loader і schema -Готово. +Завершено. - додано `qa/scenarios.md` -- додано парсер для іменованого вмісту markdown YAML pack -- виконано валідацію через zod -- споживачів переведено на розібраний pack +- додано парсер для вмісту іменованого markdown YAML-пакета +- додано валідацію через zod +- споживачів переведено на розібраний пакет - видалено `qa/seed-scenarios.json` і `qa/QA_KICKOFF_TASK.md` на рівні репозиторію -### Фаза 2: універсальний рушій +### Фаза 2: універсальний engine - розділити `extensions/qa-lab/src/suite.ts` на: - loader @@ -383,57 +381,57 @@ Markdown сценаріїв уже є джерелом істини для: - registry дій - registry перевірок - custom handlers -- зберегти наявні helper-функції як операції рушія +- зберегти наявні допоміжні функції як операції engine Результат: -- рушій виконує прості декларативні сценарії +- engine виконує прості декларативні сценарії -Почати зі сценаріїв, які здебільшого складаються з prompt + wait + assert: +Почати зі сценаріїв, які переважно складаються з промпту + очікування + перевірки: -- продовження в треді -- розпізнавання image із вкладення +- подальша взаємодія в треді +- розуміння зображення з вкладення - видимість і виклик skill -- базова перевірка каналу +- базовий сценарій каналу Результат: -- перші справжні сценарії, визначені в markdown, постачаються через універсальний рушій +- перші справжні сценарії, визначені в markdown, постачаються через універсальний engine ### Фаза 4: міграція сценаріїв середньої складності -- roundtrip генерації image +- повний цикл генерації зображення - інструменти пам’яті в контексті каналу - ранжування пам’яті сесії -- передача підзадачі субагенту -- fanout-синтез субагента +- передача підагенту +- fanout synthesis підагента Результат: -- доведено змінні, артефакти, перевірки tool і перевірки request-log +- доведено роботу змінних, артефактів, перевірок інструментів і перевірок журналу запитів ### Фаза 5: залишити складні сценарії на custom handlers -- sweep dreaming пам’яті -- пробудження після restart через apply конфігурації -- перемикання можливостей після restart конфігурації -- розходження inventory runtime +- sweep мрій пам’яті +- пробудження після перезапуску через застосування конфігурації +- перемикання можливостей після перезапуску конфігурації +- розходження інвентаря runtime Результат: - той самий формат авторингу, але з явними блоками custom-step там, де це потрібно -### Фаза 6: видалити жорстко закодовану карту сценаріїв +### Фаза 6: видалити жорстко закодовану мапу сценаріїв -Коли покриття pack стане достатньо хорошим: +Щойно покриття пакета стане достатньо хорошим: -- видалити більшість TypeScript-розгалужень для конкретних сценаріїв із `extensions/qa-lab/src/suite.ts` +- видалити більшість специфічних для сценаріїв розгалужень TypeScript із `extensions/qa-lab/src/suite.ts` -## Підтримка Fake Slack / Rich Media +## Підтримка fake Slack / rich media -Поточний QA bus орієнтований насамперед на текст. +Поточна шина QA орієнтована насамперед на текст. -Пов’язані файли: +Відповідні файли: - `extensions/qa-channel/src/protocol.ts` - `extensions/qa-lab/src/bus-state.ts` @@ -441,17 +439,17 @@ Markdown сценаріїв уже є джерелом істини для: - `extensions/qa-lab/src/bus-server.ts` - `extensions/qa-lab/web/src/ui-render.ts` -Сьогодні QA bus підтримує: +Сьогодні шина QA підтримує: - текст - реакції - треди -Він ще не моделює вбудовані медіавкладення. +Вона ще не моделює вбудовані медіавкладення. ### Потрібний транспортний контракт -Додати універсальну модель вкладень QA bus: +Додати універсальну модель вкладень шини QA: ```ts type QaBusAttachment = { @@ -468,7 +466,7 @@ type QaBusAttachment = { altText?: string; transcript?: string; }; -```` +``` Потім додати `attachments?: QaBusAttachment[]` до: @@ -476,7 +474,7 @@ type QaBusAttachment = { - `QaBusInboundMessageInput` - `QaBusOutboundMessageInput` -### Чому спочатку універсально +### Чому спочатку універсальна модель Не створювати модель медіа лише для Slack. @@ -488,26 +486,26 @@ type QaBusAttachment = { - майбутній fake Slack web - будь-які інші представлення fake transport -Це запобігає дублюванню логіки й дозволяє медіасценаріям залишатися незалежними від конкретного транспорту. +Це запобігає дублюванню логіки й дозволяє сценаріям із медіа залишатися незалежними від transport. ### Потрібна робота в UI -Оновити UI QA для рендерингу: +Оновити UI QA, щоб він рендерив: -- вбудованого попереднього перегляду image -- вбудованого audio player -- вбудованого video player -- chip вкладеного file +- вбудований попередній перегляд зображення +- вбудований аудіоплеєр +- вбудований відеоплеєр +- chip вкладеного файла -Поточний UI вже вміє рендерити треди та реакції, тож рендеринг вкладень має нашаровуватися на ту саму модель картки повідомлення. +Поточний UI вже може рендерити треди й реакції, тож рендеринг вкладень має нашаровуватися на ту саму модель картки повідомлення. -### Робота над сценаріями, яку відкриває медіатранспорт +### Робота зі сценаріями, яку відкриває транспорт медіа -Щойно вкладення почнуть проходити через QA bus, можна буде додати багатші сценарії fake-chat: +Щойно вкладення почнуть проходити через шину QA, можна буде додати багатші сценарії fake-chat: -- вбудована відповідь із image у fake Slack -- розпізнавання audio-вкладення -- розпізнавання video-вкладення +- відповідь із вбудованим зображенням у fake Slack +- розуміння аудіовкладення +- розуміння відеовкладення - змішаний порядок вкладень - відповідь у треді зі збереженням медіа @@ -515,22 +513,22 @@ type QaBusAttachment = { Наступний етап реалізації має бути таким: -1. додати loader сценаріїв markdown + schema zod +1. додати markdown loader сценаріїв + zod schema 2. згенерувати поточний каталог із markdown 3. спочатку мігрувати кілька простих сценаріїв -4. додати універсальну підтримку вкладень QA bus -5. рендерити вбудоване image в UI QA -6. потім розширити на audio і video +4. додати універсальну підтримку вкладень у шині QA +5. рендерити вбудоване зображення в UI QA +6. потім розширити на аудіо та відео -Це найменший шлях, який доводить обидві цілі: +Це найкоротший шлях, який доводить обидві цілі: -- універсальний QA, визначений через markdown -- багатші fake messaging surfaces +- універсальний QA, визначений у markdown +- багатші поверхні fake messaging ## Відкриті питання -- чи мають файли сценаріїв дозволяти вбудовані markdown-шаблони prompt зі вставкою змінних -- чи мають setup/cleanup бути іменованими секціями, чи просто впорядкованими списками дій -- чи мають посилання на артефакти бути строго типізованими в schema, чи базуватися на рядках -- чи мають custom handlers жити в одному registry або в окремих registry для кожної surface -- чи має згенерований файл сумісності JSON залишатися закоміченим під час міграції +- чи мають файли сценаріїв дозволяти вбудовані markdown-шаблони промптів з інтерполяцією змінних +- чи мають setup/cleanup бути іменованими секціями або просто впорядкованими списками дій +- чи мають посилання на артефакти бути строго типізованими в schema або рядковими +- чи мають custom handlers жити в одному registry або в registry для кожної surface +- чи має згенерований JSON-файл сумісності залишатися закоміченим під час міграції