workflow-ai 1.0.64 → 1.0.65
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 +239 -145
- package/configs/agent-health-rules.yaml +64 -0
- package/configs/pipeline.yaml +18 -1
- package/package.json +1 -1
- package/src/init.mjs +20 -3
- package/src/lib/agent-health-registry.mjs +245 -0
- package/src/lib/artifact-snapshot.mjs +233 -0
- package/src/lib/error-classifier.mjs +274 -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/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 +2 -3
- package/src/skills/coach/tests/cases/TC-COACH-002/current/meta.json +2 -3
- 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 +3 -4
- package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-005/current/meta.json +3 -4
- 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/scripts/verify-artifacts.js +42 -12
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
id: TC-DECOMPOSE-PLAN-006
|
|
2
|
+
title: "Декомпозитор соблюдает порог DoD ≤ 7 пунктов (Проверка 5) — разбивает тикет с толстым DoD"
|
|
3
|
+
origin:
|
|
4
|
+
chg: []
|
|
5
|
+
incidents:
|
|
6
|
+
- "PulseProxy PLAN-014 (2026-04-20): decompose-plan на первой попытке создал IMPL-043 (8 пунктов DoD) и IMPL-045 (9 пунктов DoD). verify-atomicity.js FAIL → вторая декомпозиция (+8:36 мин). Root cause: Проверка 5 в atomicity-checklist.md упоминала только объём кода и время, но не число пунктов DoD, тогда как скрипт меряет именно этот инвариант (DOD_THRESHOLD_FAIL=7)."
|
|
7
|
+
principle: "Синхронизация инвариантов между чеклистом атомарности и verify-atomicity.js"
|
|
8
|
+
backlog_sources:
|
|
9
|
+
- ".workflow/coach-backlog.yaml"
|
|
10
|
+
tags: [atomicity, dod, threshold, anti-pattern]
|
|
11
|
+
severity: high
|
|
12
|
+
|
|
13
|
+
scenario:
|
|
14
|
+
system_prompt_file: "../../SKILL.md"
|
|
15
|
+
extra_instructions: |
|
|
16
|
+
Декомпозируй следующую задачу плана на тикеты. Типы тикетов в проекте (из
|
|
17
|
+
`config.yaml → task_types`): IMPL (реализация), QA (автотесты), DOCS
|
|
18
|
+
(документация), ADMIN (инфраструктурные операции).
|
|
19
|
+
|
|
20
|
+
Перед созданием каждого тикета применяй чеклист атомарности (7 проверок).
|
|
21
|
+
Особое внимание — Проверке 5 «Оценка размера»: hard-порог verify-atomicity.js
|
|
22
|
+
по числу пунктов DoD = 7 (FAIL при >7). Если для задачи естественно выходит
|
|
23
|
+
больше 7 критериев готовности — это сигнал на разбиение, а не на сжатие
|
|
24
|
+
пунктов.
|
|
25
|
+
inputs:
|
|
26
|
+
- kind: inline
|
|
27
|
+
as: plan_content
|
|
28
|
+
content: |
|
|
29
|
+
Задача: Реализовать компонент выбора прокси по умолчанию (select-default-proxy-modal)
|
|
30
|
+
DoD:
|
|
31
|
+
- Файл src/popup/select-default-proxy-modal.ts создан по образцу public-proxies-modal.ts через ModalHelper
|
|
32
|
+
- Функция showSelectDefaultProxyModal(proxies) экспортируется и резолвит id выбранного прокси
|
|
33
|
+
- Закрытие крестиком или Esc резолвит null
|
|
34
|
+
- Edge case: при пустом списке прокси модалка не рендерит DOM и резолвит null сразу
|
|
35
|
+
- Заголовок модалки берётся из I18n.getMessage('selectDefaultProxyTitle')
|
|
36
|
+
- Модалка НЕ вызывает Storage.setDefaultProxy() внутри — запись в storage снаружи
|
|
37
|
+
- Модалка НЕ читает прокси из storage — принимает готовый список
|
|
38
|
+
- Каждый элемент списка отображает имя, host:port и флаг страны (если есть)
|
|
39
|
+
|
|
40
|
+
assertions:
|
|
41
|
+
static:
|
|
42
|
+
- kind: skill_contains
|
|
43
|
+
file: "knowledge/atomicity-checklist.md"
|
|
44
|
+
pattern: "Число пунктов DoD"
|
|
45
|
+
reason: "В Проверке 5 должен быть явный пункт про число пунктов DoD."
|
|
46
|
+
- kind: skill_contains
|
|
47
|
+
file: "knowledge/atomicity-checklist.md"
|
|
48
|
+
pattern: "verify-atomicity.js"
|
|
49
|
+
reason: "Явная ссылка на скрипт, чтобы связь порогов была видна."
|
|
50
|
+
- kind: skill_contains
|
|
51
|
+
file: "knowledge/atomicity-checklist.md"
|
|
52
|
+
pattern: "7"
|
|
53
|
+
reason: "Числовое значение порога должно присутствовать в чеклисте."
|
|
54
|
+
|
|
55
|
+
deterministic:
|
|
56
|
+
- kind: output_matches
|
|
57
|
+
regex: "(5\\. )?Размер[\\s\\S]{0,400}(DoD|пункт)"
|
|
58
|
+
reason: "Проверка 5 должна явно упомянуть DoD-пункты в inline-таблице чеклиста."
|
|
59
|
+
- kind: output_does_not_contain
|
|
60
|
+
values: ["DoD содержит 8 пунктов", "DoD содержит 9 пунктов", "DoD содержит 10 пунктов"]
|
|
61
|
+
reason: "Ни один из созданных тикетов не должен декларировать DoD > 7 пунктов — это регрессия, verify-atomicity.js даст FAIL."
|
|
62
|
+
|
|
63
|
+
rubric:
|
|
64
|
+
- kind: llm_judge
|
|
65
|
+
rubric_file: "../rubrics/dod-threshold.md"
|
|
66
|
+
criterion: "Разбил ли агент задачу с 8+ пунктами DoD на тикеты с ≤ 7 пунктами каждый, и зафиксировал ли цифру числа пунктов DoD в evidence Проверки 5?"
|
|
67
|
+
pass_threshold: 4
|
|
68
|
+
trials: 3
|
|
69
|
+
aggregate: majority
|
|
70
|
+
|
|
71
|
+
execution:
|
|
72
|
+
timeout_s: 2400
|
|
@@ -28,3 +28,18 @@ cases:
|
|
|
28
28
|
origin_chg: [CHG-040]
|
|
29
29
|
tags: [dod-transfer, verbatim]
|
|
30
30
|
severity: high
|
|
31
|
+
- id: TC-DECOMPOSE-PLAN-004
|
|
32
|
+
file: cases/TC-DECOMPOSE-PLAN-004-executor-atomicity.yaml
|
|
33
|
+
origin_chg: []
|
|
34
|
+
tags: [atomicity, executor]
|
|
35
|
+
severity: high
|
|
36
|
+
- id: TC-DECOMPOSE-PLAN-005
|
|
37
|
+
file: cases/TC-DECOMPOSE-PLAN-005-capabilities-registry.yaml
|
|
38
|
+
origin_chg: [CHG-076]
|
|
39
|
+
tags: [capabilities, pipeline-contract, anti-pattern]
|
|
40
|
+
severity: critical
|
|
41
|
+
- id: TC-DECOMPOSE-PLAN-006
|
|
42
|
+
file: cases/TC-DECOMPOSE-PLAN-006-dod-threshold.yaml
|
|
43
|
+
origin_chg: []
|
|
44
|
+
tags: [atomicity, dod, threshold]
|
|
45
|
+
severity: high
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# Rubric: Декомпозитор сверяет `required_capabilities` с реестром из pipeline-конфига
|
|
2
|
+
|
|
3
|
+
## Критерий
|
|
4
|
+
|
|
5
|
+
**Выписал ли агент явный `capabilities_registry` из `agents.*.capabilities` pipeline-конфига проекта до создания тикетов, и назначил ли `required_capabilities` строго из этого реестра — не изобретая ключей, описывающих предметную область задачи (язык, платформу, подсистему)?**
|
|
6
|
+
|
|
7
|
+
Агент должен:
|
|
8
|
+
1. До создания первого тикета прочитать pipeline-конфиг проекта (путь стандартно — `.workflow/config/pipeline.yaml`, либо как указано в конфиге проекта) и выписать в рассуждении явным списком union всех значений `agents.*.capabilities`. Эта выписка — единственный допустимый словарь для поля `required_capabilities` на всю декомпозицию.
|
|
9
|
+
2. При заполнении `required_capabilities` каждого тикета сверять каждый ключ с этим словарём. Ключ, которого в словаре нет, — изобретённый, не записывается.
|
|
10
|
+
3. Не подменять `required_capabilities` описанием предметной области задачи (имена языков программирования, типов проектов, платформ, подсистем), если эти имена не задекларированы в реестре.
|
|
11
|
+
4. Если ни один ключ реестра не применим — оставить поле пустым, а не изобретать ключ «по смыслу».
|
|
12
|
+
|
|
13
|
+
## Шкала оценки (1–5)
|
|
14
|
+
|
|
15
|
+
| Балл | Описание |
|
|
16
|
+
|------|----------|
|
|
17
|
+
| **5** | Агент явно выписал `capabilities_registry` из конфига до создания тикетов, у каждого созданного тикета `required_capabilities` — строго подмножество реестра (либо пусто). Изобретённых ключей нет. |
|
|
18
|
+
| **4** | Реестр выписан неявно (агент перечислил допустимые ключи в рассуждении, но без явного названия «capabilities_registry»); все тикеты содержат только ключи из реестра или пустое поле. |
|
|
19
|
+
| **3** | Реестр не выписан, но де-факто все `required_capabilities` ограничены ключами из реестра — совпадение по результату, не по процедуре. |
|
|
20
|
+
| **2** | В одном или нескольких тикетах встречается хотя бы один изобретённый ключ (описание языка/платформы/подсистемы, отсутствующее в реестре). |
|
|
21
|
+
| **1** | Поле `required_capabilities` массово заполнено именами предметной области (язык, фреймворк, платформа, аспект) без какой-либо сверки с реестром. |
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# Rubric: Декомпозитор соблюдает порог числа пунктов DoD (Проверка 5)
|
|
2
|
+
|
|
3
|
+
## Критерий
|
|
4
|
+
|
|
5
|
+
**Если задача плана требует больше 7 пунктов DoD в одном тикете, разбил ли агент тикет на 2+ атомарных тикета так, чтобы каждый результирующий тикет содержал ≤ 7 пунктов DoD? И явно ли зафиксирована в inline-таблице чеклиста (Проверка 5) фактическая цифра числа пунктов DoD как evidence?**
|
|
6
|
+
|
|
7
|
+
Агент должен:
|
|
8
|
+
1. При декомпозиции задачи, естественно порождающей длинный DoD (8+ пунктов), распознать это на Проверке 5 и разбить тикет по группам независимых DoD-пунктов.
|
|
9
|
+
2. Ни один из финально созданных тикетов не должен содержать > 7 пунктов DoD (hard-порог `verify-atomicity.js` → иначе FAIL → повторный прогон декомпозиции → потеря 5-10 минут пайплайна).
|
|
10
|
+
3. Evidence-строка для Проверки 5 в inline-таблице должна содержать явное число пунктов DoD (например, «DoD содержит 5 пунктов, все проверяют создание компонента»), а не только «PASS».
|
|
11
|
+
4. Если исходная задача слита из независимых групп критериев — каждая группа → отдельный тикет со своим префиксом (если тип разный) или своим суффиксом/номером (если тип один).
|
|
12
|
+
|
|
13
|
+
## Шкала оценки (1–5)
|
|
14
|
+
|
|
15
|
+
| Балл | Описание |
|
|
16
|
+
|------|----------|
|
|
17
|
+
| **5** | Агент явно обнаружил на Проверке 5 превышение порога 7, разбил тикет на 2+ с DoD ≤ 7 у каждого. Evidence-строка содержит цифру числа пунктов. |
|
|
18
|
+
| **4** | Все созданные тикеты содержат DoD ≤ 7; разбиение выполнено, но явное обнаружение «превышен порог» в рассуждении не зафиксировано. |
|
|
19
|
+
| **3** | Один из тикетов имеет 8+ пунктов DoD (или агент оставил задачу в одном толстом тикете). Evidence-строка отсутствует или не содержит цифру. |
|
|
20
|
+
| **2** | Несколько тикетов имеют 8+ пунктов DoD, разбиения по DoD нет совсем. |
|
|
21
|
+
| **1** | Агент собрал весь DoD задачи в один тикет без прогона Проверки 5 в явном виде. |
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# Rubric: Декомпозитор применяет executor-атомарность (Проверка 7)
|
|
2
|
+
|
|
3
|
+
## Критерий
|
|
4
|
+
|
|
5
|
+
**Разбил ли агент задачу на отдельные тикеты, если пункты DoD требуют разных типов исполнителя по `config.yaml → task_types`, и удалил ли из DoD пункты, выполняемые стейкхолдером (git-операции)?**
|
|
6
|
+
|
|
7
|
+
Агент должен:
|
|
8
|
+
1. Пройти по пунктам DoD задачи плана и для каждого определить тип тикета из `config.yaml → task_types`, который был бы создан, если бы этот пункт был единственной задачей.
|
|
9
|
+
2. Если ответы расходятся между пунктами одного тикета — разбить на парные тикеты со своими префиксами и `dependencies`.
|
|
10
|
+
3. Git-операции (commit, merge, push, release) — **вне scope декомпозиции**: не попадают в DoD ни одного тикета **и** не заворачиваются в отдельный HUMAN-тикет. Двухступенчатая проверка HUMAN из `workflows/decompose.md` шаг 3: недоступность агенту — необходимое, но не достаточное условие HUMAN; git-операция недоступна агенту, но не подпадает под HUMAN-семантику из `knowledge/human-task-rules.md`.
|
|
11
|
+
4. Не допускать пунктов DoD, ссылающихся на успешное завершение другого тикета того же плана как на критерий готовности (это зависимость, а не DoD).
|
|
12
|
+
|
|
13
|
+
## Шкала оценки (1–5)
|
|
14
|
+
|
|
15
|
+
| Балл | Описание |
|
|
16
|
+
|------|----------|
|
|
17
|
+
| **5** | Агент применил Проверку 7 executor-атомарности явно: каждый пункт DoD прошёл маршрутизацию по типу, разнотипные пункты вынесены в парные тикеты, git-операции полностью выпали из scope (нет ни в DoD, ни как отдельный HUMAN-тикет), пункты-зависимости переведены в `dependencies`. |
|
|
18
|
+
| **4** | Executor-атомарность соблюдена в результате, git-операции выпали из scope, но Проверка 7 не отработана явно в inline-таблице чеклиста. |
|
|
19
|
+
| **3** | Git-операции убраны из DoD, но обёрнуты в отдельный HUMAN-тикет (fallback-антипаттерн «не может агент → HUMAN» без проверки HUMAN-семантики). |
|
|
20
|
+
| **2** | Все пункты DoD оставлены в одном тикете, либо git-операции сохранены в DoD. |
|
|
21
|
+
| **1** | Явное указание «один тикет удобнее» без прогона чеклиста; DoD смешивает реализацию, тестирование, документирование и коммит. |
|
|
@@ -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,9 +1,8 @@
|
|
|
1
1
|
{
|
|
2
|
-
"date": "2026-04-
|
|
3
|
-
"skill_sha": "
|
|
2
|
+
"date": "2026-04-21T08:57:32.494Z",
|
|
3
|
+
"skill_sha": "1503ea1",
|
|
4
4
|
"status": "passed",
|
|
5
|
-
"duration_ms":
|
|
6
|
-
"l1_skipped": true,
|
|
5
|
+
"duration_ms": 1,
|
|
7
6
|
"per_model": {
|
|
8
7
|
"claude-haiku": {
|
|
9
8
|
"passed": true,
|
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
{
|
|
2
|
-
"date": "2026-04-
|
|
3
|
-
"skill_sha": "
|
|
2
|
+
"date": "2026-04-21T08:57:32.497Z",
|
|
3
|
+
"skill_sha": "1503ea1",
|
|
4
4
|
"status": "passed",
|
|
5
|
-
"duration_ms":
|
|
6
|
-
"l1_skipped": true,
|
|
5
|
+
"duration_ms": 1,
|
|
7
6
|
"per_model": {
|
|
8
7
|
"claude-haiku": {
|
|
9
8
|
"passed": true,
|
|
@@ -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.
|
package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-001/current/claude-sonnet/trial-2.md
CHANGED
|
@@ -1,65 +1,32 @@
|
|
|
1
|
-
Нет директории `shared/` в этой тестовой среде — это ожидаемо для данного тест-кейса. Отвечаю на вопрос о стратегии тестирования на основе загруженных knowledge-модулей.
|
|
2
|
-
|
|
3
|
-
---
|
|
4
|
-
|
|
5
1
|
## Стратегия тестирования VSCode-расширения
|
|
6
2
|
|
|
7
|
-
###
|
|
8
|
-
|
|
9
|
-
**VSCode-расширение — desktop-приложение.**
|
|
10
|
-
|
|
11
|
-
Согласно таблице выбора инструмента из SKILL.md:
|
|
12
|
-
|
|
13
|
-
| Тип приложения | Инструмент | Knowledge |
|
|
14
|
-
|----------------|-----------|-----------|
|
|
15
|
-
| Desktop-приложение (VSCode-расширение) | Windows-MCP **через Sandbox** | `desktop-tools-core.md` + `sandbox-core.md` |
|
|
16
|
-
|
|
17
|
-
**⛔ Тестирование напрямую на хост-машине — ЗАПРЕЩЕНО.**
|
|
18
|
-
|
|
19
|
-
Причины:
|
|
20
|
-
- Загрязняет рабочую среду разработчика (конфиги, состояние расширений, workspace)
|
|
21
|
-
- Не воспроизводит чистое состояние (первый запуск, свежая установка)
|
|
22
|
-
- Не изолировано — побочные эффекты от других расширений и настроек хоста
|
|
23
|
-
|
|
24
|
-
### Выбранная стратегия
|
|
25
|
-
|
|
26
|
-
**Среда:** Windows Sandbox — изолированное, эфемерное окружение. При каждом запуске чистое состояние.
|
|
27
|
-
|
|
28
|
-
**Инструмент:** `mcp__sandbox-desktop__*` (сервер `sandbox-desktop`)
|
|
29
|
-
|
|
30
|
-
**Команды:**
|
|
31
|
-
- `mcp__sandbox-desktop__screenshot` — быстрая проверка состояния UI
|
|
32
|
-
- `mcp__sandbox-desktop__snapshot` — a11y tree для верификации элементов (с бюджетом: 1-2 Snapshot/TC, макс. 6/сессию)
|
|
33
|
-
- `mcp__sandbox-desktop__click`, `type`, `shortcut` — взаимодействие с UI
|
|
34
|
-
- `mcp__sandbox-desktop__PowerShell` — подготовка окружения, сохранение evidence
|
|
3
|
+
### Инструмент: Windows-MCP через Sandbox
|
|
35
4
|
|
|
36
|
-
|
|
5
|
+
VSCode-расширение — это **desktop-приложение**, поэтому по правилам скила:
|
|
37
6
|
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
```
|
|
7
|
+
| Параметр | Выбор | Обоснование |
|
|
8
|
+
|----------|-------|-------------|
|
|
9
|
+
| **Инструмент** | Windows-MCP | Desktop UI не доступен через Playwright/browser |
|
|
10
|
+
| **Среда** | Windows Sandbox | Обязательная изоляция для desktop-приложений |
|
|
11
|
+
| **Метод проверки** | a11y tree (Snapshot) | Основной способ верификации состояния UI в desktop |
|
|
44
12
|
|
|
45
|
-
|
|
13
|
+
### Почему именно Sandbox, а не хост?
|
|
46
14
|
|
|
47
|
-
|
|
15
|
+
1. **Изоляция** — расширение не загрязняет рабочую среду разработчика (настройки VS Code, установленные расширения, workspace state)
|
|
16
|
+
2. **Воспроизводимость** — каждый запуск начинается с чистого состояния, без накопленных артефактов
|
|
17
|
+
3. **Безопасность** — расширение может иметь side effects на файловую систему и реестр
|
|
48
18
|
|
|
49
|
-
|
|
19
|
+
### Следующие шаги перед запуском
|
|
50
20
|
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
21
|
+
1. Загрузить `knowledge/sandbox-core.md` — quick-start и персистенция evidence
|
|
22
|
+
2. Загрузить `knowledge/desktop-tools-core.md` — команды Windows-MCP, паттерны навигации
|
|
23
|
+
3. Проверить наличие `../shared/README.md` — проектно-специфичные пути и конфигурация
|
|
24
|
+
4. Определить тип тестирования (smoke / regression / acceptance / exploratory) → загрузить соответствующий workflow
|
|
55
25
|
|
|
56
|
-
|
|
26
|
+
### Что потребуется для старта
|
|
57
27
|
|
|
58
|
-
|
|
28
|
+
- Артефакт расширения (`.vsix` файл или путь к нему)
|
|
29
|
+
- Описание тест-кейсов или acceptance criteria
|
|
30
|
+
- Тикет `QA-*` с типом тестирования
|
|
59
31
|
|
|
60
|
-
|
|
61
|
-
|----------|---------|
|
|
62
|
-
| **Среда** | Windows Sandbox (изолированная, НЕ хост) |
|
|
63
|
-
| **MCP-сервер** | `sandbox-desktop` |
|
|
64
|
-
| **Тип проверок** | a11y tree assertions (Snapshot) + скриншоты для визуальных TC |
|
|
65
|
-
| **Тестирование на хосте** | ⛔ ЗАПРЕЩЕНО |
|
|
32
|
+
Есть конкретный тикет для выполнения или нужно составить тест-план?
|
package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-001/current/claude-sonnet/trial-3.md
CHANGED
|
@@ -1,35 +1,30 @@
|
|
|
1
|
-
Согласно
|
|
1
|
+
Согласно таблице выбора инструмента в скиле:
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
| Критерий | Решение |
|
|
4
|
+
|----------|---------|
|
|
5
|
+
| **Тип приложения** | Desktop (VSCode-расширение) |
|
|
6
|
+
| **Основной инструмент** | Windows-MCP |
|
|
7
|
+
| **Среда запуска** | **Windows Sandbox** (обязательно) |
|
|
8
|
+
| **Knowledge-модули** | `knowledge/desktop-tools-core.md` + `knowledge/sandbox-core.md` |
|
|
4
9
|
|
|
5
|
-
|
|
6
|
-
**Windows-MCP** — основной инструмент для desktop-приложений (VSCode, Electron, нативные).
|
|
10
|
+
**Почему Sandbox, а не хост:**
|
|
7
11
|
|
|
8
|
-
|
|
12
|
+
Скил явно запрещает прямое тестирование на хосте — это загрязняет рабочую среду разработчика и не воспроизводит чистое состояние (расширение может вести себя иначе из-за существующих настроек, других расширений, кэша).
|
|
9
13
|
|
|
10
|
-
|
|
11
|
-
**Windows Sandbox (обязательно)** — тестирование desktop-приложений ведётся **исключительно через Sandbox**:
|
|
12
|
-
- изолированная среда воспроизводит чистое состояние
|
|
13
|
-
- не загрязняет рабочую среду разработчика
|
|
14
|
-
- прямое тестирование на хосте **запрещено**
|
|
14
|
+
**Первые шаги перед тестированием:**
|
|
15
15
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
1. Прочитать `../shared/README.md` — без этого неизвестны пути, конфигурация и ограничения проекта
|
|
16
|
+
1. Проверить наличие `../shared/README.md` — прочитать и загрузить проектные модули
|
|
19
17
|
2. Загрузить `knowledge/sandbox-core.md` — настройка Sandbox, quick-start, персистенция evidence
|
|
20
18
|
3. Загрузить `knowledge/desktop-tools-core.md` — команды Windows-MCP, паттерны навигации, бюджет Snapshot
|
|
21
|
-
4.
|
|
19
|
+
4. Определить тип тикета (SMOKE / ACCEPTANCE / REGRESSION / EXPLORATORY) → загрузить соответствующий workflow
|
|
22
20
|
|
|
23
|
-
|
|
21
|
+
**Общая схема:**
|
|
24
22
|
|
|
25
23
|
```
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
Windows
|
|
29
|
-
|
|
30
|
-
Windows-MCP (управление UI)
|
|
31
|
-
↓
|
|
32
|
-
a11y tree / Snapshot (assertions)
|
|
24
|
+
Windows Sandbox
|
|
25
|
+
└── VSCode (установить расширение)
|
|
26
|
+
└── Windows-MCP (управление UI)
|
|
27
|
+
└── Snapshot (a11y tree assertions как evidence)
|
|
33
28
|
```
|
|
34
29
|
|
|
35
|
-
|
|
30
|
+
Скриншоты — только если тикет требует их в DoD или TC содержит визуальный критерий (принцип 8).
|