workflow-ai 1.0.64 → 1.0.66
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +377 -277
- package/configs/agent-health-rules.yaml +75 -0
- package/configs/pipeline.yaml +24 -7
- package/package.json +1 -1
- package/src/init.mjs +20 -3
- package/src/lib/agent-health-registry.mjs +245 -0
- package/src/lib/agent-spawner.mjs +47 -6
- package/src/lib/artifact-snapshot.mjs +233 -0
- package/src/lib/error-classifier.mjs +311 -0
- package/src/lib/test-error-classifier.mjs +60 -0
- package/src/lib/test-extends.mjs +58 -0
- package/src/lib/test-version.mjs +21 -0
- package/src/runner.mjs +215 -58
- package/src/scripts/move-to-review.js +5 -7
- package/src/scripts/reset-agent-health.js +62 -0
- package/src/skills/coach/SKILL.md +1 -0
- package/src/skills/coach/tests/cases/TC-COACH-001/current/meta.json +93 -94
- package/src/skills/coach/tests/cases/TC-COACH-002/current/meta.json +93 -94
- package/src/skills/create-plan/SKILL.md +1 -0
- package/src/skills/create-plan/knowledge/test-hygiene.md +47 -0
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-001/current/claude-sonnet/trial-1.md +23 -31
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-001/current/claude-sonnet/trial-2.md +20 -35
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-001/current/claude-sonnet/trial-3.md +36 -19
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-001/current/judge.json +1 -1
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-001/current/kilo-deepseek/trial-2.md +11 -5
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-001/current/kilo-deepseek/trial-3.md +12 -16
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-001/current/kilo-glm/trial-1.md +15 -9
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-001/current/kilo-glm/trial-3.md +15 -14
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-001/current/kilo-minimax/trial-1.md +22 -18
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-001/current/kilo-minimax/trial-2.md +24 -16
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-001/current/kilo-minimax/trial-3.md +13 -20
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-001/current/meta.json +2 -2
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-002/current/claude-sonnet/trial-1.md +14 -19
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-002/current/claude-sonnet/trial-2.md +24 -14
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-002/current/claude-sonnet/trial-3.md +20 -19
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-002/current/judge.json +16 -17
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-002/current/kilo-deepseek/trial-1.md +0 -7
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-002/current/kilo-deepseek/trial-2.md +9 -10
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-002/current/kilo-deepseek/trial-3.md +5 -5
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-002/current/kilo-glm/trial-1.md +20 -4
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-002/current/kilo-glm/trial-2.md +36 -9
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-002/current/kilo-glm/trial-3.md +9 -6
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-002/current/kilo-minimax/trial-1.md +4 -12
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-002/current/kilo-minimax/trial-2.md +6 -8
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-002/current/kilo-minimax/trial-3.md +8 -4
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-002/current/meta.json +10 -11
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-003/current/claude-sonnet/trial-1.md +30 -0
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-003/current/claude-sonnet/trial-2.md +30 -0
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-003/current/claude-sonnet/trial-3.md +30 -0
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-003/current/judge.json +165 -0
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-003/current/kilo-deepseek/trial-1.md +5 -0
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-003/current/kilo-deepseek/trial-2.md +26 -0
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-003/current/kilo-deepseek/trial-3.md +5 -0
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-003/current/kilo-glm/trial-1.md +39 -0
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-003/current/kilo-glm/trial-2.md +37 -0
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-003/current/kilo-glm/trial-3.md +45 -0
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-003/current/kilo-minimax/trial-1.md +26 -0
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-003/current/kilo-minimax/trial-2.md +27 -0
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-003/current/kilo-minimax/trial-3.md +7 -0
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-003/current/meta.json +117 -0
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-003-parent-plan-mandatory.yaml +41 -0
- package/src/skills/decompose-gaps/tests/index.yaml +5 -0
- package/src/skills/decompose-gaps/tests/rubrics/parent-plan-mandatory.md +22 -0
- package/src/skills/decompose-gaps/workflows/decompose.md +5 -2
- package/src/skills/decompose-plan/knowledge/atomicity-checklist.md +31 -5
- package/src/skills/decompose-plan/knowledge/capabilities.md +29 -5
- package/src/skills/decompose-plan/knowledge/human-task-rules.md +15 -0
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-004/current/claude-sonnet/trial-1.md +55 -0
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-004/current/claude-sonnet/trial-2.md +49 -0
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-004/current/claude-sonnet/trial-3.md +49 -0
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-004/current/judge.json +163 -0
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-004/current/kilo-deepseek/trial-1.md +104 -0
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-004/current/kilo-deepseek/trial-2.md +45 -0
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-004/current/kilo-deepseek/trial-3.md +58 -0
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-004/current/kilo-glm/trial-1.md +193 -0
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-004/current/kilo-glm/trial-2.md +202 -0
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-004/current/kilo-glm/trial-3.md +155 -0
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-004/current/kilo-minimax/trial-1.md +52 -0
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-004/current/kilo-minimax/trial-2.md +17 -0
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-004/current/kilo-minimax/trial-3.md +0 -0
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-004/current/meta.json +115 -0
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-004-executor-atomicity.yaml +64 -0
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-005/current/claude-sonnet/trial-1.md +59 -0
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-005/current/claude-sonnet/trial-2.md +204 -0
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-005/current/claude-sonnet/trial-3.md +213 -0
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-005/current/judge.json +163 -0
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-005/current/kilo-deepseek/trial-1.md +0 -0
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-005/current/kilo-deepseek/trial-2.md +57 -0
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-005/current/kilo-deepseek/trial-3.md +54 -0
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-005/current/kilo-glm/trial-1.md +147 -0
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-005/current/kilo-glm/trial-2.md +165 -0
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-005/current/kilo-glm/trial-3.md +133 -0
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-005/current/kilo-minimax/trial-1.md +81 -0
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-005/current/kilo-minimax/trial-2.md +108 -0
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-005/current/kilo-minimax/trial-3.md +3 -0
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-005/current/meta.json +114 -0
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-005-capabilities-registry.yaml +78 -0
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-006/current/claude-sonnet/trial-1.md +225 -0
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-006/current/claude-sonnet/trial-2.md +66 -0
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-006/current/claude-sonnet/trial-3.md +36 -0
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-006/current/judge.json +163 -0
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-006/current/kilo-deepseek/trial-1.md +42 -0
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-006/current/kilo-deepseek/trial-2.md +67 -0
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-006/current/kilo-deepseek/trial-3.md +40 -0
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-006/current/kilo-glm/trial-1.md +122 -0
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-006/current/kilo-glm/trial-2.md +131 -0
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-006/current/kilo-glm/trial-3.md +138 -0
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-006/current/kilo-minimax/trial-1.md +41 -0
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-006/current/kilo-minimax/trial-2.md +88 -0
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-006/current/kilo-minimax/trial-3.md +0 -0
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-006/current/meta.json +115 -0
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-006-dod-threshold.yaml +72 -0
- package/src/skills/decompose-plan/tests/index.yaml +15 -0
- package/src/skills/decompose-plan/tests/rubrics/capabilities-registry.md +21 -0
- package/src/skills/decompose-plan/tests/rubrics/dod-threshold.md +21 -0
- package/src/skills/decompose-plan/tests/rubrics/executor-atomicity.md +21 -0
- package/src/skills/decompose-plan/workflows/decompose.md +38 -5
- package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-001/current/meta.json +87 -88
- package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-005/current/meta.json +87 -88
- package/src/skills/manual-testing/SKILL.md +6 -4
- package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-001/current/claude-sonnet/trial-1.md +29 -16
- package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-001/current/claude-sonnet/trial-2.md +21 -54
- package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-001/current/claude-sonnet/trial-3.md +18 -23
- package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-001/current/judge.json +17 -17
- package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-001/current/meta.json +19 -19
- package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-002/current/claude-sonnet/trial-1.md +27 -30
- package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-002/current/claude-sonnet/trial-2.md +16 -23
- package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-002/current/claude-sonnet/trial-3.md +35 -28
- package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-002/current/judge.json +13 -13
- package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-002/current/meta.json +15 -15
- package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-003/current/claude-sonnet/trial-1.md +76 -0
- package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-003/current/claude-sonnet/trial-2.md +71 -0
- package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-003/current/claude-sonnet/trial-3.md +85 -0
- package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-003/current/judge.json +46 -0
- package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-003/current/meta.json +36 -0
- package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-003-qa-non-ui-assertion.yaml +65 -0
- package/src/skills/manual-testing/tests/index.yaml +5 -0
- package/src/skills/manual-testing/tests/rubrics/qa-non-ui-assertion.md +31 -0
- package/src/skills/review-result/SKILL.md +1 -0
- package/src/skills/review-result/knowledge/test-hygiene.md +44 -0
- package/src/skills/review-result/scripts/verify-artifacts.js +157 -14
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-003/current/claude-sonnet/trial-1.md +7 -0
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-003/current/claude-sonnet/trial-2.md +7 -0
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-003/current/claude-sonnet/trial-3.md +7 -0
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-003/current/judge.json +163 -0
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-003/current/kilo-deepseek/trial-1.md +5 -0
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-003/current/kilo-deepseek/trial-2.md +5 -0
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-003/current/kilo-deepseek/trial-3.md +11 -0
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-003/current/kilo-glm/trial-1.md +16 -0
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-003/current/kilo-glm/trial-2.md +18 -0
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-003/current/kilo-glm/trial-3.md +17 -0
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-003/current/kilo-minimax/trial-1.md +17 -0
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-003/current/kilo-minimax/trial-2.md +31 -0
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-003/current/kilo-minimax/trial-3.md +5 -0
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-003/current/meta.json +115 -0
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-003-test-isolation.yaml +50 -0
- package/src/skills/review-result/tests/fixtures/QA-904-test-isolation-violation/QA-904.md +51 -0
- package/src/skills/review-result/tests/fixtures/QA-904-test-isolation-violation/example-test.mjs +36 -0
- package/src/skills/review-result/tests/index.yaml +5 -0
- package/src/skills/review-result/tests/rubrics/test-isolation.md +20 -0
|
@@ -32,11 +32,11 @@
|
|
|
32
32
|
|
|
33
33
|
**⛔ Задача плана ≠ тикет.** Задача плана — это кандидат на разбиение, а не готовый тикет. Одна задача плана может (и часто должна) превратиться в 2+ тикетов. Количество тикетов ≥ количества задач плана. Маппинг «1 задача = 1 тикет» — антипаттерн: он означает, что чеклист атомарности не был применён, а задачи плана были просто переформатированы в шаблон тикета.
|
|
34
34
|
|
|
35
|
-
**ОБЯЗАТЕЛЬНО** для каждого тикета-кандидата — чеклист атомарности (
|
|
35
|
+
**ОБЯЗАТЕЛЬНО** для каждого тикета-кандидата — чеклист атомарности (7 проверок). Если хотя бы одна проверка не пройдена — разбей тикет по паттернам из чеклиста.
|
|
36
36
|
|
|
37
37
|
**⛔ Единственная допустимая реакция на FAIL — разбиение на 2+ тикетов.** Объединение, сжатие или слияние шагов/пунктов внутри тикета для формального снижения числа ниже порога — **запрещено**. Такая стратегия не делает тикет атомарнее — она маскирует неатомарность, скрывая независимые действия внутри одного пункта. Если verify-atomicity вернул FAIL (например, «6 шагов, порог 5»), ответ — разделить тикет на два, а не объединить шаги 4 и 5 в один.
|
|
38
38
|
|
|
39
|
-
**⛔ Обязательная фиксация результата чеклиста.** Перед записью каждого тикета в файл выпиши inline-таблицу результатов
|
|
39
|
+
**⛔ Обязательная фиксация результата чеклиста.** Перед записью каждого тикета в файл выпиши inline-таблицу результатов 7 проверок атомарности:
|
|
40
40
|
|
|
41
41
|
```
|
|
42
42
|
Тикет-кандидат: «{title}»
|
|
@@ -48,6 +48,7 @@
|
|
|
48
48
|
| 4. Нет скрытых подзадач | PASS/FAIL | ... |
|
|
49
49
|
| 5. Размер | PASS/FAIL | ... |
|
|
50
50
|
| 6. Независимая верификация | PASS/FAIL | ... |
|
|
51
|
+
| 7. Один исполнитель | PASS/FAIL | ... |
|
|
51
52
|
→ Решение: СОЗДАТЬ / РАЗБИТЬ на N тикетов
|
|
52
53
|
```
|
|
53
54
|
|
|
@@ -107,11 +108,23 @@
|
|
|
107
108
|
|
|
108
109
|
→ Загрузи `knowledge/human-task-rules.md`
|
|
109
110
|
|
|
111
|
+
Маршрутизация — **двухступенчатая проверка**, оба условия обязательны для HUMAN:
|
|
112
|
+
|
|
113
|
+
1. **Условие недоступности:** агент физически не может выполнить задачу (нет инструмента, нет доступа, нет прав).
|
|
114
|
+
2. **Условие HUMAN-семантики:** задача подпадает под один из критериев таблицы «Когда задача = HUMAN» из `knowledge/human-task-rules.md` (внешние системы с аутентификацией, физические действия, бизнес-решения, приватные данные, финансовые транзакции).
|
|
115
|
+
|
|
110
116
|
| Категория | Критерий | Действие |
|
|
111
117
|
|-----------|----------|----------|
|
|
112
|
-
| **Полностью автономная** | Агент может выполнить все шаги | `executor_type: agent
|
|
113
|
-
| **Полностью ручная** |
|
|
114
|
-
| **Гибридная** | Часть — агент, часть
|
|
118
|
+
| **Полностью автономная** | Агент может выполнить все шаги | `executor_type: agent`, тип по маршрутизации шага 4 |
|
|
119
|
+
| **Полностью ручная** | Оба условия (недоступность **и** HUMAN-семантика) выполнены | Префикс `HUMAN`, `executor_type: human` |
|
|
120
|
+
| **Гибридная** | Часть — агент, часть подпадает под оба условия HUMAN | Разбить на 2 тикета с зависимостью |
|
|
121
|
+
| **Вне scope декомпозиции** | Недоступность агенту **есть**, но HUMAN-семантика **не подтверждена** | Тикет не создаётся; действие выполняется стейкхолдером вне пайплайна; при необходимости — строка в «Рекомендации для следующего плана» |
|
|
122
|
+
|
|
123
|
+
**⛔ Антипаттерн «fallback в HUMAN»:** получить FAIL на условии 1 (агент не может) и сразу назначить префикс `HUMAN`, не проверив условие 2. Недоступность агенту — необходимое, но не достаточное условие HUMAN. Типичные ошибки маршрутизации: git-операции проекта (commit, push, merge, release, tag), CI/CD-триггеры, ручной деплой через стандартные инструменты стейкхолдера — это **не HUMAN**, потому что не соответствуют HUMAN-семантике из `knowledge/human-task-rules.md`. Они выпадают из scope декомпозиции целиком.
|
|
124
|
+
|
|
125
|
+
**Как отличить HUMAN от «вне scope»:** задай два вопроса подряд.
|
|
126
|
+
- Вопрос 1: может ли агент технически выполнить это действие сейчас? Если да — категория «автономная», HUMAN не рассматривается.
|
|
127
|
+
- Вопрос 2 (только при «нет» на вопрос 1): задача относится к одному из критериев таблицы «Когда задача = HUMAN»? Если да — HUMAN. Если нет — «вне scope декомпозиции».
|
|
115
128
|
|
|
116
129
|
### 4. Определить тип каждого тикета
|
|
117
130
|
|
|
@@ -227,6 +240,24 @@
|
|
|
227
240
|
|
|
228
241
|
**Антипаттерн:** «возьму номера из головы, раз скрипт теперь не вызывается напрямую». `id_ranges` — **единственный** допустимый источник. Любое отклонение (включая «начну с 001, потом исправлю») ломает ссылочную целостность: после записи файла ID уже попадает в перекрёстные ссылки (`depends_on`, `parent_plan`, упоминания в плане и отчётах) — переименование становится масштабной правкой с риском рассинхрона.
|
|
229
242
|
|
|
243
|
+
#### 9.C ⛔ СТОП-ГЕЙТ: выписка реестра `required_capabilities` из конфига (выполняется до любых Write/Edit тикетов)
|
|
244
|
+
|
|
245
|
+
До создания **любого** файла тикета обязательно выполни процедуру из `knowledge/capabilities.md` → «Обязательная процедура перед заполнением `required_capabilities`»:
|
|
246
|
+
|
|
247
|
+
1. **Прочитай** pipeline-конфиг проекта (стандартный путь — `.workflow/config/pipeline.yaml`; если в проекте другой — ориентируйся на фактический). Агенты и их capabilities — в секции `agents.*.capabilities`.
|
|
248
|
+
2. **Выпиши в рассуждении явным списком** union всех значений `agents.*.capabilities` из конфига. Например (иллюстрация формата, не значения):
|
|
249
|
+
```
|
|
250
|
+
capabilities_registry: [<ключ_1>, <ключ_2>, ...]
|
|
251
|
+
```
|
|
252
|
+
Конкретные значения берутся **только** из фактического конфига текущего проекта — не из памяти, не из других проектов.
|
|
253
|
+
3. Эта выписка — **единственный допустимый словарь** для поля `required_capabilities` на всю декомпозицию. При заполнении поля на шаге 9.1 каждый ключ должен присутствовать в `capabilities_registry`. Ключ, которого в выписке нет, — изобретённый, его нельзя записывать в тикет.
|
|
254
|
+
|
|
255
|
+
**Без явной фиксации `capabilities_registry` в рассуждении стоп-гейт считается пропущенным.** Отсутствие выписки = нарушение контракта стадии.
|
|
256
|
+
|
|
257
|
+
**Почему это стоп-гейт:** тикет с изобретённым capability физически не может быть исполнен — ни один агент не покрывает несуществующий ключ, пайплайн блокирует execute-task по `no_capable_agent`. Цикл retry → blocked расходует слоты попыток и блокирует весь план. Исправление задним числом требует ручной правки тикетов + перезапуска — проще один раз свериться с реестром перед записью.
|
|
258
|
+
|
|
259
|
+
**Антипаттерн (описание задачи вместо способности агента):** записать в `required_capabilities` ключ, описывающий **предметную область задачи** (язык, платформу, подсистему), а не способность агента-исполнителя. Подробнее см. `knowledge/capabilities.md` → «Антипаттерн: изобретение ключей по предметной области». Критерий отсечения: если ключа нет в `capabilities_registry` — не записывай, как бы хорошо он ни «описывал задачу».
|
|
260
|
+
|
|
230
261
|
#### 9.1 Создание каждого тикета
|
|
231
262
|
|
|
232
263
|
Для **каждого** тикета:
|
|
@@ -240,6 +271,8 @@
|
|
|
240
271
|
|
|
241
272
|
> **⛔ Структура заголовков тикета должна точно соответствовать шаблону.** Секция DoD обязана быть на уровне `##` (`## Критерии готовности (Definition of Done)` или `## Definition of Done`) и находиться как самостоятельный блок верхнего уровня — **не вкладывай её внутрь другой секции** (`## Детали задачи` и т.п.). Нарушение уровня заголовка (например, `###` вместо `##`) делает тикет невидимым для автоматических проверок пайплайна (verify-artifacts) и приведёт к бесконечному циклу ретраев.
|
|
242
273
|
|
|
274
|
+
> **⛔ Валидация `required_capabilities` по реестру (СТОП-гейт на каждый тикет).** Перед записью тикета пройди по каждому ключу, который собираешься положить в `required_capabilities`, и убедись, что он присутствует в `capabilities_registry`, выписанном в 9.C. Если ключа нет в реестре — **не записывай его**: это изобретённый ключ, тикет будет немедленно заблокирован пайплайном по `no_capable_agent`. Допустимые реакции: (а) убрать ключ, если это описание задачи (язык, платформа, подсистема), а не способность агента; (б) заменить на ключ из реестра, если смысл сохраняется; (в) оставить поле `required_capabilities` пустым, если ни один ключ реестра не подходит. Подробности — `knowledge/capabilities.md`.
|
|
275
|
+
|
|
243
276
|
4. Сохрани в `.workflow/tickets/backlog/{TYPE}-{NNN}.md`
|
|
244
277
|
5. **Пост-валидация уникальности** (обязательно после каждого сохранения):
|
|
245
278
|
- Выполни `Glob` по `.workflow/tickets/**/{TYPE}-{NNN}.md`
|
|
@@ -1,89 +1,88 @@
|
|
|
1
|
-
{
|
|
2
|
-
"date": "2026-04-
|
|
3
|
-
"skill_sha": "
|
|
4
|
-
"status": "passed",
|
|
5
|
-
"duration_ms":
|
|
6
|
-
"
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
"
|
|
10
|
-
"
|
|
11
|
-
"
|
|
12
|
-
"
|
|
13
|
-
"
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
"
|
|
18
|
-
"
|
|
19
|
-
"
|
|
20
|
-
"
|
|
21
|
-
"
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
"
|
|
26
|
-
"
|
|
27
|
-
"
|
|
28
|
-
"
|
|
29
|
-
"
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
"
|
|
36
|
-
"
|
|
37
|
-
"
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
"
|
|
42
|
-
"
|
|
43
|
-
"
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
"
|
|
48
|
-
"
|
|
49
|
-
"
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
"
|
|
54
|
-
"
|
|
55
|
-
"
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
"
|
|
60
|
-
"
|
|
61
|
-
"
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
"
|
|
66
|
-
"
|
|
67
|
-
"
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
"
|
|
72
|
-
"
|
|
73
|
-
"
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
"
|
|
78
|
-
"
|
|
79
|
-
"
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
"
|
|
84
|
-
"
|
|
85
|
-
"
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
]
|
|
1
|
+
{
|
|
2
|
+
"date": "2026-04-21T16:43:17.768Z",
|
|
3
|
+
"skill_sha": "1503ea1",
|
|
4
|
+
"status": "passed",
|
|
5
|
+
"duration_ms": 2,
|
|
6
|
+
"per_model": {
|
|
7
|
+
"claude-haiku": {
|
|
8
|
+
"passed": true,
|
|
9
|
+
"errored": false,
|
|
10
|
+
"pass_count": 3,
|
|
11
|
+
"error_count": 0,
|
|
12
|
+
"total": 3,
|
|
13
|
+
"threshold": 2
|
|
14
|
+
},
|
|
15
|
+
"kilo-free": {
|
|
16
|
+
"passed": true,
|
|
17
|
+
"errored": false,
|
|
18
|
+
"pass_count": 3,
|
|
19
|
+
"error_count": 0,
|
|
20
|
+
"total": 3,
|
|
21
|
+
"threshold": 2
|
|
22
|
+
},
|
|
23
|
+
"kilo-glm-air": {
|
|
24
|
+
"passed": true,
|
|
25
|
+
"errored": false,
|
|
26
|
+
"pass_count": 3,
|
|
27
|
+
"error_count": 0,
|
|
28
|
+
"total": 3,
|
|
29
|
+
"threshold": 2
|
|
30
|
+
}
|
|
31
|
+
},
|
|
32
|
+
"rubric_scores": [
|
|
33
|
+
{
|
|
34
|
+
"agentId": "claude-haiku",
|
|
35
|
+
"trial": 1,
|
|
36
|
+
"score": 4,
|
|
37
|
+
"errored": false
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
"agentId": "claude-haiku",
|
|
41
|
+
"trial": 2,
|
|
42
|
+
"score": 4,
|
|
43
|
+
"errored": false
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
"agentId": "claude-haiku",
|
|
47
|
+
"trial": 3,
|
|
48
|
+
"score": 4,
|
|
49
|
+
"errored": false
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
"agentId": "kilo-free",
|
|
53
|
+
"trial": 1,
|
|
54
|
+
"score": 4,
|
|
55
|
+
"errored": false
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
"agentId": "kilo-free",
|
|
59
|
+
"trial": 2,
|
|
60
|
+
"score": 4,
|
|
61
|
+
"errored": false
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
"agentId": "kilo-free",
|
|
65
|
+
"trial": 3,
|
|
66
|
+
"score": 4,
|
|
67
|
+
"errored": false
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
"agentId": "kilo-glm-air",
|
|
71
|
+
"trial": 1,
|
|
72
|
+
"score": 4,
|
|
73
|
+
"errored": false
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
"agentId": "kilo-glm-air",
|
|
77
|
+
"trial": 2,
|
|
78
|
+
"score": 4,
|
|
79
|
+
"errored": false
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
"agentId": "kilo-glm-air",
|
|
83
|
+
"trial": 3,
|
|
84
|
+
"score": 4,
|
|
85
|
+
"errored": false
|
|
86
|
+
}
|
|
87
|
+
]
|
|
89
88
|
}
|
|
@@ -1,89 +1,88 @@
|
|
|
1
|
-
{
|
|
2
|
-
"date": "2026-04-
|
|
3
|
-
"skill_sha": "
|
|
4
|
-
"status": "passed",
|
|
5
|
-
"duration_ms":
|
|
6
|
-
"
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
"
|
|
10
|
-
"
|
|
11
|
-
"
|
|
12
|
-
"
|
|
13
|
-
"
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
"
|
|
18
|
-
"
|
|
19
|
-
"
|
|
20
|
-
"
|
|
21
|
-
"
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
"
|
|
26
|
-
"
|
|
27
|
-
"
|
|
28
|
-
"
|
|
29
|
-
"
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
"
|
|
36
|
-
"
|
|
37
|
-
"
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
"
|
|
42
|
-
"
|
|
43
|
-
"
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
"
|
|
48
|
-
"
|
|
49
|
-
"
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
"
|
|
54
|
-
"
|
|
55
|
-
"
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
"
|
|
60
|
-
"
|
|
61
|
-
"
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
"
|
|
66
|
-
"
|
|
67
|
-
"
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
"
|
|
72
|
-
"
|
|
73
|
-
"
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
"
|
|
78
|
-
"
|
|
79
|
-
"
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
"
|
|
84
|
-
"
|
|
85
|
-
"
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
]
|
|
1
|
+
{
|
|
2
|
+
"date": "2026-04-21T16:43:17.772Z",
|
|
3
|
+
"skill_sha": "1503ea1",
|
|
4
|
+
"status": "passed",
|
|
5
|
+
"duration_ms": 2,
|
|
6
|
+
"per_model": {
|
|
7
|
+
"claude-haiku": {
|
|
8
|
+
"passed": true,
|
|
9
|
+
"errored": false,
|
|
10
|
+
"pass_count": 3,
|
|
11
|
+
"error_count": 0,
|
|
12
|
+
"total": 3,
|
|
13
|
+
"threshold": 2
|
|
14
|
+
},
|
|
15
|
+
"kilo-free": {
|
|
16
|
+
"passed": true,
|
|
17
|
+
"errored": false,
|
|
18
|
+
"pass_count": 3,
|
|
19
|
+
"error_count": 0,
|
|
20
|
+
"total": 3,
|
|
21
|
+
"threshold": 2
|
|
22
|
+
},
|
|
23
|
+
"kilo-glm-air": {
|
|
24
|
+
"passed": true,
|
|
25
|
+
"errored": false,
|
|
26
|
+
"pass_count": 3,
|
|
27
|
+
"error_count": 0,
|
|
28
|
+
"total": 3,
|
|
29
|
+
"threshold": 2
|
|
30
|
+
}
|
|
31
|
+
},
|
|
32
|
+
"rubric_scores": [
|
|
33
|
+
{
|
|
34
|
+
"agentId": "claude-haiku",
|
|
35
|
+
"trial": 1,
|
|
36
|
+
"score": 5,
|
|
37
|
+
"errored": false
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
"agentId": "claude-haiku",
|
|
41
|
+
"trial": 2,
|
|
42
|
+
"score": 5,
|
|
43
|
+
"errored": false
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
"agentId": "claude-haiku",
|
|
47
|
+
"trial": 3,
|
|
48
|
+
"score": 5,
|
|
49
|
+
"errored": false
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
"agentId": "kilo-free",
|
|
53
|
+
"trial": 1,
|
|
54
|
+
"score": 5,
|
|
55
|
+
"errored": false
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
"agentId": "kilo-free",
|
|
59
|
+
"trial": 2,
|
|
60
|
+
"score": 5,
|
|
61
|
+
"errored": false
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
"agentId": "kilo-free",
|
|
65
|
+
"trial": 3,
|
|
66
|
+
"score": 5,
|
|
67
|
+
"errored": false
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
"agentId": "kilo-glm-air",
|
|
71
|
+
"trial": 1,
|
|
72
|
+
"score": 5,
|
|
73
|
+
"errored": false
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
"agentId": "kilo-glm-air",
|
|
77
|
+
"trial": 2,
|
|
78
|
+
"score": 5,
|
|
79
|
+
"errored": false
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
"agentId": "kilo-glm-air",
|
|
83
|
+
"trial": 3,
|
|
84
|
+
"score": 5,
|
|
85
|
+
"errored": false
|
|
86
|
+
}
|
|
87
|
+
]
|
|
89
88
|
}
|
|
@@ -18,11 +18,13 @@ ticket_prefix: QA
|
|
|
18
18
|
|
|
19
19
|
**Ты НЕ делаешь:** нагрузочное/перформанс-тестирование (передай соответствующему скилу), исправление найденных багов (зафиксируй дефект в QA-тикете — исправление выполнит соответствующий скил), принятие решений о релизе (только предоставляешь данные для решения).
|
|
20
20
|
|
|
21
|
-
**⛔ ЗАПРЕЩЕНО даже если инструменты заблокированы:**
|
|
21
|
+
**⛔ ЗАПРЕЩЕНО даже если инструменты заблокированы:** code review исходников вместо реальной проверки, генерация тестовых данных как замена запуска тест-кейсов, написание теста без его фактического запуска или с фейковым результатом (призрачное выполнение), **подмена ручной проверки UI-наблюдаемого поведения запуском уже существующих автотестов разработки**. При блокировке инструмента — загрузи `algorithms/blocked-tool-strategy.md`.
|
|
22
|
+
|
|
23
|
+
**Легитимная работа QA:** написание и **реальный запуск** ассертов как инструмент проверки инварианта — допустимы и являются частью роли. Критерий применимости: содержит ли DoD тикета **UI-наблюдаемый** критерий (визуальный рендеринг, реакция на действия пользователя, интеграция с хостом, accessibility)? Если да — ассерт не может заменить ручную проверку, она всё равно обязательна (см. антипаттерн ниже). Если нет (инвариант выражается через ФС, данные, структуру файла, содержимое конфига) — написание и запуск ассерта сам по себе является достаточной проверкой, это и есть выполнение QA-тикета. Проектные правила размещения и именования тестов — в `../shared/` (если проект его определяет); отсутствие `../shared/` не является запретом писать тесты для не-UI инвариантов.
|
|
22
24
|
|
|
23
25
|
**⛔ Антипаттерн «подмена ручной проверки запуском чужих автотестов»:** если задача требует ручной проверки наблюдаемого поведения (UI, рендеринг, реакция на действия пользователя), и в проекте уже существуют unit/integration-тесты, покрывающие эти же объекты, **запуск этих тестов не является ручной проверкой** — даже если они зелёные. Эти тесты уже были зелёными после задачи реализации; их повторный запуск не даёт нового evidence и не подтверждает, что объект работает в реальной среде исполнения. Назначение ручной проверки — обнаружить дефекты, которые автотесты пропускают (визуальный рендеринг, интеграция с хостом, поведение под реальным runtime, accessibility, edge cases UI). Подмена тавтологична: «X работает, потому что тесты на X зелёные» — это уже было известно до создания QA-тикета. **Правильное действие при недоступности UI-инструмента:** см. `algorithms/blocked-tool-strategy.md` → BLOCKED, не fallback на запуск автотестов.
|
|
24
26
|
|
|
25
|
-
**Проектные правила тестирования:** перед написанием/изменением тестов, выбором места для артефактов, именованием файлов —
|
|
27
|
+
**Проектные правила тестирования:** перед написанием/изменением тестов, выбором места для артефактов, именованием файлов — если `../shared/README.md` есть в проекте, прочитай его и загрузи модули по триггеру «работа с тестами проекта»: проект мог задать специфику размещения и именования. Если `../shared/` отсутствует — разместить тест рядом с существующими тестами того же уровня и использовать принятые в репозитории конвенции именования. Отсутствие shared не отменяет и не запрещает QA-работу по написанию ассертов для не-UI инвариантов.
|
|
26
28
|
|
|
27
29
|
## Взаимодействие
|
|
28
30
|
|
|
@@ -64,7 +66,7 @@ ticket_prefix: QA
|
|
|
64
66
|
|
|
65
67
|
## Загрузка знаний
|
|
66
68
|
|
|
67
|
-
⛔ **Обязательный первый
|
|
69
|
+
⛔ **Обязательный первый шаг (если `../shared/README.md` присутствует):** прочитай его и загрузи все релевантные модули (карта UI, тестовые workspace'ы, проектные правила). Без shared ты не знаешь проектно-специфичные пути, конфигурацию и ограничения продукта. Если `../shared/` в проекте отсутствует — действуй по общим правилам скила; это не блокирует выполнение QA-тикета, а означает, что проект не задал проектные настройки поверх дефолтов.
|
|
68
70
|
|
|
69
71
|
| Модуль | Когда загружать |
|
|
70
72
|
|--------|----------------|
|
|
@@ -163,7 +165,7 @@ ticket_prefix: QA
|
|
|
163
165
|
|
|
164
166
|
## Границы компетенции
|
|
165
167
|
|
|
166
|
-
-
|
|
168
|
+
- **Подмена ручной проверки UI-наблюдаемого поведения запуском автотестов** → запрещено (см. ⛔ антипаттерн выше). Написание и реальный запуск ассертов для инвариантов, не выражающихся через UI (ФС, данные, структура файла), — в зоне QA; правила размещения/именования тестов, если заданы проектом, ищи в `../shared/`
|
|
167
169
|
- **Нагрузочное тестирование** → соответствующий скил проекта
|
|
168
170
|
- **Исправление багов** → соответствующий скил через тикет
|
|
169
171
|
- **Решение о релизе** → принимает ответственный скил проекта
|
package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-001/current/claude-sonnet/trial-1.md
CHANGED
|
@@ -1,21 +1,34 @@
|
|
|
1
|
-
|
|
1
|
+
## Стратегия тестирования VSCode-расширения
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|----------|-------|
|
|
5
|
-
| **Тип приложения** | Desktop (VSCode-расширение) |
|
|
6
|
-
| **Основной инструмент** | Windows-MCP **через Sandbox** |
|
|
7
|
-
| **Knowledge-модули** | `knowledge/desktop-tools-core.md` + `knowledge/sandbox-core.md` |
|
|
3
|
+
### Инструмент
|
|
8
4
|
|
|
9
|
-
|
|
5
|
+
**Windows-MCP через Windows Sandbox** — единственный допустимый вариант для desktop-приложений согласно матрице выбора инструмента:
|
|
10
6
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
7
|
+
| Тип приложения | Инструмент | Knowledge |
|
|
8
|
+
|---|---|---|
|
|
9
|
+
| Desktop (VSCode-расширение) | **Windows-MCP через Sandbox** | `desktop-tools-core.md` + `sandbox-core.md` |
|
|
14
10
|
|
|
15
|
-
|
|
11
|
+
### Среда запуска: Windows Sandbox
|
|
16
12
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
13
|
+
**Обязательно** — прямое тестирование на хосте запрещено по двум причинам:
|
|
14
|
+
1. **Загрязнение рабочей среды** — расширение может изменить настройки VSCode, установить зависимости, создать файлы
|
|
15
|
+
2. **Нет чистого состояния** — хост уже содержит расширения, настройки, историю; воспроизводимость нарушена
|
|
16
|
+
|
|
17
|
+
Sandbox даёт изолированную Windows-среду с чистым VSCode при каждом запуске.
|
|
18
|
+
|
|
19
|
+
### Последовательность подготовки
|
|
20
|
+
|
|
21
|
+
1. Загрузить `knowledge/sandbox-core.md` — quick-start Sandbox, персистенция evidence
|
|
22
|
+
2. Загрузить `knowledge/desktop-tools-core.md` — команды Windows-MCP, навигация, бюджет Snapshot
|
|
23
|
+
3. Прочитать `../shared/README.md` (если существует) — проектно-специфичные пути и конфигурация
|
|
24
|
+
4. Установить VSCode + расширение в Sandbox
|
|
25
|
+
5. Выполнять тест-кейсы через Windows-MCP (клики, ввод, навигация)
|
|
26
|
+
6. Получать evidence через **a11y tree (Snapshot)** — основной инструмент проверки состояния UI; скриншоты — только для визуальных критериев (принцип 8)
|
|
27
|
+
|
|
28
|
+
### Важно про evidence в Sandbox
|
|
29
|
+
|
|
30
|
+
Файлы внутри Sandbox эфемерны — при закрытии Sandbox всё уничтожается. Скриншоты и другие артефакты нужно выносить на хост до завершения сессии. Детали — в `knowledge/sandbox-core.md` → «Персистенция evidence».
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
Если у тебя есть конкретный тикет `QA-*` — передай его, и я загружу нужные модули и начну выполнение по соответствующему workflow.
|