chore(i18n): refresh uk translations
This commit is contained in:
parent
c4a28e3b28
commit
ebed89a113
@ -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-файл сумісності залишатися закоміченим під час міграції
|
||||
|
||||
Loading…
Reference in New Issue
Block a user