workflow-ai 1.0.65 → 1.0.67

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.
Files changed (36) hide show
  1. package/README.md +377 -371
  2. package/configs/agent-health-rules.yaml +12 -1
  3. package/configs/pipeline.yaml +6 -6
  4. package/package.json +1 -1
  5. package/src/lib/agent-spawner.mjs +47 -6
  6. package/src/lib/error-classifier.mjs +311 -274
  7. package/src/runner.mjs +241 -58
  8. package/src/skills/coach/tests/cases/TC-COACH-001/current/meta.json +93 -93
  9. package/src/skills/coach/tests/cases/TC-COACH-002/current/meta.json +93 -93
  10. package/src/skills/create-plan/SKILL.md +1 -0
  11. package/src/skills/create-plan/knowledge/test-hygiene.md +47 -0
  12. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-005/current/meta.json +113 -113
  13. package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-001/current/meta.json +87 -87
  14. package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-005/current/meta.json +87 -87
  15. package/src/skills/review-result/SKILL.md +1 -0
  16. package/src/skills/review-result/knowledge/test-hygiene.md +44 -0
  17. package/src/skills/review-result/scripts/verify-artifacts.js +115 -2
  18. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-003/current/claude-sonnet/trial-1.md +7 -0
  19. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-003/current/claude-sonnet/trial-2.md +7 -0
  20. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-003/current/claude-sonnet/trial-3.md +7 -0
  21. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-003/current/judge.json +163 -0
  22. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-003/current/kilo-deepseek/trial-1.md +5 -0
  23. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-003/current/kilo-deepseek/trial-2.md +5 -0
  24. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-003/current/kilo-deepseek/trial-3.md +11 -0
  25. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-003/current/kilo-glm/trial-1.md +16 -0
  26. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-003/current/kilo-glm/trial-2.md +18 -0
  27. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-003/current/kilo-glm/trial-3.md +17 -0
  28. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-003/current/kilo-minimax/trial-1.md +17 -0
  29. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-003/current/kilo-minimax/trial-2.md +31 -0
  30. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-003/current/kilo-minimax/trial-3.md +5 -0
  31. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-003/current/meta.json +115 -0
  32. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-003-test-isolation.yaml +50 -0
  33. package/src/skills/review-result/tests/fixtures/QA-904-test-isolation-violation/QA-904.md +51 -0
  34. package/src/skills/review-result/tests/fixtures/QA-904-test-isolation-violation/example-test.mjs +36 -0
  35. package/src/skills/review-result/tests/index.yaml +5 -0
  36. package/src/skills/review-result/tests/rubrics/test-isolation.md +20 -0
