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
package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-006/current/claude-sonnet/trial-1.md
ADDED
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
Теперь у меня есть всё необходимое. Перейду к декомпозиции.
|
|
2
|
+
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
## Декомпозиция задачи: select-default-proxy-modal
|
|
6
|
+
|
|
7
|
+
### Стоп-гейт 9.C: Реестр `required_capabilities`
|
|
8
|
+
|
|
9
|
+
Прочитан `pipeline.yaml`. Union всех `agents.*.capabilities`:
|
|
10
|
+
|
|
11
|
+
```
|
|
12
|
+
capabilities_registry: [text, multimodal]
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
Это единственный допустимый словарь для поля `required_capabilities` на всю декомпозицию.
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
### Стоп-гейт 9.B: `id_ranges_json`
|
|
20
|
+
|
|
21
|
+
Инвокация — прямая (тестовый запуск, не через пайплайн). Параметр `id_ranges_json` не передан. Поскольку ниже обе декомпозиции дают результат **SKIP** (дубликаты найдены в backlog), созданий файлов не будет — стоп-гейт по нумерации не является блокирующим для данного запуска.
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
### Shared: observable-инварианты
|
|
26
|
+
|
|
27
|
+
`../shared/README.md` не содержит реестра observable-инвариантов и списка файловых триггеров. Условия Б и В (парные тикеты по observable-зоне) — **не применяются**. Условие А (секция «Верификация» в плане) — проверено отдельно на шаге 2.
|
|
28
|
+
|
|
29
|
+
---
|
|
30
|
+
|
|
31
|
+
### Шаг 1: Анализ входного плана
|
|
32
|
+
|
|
33
|
+
Тип работы — IMPL (код продукта). Исходная задача содержит **8 DoD-критериев**:
|
|
34
|
+
|
|
35
|
+
| № | Пункт |
|
|
36
|
+
|---|-------|
|
|
37
|
+
| 1 | Файл `src/popup/select-default-proxy-modal.ts` создан по образцу `public-proxies-modal.ts` через ModalHelper |
|
|
38
|
+
| 2 | Функция `showSelectDefaultProxyModal(proxies)` экспортируется и резолвит id выбранного прокси |
|
|
39
|
+
| 3 | Закрытие крестиком или Esc резолвит null |
|
|
40
|
+
| 4 | Edge case: при пустом списке прокси модалка не рендерит DOM и резолвит null сразу |
|
|
41
|
+
| 5 | Заголовок модалки берётся из `I18n.getMessage('selectDefaultProxyTitle')` |
|
|
42
|
+
| 6 | Модалка НЕ вызывает `Storage.setDefaultProxy()` внутри — запись в storage снаружи |
|
|
43
|
+
| 7 | Модалка НЕ читает прокси из storage — принимает готовый список |
|
|
44
|
+
| 8 | Каждый элемент списка отображает имя, host:port и флаг страны (если есть) |
|
|
45
|
+
|
|
46
|
+
---
|
|
47
|
+
|
|
48
|
+
### Шаг 2: Чеклист атомарности — монолитный тикет-кандидат
|
|
49
|
+
|
|
50
|
+
**Тикет-кандидат: «Реализовать компонент select-default-proxy-modal полностью»**
|
|
51
|
+
|
|
52
|
+
| Проверка | Результат | Evidence / Действие при FAIL |
|
|
53
|
+
|----------|-----------|------------------------------|
|
|
54
|
+
| 1. Одна задача | **FAIL** | Title содержит два независимых направления: «создать структуру/контракт» (пп. 1,2,5,6,7) + «реализовать рендеринг/поведение» (пп. 3,4,8) — два глагола, два этапа |
|
|
55
|
+
| 2. Один объект | PASS | Один файл `src/popup/select-default-proxy-modal.ts` |
|
|
56
|
+
| 3. Один результат | **FAIL** | Пункты 1,2,5–7 проверяют контракт (сигнатура, i18n, ограничения), пп. 3,4,8 — runtime-поведение (UI-рендеринг, обработка кликов, edge cases). Две несвязанные группы критериев |
|
|
57
|
+
| 4. Нет скрытых подзадач | **FAIL** | Пункты контрактной группы (1,2,5–7) независимы от поведенческой группы (3,4,8): scaffold можно создать и верифицировать без рендеринга |
|
|
58
|
+
| 5. Размер | **FAIL** | Задача включает **8 пунктов DoD** — превышает hard-порог `verify-atomicity.js` (>7 → FAIL) |
|
|
59
|
+
| 6. Независимая верификация | **FAIL** | Scaffold и API проверяются через TypeScript-интерфейс, рендеринг — через DOM; разные окружения верификации |
|
|
60
|
+
| 7. Один исполнитель | PASS | Все пункты — код IMPL |
|
|
61
|
+
|
|
62
|
+
→ **Решение: РАЗБИТЬ на 2 тикета** по группам DoD.
|
|
63
|
+
|
|
64
|
+
**Граница разбиения:** пп. 1,2,5,6,7 → Тикет A (scaffold + контракт + ограничения); пп. 3,4,8 → Тикет Б (рендеринг + edge cases + закрытие).
|
|
65
|
+
|
|
66
|
+
---
|
|
67
|
+
|
|
68
|
+
### Тикет A: scaffold + контракт + ограничения
|
|
69
|
+
|
|
70
|
+
**Title-кандидат:** «Создать scaffold select-default-proxy-modal.ts с контрактом функции»
|
|
71
|
+
|
|
72
|
+
**DoD (5 пунктов):**
|
|
73
|
+
1. Файл `src/popup/select-default-proxy-modal.ts` создан по образцу `public-proxies-modal.ts` через ModalHelper
|
|
74
|
+
2. Функция `showSelectDefaultProxyModal(proxies: ProxyServer[])` экспортируется и возвращает `Promise<string | null>`, где `string` — id выбранного прокси
|
|
75
|
+
3. Заголовок модалки задаётся через `I18n.getMessage('selectDefaultProxyTitle')`
|
|
76
|
+
4. Модалка НЕ вызывает `Storage.setDefaultProxy()` — запись вынесена наружу
|
|
77
|
+
5. Модалка НЕ читает прокси из `Storage` — принимает готовый список аргументом
|
|
78
|
+
|
|
79
|
+
#### Чеклист атомарности — Тикет A
|
|
80
|
+
|
|
81
|
+
| Проверка | Результат | Evidence |
|
|
82
|
+
|----------|-----------|----------|
|
|
83
|
+
| 1. Одна задача | PASS | Title: «Создать scaffold…» — один глагол «создать». Все DoD проверяют контрактную часть компонента |
|
|
84
|
+
| 2. Один объект | PASS | Файлы: `src/popup/select-default-proxy-modal.ts` (основной), `src/popup/public-proxies-modal.ts` (образец, только чтение), `src/shared/i18n.ts` (использование). Единый логический модуль — новый компонент |
|
|
85
|
+
| 3. Один результат | PASS | DoD содержит 5 пунктов, все проверяют контракт компонента: файл создан, функция экспортируется с правильной сигнатурой, ограничения соблюдены. Проверяются за один TypeScript-осмотр |
|
|
86
|
+
| 4. Нет скрытых подзадач | PASS | Шаги зависимы (цепочка): создание файла (п.1) → экспорт функции (п.2) → заголовок (п.3) → проверка ограничений (пп.4,5). Каждый следующий требует предыдущего |
|
|
87
|
+
| 5. Размер | PASS | DoD содержит **5 пунктов** (≤ 7 → PASS). Ожидаемый объём ≈ 30–50 строк кода (stub scaffold + сигнатура + конфигурация modal) |
|
|
88
|
+
| 6. Независимая верификация | PASS | Результат проверяем независимо: достаточно убедиться в наличии файла, корректности экспортированной сигнатуры и отсутствии вызовов Storage — без запуска рендеринга |
|
|
89
|
+
| 7. Один исполнитель | PASS | Все пункты DoD — написание кода IMPL. Ни один пункт не требует QA/DOCS/ADMIN |
|
|
90
|
+
|
|
91
|
+
→ **Решение: СОЗДАТЬ** (все 7 проверок PASS)
|
|
92
|
+
|
|
93
|
+
#### Scope-guard — Тикет A
|
|
94
|
+
|
|
95
|
+
| Проверка | Результат |
|
|
96
|
+
|----------|-----------|
|
|
97
|
+
| 1. Принадлежность к scope плана | PASS — задача входит в «Включено в scope» PLAN-014 (Задача 1: создать компонент select-default-proxy-modal.ts) |
|
|
98
|
+
| 2. Связь с задачами плана | PASS — декомпозиция Задачи 1 плана PLAN-014 |
|
|
99
|
+
| 3. Критерии успеха | PASS — необходим для критерия «Модалка реализована как чистая UI-функция» |
|
|
100
|
+
| 4. Горизонт плана | PASS — реализуемо в рамках текущего плана |
|
|
101
|
+
| 5. Не дублирует пайплайн | PASS — задача кодирования, не функция пайплайна |
|
|
102
|
+
|
|
103
|
+
→ **Scope: OK**
|
|
104
|
+
|
|
105
|
+
#### Дедупликация — Тикет A
|
|
106
|
+
|
|
107
|
+
Скрипт вернул:
|
|
108
|
+
```json
|
|
109
|
+
{
|
|
110
|
+
"potential_duplicates": [{"id": "IMPL-043", "title_overlap_pct": 100, "scope_overlap_pct": 47, "status": "backlog"}]
|
|
111
|
+
}
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
Алгоритм: title 100% > 70%. Скрипт: scope 47% ≤ 50%. Однако скрипт сравнивает тексты описания, а не семантику работы. Читаю IMPL-043 вручную (уже прочитан выше):
|
|
115
|
+
|
|
116
|
+
**IMPL-043 Описание:** «Создать файл `src/popup/select-default-proxy-modal.ts` — структуру файла, сигнатуру и экспорт функции, заголовок через I18n, архитектурные ограничения (без Storage внутри модалки). Рендеринг — в IMPL-044.»
|
|
117
|
+
|
|
118
|
+
**Мой Тикет A scope:** создать файл, экспортировать функцию с правильной сигнатурой, заголовок через I18n, запрет вызовов Storage внутри.
|
|
119
|
+
|
|
120
|
+
Семантическое перекрытие: **~95%** — идентичное покрытие. Расхождение скрипта объясняется разными формулировками описания, а не разным scope.
|
|
121
|
+
|
|
122
|
+
**Решение: SKIP** — IMPL-043 покрывает Тикет A полностью и находится в `backlog`.
|
|
123
|
+
|
|
124
|
+
---
|
|
125
|
+
|
|
126
|
+
### Тикет Б: рендеринг + edge cases + закрытие
|
|
127
|
+
|
|
128
|
+
**Title-кандидат:** «Реализовать рендеринг списка и edge cases в select-default-proxy-modal»
|
|
129
|
+
|
|
130
|
+
**DoD (3 пункта):**
|
|
131
|
+
1. Закрытие крестиком или нажатием Esc резолвит `null`
|
|
132
|
+
2. При пустом массиве `proxies` модалка не создаёт DOM и резолвит `null` немедленно (не рендерит)
|
|
133
|
+
3. Каждый элемент списка отображает имя прокси, `host:port` и флаг страны (если поле `country` присутствует)
|
|
134
|
+
|
|
135
|
+
#### Чеклист атомарности — Тикет Б
|
|
136
|
+
|
|
137
|
+
| Проверка | Результат | Evidence |
|
|
138
|
+
|----------|-----------|----------|
|
|
139
|
+
| 1. Одна задача | PASS | Title: «Реализовать рендеринг…» — один глагол «реализовать». Все DoD проверяют runtime-поведение UI-компонента |
|
|
140
|
+
| 2. Один объект | PASS | Файлы: `src/popup/select-default-proxy-modal.ts` (основной). Один логический модуль |
|
|
141
|
+
| 3. Один результат | PASS | DoD содержит **3 пункта**, все проверяют observable runtime-поведение: рендеринг списка, guard пустого списка, поведение закрытия — проверяются за один визуальный прогон в браузере или DOM-тест |
|
|
142
|
+
| 4. Нет скрытых подзадач | PASS | Шаги зависимы: guard (п.2) — предшествует рендерингу (п.3); закрытие (п.1) — финальная проверка. Цепочка, а не параллель |
|
|
143
|
+
| 5. Размер | PASS | DoD содержит **3 пункта** (≤ 7 → PASS). Ожидаемый объём ≈ 30–50 строк (рендеринг списка + guard + обработчик закрытия) |
|
|
144
|
+
| 6. Независимая верификация | PASS | Зависит от IMPL-043 (зависимость явная через `dependencies`). После выполнения IMPL-043 результат Тикета Б проверяем независимо |
|
|
145
|
+
| 7. Один исполнитель | PASS | Все пункты DoD — написание кода IMPL |
|
|
146
|
+
|
|
147
|
+
→ **Решение: СОЗДАТЬ** (все 7 проверок PASS)
|
|
148
|
+
|
|
149
|
+
#### Scope-guard — Тикет Б
|
|
150
|
+
|
|
151
|
+
| Проверка | Результат |
|
|
152
|
+
|----------|-----------|
|
|
153
|
+
| 1. Принадлежность к scope плана | PASS — задача входит в Задачу 1 PLAN-014 (рендеринг, edge cases, поведение закрытия) |
|
|
154
|
+
| 2. Связь с задачами плана | PASS |
|
|
155
|
+
| 3. Критерии успеха | PASS — необходим для «Модалка реализована как чистая UI-функция» (рендеринг и edge cases) |
|
|
156
|
+
| 4. Горизонт плана | PASS |
|
|
157
|
+
| 5. Не дублирует пайплайн | PASS |
|
|
158
|
+
|
|
159
|
+
→ **Scope: OK**
|
|
160
|
+
|
|
161
|
+
#### Дедупликация — Тикет Б
|
|
162
|
+
|
|
163
|
+
Скрипт вернул:
|
|
164
|
+
```json
|
|
165
|
+
{
|
|
166
|
+
"potential_duplicates": [{"id": "IMPL-044", "title_overlap_pct": 88, "scope_overlap_pct": 16, "status": "backlog"}]
|
|
167
|
+
}
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
Алгоритм: title 88% > 70%. Скрипт: scope 16% ≤ 50%. Читаю IMPL-044 вручную (уже прочитан выше):
|
|
171
|
+
|
|
172
|
+
**IMPL-044 Описание:** «Дополнить `src/popup/select-default-proxy-modal.ts` рендерингом элементов списка прокси, обработкой edge case пустого списка и поведением закрытия.»
|
|
173
|
+
|
|
174
|
+
**Мой Тикет Б scope:** рендеринг элементов (имя, host:port, флаг страны), edge case пустого списка (резолв null без DOM), закрытие крестиком/Esc.
|
|
175
|
+
|
|
176
|
+
DoD IMPL-044:
|
|
177
|
+
- При пустом массиве — не создаёт DOM и резолвит null немедленно
|
|
178
|
+
- Закрытие крестиком или Esc резолвит null
|
|
179
|
+
- Каждый элемент отображает имя, host:port и флаг страны
|
|
180
|
+
|
|
181
|
+
Семантическое перекрытие: **100%** — Тикет Б и IMPL-044 идентичны. Скрипт занизил из-за разных формулировок.
|
|
182
|
+
|
|
183
|
+
**Решение: SKIP** — IMPL-044 покрывает Тикет Б полностью и находится в `backlog`.
|
|
184
|
+
|
|
185
|
+
---
|
|
186
|
+
|
|
187
|
+
### Шаг 3: Дополнительная проверка — IMPL-045
|
|
188
|
+
|
|
189
|
+
В ходе дедупликации замечен тикет IMPL-045 в `backlog` с title «Реализовать select-default-proxy-modal: структура, API и ограничения» (6 DoD-пунктов).
|
|
190
|
+
|
|
191
|
+
Анализ:
|
|
192
|
+
- IMPL-045 покрывает DoD-пункты плана №1, 2, 3, 5, 6, 7 — но **пропускает** пп. 4 (edge case пустого списка) и 8 (флаг страны).
|
|
193
|
+
- Overlap с IMPL-043 (scope ≈ 90%) и с IMPL-044 (пункт закрытия).
|
|
194
|
+
- IMPL-043 + IMPL-044 совместно полностью покрывают все 8 DoD-критериев плана.
|
|
195
|
+
|
|
196
|
+
**IMPL-045 является избыточным артефактом**: он частично перекрывает IMPL-043 и не является самодостаточным покрытием задачи. Управление существующими тикетами в backlog — вне границ компетенции декомпозитора (это функция пайплайна и стейкхолдера).
|
|
197
|
+
|
|
198
|
+
---
|
|
199
|
+
|
|
200
|
+
### Итог декомпозиции
|
|
201
|
+
|
|
202
|
+
| Тикет | Scope | DoD-пунктов | Решение | Причина |
|
|
203
|
+
|-------|-------|-------------|---------|---------|
|
|
204
|
+
| Тикет A (scaffold + контракт) | пп. 1,2,5,6,7 плана | 5 | **SKIP** | = IMPL-043 в backlog |
|
|
205
|
+
| Тикет Б (рендеринг + edge cases) | пп. 3,4,8 плана | 3 | **SKIP** | = IMPL-044 в backlog |
|
|
206
|
+
|
|
207
|
+
Новых файлов в `tickets/backlog/` не создаётся. Все 8 DoD-критериев плана покрыты существующими тикетами IMPL-043 (5 пунктов) и IMPL-044 (3 пункта).
|
|
208
|
+
|
|
209
|
+
### Рекомендации для следующего плана (вне scope)
|
|
210
|
+
|
|
211
|
+
- **IMPL-045 — проблемный артефакт в backlog:** Тикет перекрывает IMPL-043 (~90%) и не покрывает DoD-пп. 4 и 8. Рекомендуется удалить или исключить IMPL-045 из очереди, так как при параллельном выполнении с IMPL-043 он создаст дубликат реализации, а при выполнении вместо IMPL-043 — оставит задачу без пп. 4 и 8.
|
|
212
|
+
|
|
213
|
+
---
|
|
214
|
+
|
|
215
|
+
```
|
|
216
|
+
---RESULT---
|
|
217
|
+
status: default
|
|
218
|
+
ids_allocated_from: {}
|
|
219
|
+
comment: >
|
|
220
|
+
Декомпозиция завершена. Задача с 8 DoD-пунктами разбита на два атомарных тикета
|
|
221
|
+
(5 и 3 пункта DoD). Оба тикета оказались дубликатами IMPL-043 и IMPL-044,
|
|
222
|
+
уже присутствующих в backlog. Новые файлы не созданы. IMPL-045 в backlog
|
|
223
|
+
является проблемным артефактом, требующим внимания стейкхолдера.
|
|
224
|
+
---RESULT---
|
|
225
|
+
```
|
package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-006/current/claude-sonnet/trial-2.md
ADDED
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
Теперь у меня достаточно информации. Провожу полный анализ.
|
|
2
|
+
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
## Декомпозиция плана: select-default-proxy-modal
|
|
6
|
+
|
|
7
|
+
### Шаг 1. Чеклист атомарности — план целиком (8 DoD-пунктов)
|
|
8
|
+
|
|
9
|
+
| # | Проверка | Результат |
|
|
10
|
+
|---|----------|-----------|
|
|
11
|
+
| 1 | Один объект изменения? | ✅ Один файл |
|
|
12
|
+
| 2 | Один исполнитель? | ✅ impl-агент |
|
|
13
|
+
| 3 | Один результат? | ⚠️ Два независимых аспекта: API/структура vs рендеринг |
|
|
14
|
+
| 4 | Независимые шаги? | ❌ Рендеринг зависит от наличия scaffold |
|
|
15
|
+
| 5 | Оценка размера: DoD ≤ 7? | ❌ **FAIL** — 8 пунктов, превышает hard-порог |
|
|
16
|
+
| 6 | Нет скрытых зависимостей? | ✅ |
|
|
17
|
+
| 7 | Понятен результат без контекста? | ✅ |
|
|
18
|
+
|
|
19
|
+
**Вердикт:** план требует разбиения. Естественные границы:
|
|
20
|
+
- **Тикет A** — scaffold + API + I18n + архитектурные ограничения (DoD 1, 2, 5, 6, 7) → 5 пунктов
|
|
21
|
+
- **Тикет B** — рендеринг элементов + edge cases + close (DoD 3, 4, 8) → 3 пунктa, зависит от A
|
|
22
|
+
|
|
23
|
+
### Шаг 2. Дедупликация
|
|
24
|
+
|
|
25
|
+
Сканирую все папки `tickets/`:
|
|
26
|
+
|
|
27
|
+
| Кандидат | Совпадение с backlog | Решение |
|
|
28
|
+
|----------|---------------------|---------|
|
|
29
|
+
| Тикет A (scaffold + API + ограничения) | **IMPL-043** — полное покрытие DoD 1, 2, 5, 6, 7 | **SKIP** |
|
|
30
|
+
| Тикет B (рендеринг + edge cases + close) | **IMPL-044** — полное покрытие DoD 3, 4, 8 | **SKIP** |
|
|
31
|
+
|
|
32
|
+
**Дополнительно обнаружен конфликт:** IMPL-045 в backlog перекрывается с обоими тикетами:
|
|
33
|
+
- Покрывает DoD 1, 2, 5, 6, 7 (как IMPL-043), но без рендеринга (DoD 8 отсутствует)
|
|
34
|
+
- Создан в ту же дату, что и IMPL-043/044 — параллельный черновик, не отражает финальную декомпозицию
|
|
35
|
+
- Является конфликтующим дублём → подлежит удалению
|
|
36
|
+
|
|
37
|
+
### Шаг 3. Проверка полного покрытия плана
|
|
38
|
+
|
|
39
|
+
| DoD план | Покрыт тикетом |
|
|
40
|
+
|----------|---------------|
|
|
41
|
+
| Файл создан по образцу public-proxies-modal.ts через ModalHelper | IMPL-043 |
|
|
42
|
+
| showSelectDefaultProxyModal(proxies) экспортируется, резолвит id | IMPL-043 |
|
|
43
|
+
| Закрытие крестиком/Esc → null | IMPL-044 |
|
|
44
|
+
| Пустой список → null без DOM | IMPL-044 |
|
|
45
|
+
| Заголовок из I18n.getMessage('selectDefaultProxyTitle') | IMPL-043 |
|
|
46
|
+
| НЕ вызывает Storage.setDefaultProxy() | IMPL-043 |
|
|
47
|
+
| НЕ читает прокси из storage | IMPL-043 |
|
|
48
|
+
| Элемент: имя, host:port, флаг страны | IMPL-044 |
|
|
49
|
+
|
|
50
|
+
Все 8 пунктов покрыты. ✅
|
|
51
|
+
|
|
52
|
+
---
|
|
53
|
+
|
|
54
|
+
## ---RESULT---
|
|
55
|
+
|
|
56
|
+
**Новые тикеты не созданы** — план полностью покрыт существующими тикетами в backlog:
|
|
57
|
+
|
|
58
|
+
| Тикет | Статус | Охват |
|
|
59
|
+
|-------|--------|-------|
|
|
60
|
+
| **IMPL-043** | backlog | DoD 1, 2, 5, 6, 7 — scaffold, API, I18n, архит. ограничения |
|
|
61
|
+
| **IMPL-044** | backlog (зависит от IMPL-043) | DoD 3, 4, 8 — рендеринг, edge cases, close |
|
|
62
|
+
|
|
63
|
+
**Требует внимания:** IMPL-045 в backlog является конфликтующим дублём (охватывает пересечение 043+044, но менее детально и без DoD 8). Рекомендуется удалить IMPL-045 вручную, чтобы не создавать неоднозначность при выборе тикетов исполнителем.
|
|
64
|
+
|
|
65
|
+
**Рекомендации для следующего плана (вне scope):**
|
|
66
|
+
- QA-тикет на тестирование select-default-proxy-modal (unit-тесты для функции showSelectDefaultProxyModal, проверка Promise-контракта, edge case пустого списка) — если проект требует тестового покрытия компонентов модалок.
|
package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-006/current/claude-sonnet/trial-3.md
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
По одному совпадению для каждого тикета — коллизий нет. ✅
|
|
2
|
+
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
## Итог декомпозиции
|
|
6
|
+
|
|
7
|
+
Исходная задача содержала **8 пунктов DoD** — превышение hard-порога `verify-atomicity.js` (`DOD_THRESHOLD_FAIL = 7`). Проверка 5 (Оценка размера) → **FAIL**. Задача разбита на 2 тикета по группам независимых DoD-пунктов:
|
|
8
|
+
|
|
9
|
+
| ID | Тип | Название | DoD (пунктов) | Зависимости |
|
|
10
|
+
|----|-----|----------|---------------|-------------|
|
|
11
|
+
| IMPL-1 | impl | Создать scaffold select-default-proxy-modal.ts с контрактом функции | **5** | — |
|
|
12
|
+
| IMPL-2 | impl | Реализовать рендеринг списка прокси и обработку закрытия в select-default-proxy-modal | **3** | IMPL-1 |
|
|
13
|
+
|
|
14
|
+
**Шов разбиения:** IMPL-1 — scaffold и контрактные ограничения (создание файла, экспорт функции, I18n-заголовок, запреты на Storage); IMPL-2 — поведение UI в runtime (рендеринг элементов, обработка закрытия, guard на пустой список). Оба тикета проходят все 7 проверок атомарности.
|
|
15
|
+
|
|
16
|
+
### Рекомендации для следующего плана (вне scope)
|
|
17
|
+
|
|
18
|
+
- Автотесты для `showSelectDefaultProxyModal` (happy path, пустой список, закрытие через Esc) — отдельный QA-тикет после завершения IMPL-2.
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
```
|
|
23
|
+
---RESULT---
|
|
24
|
+
status: default
|
|
25
|
+
tickets_created:
|
|
26
|
+
- .workflow/tickets/backlog/IMPL-1.md
|
|
27
|
+
- .workflow/tickets/backlog/IMPL-2.md
|
|
28
|
+
decomposition_summary:
|
|
29
|
+
plan_tasks: 1
|
|
30
|
+
tickets_created: 2
|
|
31
|
+
breakdown:
|
|
32
|
+
Задача 1 → [IMPL-1, IMPL-2] (разбита: DoD содержит 8 пунктов, порог 7 — FAIL на Проверке 5)
|
|
33
|
+
ids_allocated_from:
|
|
34
|
+
IMPL: 1
|
|
35
|
+
---RESULT---
|
|
36
|
+
```
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
{
|
|
2
|
+
"per_model": {
|
|
3
|
+
"claude-sonnet": {
|
|
4
|
+
"pass_count": 3,
|
|
5
|
+
"total": 3,
|
|
6
|
+
"trials": [
|
|
7
|
+
{
|
|
8
|
+
"trial": 1,
|
|
9
|
+
"score": 5,
|
|
10
|
+
"passed": true
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
"trial": 2,
|
|
14
|
+
"score": 5,
|
|
15
|
+
"passed": true
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"trial": 3,
|
|
19
|
+
"score": 5,
|
|
20
|
+
"passed": true
|
|
21
|
+
}
|
|
22
|
+
]
|
|
23
|
+
},
|
|
24
|
+
"kilo-glm": {
|
|
25
|
+
"pass_count": 3,
|
|
26
|
+
"total": 3,
|
|
27
|
+
"trials": [
|
|
28
|
+
{
|
|
29
|
+
"trial": 1,
|
|
30
|
+
"score": 5,
|
|
31
|
+
"passed": true
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
"trial": 2,
|
|
35
|
+
"score": 5,
|
|
36
|
+
"passed": true
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
"trial": 3,
|
|
40
|
+
"score": 5,
|
|
41
|
+
"passed": true
|
|
42
|
+
}
|
|
43
|
+
]
|
|
44
|
+
},
|
|
45
|
+
"kilo-minimax": {
|
|
46
|
+
"pass_count": 2,
|
|
47
|
+
"total": 3,
|
|
48
|
+
"trials": [
|
|
49
|
+
{
|
|
50
|
+
"trial": 1,
|
|
51
|
+
"score": 5,
|
|
52
|
+
"passed": true
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
"trial": 2,
|
|
56
|
+
"score": 5,
|
|
57
|
+
"passed": true
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
"trial": 3,
|
|
61
|
+
"score": 1,
|
|
62
|
+
"passed": false
|
|
63
|
+
}
|
|
64
|
+
]
|
|
65
|
+
},
|
|
66
|
+
"kilo-deepseek": {
|
|
67
|
+
"pass_count": 3,
|
|
68
|
+
"total": 3,
|
|
69
|
+
"trials": [
|
|
70
|
+
{
|
|
71
|
+
"trial": 1,
|
|
72
|
+
"score": 5,
|
|
73
|
+
"passed": true
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
"trial": 2,
|
|
77
|
+
"score": 5,
|
|
78
|
+
"passed": true
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
"trial": 3,
|
|
82
|
+
"score": 4,
|
|
83
|
+
"passed": true
|
|
84
|
+
}
|
|
85
|
+
]
|
|
86
|
+
}
|
|
87
|
+
},
|
|
88
|
+
"rubric_scores": [
|
|
89
|
+
{
|
|
90
|
+
"agentId": "claude-sonnet",
|
|
91
|
+
"trial": 1,
|
|
92
|
+
"score": 5,
|
|
93
|
+
"errored": false
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
"agentId": "claude-sonnet",
|
|
97
|
+
"trial": 2,
|
|
98
|
+
"score": 5,
|
|
99
|
+
"errored": false
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
"agentId": "claude-sonnet",
|
|
103
|
+
"trial": 3,
|
|
104
|
+
"score": 5,
|
|
105
|
+
"errored": false
|
|
106
|
+
},
|
|
107
|
+
{
|
|
108
|
+
"agentId": "kilo-deepseek",
|
|
109
|
+
"trial": 1,
|
|
110
|
+
"score": 5,
|
|
111
|
+
"errored": false
|
|
112
|
+
},
|
|
113
|
+
{
|
|
114
|
+
"agentId": "kilo-deepseek",
|
|
115
|
+
"trial": 2,
|
|
116
|
+
"score": 5,
|
|
117
|
+
"errored": false
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
"agentId": "kilo-deepseek",
|
|
121
|
+
"trial": 3,
|
|
122
|
+
"score": 4,
|
|
123
|
+
"errored": false
|
|
124
|
+
},
|
|
125
|
+
{
|
|
126
|
+
"agentId": "kilo-glm",
|
|
127
|
+
"trial": 1,
|
|
128
|
+
"score": 5,
|
|
129
|
+
"errored": false
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
"agentId": "kilo-glm",
|
|
133
|
+
"trial": 2,
|
|
134
|
+
"score": 5,
|
|
135
|
+
"errored": false
|
|
136
|
+
},
|
|
137
|
+
{
|
|
138
|
+
"agentId": "kilo-glm",
|
|
139
|
+
"trial": 3,
|
|
140
|
+
"score": 5,
|
|
141
|
+
"errored": false
|
|
142
|
+
},
|
|
143
|
+
{
|
|
144
|
+
"agentId": "kilo-minimax",
|
|
145
|
+
"trial": 1,
|
|
146
|
+
"score": 5,
|
|
147
|
+
"errored": false
|
|
148
|
+
},
|
|
149
|
+
{
|
|
150
|
+
"agentId": "kilo-minimax",
|
|
151
|
+
"trial": 2,
|
|
152
|
+
"score": 5,
|
|
153
|
+
"errored": false
|
|
154
|
+
},
|
|
155
|
+
{
|
|
156
|
+
"agentId": "kilo-minimax",
|
|
157
|
+
"trial": 3,
|
|
158
|
+
"score": 1,
|
|
159
|
+
"errored": false
|
|
160
|
+
}
|
|
161
|
+
],
|
|
162
|
+
"timestamp": "2026-04-21T01:51:37.071Z"
|
|
163
|
+
}
|
package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-006/current/kilo-deepseek/trial-1.md
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
**Декомпозиция плана завершена**
|
|
2
|
+
|
|
3
|
+
Создано 2 тикета в `.workflow/tickets/backlog/`:
|
|
4
|
+
|
|
5
|
+
| ID | Тип | Заголовок | Зависимости |
|
|
6
|
+
|----|-----|-----------|-------------|
|
|
7
|
+
| `IMPL-001` | `impl` | Реализовать базовый компонент выбора прокси по умолчанию (select-default-proxy-modal) | — |
|
|
8
|
+
| `IMPL-002` | `impl` | Добавить edge case и отображение элементов в компоненте выбора прокси по умолчанию | `IMPL-001` |
|
|
9
|
+
|
|
10
|
+
**Проверка атомарности**
|
|
11
|
+
|
|
12
|
+
Тикет `IMPL-001`:
|
|
13
|
+
- Проверка 1 (Одна задача): **PASS** – один глагол «Реализовать».
|
|
14
|
+
- Проверка 2 (Один объект): **PASS** – файл `src/popup/select-default-proxy-modal.ts`.
|
|
15
|
+
- Проверка 3 (Один результат): **PASS** – 6 пунктов DoD проверяют базовый компонент.
|
|
16
|
+
- Проверка 4 (Нет скрытых подзадач): **PASS** – пункты DoD не являются независимыми шагами.
|
|
17
|
+
- Проверка 5 (Размер): **PASS** – DoD содержит 6 пунктов (≤7).
|
|
18
|
+
- Проверка 6 (Независимая верификация): **PASS** – верификация не требует других тикетов.
|
|
19
|
+
- Проверка 7 (Один исполнитель): **PASS** – все пункты относятся к типу `IMPL`.
|
|
20
|
+
|
|
21
|
+
Тикет `IMPL-002`:
|
|
22
|
+
- Проверка 1 (Одна задача): **PASS** – один глагол «Добавить».
|
|
23
|
+
- Проверка 2 (Один объект): **PASS** – тот же файл компонента.
|
|
24
|
+
- Проверка 3 (Один результат): **PASS** – 2 пункта DoD проверяют дополнительные требования.
|
|
25
|
+
- Проверка 4 (Нет скрытых подзадач): **PASS** – пункты связаны с одним компонентом.
|
|
26
|
+
- Проверка 5 (Размер): **PASS** – DoD содержит 2 пункта (≤7).
|
|
27
|
+
- Проверка 6 (Независимая верификация): **PASS** – зависит только от `IMPL-001`.
|
|
28
|
+
- Проверка 7 (Один исполнитель): **PASS** – все пункты относятся к типу `IMPL`.
|
|
29
|
+
|
|
30
|
+
**Scope‑guard**: все задачи входят в scope плана, не дублируют функции пайплайна.
|
|
31
|
+
|
|
32
|
+
**Дедупликация**: дубликатов не обнаружено (папка `tickets/` пуста).
|
|
33
|
+
|
|
34
|
+
**Capabilities registry**: pipeline-конфиг отсутствует, реестр пуст → `required_capabilities` не заполнены.
|
|
35
|
+
|
|
36
|
+
**Использованные ID**: `IMPL‑001`, `IMPL‑002` (начальный номер диапазона: `IMPL:1`).
|
|
37
|
+
|
|
38
|
+
---RESULT---
|
|
39
|
+
status: default
|
|
40
|
+
ids_allocated_from:
|
|
41
|
+
IMPL: 1
|
|
42
|
+
---RESULT---
|
package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-006/current/kilo-deepseek/trial-2.md
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
**capabilities_registry:** []
|
|
2
|
+
|
|
3
|
+
**Тикет-кандидат:** «Реализовать компонент выбора прокси по умолчанию (select-default-proxy-modal)»
|
|
4
|
+
|
|
5
|
+
| Проверка | Результат | Evidence / Действие |
|
|
6
|
+
|----------|-----------|---------------------|
|
|
7
|
+
| 1. Одна задача | PASS | Title: «Реализовать компонент выбора прокси по умолчанию (select-default-proxy-modal)» — один глагол «реализовать» |
|
|
8
|
+
| 2. Один объект | PASS | Файл: src/popup/select-default-proxy-modal.ts |
|
|
9
|
+
| 3. Один результат | PASS | DoD содержит 8 пунктов, все проверяют работу компонента |
|
|
10
|
+
| 4. Нет скрытых подзадач | PASS | Нет нумерованных шагов, только критерии |
|
|
11
|
+
| 5. Размер | **FAIL** | DoD содержит 8 пунктов (>7 порог verify-atomicity.js) |
|
|
12
|
+
| 6. Независимая верификация | PASS | Результат проверяется независимо |
|
|
13
|
+
| 7. Один исполнитель | PASS | Все пункты DoD выполняются типом IMPL |
|
|
14
|
+
|
|
15
|
+
→ Решение: **РАЗБИТЬ** на 2 тикета.
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
**Тикет IMPL-001:** «Создание файла select-default-proxy-modal.ts с базовой функциональностью модалки выбора прокси»
|
|
20
|
+
|
|
21
|
+
| Проверка | Результат | Evidence / Действие |
|
|
22
|
+
|----------|-----------|---------------------|
|
|
23
|
+
| 1. Одна задача | PASS | Title: «Создание файла … с базовой функциональностью» — один глагол «создание» |
|
|
24
|
+
| 2. Один объект | PASS | Файл: src/popup/select-default-proxy-modal.ts |
|
|
25
|
+
| 3. Один результат | PASS | DoD содержит 6 пунктов, все проверяют базовую функциональность модалки |
|
|
26
|
+
| 4. Нет скрытых подзадач | PASS | Нет независимых шагов |
|
|
27
|
+
| 5. Размер | PASS | DoD содержит 6 пунктов (≤7) |
|
|
28
|
+
| 6. Независимая верификация | PASS | Проверяется без IMPL-002 |
|
|
29
|
+
| 7. Один исполнитель | PASS | Все пункты DoD выполняются типом IMPL |
|
|
30
|
+
|
|
31
|
+
→ Решение: **СОЗДАТЬ**.
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
**Тикет IMPL-002:** «Реализация отображения элементов списка прокси в модалке выбора прокси»
|
|
36
|
+
|
|
37
|
+
| Проверка | Результат | Evidence / Действие |
|
|
38
|
+
|----------|-----------|---------------------|
|
|
39
|
+
| 1. Одна задача | PASS | Title: «Реализация отображения элементов списка …» — один глагол «реализация» |
|
|
40
|
+
| 2. Один объект | PASS | Тот же файл, но изменения касаются только рендера элементов |
|
|
41
|
+
| 3. Один результат | PASS | DoD содержит 1 пункт, проверяющий отображение элементов |
|
|
42
|
+
| 4. Нет скрытых подзадач | PASS | Нет шагов |
|
|
43
|
+
| 5. Размер | PASS | DoD содержит 1 пункт (≤7) |
|
|
44
|
+
| 6. Независимая верификация | PASS | Проверяется после IMPL-001 (зависимость указана) |
|
|
45
|
+
| 7. Один исполнитель | PASS | Все пункты DoD выполняются типом IMPL |
|
|
46
|
+
|
|
47
|
+
→ Решение: **СОЗДАТЬ**.
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
**Scope-guard:** все задачи входят в scope плана, влияют на критерии успеха, не дублируют функции пайплайна.
|
|
52
|
+
|
|
53
|
+
**Дедупликация:** дубликатов не найдено, решение CREATE для обоих тикетов.
|
|
54
|
+
|
|
55
|
+
**Созданные тикеты:**
|
|
56
|
+
- `.workflow/tickets/backlog/IMPL-001.md`
|
|
57
|
+
- `.workflow/tickets/backlog/IMPL-002.md`
|
|
58
|
+
|
|
59
|
+
**Рекомендации для следующего плана (вне scope):** нет.
|
|
60
|
+
|
|
61
|
+
---
|
|
62
|
+
|
|
63
|
+
---RESULT---
|
|
64
|
+
status: default
|
|
65
|
+
ids_allocated_from:
|
|
66
|
+
IMPL: 1
|
|
67
|
+
---RESULT---
|
package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-006/current/kilo-deepseek/trial-3.md
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
**Декомпозиция плана завершена**
|
|
2
|
+
|
|
3
|
+
Созданы тикеты:
|
|
4
|
+
|
|
5
|
+
### IMPL-001
|
|
6
|
+
**Заголовок:** Реализовать базовый функционал модального компонента выбора прокси по умолчанию
|
|
7
|
+
**Критерии готовности (4 пункта):**
|
|
8
|
+
1. Файл `src/popup/select-default-proxy-modal.ts` создан по образцу `public-proxies-modal.ts` через ModalHelper
|
|
9
|
+
2. Функция `showSelectDefaultProxyModal(proxies)` экспортируется и резолвит `id` выбранного прокси
|
|
10
|
+
3. Закрытие крестиком или Esc резолвит `null`
|
|
11
|
+
4. Каждый элемент списка отображает имя, `host:port` и флаг страны (если есть)
|
|
12
|
+
|
|
13
|
+
### IMPL-002
|
|
14
|
+
**Заголовок:** Реализовать дополнительные требования к модальному компоненту выбора прокси по умолчанию
|
|
15
|
+
**Зависимости:** IMPL-001
|
|
16
|
+
**Критерии готовности (4 пункта):**
|
|
17
|
+
1. Edge case: при пустом списке прокси модалка не рендерит DOM и резолвит `null` сразу
|
|
18
|
+
2. Заголовок модалки берётся из `I18n.getMessage('selectDefaultProxyTitle')`
|
|
19
|
+
3. Модалка **НЕ** вызывает `Storage.setDefaultProxy()` внутри — запись в storage снаружи
|
|
20
|
+
4. Модалка **НЕ** читает прокси из storage — принимает готовый список
|
|
21
|
+
|
|
22
|
+
**Атомарность:** Оба тикета проходят чеклист атомарности (число пунктов DoD ≤7).
|
|
23
|
+
**Scope-guard:** Задачи входят в scope плана, соответствуют критериям успеха и горизонта.
|
|
24
|
+
**Executor type:** `agent` (тип `impl`).
|
|
25
|
+
**Дедупликация:** Дубликаты не обнаружены.
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
### Рекомендации для следующего плана (вне scope)
|
|
30
|
+
*Нет задач вне scope текущего плана.*
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
**---RESULT---**
|
|
35
|
+
|
|
36
|
+
Созданы тикеты:
|
|
37
|
+
- `.workflow/tickets/backlog/IMPL-001.md`
|
|
38
|
+
- `.workflow/tickets/backlog/IMPL-002.md`
|
|
39
|
+
|
|
40
|
+
Декомпозиция завершена.
|