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/README.md
CHANGED
|
@@ -1,134 +1,163 @@
|
|
|
1
1
|
# workflow-ai
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Координатор воркфлоу для AI-агентов — конвейер на основе канбан-доски для AI-агентов, пишущих код.
|
|
4
4
|
|
|
5
5
|
Система координации AI-агентов через файловую канбан-доску. Автоматически оркестрирует выполнение задач: берёт тикеты из очереди, запускает нужного агента, проверяет результат и генерирует отчёты.
|
|
6
6
|
|
|
7
|
-
##
|
|
7
|
+
## Установка
|
|
8
8
|
|
|
9
9
|
```bash
|
|
10
10
|
npm install -g workflow-ai
|
|
11
11
|
```
|
|
12
12
|
|
|
13
|
-
##
|
|
13
|
+
## Быстрый старт
|
|
14
14
|
|
|
15
15
|
```bash
|
|
16
|
-
#
|
|
16
|
+
# 1. Инициализировать воркфлоу в вашем проекте
|
|
17
17
|
workflow init
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
```text
|
|
21
|
+
# 2. Открыть проект в AI-агенте (Claude Code, Kilo, и т.д.) и попросить создать план через скил:
|
|
22
|
+
Создай план <описание задачи> используя скил .workflow/src/skills/create-plan/SKILL.md
|
|
23
|
+
```
|
|
18
24
|
|
|
19
|
-
|
|
25
|
+
```bash
|
|
26
|
+
# 3. Запустить конвейер — он декомпозирует план на тикеты и начнёт исполнение
|
|
20
27
|
workflow run
|
|
21
28
|
```
|
|
22
29
|
|
|
23
|
-
##
|
|
30
|
+
## Команды
|
|
24
31
|
|
|
25
|
-
|
|
|
26
|
-
|
|
27
|
-
| `workflow init [path] [--force]` |
|
|
28
|
-
| `workflow run [options]` |
|
|
29
|
-
| `workflow update [path]` |
|
|
30
|
-
| `workflow eject <skill> [path]` |
|
|
31
|
-
| `workflow eject-scripts [path]` |
|
|
32
|
-
| `workflow eject-configs [path]` |
|
|
33
|
-
| `workflow list [path]` |
|
|
34
|
-
| `workflow help` |
|
|
35
|
-
| `workflow version` |
|
|
32
|
+
| Команда | Описание |
|
|
33
|
+
|---------|----------|
|
|
34
|
+
| `workflow init [path] [--force]` | Инициализировать директорию `.workflow/` со структурой канбан-доски |
|
|
35
|
+
| `workflow run [options]` | Запустить AI-конвейер |
|
|
36
|
+
| `workflow update [path]` | Обновить глобальную директорию и пересоздать junctions |
|
|
37
|
+
| `workflow eject <skill> [path]` | Извлечь скил (скопировать из глобальной директории в проект) |
|
|
38
|
+
| `workflow eject-scripts [path]` | Извлечь скрипты (скопировать из глобальной директории в проект) |
|
|
39
|
+
| `workflow eject-configs [path]` | Извлечь конфиги (скопировать из глобальной директории в проект) |
|
|
40
|
+
| `workflow list [path]` | Вывести список скилов со статусом (shared/ejected/project-only) |
|
|
41
|
+
| `workflow help` | Показать справку |
|
|
42
|
+
| `workflow version` | Показать версию |
|
|
36
43
|
|
|
37
|
-
###
|
|
44
|
+
### Опции команды `run`
|
|
38
45
|
|
|
39
|
-
|
|
|
40
|
-
|
|
41
|
-
| `--plan <plan>` |
|
|
42
|
-
| `--config <path>` |
|
|
43
|
-
| `--project <path>` |
|
|
46
|
+
| Опция | Описание |
|
|
47
|
+
|-------|----------|
|
|
48
|
+
| `--plan <plan>` | ID плана для выполнения |
|
|
49
|
+
| `--config <path>` | Путь к конфиг-файлу |
|
|
50
|
+
| `--project <path>` | Корень проекта (по умолчанию: автоопределение) |
|
|
44
51
|
|
|
45
|
-
##
|
|
52
|
+
## Инициализация
|
|
46
53
|
|
|
47
|
-
|
|
54
|
+
Команда `workflow init` создаёт структуру директории `.workflow/`:
|
|
48
55
|
|
|
49
56
|
```
|
|
50
57
|
.workflow/
|
|
51
|
-
├── config/ # → junction
|
|
58
|
+
├── config/ # → junction на ~/.workflow/configs/ (eject для кастомизации)
|
|
52
59
|
├── plans/
|
|
53
|
-
│ ├── current/ #
|
|
54
|
-
│ ├── templates/ #
|
|
55
|
-
│ └── archive/ #
|
|
60
|
+
│ ├── current/ # Текущие планы разработки
|
|
61
|
+
│ ├── templates/ # Шаблоны планов с триггерами (повторяющиеся планы)
|
|
62
|
+
│ └── archive/ # Архивные планы
|
|
56
63
|
├── tickets/
|
|
57
|
-
│ ├── backlog/ #
|
|
58
|
-
│ ├── ready/ #
|
|
59
|
-
│ ├── in-progress/ #
|
|
60
|
-
│ ├── blocked/ #
|
|
61
|
-
│ ├── review/ #
|
|
62
|
-
│ └── done/ #
|
|
63
|
-
├── reports/ #
|
|
64
|
-
├── logs/ #
|
|
65
|
-
├── metrics/ #
|
|
66
|
-
├── templates/ #
|
|
64
|
+
│ ├── backlog/ # Ожидают условий
|
|
65
|
+
│ ├── ready/ # Готовы к выполнению
|
|
66
|
+
│ ├── in-progress/ # В работе
|
|
67
|
+
│ ├── blocked/ # Заблокированы зависимостями
|
|
68
|
+
│ ├── review/ # Ожидают ревью
|
|
69
|
+
│ └── done/ # Завершены
|
|
70
|
+
├── reports/ # Сгенерированные отчёты
|
|
71
|
+
├── logs/ # Логи выполнения конвейера
|
|
72
|
+
├── metrics/ # Метрики производительности
|
|
73
|
+
├── templates/ # Шаблоны тикетов/планов/отчётов
|
|
67
74
|
└── src/
|
|
68
|
-
├── skills/ #
|
|
69
|
-
└── scripts/ #
|
|
75
|
+
├── skills/ # Инструкции скилов (junctions на глобальные, по каждому скилу)
|
|
76
|
+
└── scripts/ # Скрипты автоматизации (junction на глобальные)
|
|
70
77
|
```
|
|
71
78
|
|
|
72
|
-
##
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
1. **pick-first-task** —
|
|
77
|
-
2. **check-plan-templates** —
|
|
78
|
-
3. **check-plan-decomposition** —
|
|
79
|
-
4. **decompose-plan** —
|
|
80
|
-
5. **check-conditions** —
|
|
81
|
-
6. **move-to-ready** —
|
|
82
|
-
7. **pick-next-task** —
|
|
83
|
-
8. **move-to-in-progress** —
|
|
84
|
-
9. **check-relevance** —
|
|
85
|
-
10. **execute-task** —
|
|
86
|
-
11. **move-to-review** —
|
|
87
|
-
12. **review-result** —
|
|
88
|
-
13. **increment-task-attempts** —
|
|
89
|
-
14. **move-ticket** —
|
|
90
|
-
15. **create-report** —
|
|
91
|
-
16. **analyze-report / decompose-gaps** —
|
|
92
|
-
|
|
93
|
-
###
|
|
94
|
-
|
|
95
|
-
|
|
|
96
|
-
|
|
97
|
-
| `claude-
|
|
98
|
-
| `
|
|
99
|
-
| `
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
##
|
|
105
|
-
|
|
106
|
-
|
|
79
|
+
## Конвейер
|
|
80
|
+
|
|
81
|
+
Команда `workflow run` исполняет многоэтапный конвейер:
|
|
82
|
+
|
|
83
|
+
1. **pick-first-task** — выбрать тикет из очереди ready
|
|
84
|
+
2. **check-plan-templates** — проверить триггеры шаблонов планов, создать планы при срабатывании
|
|
85
|
+
3. **check-plan-decomposition** — проверить, что план декомпозирован на тикеты
|
|
86
|
+
4. **decompose-plan** — разбить план на тикеты (при необходимости)
|
|
87
|
+
5. **check-conditions** — проверить условия готовности тикета
|
|
88
|
+
6. **move-to-ready** — переместить тикеты из backlog в ready
|
|
89
|
+
7. **pick-next-task** — выбрать следующий тикет для выполнения
|
|
90
|
+
8. **move-to-in-progress** — начать выполнение
|
|
91
|
+
9. **check-relevance** — проверить, что тикет всё ещё актуален (на скриптах, без LLM)
|
|
92
|
+
10. **execute-task** — выполнить работу через AI-агента
|
|
93
|
+
11. **move-to-review** — отправить на ревью
|
|
94
|
+
12. **review-result** — проверить результаты по Definition of Done
|
|
95
|
+
13. **increment-task-attempts** — учесть попытки повторов
|
|
96
|
+
14. **move-ticket** — переместить в done/blocked по результатам ревью
|
|
97
|
+
15. **create-report** — сгенерировать отчёт о выполнении
|
|
98
|
+
16. **analyze-report / decompose-gaps** — проанализировать результаты и итерировать
|
|
99
|
+
|
|
100
|
+
### Поддерживаемые агенты
|
|
101
|
+
|
|
102
|
+
| Агент | Описание |
|
|
103
|
+
|-------|----------|
|
|
104
|
+
| `claude-code` | Claude Opus — мощная модель для сложных задач |
|
|
105
|
+
| `qwen-code` | Qwen Code — альтернативный агент |
|
|
106
|
+
| `kilo-code` | Kilo Code — мультирежимный агент |
|
|
107
|
+
...
|
|
108
|
+
|
|
109
|
+
Агенты настраиваются в `configs/pipeline.yaml`.
|
|
110
|
+
|
|
111
|
+
## Скилы
|
|
112
|
+
|
|
113
|
+
Встроенные скилы для разных типов задач:
|
|
114
|
+
|
|
115
|
+
| Скил | Описание |
|
|
116
|
+
|------|----------|
|
|
117
|
+
| `analyze-report` | Анализ отчёта |
|
|
118
|
+
| `coach` | Управление и улучшение скилов |
|
|
119
|
+
| `create-plan` | Создание плана |
|
|
120
|
+
| `create-report` | Генерация отчёта |
|
|
121
|
+
| `decompose-gaps` | Декомпозиция пробелов |
|
|
122
|
+
| `decompose-plan` | Декомпозиция плана на тикеты |
|
|
123
|
+
| `deep-research` | Глубокий ресерч |
|
|
124
|
+
| `execute-task` | Выполнение задачи |
|
|
125
|
+
| `review-result` | Ревью результата по DoD |
|
|
126
|
+
|
|
127
|
+
Скилы хранятся глобально в `~/.workflow/skills/` и подключаются в проекты через junctions.
|
|
128
|
+
|
|
129
|
+
Используйте `workflow eject <skill>` для копирования скила в проект для кастомизации.
|
|
130
|
+
|
|
131
|
+
### Как работать с коучем
|
|
132
|
+
|
|
133
|
+
Коуч — мета-скил для создания и улучшения остальных скилов. Правки в `.workflow/src/skills/` делаются **только** через него.
|
|
134
|
+
|
|
135
|
+
```text
|
|
136
|
+
# Запрос к AI-агенту:
|
|
137
|
+
Загрузи коуча из .workflow/src/skills/coach/SKILL.md и <действие>
|
|
138
|
+
```
|
|
107
139
|
|
|
108
|
-
|
|
109
|
-
|-------|-------------|
|
|
110
|
-
| `analyze-report` | Report analysis |
|
|
111
|
-
| `coach` | Skill management and improvement |
|
|
112
|
-
| `create-plan` | Plan creation |
|
|
113
|
-
| `create-report` | Report generation |
|
|
114
|
-
| `decompose-gaps` | Gap decomposition |
|
|
115
|
-
| `decompose-plan` | Plan decomposition into tickets |
|
|
116
|
-
| `deep-research` | Deep research |
|
|
117
|
-
| `execute-task` | Task execution |
|
|
118
|
-
| `review-result` | Result review against DoD |
|
|
140
|
+
Варианты `<действия>`:
|
|
119
141
|
|
|
120
|
-
|
|
142
|
+
| Тип задачи | Пример запроса |
|
|
143
|
+
|------------|----------------|
|
|
144
|
+
| Создать новый скил | `создай скил <имя> для <назначение>` |
|
|
145
|
+
| Аудит существующего | `сделай аудит скила <имя>` |
|
|
146
|
+
| Анализ эффективности | `проанализируй результаты скила <имя> по завершённым тикетам` |
|
|
147
|
+
| Точечное улучшение | `улучши скил <имя>: <что именно>` |
|
|
148
|
+
| Ресерч практик | `найди лучшие практики для <тема> и обогати скил <имя>` |
|
|
149
|
+
| Ревью скила | `сделай ревью скила <имя>` |
|
|
121
150
|
|
|
122
|
-
|
|
151
|
+
Коуч сам определит тип задачи, загрузит нужный воркфлоу, внесёт правку, прогонит тест скила и запишет результат в `.workflow/coach-backlog.yaml`. Коммит делает пользователь.
|
|
123
152
|
|
|
124
|
-
##
|
|
153
|
+
## Регрессионные тесты скилов
|
|
125
154
|
|
|
126
155
|
Трёхуровневая система тестирования скилов для проверки качества AI-агентов.
|
|
127
156
|
|
|
128
157
|
### Три слоя тестирования
|
|
129
158
|
|
|
130
|
-
|
|
|
131
|
-
|
|
159
|
+
| Уровень | Название | Описание |
|
|
160
|
+
|---------|----------|----------|
|
|
132
161
|
| L0 | Static | Базовая проверка синтаксиса и структуры: YAML-валидация, проверка обязательных полей, линтер |
|
|
133
162
|
| L1 | Deterministic | Детерминированные тесты: эталонные входные данные → ожидаемый результат (strict match) |
|
|
134
163
|
| L2 | Rubric | Гибкая оценка по критериям: scorer выставляет баллы на основе качества результата |
|
|
@@ -157,18 +186,18 @@ npm run test:skills
|
|
|
157
186
|
|
|
158
187
|
### CLI-флаги
|
|
159
188
|
|
|
160
|
-
|
|
|
161
|
-
|
|
189
|
+
| Флаг | Описание |
|
|
190
|
+
|------|----------|
|
|
162
191
|
| `--skill <name>` | Запустить тесты только для указанного скила |
|
|
163
192
|
| `--relevant` | Запустить только тесты, соответствующие изменённым файлам |
|
|
164
193
|
| `--establish-baseline` | Запустить тесты и сохранить результаты как baseline |
|
|
165
194
|
| `--baseline-ref <ref>` | Использовать конкретный baseline (коммит, тег) |
|
|
166
195
|
| `--yes` | Автоматически подтверждать все действия |
|
|
167
196
|
|
|
168
|
-
###
|
|
197
|
+
### Режимы вердикта
|
|
169
198
|
|
|
170
|
-
|
|
|
171
|
-
|
|
199
|
+
| Режим | Описание |
|
|
200
|
+
|-------|----------|
|
|
172
201
|
| `no-baseline` | Первый запуск — результаты сохраняются как baseline без сравнения |
|
|
173
202
|
| `no-regression` | Сравнение с baseline — тест считается пройденным, если результат не хуже baseline |
|
|
174
203
|
|
|
@@ -176,29 +205,29 @@ npm run test:skills
|
|
|
176
205
|
|
|
177
206
|
Runner и коуч **не выполняют git write-операций**. Все изменения в кодовой базе делает исключительно пользователь. Runner только анализирует и рекомендует, но не коммитит.
|
|
178
207
|
|
|
179
|
-
###
|
|
208
|
+
### Первый запуск на новом проекте
|
|
180
209
|
|
|
181
210
|
1. Запустить тесты с флагом `--establish-baseline`
|
|
182
211
|
2. Проверить результаты: красные тесты — ожидаемы для нового проекта
|
|
183
212
|
3. Зафиксировать baseline: `git commit current/` как baseline-коммит
|
|
184
213
|
|
|
185
|
-
##
|
|
214
|
+
## Скрипты
|
|
186
215
|
|
|
187
|
-
|
|
216
|
+
Скрипты хранятся глобально в `~/.workflow/scripts/` и подключаются одним junction в `.workflow/src/scripts/`.
|
|
188
217
|
|
|
189
|
-
|
|
218
|
+
Используйте `workflow eject-scripts` для копирования скриптов в проект для кастомизации.
|
|
190
219
|
|
|
191
|
-
##
|
|
220
|
+
## Конфиги
|
|
192
221
|
|
|
193
|
-
|
|
222
|
+
Конфиги хранятся глобально в `~/.workflow/configs/` и подключаются одним junction в `.workflow/config/`.
|
|
194
223
|
|
|
195
|
-
|
|
224
|
+
Используйте `workflow eject-configs` для копирования конфигов в проект для кастомизации.
|
|
196
225
|
|
|
197
|
-
##
|
|
226
|
+
## Шаблоны планов
|
|
198
227
|
|
|
199
|
-
|
|
228
|
+
Шаблоны планов позволяют автоматически создавать повторяющиеся планы. Шаблоны лежат в `.workflow/plans/templates/` и содержат условия триггеров во frontmatter.
|
|
200
229
|
|
|
201
|
-
###
|
|
230
|
+
### Формат шаблона
|
|
202
231
|
|
|
203
232
|
```yaml
|
|
204
233
|
id: "TMPL-001"
|
|
@@ -206,72 +235,137 @@ title: "Daily manual testing"
|
|
|
206
235
|
type: template
|
|
207
236
|
trigger:
|
|
208
237
|
type: daily # daily | weekly | date_after | interval_days
|
|
209
|
-
params: {} #
|
|
210
|
-
last_triggered: "" #
|
|
238
|
+
params: {} # параметры, зависящие от типа
|
|
239
|
+
last_triggered: "" # обновляется автоматически при срабатывании
|
|
211
240
|
enabled: true
|
|
212
241
|
```
|
|
213
242
|
|
|
214
|
-
###
|
|
243
|
+
### Типы триггеров
|
|
244
|
+
|
|
245
|
+
| Тип | Параметры | Описание |
|
|
246
|
+
|-----|-----------|----------|
|
|
247
|
+
| `daily` | — | Раз в день |
|
|
248
|
+
| `weekly` | `days_of_week: [1,3,5]` (0=вс) | В указанные дни недели |
|
|
249
|
+
| `date_after` | `date: "2026-04-01"` | Один раз после указанной даты |
|
|
250
|
+
| `interval_days` | `days: 3` | Каждые N дней |
|
|
251
|
+
|
|
252
|
+
При срабатывании триггера конвейер создаёт план в `plans/current/` со статусом `approved`, далее идёт обычный поток декомпозиции.
|
|
253
|
+
|
|
254
|
+
## Типы задач
|
|
255
|
+
|
|
256
|
+
| Тип | Префикс | Описание |
|
|
257
|
+
|-----|---------|----------|
|
|
258
|
+
| `arch` | ARCH | Архитектура и планирование |
|
|
259
|
+
| `impl` | IMPL | Реализация кода |
|
|
260
|
+
| `fix` | FIX | Исправления ошибок |
|
|
261
|
+
| `review` | REVIEW | Ревью кода/документации |
|
|
262
|
+
| `docs` | DOCS | Документация |
|
|
263
|
+
| `admin` | ADMIN | Административные задачи |
|
|
264
|
+
|
|
265
|
+
## Fallback агентов и правила здоровья
|
|
266
|
+
|
|
267
|
+
Система включает механизм in-stage fallback и health-мониторинг агентов.
|
|
215
268
|
|
|
216
|
-
|
|
217
|
-
|------|--------|-------------|
|
|
218
|
-
| `daily` | — | Once per day |
|
|
219
|
-
| `weekly` | `days_of_week: [1,3,5]` (0=Sun) | On specific weekdays |
|
|
220
|
-
| `date_after` | `date: "2026-04-01"` | Once after a specific date |
|
|
221
|
-
| `interval_days` | `days: 3` | Every N days |
|
|
269
|
+
### Механика fallback
|
|
222
270
|
|
|
223
|
-
|
|
271
|
+
Когда агент падает во время выполнения задачи, система использует **artifact-snapshot** для принятия решения:
|
|
272
|
+
- Если snapshot пустой (нет записанных файлов) → выполняется fallback на следующего агента
|
|
273
|
+
- Если snapshot непустой (есть изменения) → задача переходит в состояние `goto.error`
|
|
224
274
|
|
|
225
|
-
|
|
275
|
+
**Пример сценария:** Qwen превысил quota и упал без записи файлов → Kilo вызван в той же попытке, task_attempts не инкрементирован.
|
|
226
276
|
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
277
|
+
Конфигурация snapshot:
|
|
278
|
+
```yaml
|
|
279
|
+
execution:
|
|
280
|
+
artifact_snapshot_enabled: false # по умолчанию выключено
|
|
281
|
+
snapshot_paths: ["src/", "configs/"] # что мониторить
|
|
282
|
+
snapshot_max_file_size: 524288 # файлы >512KB — только mtime+size
|
|
283
|
+
```
|
|
284
|
+
|
|
285
|
+
**Baseline производительности:** `p50=169ms p95=299ms files=598` (из QA-20 benchmark).
|
|
286
|
+
|
|
287
|
+
### Классификатор ошибок и health-реестр
|
|
288
|
+
|
|
289
|
+
Ошибки классифицируются по классам:
|
|
290
|
+
- `unavailable` — агент временно недоступен (quota, rate limit)
|
|
291
|
+
- `transient` — временная ошибка сети (timeout, 5xx)
|
|
292
|
+
- `misconfigured` — ошибка конфигурации (401, 403, отсутствует API key)
|
|
293
|
+
- `unmatched` — ошибка не распознана
|
|
294
|
+
|
|
295
|
+
**Семантика TTL:**
|
|
296
|
+
- `5m` — 5 минут
|
|
297
|
+
- `1h` — 1 час
|
|
298
|
+
- `until_utc_midnight` — до полуночи UTC (минимум 30 минут)
|
|
299
|
+
- `infinite` — навсегда
|
|
300
|
+
|
|
301
|
+
Файл конфигурации: `configs/agent-health-rules.yaml`. Файл состояния: `.workflow/state/agent-health.json`.
|
|
302
|
+
|
|
303
|
+
### Команда сброса
|
|
304
|
+
|
|
305
|
+
```bash
|
|
306
|
+
# показать текущее состояние
|
|
307
|
+
node .workflow/src/scripts/reset-agent-health.js
|
|
308
|
+
|
|
309
|
+
# сбросить конкретного агента
|
|
310
|
+
node .workflow/src/scripts/reset-agent-health.js --agent qwen-code
|
|
311
|
+
|
|
312
|
+
# сбросить всех агентов
|
|
313
|
+
node .workflow/src/scripts/reset-agent-health.js --all
|
|
314
|
+
```
|
|
315
|
+
|
|
316
|
+
### Пример добавления правила
|
|
317
|
+
|
|
318
|
+
```yaml
|
|
319
|
+
# В configs/agent-health-rules.yaml:
|
|
320
|
+
agents:
|
|
321
|
+
my-new-agent:
|
|
322
|
+
rules:
|
|
323
|
+
- id: "my-agent-quota"
|
|
324
|
+
class: "unavailable"
|
|
325
|
+
ttl: "until_utc_midnight"
|
|
326
|
+
pattern: "quota exceeded|daily limit reached"
|
|
327
|
+
exit_codes: "any"
|
|
328
|
+
```
|
|
235
329
|
|
|
236
|
-
##
|
|
330
|
+
## Конфигурация
|
|
237
331
|
|
|
238
332
|
### `configs/config.yaml`
|
|
239
333
|
|
|
240
|
-
|
|
334
|
+
Основная конфигурация воркфлоу: информация о проекте, типы задач, приоритеты, статусы, типы условий, пути, настройки отчётности.
|
|
241
335
|
|
|
242
336
|
### `configs/pipeline.yaml`
|
|
243
337
|
|
|
244
|
-
|
|
338
|
+
Определение конвейера: агенты, стадии, управление потоком, goto-логика, стратегии повторов.
|
|
245
339
|
|
|
246
340
|
### `configs/ticket-movement-rules.yaml`
|
|
247
341
|
|
|
248
|
-
|
|
342
|
+
Правила автоматического перемещения тикетов на основе статуса ревью.
|
|
249
343
|
|
|
250
|
-
##
|
|
344
|
+
## Структура проекта
|
|
251
345
|
|
|
252
346
|
```
|
|
253
347
|
workflow-ai/
|
|
254
|
-
├── bin/ #
|
|
348
|
+
├── bin/ # Точка входа CLI
|
|
255
349
|
├── src/
|
|
256
|
-
│ ├── cli.mjs #
|
|
257
|
-
│ ├── runner.mjs #
|
|
258
|
-
│ ├── init.mjs #
|
|
259
|
-
│ ├── global-dir.mjs #
|
|
260
|
-
│ ├── junction-manager.mjs #
|
|
261
|
-
│ ├── wf-loader.mjs #
|
|
262
|
-
│ ├── lib/ #
|
|
263
|
-
│ └── tests/ #
|
|
264
|
-
├── configs/ #
|
|
265
|
-
├── templates/ #
|
|
266
|
-
├── agent-templates/ #
|
|
350
|
+
│ ├── cli.mjs # Парсинг команд
|
|
351
|
+
│ ├── runner.mjs # Оркестратор конвейера
|
|
352
|
+
│ ├── init.mjs # Инициализация проекта
|
|
353
|
+
│ ├── global-dir.mjs # Управление глобальной ~/.workflow/
|
|
354
|
+
│ ├── junction-manager.mjs # Управление junction/symlink
|
|
355
|
+
│ ├── wf-loader.mjs # Загрузчик конфигов
|
|
356
|
+
│ ├── lib/ # Библиотеки утилит
|
|
357
|
+
│ └── tests/ # Набор тестов
|
|
358
|
+
├── configs/ # Файлы конфигурации (источник)
|
|
359
|
+
├── templates/ # Шаблоны воркфлоу (источник)
|
|
360
|
+
├── agent-templates/ # Шаблоны инструкций для AI-агентов
|
|
267
361
|
└── package.json
|
|
268
362
|
```
|
|
269
363
|
|
|
270
|
-
##
|
|
364
|
+
## Требования
|
|
271
365
|
|
|
272
366
|
- Node.js >= 18.0.0
|
|
273
367
|
- npm
|
|
274
368
|
|
|
275
|
-
##
|
|
369
|
+
## Лицензия
|
|
276
370
|
|
|
277
371
|
MIT
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
version: "1.0"
|
|
2
|
+
|
|
3
|
+
common:
|
|
4
|
+
- id: "net-econnreset"
|
|
5
|
+
class: "transient"
|
|
6
|
+
ttl: "5m"
|
|
7
|
+
pattern: "ECONNRESET|ETIMEDOUT|EAI_AGAIN|connection reset by peer|socket hang up"
|
|
8
|
+
exit_codes: "any"
|
|
9
|
+
- id: "http-5xx-transient"
|
|
10
|
+
class: "transient"
|
|
11
|
+
ttl: "5m"
|
|
12
|
+
pattern: "\\b(502|503|504)\\b.*(Bad Gateway|Service Unavailable|Gateway Timeout)"
|
|
13
|
+
exit_codes: "any"
|
|
14
|
+
- id: "http-auth"
|
|
15
|
+
class: "misconfigured"
|
|
16
|
+
ttl: "1h"
|
|
17
|
+
pattern: "\\b(401|403)\\b|Unauthorized|Forbidden|API key (not found|invalid|missing)"
|
|
18
|
+
exit_codes: "any"
|
|
19
|
+
|
|
20
|
+
agents:
|
|
21
|
+
qwen-code:
|
|
22
|
+
rules:
|
|
23
|
+
- id: "qwen-quota"
|
|
24
|
+
class: "unavailable"
|
|
25
|
+
ttl: "until_utc_midnight"
|
|
26
|
+
pattern: "Qwen OAuth quota exceeded|qwen.*quota.*exceed|Daily limit.*reached"
|
|
27
|
+
exit_codes: "any"
|
|
28
|
+
- id: "qwen-oauth-required"
|
|
29
|
+
class: "misconfigured"
|
|
30
|
+
ttl: "1h"
|
|
31
|
+
pattern: "Please run `qwen login`|qwen OAuth flow"
|
|
32
|
+
exit_codes: "any"
|
|
33
|
+
|
|
34
|
+
claude-sonnet:
|
|
35
|
+
rules:
|
|
36
|
+
- id: "claude-overloaded"
|
|
37
|
+
class: "unavailable"
|
|
38
|
+
ttl: "10m"
|
|
39
|
+
pattern: "overloaded_error|\\b529\\b|Overloaded"
|
|
40
|
+
exit_codes: "any"
|
|
41
|
+
- id: "claude-rate-limit"
|
|
42
|
+
class: "unavailable"
|
|
43
|
+
ttl: "1h"
|
|
44
|
+
pattern: "rate_limit_error|\\b429\\b.*rate|usage limit"
|
|
45
|
+
exit_codes: "any"
|
|
46
|
+
|
|
47
|
+
claude-opus:
|
|
48
|
+
extends: claude-sonnet
|
|
49
|
+
|
|
50
|
+
kilo-free:
|
|
51
|
+
rules:
|
|
52
|
+
- id: "kilo-free-tier-exhausted"
|
|
53
|
+
class: "unavailable"
|
|
54
|
+
ttl: "until_utc_midnight"
|
|
55
|
+
pattern: "free tier.*exhaust|daily limit|too many requests"
|
|
56
|
+
exit_codes: "any"
|
|
57
|
+
|
|
58
|
+
kilo-deepseek:
|
|
59
|
+
rules:
|
|
60
|
+
- id: "kilo-deepseek-provider-down"
|
|
61
|
+
class: "transient"
|
|
62
|
+
ttl: "15m"
|
|
63
|
+
pattern: "deepseek.*unavailable|upstream error"
|
|
64
|
+
exit_codes: "any"
|
package/configs/pipeline.yaml
CHANGED
|
@@ -350,7 +350,7 @@ pipeline:
|
|
|
350
350
|
# -------------------------------------------------------------------------
|
|
351
351
|
decompose-plan:
|
|
352
352
|
description: "Декомпозировать план на тикеты"
|
|
353
|
-
agents: [claude-sonnet, kilo-glm
|
|
353
|
+
agents: [claude-sonnet, kilo-glm]
|
|
354
354
|
skill: decompose-plan
|
|
355
355
|
instructions: "Декомпозируй план .workflow/$context.plan_file на тикеты. ID тикетов бери ТОЛЬКО из JSON-карты id_ranges_json=$context.id_ranges_json — это стартовые номера по префиксам в формате {\"PREFIX\":N_start,...}, уже выделенные стадией allocate-ticket-ids. Распарси JSON, используй значения как есть. НЕ вызывай get-next-id.js и НЕ изобретай номера самостоятельно. Подробности: см. шаг 9.0 в workflows/decompose.md. При наличии $context.atomicity_failures — учти их при декомпозиции: исправь неатомарные тикеты."
|
|
356
356
|
goto:
|
|
@@ -593,6 +593,17 @@ pipeline:
|
|
|
593
593
|
ticket_id: "$context.ticket_id"
|
|
594
594
|
attempt: "$counter.task_attempts"
|
|
595
595
|
target: review
|
|
596
|
+
# Runner возвращает status=blocked при no_capable_agent / attempts_exhausted
|
|
597
|
+
# (resolveAgent в runner.mjs, строка ~926). Направляем тикет сразу в blocked/,
|
|
598
|
+
# минуя move-to-review → verify-artifacts → increment-task-attempts: иначе
|
|
599
|
+
# тикет крутится 6 итераций вхолостую (execute-task не может его взять,
|
|
600
|
+
# verify-artifacts фейлится с пустым result, счётчик достигает max → blocked
|
|
601
|
+
# всё равно). Прямой маршрут экономит ~6 пустых итераций на тикет.
|
|
602
|
+
blocked:
|
|
603
|
+
stage: move-ticket
|
|
604
|
+
params:
|
|
605
|
+
ticket_id: "$context.ticket_id"
|
|
606
|
+
target: blocked
|
|
596
607
|
error:
|
|
597
608
|
stage: move-to-review
|
|
598
609
|
params:
|
|
@@ -728,6 +739,10 @@ pipeline:
|
|
|
728
739
|
stage: analyze-report
|
|
729
740
|
params:
|
|
730
741
|
report_id: "$result.report_id"
|
|
742
|
+
# blocked означает, что required_capabilities из контекста (от предыдущего
|
|
743
|
+
# тикета) не покрыты ни одним агентом create-report. Это не фатально —
|
|
744
|
+
# завершаем пайплайн, отчёт не создан, но данные не теряются.
|
|
745
|
+
blocked: end
|
|
731
746
|
error:
|
|
732
747
|
stage: increment-create-report-attempts
|
|
733
748
|
|
|
@@ -758,6 +773,8 @@ pipeline:
|
|
|
758
773
|
params:
|
|
759
774
|
gaps: "$result.gaps"
|
|
760
775
|
report_id: "$context.report_id"
|
|
776
|
+
# blocked по тем же причинам, что и в create-report — завершаем пайплайн.
|
|
777
|
+
blocked: end
|
|
761
778
|
error:
|
|
762
779
|
stage: increment-analyze-report-attempts
|
|
763
780
|
|