@@ -1,94 +1,94 @@
1
- {
2
- "date": "2026-04-21T08:57:32.466Z",
3
- "skill_sha": "6df42d0",
4
- "status": "passed",
5
- "duration_ms": 2,
6
- "per_model": {
7
- "claude-sonnet": {
8
- "passed": true,
9
- "pass_count": 3,
10
- "total": 3,
11
- "threshold": 2
12
- },
13
- "kilo-deepseek": {
14
- "passed": true,
15
- "pass_count": 2,
16
- "total": 3,
17
- "threshold": 2
18
- },
19
- "kilo-minimax": {
20
- "passed": true,
21
- "pass_count": 3,
22
- "total": 3,
23
- "threshold": 2
24
- },
25
- "kilo-glm": {
26
- "passed": true,
27
- "pass_count": 3,
28
- "total": 3,
29
- "threshold": 2
30
- }
31
- },
32
- "rubric_scores": [
33
- {
34
- "agentId": "claude-sonnet",
35
- "trial": 1,
36
- "score": 5
37
- },
38
- {
39
- "agentId": "claude-sonnet",
40
- "trial": 2,
41
- "score": 5
42
- },
43
- {
44
- "agentId": "claude-sonnet",
45
- "trial": 3,
46
- "score": 5
47
- },
48
- {
49
- "agentId": "kilo-deepseek",
50
- "trial": 1,
51
- "score": 1
52
- },
53
- {
54
- "agentId": "kilo-deepseek",
55
- "trial": 2,
56
- "score": 5
57
- },
58
- {
59
- "agentId": "kilo-deepseek",
60
- "trial": 3,
61
- "score": 5
62
- },
63
- {
64
- "agentId": "kilo-minimax",
65
- "trial": 1,
66
- "score": 5
67
- },
68
- {
69
- "agentId": "kilo-minimax",
70
- "trial": 2,
71
- "score": 5
72
- },
73
- {
74
- "agentId": "kilo-minimax",
75
- "trial": 3,
76
- "score": 5
77
- },
78
- {
79
- "agentId": "kilo-glm",
80
- "trial": 1,
81
- "score": 5
82
- },
83
- {
84
- "agentId": "kilo-glm",
85
- "trial": 2,
86
- "score": 5
87
- },
88
- {
89
- "agentId": "kilo-glm",
90
- "trial": 3,
91
- "score": 5
92
- }
93
- ]
1
+ {
2
+ "date": "2026-04-23T08:08:11.039Z",
3
+ "skill_sha": "6df42d0",
4
+ "status": "passed",
5
+ "duration_ms": 2,
6
+ "per_model": {
7
+ "claude-sonnet": {
8
+ "passed": true,
9
+ "pass_count": 3,
10
+ "total": 3,
11
+ "threshold": 2
12
+ },
13
+ "kilo-deepseek": {
14
+ "passed": true,
15
+ "pass_count": 2,
16
+ "total": 3,
17
+ "threshold": 2
18
+ },
19
+ "kilo-minimax": {
20
+ "passed": true,
21
+ "pass_count": 3,
22
+ "total": 3,
23
+ "threshold": 2
24
+ },
25
+ "kilo-glm": {
26
+ "passed": true,
27
+ "pass_count": 3,
28
+ "total": 3,
29
+ "threshold": 2
30
+ }
31
+ },
32
+ "rubric_scores": [
33
+ {
34
+ "agentId": "claude-sonnet",
35
+ "trial": 1,
36
+ "score": 5
37
+ },
38
+ {
39
+ "agentId": "claude-sonnet",
40
+ "trial": 2,
41
+ "score": 5
42
+ },
43
+ {
44
+ "agentId": "claude-sonnet",
45
+ "trial": 3,
46
+ "score": 5
47
+ },
48
+ {
49
+ "agentId": "kilo-deepseek",
50
+ "trial": 1,
51
+ "score": 1
52
+ },
53
+ {
54
+ "agentId": "kilo-deepseek",
55
+ "trial": 2,
56
+ "score": 5
57
+ },
58
+ {
59
+ "agentId": "kilo-deepseek",
60
+ "trial": 3,
61
+ "score": 5
62
+ },
63
+ {
64
+ "agentId": "kilo-minimax",
65
+ "trial": 1,
66
+ "score": 5
67
+ },
68
+ {
69
+ "agentId": "kilo-minimax",
70
+ "trial": 2,
71
+ "score": 5
72
+ },
73
+ {
74
+ "agentId": "kilo-minimax",
75
+ "trial": 3,
76
+ "score": 5
77
+ },
78
+ {
79
+ "agentId": "kilo-glm",
80
+ "trial": 1,
81
+ "score": 5
82
+ },
83
+ {
84
+ "agentId": "kilo-glm",
85
+ "trial": 2,
86
+ "score": 5
87
+ },
88
+ {
89
+ "agentId": "kilo-glm",
90
+ "trial": 3,
91
+ "score": 5
92
+ }
93
+ ]
94
94
  }
@@ -39,6 +39,7 @@ description: >
39
39
  | `knowledge/plan-completeness.md` | **ВСЕГДА** — чеклист полноты плана, правила извлечения данных из ТЗ |
40
40
  | `knowledge/plan-lifecycle.md` | **ВСЕГДА** — статусы планов и правила их установки |
41
41
  | `knowledge/task-verification-pairs.md` | При наличии в плане задач тестирования/верификации ИЛИ задач, изменяющих код — правила TC-структуры: data assertions, entry points, config variations, persistence и парные задачи верификации |
42
+ | `knowledge/test-hygiene.md` | При наличии в плане задач на создание/правку автотестов — правила изоляции теста (корень изоляции, teardown, запрет на запись в рабочий репозиторий) |
42
43
  | `../shared/*` | **Перед началом работы** проверь `../shared/README.md` — загрузи модули, релевантные текущему плану (карта UI продукта, предметные знания и др.) |
43
44
 
44
45
  ## Загрузка алгоритмов
@@ -0,0 +1,47 @@
1
+ # Изоляция тестов в плане
2
+
3
+ Когда план содержит задачи на создание/правку автотестов, в **описании** задачи и в её DoD должно быть зафиксировано требование: **тест не пишет артефакты (файлы, директории, конфиги, БД) в рабочий репозиторий или в общие системные пути**. Все файловые операции теста — во временной директории, создаваемой стандартной библиотекой языка.
4
+
5
+ ## Зачем
6
+
7
+ Тесты, которые пишут в рабочий репозиторий:
8
+ - затирают файлы, нужные параллельно выполняющимся задачам/агентам проекта;
9
+ - оставляют "призрачный" state при прерывании (Ctrl+C, краш, таймаут) — следующий прогон подхватывает оставленные данные как настоящие и даёт ложный результат;
10
+ - делают тесты зависимыми от чистоты CWD — то же поведение на машине разработчика и в CI отличается;
11
+ - провоцируют ложные вердикты механических проверок, завязанных на mtime/наличие файлов (verify-artifacts, git-status-снапшоты);
12
+ - могут случайно коммититься в историю, если test-runner создал файл в tracked-директории.
13
+
14
+ ## Критерий проверки для плана
15
+
16
+ Каждая задача, результат которой — тестовый файл или правка тестового файла, должна явно описывать **корень изоляции**. Варианты:
17
+
18
+ | Источник корня | Когда подходит |
19
+ |----------------|----------------|
20
+ | Стандартный системный tmp языка | Тест создаёт одноразовое окружение на прогон (самое частое) |
21
+ | Специально выделенная fixtures-директория теста | Неизменяемые шаблонные данные, read-only |
22
+ | Изолированный git-worktree | Тест проверяет поведение на полноценной копии репо |
23
+ | Иной способ изоляции | Явно обоснован в плане: почему перечисленных выше недостаточно |
24
+
25
+ Если задача не попадает ни в один вариант — план должен явно обосновать, почему этот тест имеет право писать в рабочий репозиторий (например, тест-генератор, который коммитится в репо как артефакт).
26
+
27
+ **Конкретное имя функции стандартной библиотеки — на стороне исполнителя**, не на стороне плана. План фиксирует требование, не реализацию.
28
+
29
+ ## Что фиксировать в задаче плана
30
+
31
+ - **Корень изоляции** — один из вариантов из таблицы выше (или явно обоснованный иной).
32
+ - **Гарантия очистки** — тест обязан удалять созданный корень при любом исходе, включая падение assertion (teardown/after-hook, а не ad-hoc cleanup в конце test-функции).
33
+ - **Антипаттерн** — явный запрет на запись в реальные каталоги проекта (любые config-, data-, state-, cache-каталоги внутри корня репозитория).
34
+
35
+ ## Что фиксировать в DoD
36
+
37
+ - Пункт DoD явно требует изолированный корень (формулировка вроде «тест создаёт и уничтожает tmp-корень, не пишет в рабочий репозиторий»).
38
+ - При наличии соседних тестовых файлов в модуле — пункт DoD требует сверки с уже принятым в проекте паттерном изоляции (не изобретать новый способ).
39
+
40
+ ## Self-check при создании плана
41
+
42
+ Перед сохранением плана ответь себе по каждой задаче, результат которой связан с тестами:
43
+ 1. Указан ли корень изоляции в описании задачи?
44
+ 2. Зафиксирован ли teardown в DoD?
45
+ 3. Есть ли в проекте уже принятый паттерн изоляции, и задача ссылается на него?
46
+
47
+ Если хотя бы на один вопрос "нет" — задача недооформлена.
@@ -1,114 +1,114 @@
1
- {
2
- "date": "2026-04-21T08:57:32.485Z",
3
- "skill_sha": "3f91270",
4
- "status": "passed",
5
- "duration_ms": 4,
6
- "per_model": {
7
- "claude-sonnet": {
8
- "passed": true,
9
- "errored": false,
10
- "pass_count": 3,
11
- "error_count": 0,
12
- "total": 3,
13
- "threshold": 2
14
- },
15
- "kilo-glm": {
16
- "passed": true,
17
- "errored": false,
18
- "pass_count": 3,
19
- "error_count": 0,
20
- "total": 3,
21
- "threshold": 2
22
- },
23
- "kilo-minimax": {
24
- "passed": true,
25
- "errored": false,
26
- "pass_count": 2,
27
- "error_count": 0,
28
- "total": 3,
29
- "threshold": 2
30
- },
31
- "kilo-deepseek": {
32
- "passed": true,
33
- "errored": false,
34
- "pass_count": 2,
35
- "error_count": 0,
36
- "total": 3,
37
- "threshold": 2
38
- }
39
- },
40
- "rubric_scores": [
41
- {
42
- "agentId": "claude-sonnet",
43
- "trial": 1,
44
- "score": 5,
45
- "errored": false
46
- },
47
- {
48
- "agentId": "claude-sonnet",
49
- "trial": 2,
50
- "score": 5,
51
- "errored": false
52
- },
53
- {
54
- "agentId": "claude-sonnet",
55
- "trial": 3,
56
- "score": 5,
57
- "errored": false
58
- },
59
- {
60
- "agentId": "kilo-deepseek",
61
- "trial": 1,
62
- "score": 1,
63
- "errored": false
64
- },
65
- {
66
- "agentId": "kilo-deepseek",
67
- "trial": 2,
68
- "score": 5,
69
- "errored": false
70
- },
71
- {
72
- "agentId": "kilo-deepseek",
73
- "trial": 3,
74
- "score": 5,
75
- "errored": false
76
- },
77
- {
78
- "agentId": "kilo-glm",
79
- "trial": 1,
80
- "score": 5,
81
- "errored": false
82
- },
83
- {
84
- "agentId": "kilo-glm",
85
- "trial": 2,
86
- "score": 5,
87
- "errored": false
88
- },
89
- {
90
- "agentId": "kilo-glm",
91
- "trial": 3,
92
- "score": 5,
93
- "errored": false
94
- },
95
- {
96
- "agentId": "kilo-minimax",
97
- "trial": 1,
98
- "score": 5,
99
- "errored": false
100
- },
101
- {
102
- "agentId": "kilo-minimax",
103
- "trial": 2,
104
- "score": 5,
105
- "errored": false
106
- },
107
- {
108
- "agentId": "kilo-minimax",
109
- "trial": 3,
110
- "score": 1,
111
- "errored": false
112
- }
113
- ]
1
+ {
2
+ "date": "2026-04-23T08:08:11.073Z",
3
+ "skill_sha": "3f91270",
4
+ "status": "passed",
5
+ "duration_ms": 10,
6
+ "per_model": {
7
+ "claude-sonnet": {
8
+ "passed": true,
9
+ "errored": false,
10
+ "pass_count": 3,
11
+ "error_count": 0,
12
+ "total": 3,
13
+ "threshold": 2
14
+ },
15
+ "kilo-glm": {
16
+ "passed": true,
17
+ "errored": false,
18
+ "pass_count": 3,
19
+ "error_count": 0,
20
+ "total": 3,
21
+ "threshold": 2
22
+ },
23
+ "kilo-minimax": {
24
+ "passed": true,
25
+ "errored": false,
26
+ "pass_count": 2,
27
+ "error_count": 0,
28
+ "total": 3,
29
+ "threshold": 2
30
+ },
31
+ "kilo-deepseek": {
32
+ "passed": true,
33
+ "errored": false,
34
+ "pass_count": 2,
35
+ "error_count": 0,
36
+ "total": 3,
37
+ "threshold": 2
38
+ }
39
+ },
40
+ "rubric_scores": [
41
+ {
42
+ "agentId": "claude-sonnet",
43
+ "trial": 1,
44
+ "score": 5,
45
+ "errored": false
46
+ },
47
+ {
48
+ "agentId": "claude-sonnet",
49
+ "trial": 2,
50
+ "score": 5,
51
+ "errored": false
52
+ },
53
+ {
54
+ "agentId": "claude-sonnet",
55
+ "trial": 3,
56
+ "score": 5,
57
+ "errored": false
58
+ },
59
+ {
60
+ "agentId": "kilo-deepseek",
61
+ "trial": 1,
62
+ "score": 1,
63
+ "errored": false
64
+ },
65
+ {
66
+ "agentId": "kilo-deepseek",
67
+ "trial": 2,
68
+ "score": 5,
69
+ "errored": false
70
+ },
71
+ {
72
+ "agentId": "kilo-deepseek",
73
+ "trial": 3,
74
+ "score": 5,
75
+ "errored": false
76
+ },
77
+ {
78
+ "agentId": "kilo-glm",
79
+ "trial": 1,
80
+ "score": 5,
81
+ "errored": false
82
+ },
83
+ {
84
+ "agentId": "kilo-glm",
85
+ "trial": 2,
86
+ "score": 5,
87
+ "errored": false
88
+ },
89
+ {
90
+ "agentId": "kilo-glm",
91
+ "trial": 3,
92
+ "score": 5,
93
+ "errored": false
94
+ },
95
+ {
96
+ "agentId": "kilo-minimax",
97
+ "trial": 1,
98
+ "score": 5,
99
+ "errored": false
100
+ },
101
+ {
102
+ "agentId": "kilo-minimax",
103
+ "trial": 2,
104
+ "score": 5,
105
+ "errored": false
106
+ },
107
+ {
108
+ "agentId": "kilo-minimax",
109
+ "trial": 3,
110
+ "score": 1,
111
+ "errored": false
112
+ }
113
+ ]
114
114
  }
@@ -1,88 +1,88 @@
1
- {
2
- "date": "2026-04-21T08:57:32.494Z",
3
- "skill_sha": "1503ea1",
4
- "status": "passed",
5
- "duration_ms": 1,
6
- "per_model": {
7
- "claude-haiku": {
8
- "passed": true,
9
- "errored": false,
10
- "pass_count": 3,
11
- "error_count": 0,
12
- "total": 3,
13
- "threshold": 2
14
- },
15
- "kilo-free": {
16
- "passed": true,
17
- "errored": false,
18
- "pass_count": 3,
19
- "error_count": 0,
20
- "total": 3,
21
- "threshold": 2
22
- },
23
- "kilo-glm-air": {
24
- "passed": true,
25
- "errored": false,
26
- "pass_count": 3,
27
- "error_count": 0,
28
- "total": 3,
29
- "threshold": 2
30
- }
31
- },
32
- "rubric_scores": [
33
- {
34
- "agentId": "claude-haiku",
35
- "trial": 1,
36
- "score": 4,
37
- "errored": false
38
- },
39
- {
40
- "agentId": "claude-haiku",
41
- "trial": 2,
42
- "score": 4,
43
- "errored": false
44
- },
45
- {
46
- "agentId": "claude-haiku",
47
- "trial": 3,
48
- "score": 4,
49
- "errored": false
50
- },
51
- {
52
- "agentId": "kilo-free",
53
- "trial": 1,
54
- "score": 4,
55
- "errored": false
56
- },
57
- {
58
- "agentId": "kilo-free",
59
- "trial": 2,
60
- "score": 4,
61
- "errored": false
62
- },
63
- {
64
- "agentId": "kilo-free",
65
- "trial": 3,
66
- "score": 4,
67
- "errored": false
68
- },
69
- {
70
- "agentId": "kilo-glm-air",
71
- "trial": 1,
72
- "score": 4,
73
- "errored": false
74
- },
75
- {
76
- "agentId": "kilo-glm-air",
77
- "trial": 2,
78
- "score": 4,
79
- "errored": false
80
- },
81
- {
82
- "agentId": "kilo-glm-air",
83
- "trial": 3,
84
- "score": 4,
85
- "errored": false
86
- }
87
- ]
1
+ {
2
+ "date": "2026-04-23T08:08:11.087Z",
3
+ "skill_sha": "1503ea1",
4
+ "status": "passed",
5
+ "duration_ms": 2,
6
+ "per_model": {
7
+ "claude-haiku": {
8
+ "passed": true,
9
+ "errored": false,
10
+ "pass_count": 3,
11
+ "error_count": 0,
12
+ "total": 3,
13
+ "threshold": 2
14
+ },
15
+ "kilo-free": {
16
+ "passed": true,
17
+ "errored": false,
18
+ "pass_count": 3,
19
+ "error_count": 0,
20
+ "total": 3,
21
+ "threshold": 2
22
+ },
23
+ "kilo-glm-air": {
24
+ "passed": true,
25
+ "errored": false,
26
+ "pass_count": 3,
27
+ "error_count": 0,
28
+ "total": 3,
29
+ "threshold": 2
30
+ }
31
+ },
32
+ "rubric_scores": [
33
+ {
34
+ "agentId": "claude-haiku",
35
+ "trial": 1,
36
+ "score": 4,
37
+ "errored": false
38
+ },
39
+ {
40
+ "agentId": "claude-haiku",
41
+ "trial": 2,
42
+ "score": 4,
43
+ "errored": false
44
+ },
45
+ {
46
+ "agentId": "claude-haiku",
47
+ "trial": 3,
48
+ "score": 4,
49
+ "errored": false
50
+ },
51
+ {
52
+ "agentId": "kilo-free",
53
+ "trial": 1,
54
+ "score": 4,
55
+ "errored": false
56
+ },
57
+ {
58
+ "agentId": "kilo-free",
59
+ "trial": 2,
60
+ "score": 4,
61
+ "errored": false
62
+ },
63
+ {
64
+ "agentId": "kilo-free",
65
+ "trial": 3,
66
+ "score": 4,
67
+ "errored": false
68
+ },
69
+ {
70
+ "agentId": "kilo-glm-air",
71
+ "trial": 1,
72
+ "score": 4,
73
+ "errored": false
74
+ },
75
+ {
76
+ "agentId": "kilo-glm-air",
77
+ "trial": 2,
78
+ "score": 4,
79
+ "errored": false
80
+ },
81
+ {
82
+ "agentId": "kilo-glm-air",
83
+ "trial": 3,
84
+ "score": 4,
85
+ "errored": false
86
+ }
87
+ ]
88
88
  }