workflow-ai 1.0.68 → 1.1.0

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 (44) hide show
  1. package/package.json +10 -7
  2. package/src/lib/operations/plans.mjs +85 -0
  3. package/src/lib/operations/skills.mjs +124 -0
  4. package/src/lib/operations/tickets.mjs +332 -0
  5. package/src/scripts/get-next-id.js +39 -165
  6. package/src/scripts/move-ticket.js +68 -225
  7. package/src/scripts/pick-next-task.js +93 -759
  8. package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-001/current/claude-sonnet/trial-1.md +4 -68
  9. package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-001/current/claude-sonnet/trial-2.md +53 -58
  10. package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-001/current/claude-sonnet/trial-3.md +48 -48
  11. package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-001/current/judge.json +15 -15
  12. package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-001/current/meta.json +16 -16
  13. package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-002/current/claude-sonnet/trial-3.md +4 -76
  14. package/src/skills/coach/tests/cases/TC-COACH-001/current/meta.json +93 -93
  15. package/src/skills/coach/tests/cases/TC-COACH-002/current/meta.json +93 -93
  16. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-005/current/meta.json +113 -113
  17. package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-001/current/meta.json +87 -87
  18. package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-005/current/meta.json +87 -87
  19. package/src/skills/review-result/SKILL.md +1 -0
  20. package/src/skills/review-result/knowledge/baseline-snapshot-validation.md +67 -0
  21. package/src/skills/review-result/knowledge/dod-patterns.md +1 -0
  22. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-001/current/claude-sonnet/trial-1.md +2 -2
  23. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-001/current/claude-sonnet/trial-2.md +2 -2
  24. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-001/current/claude-sonnet/trial-3.md +2 -14
  25. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-001/current/judge.json +18 -18
  26. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-001/current/meta.json +20 -20
  27. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-002/current/claude-sonnet/trial-2.md +2 -34
  28. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-002/current/judge.json +19 -19
  29. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-002/current/meta.json +21 -21
  30. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-003/current/claude-sonnet/trial-1.md +36 -3
  31. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-003/current/claude-sonnet/trial-2.md +11 -3
  32. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-003/current/claude-sonnet/trial-3.md +3 -3
  33. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-003/current/judge.json +18 -18
  34. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-003/current/meta.json +20 -20
  35. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-004/current/claude-sonnet/trial-1.md +5 -0
  36. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-004/current/claude-sonnet/trial-2.md +5 -0
  37. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-004/current/claude-sonnet/trial-3.md +6 -0
  38. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-004/current/judge.json +46 -0
  39. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-004/current/meta.json +37 -0
  40. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-004-baseline-snapshot.yaml +50 -0
  41. package/src/skills/review-result/tests/fixtures/QA-905-baseline-regex-instead-of-snapshot/QA-905.md +62 -0
  42. package/src/skills/review-result/tests/fixtures/QA-905-baseline-regex-instead-of-snapshot/baseline.test.mjs +124 -0
  43. package/src/skills/review-result/tests/index.yaml +5 -0
  44. package/src/skills/review-result/tests/rubrics/baseline-snapshot.md +20 -0
@@ -13,6 +13,7 @@
13
13
  | Код проходит линтер | `compilation` | Запустить lint |
14
14
  | Реализована функция X | `text` | Проверить наличие функции, её сигнатуру и логику |
15
15
  | Тесты на маппинг/парсинг данных | `tests` + `text` | Проверить, что тестовые fixtures содержат **реальные** значения из runtime-источника (лог, конфиг, API), а не синтетические. Прочитать источник данных и сверить с fixtures. Если fixtures не соответствуют реальным данным — тесты тавтологичны |
16
+ | Baseline / snapshot / эталон / regression-фиксация | `tests` + `structure` | Проверка способа реализации теста (точное сравнение нормализованного output с литералом-эталоном vs регекс/includes по подстроке). См. `knowledge/baseline-snapshot-validation.md` — обязательная загрузка при триггерных формулировках DoD. |
16
17
  | Документация обновлена | `text` | Проверить JSDoc / README / комментарии |
17
18
 
18
19
  ### fix (исправление бага)
@@ -1,6 +1,6 @@
1
1
  ---RESULT---
2
2
  status: failed
3
3
  issues:
4
- - "DoD пп.1-3 (все визуальные критерии): evidence отсутствует нет скриншотов, нет a11y assertions, нет описания шагов тестирования. Result содержит только текстовое утверждение «проверял локально в браузере», что не является верифицируемым доказательством визуального соответствия. По п.5.1 workflow: FAIL если не приложил evidence (ни a11y assertion, ни описания шагов). [HIGH]"
5
- - "Файл src/components/SubmitButton.tsx указан в «Изменённые файлы», но физически не существует в рабочей директории. [HIGH]"
4
+ - "DoD пункт 1 «Кнопка визуально соответствует макету» не верифицирован: визуальный критерий требует скриншот как evidence (шаг 4.7, триггер B), однако скриншоты не приложены. Исполнитель явно подтвердил: «Скриншоты не прикладывал проверял локально в браузере». Визуальное соответствие макету не может быть подтверждено без визуального артефакта. [HIGH]"
5
+ - "QA-тикет не содержит требуемого evidence: отсутствуют a11y assertion и детальное описание шагов воспроизведения. Фраза «проверял локально в браузере» не является достаточным evidence по правилам шага 5.1."
6
6
  ---RESULT---
@@ -1,6 +1,6 @@
1
1
  ---RESULT---
2
2
  status: failed
3
3
  issues:
4
- - "DoD п.1 «Кнопка визуально соответствует макету»: визуальный критерий не подтверждён скриншоты не приложены, исполнитель сообщил о проверке локально в браузере без визуального артефакта. Шаг 4.7.0: HIGH issue ревьюер не может подтвердить визуальное соответствие макету без скриншота."
5
- - "Файл src/components/SubmitButton.tsx указан в «Изменённые файлы», но физически не существует в рабочей директории."
4
+ - "DoD п.1 «Кнопка визуально соответствует макету» не подтверждён: ожидалось визуальное evidence (скриншот или a11y assertion), получено только текстовое утверждение «проверял локально в браузере» без артефактов. Файл скриншота не приложен и физически не существует."
5
+ - "Файл-артефакт src/components/SubmitButton.tsx физически отсутствует в репозитории."
6
6
  ---RESULT---
@@ -1,18 +1,6 @@
1
- **Анализ:**
2
-
3
- Тикет QA-901 содержит три визуальных DoD-критерия. Триггер B по шагу 4.7 сработал: «Кнопка визуально соответствует макету» — явная визуальная формулировка.
4
-
5
- **Шаг 4.7.0:** Поиск скриншотов дал пустой результат. Исполнитель явно написал: *«Скриншоты не прикладывал — проверял локально в браузере»*. Визуальные evidence полностью отсутствуют.
6
-
7
- **По правилу 5.1 (QA-тикеты):** Тестировщик не приложил ни a11y assertion, ни описания шагов, ни скриншотов → FAIL.
8
-
9
- **Дополнительно:** файл `src/components/SubmitButton.tsx` физически не найден в рабочей директории.
10
-
11
1
  ---RESULT---
12
2
  status: failed
13
3
  issues:
14
- - "DoD п.1 «Кнопка визуально соответствует макету»: визуальный критерий без evidence (HIGH) — скриншоты не найдены, исполнитель явно указал что их не прикладывал. Ревьюер не может подтвердить соответствие макету без визуального артефакта."
15
- - "DoD п.2 «Цвет кнопки совпадает с design tokens»: отсутствует evidence (нет скриншота, нет ссылки на токены, нет assertion)."
16
- - "DoD п.3 «Скругление углов 8px»: отсутствует evidence (нет скриншота, нет CSS-проверки)."
17
- - "Файл src/components/SubmitButton.tsx физически не найден в рабочей директории."
4
+ - "Пункт DoD 1 не выполнен: визуальный критерий «Кнопка визуально соответствует макету» не подтверждён — скриншоты отсутствуют физически, executor явно указал «скриншоты не прикладывал». Визуальное свойство не может быть верифицировано без визуального артефакта. [HIGH, шаг 4.7.0]"
5
+ - "Отсутствует evidence для всех трёх пунктов DoD: в секции Result нет a11y tree assertion, DOM-проверок, пошагового описания тест-шагов с ожидаемым/фактическим результатом. Указано только «проверял локально в браузере» недостаточно для QA-тикета (шаг 5.1: «не приложил evidence»)."
18
6
  ---RESULT---
@@ -87,78 +87,78 @@
87
87
  },
88
88
  "rubric_scores": [
89
89
  {
90
- "agentId": "claude-sonnet",
90
+ "agentId": "kilo-deepseek",
91
91
  "trial": 1,
92
- "score": 5,
93
- "errored": false
92
+ "score": null,
93
+ "errored": true,
94
+ "error": "Stage \"TC-REVIEW-RESULT-001-kilo-deepseek-trial-1\" timed out after 1200s"
94
95
  },
95
96
  {
96
- "agentId": "claude-sonnet",
97
+ "agentId": "kilo-deepseek",
97
98
  "trial": 2,
98
99
  "score": 5,
99
100
  "errored": false
100
101
  },
101
102
  {
102
- "agentId": "claude-sonnet",
103
+ "agentId": "kilo-deepseek",
103
104
  "trial": 3,
104
105
  "score": 5,
105
106
  "errored": false
106
107
  },
107
108
  {
108
- "agentId": "kilo-deepseek",
109
+ "agentId": "kilo-glm",
109
110
  "trial": 1,
110
- "score": null,
111
- "errored": true,
112
- "error": "Stage \"TC-REVIEW-RESULT-001-kilo-deepseek-trial-1\" timed out after 1200s"
111
+ "score": 5,
112
+ "errored": false
113
113
  },
114
114
  {
115
- "agentId": "kilo-deepseek",
115
+ "agentId": "kilo-glm",
116
116
  "trial": 2,
117
117
  "score": 5,
118
118
  "errored": false
119
119
  },
120
120
  {
121
- "agentId": "kilo-deepseek",
121
+ "agentId": "kilo-glm",
122
122
  "trial": 3,
123
123
  "score": 5,
124
124
  "errored": false
125
125
  },
126
126
  {
127
- "agentId": "kilo-glm",
127
+ "agentId": "kilo-minimax",
128
128
  "trial": 1,
129
129
  "score": 5,
130
130
  "errored": false
131
131
  },
132
132
  {
133
- "agentId": "kilo-glm",
133
+ "agentId": "kilo-minimax",
134
134
  "trial": 2,
135
135
  "score": 5,
136
136
  "errored": false
137
137
  },
138
138
  {
139
- "agentId": "kilo-glm",
139
+ "agentId": "kilo-minimax",
140
140
  "trial": 3,
141
141
  "score": 5,
142
142
  "errored": false
143
143
  },
144
144
  {
145
- "agentId": "kilo-minimax",
145
+ "agentId": "claude-sonnet",
146
146
  "trial": 1,
147
147
  "score": 5,
148
148
  "errored": false
149
149
  },
150
150
  {
151
- "agentId": "kilo-minimax",
151
+ "agentId": "claude-sonnet",
152
152
  "trial": 2,
153
153
  "score": 5,
154
154
  "errored": false
155
155
  },
156
156
  {
157
- "agentId": "kilo-minimax",
157
+ "agentId": "claude-sonnet",
158
158
  "trial": 3,
159
159
  "score": 5,
160
160
  "errored": false
161
161
  }
162
162
  ],
163
- "timestamp": "2026-04-20T06:17:58.717Z"
163
+ "timestamp": "2026-04-25T07:11:20.099Z"
164
164
  }
@@ -1,8 +1,8 @@
1
1
  {
2
- "date": "2026-04-20T06:17:58.726Z",
3
- "skill_sha": "5f441e3",
2
+ "date": "2026-04-25T07:11:20.108Z",
3
+ "skill_sha": "b6cda8a",
4
4
  "status": "passed",
5
- "duration_ms": 1206439,
5
+ "duration_ms": 138941,
6
6
  "l1_skipped": true,
7
7
  "per_model": {
8
8
  "claude-sonnet": {
@@ -40,74 +40,74 @@
40
40
  },
41
41
  "rubric_scores": [
42
42
  {
43
- "agentId": "claude-sonnet",
43
+ "agentId": "kilo-deepseek",
44
44
  "trial": 1,
45
- "score": 5,
46
- "errored": false
45
+ "score": null,
46
+ "errored": true,
47
+ "error": "Stage \"TC-REVIEW-RESULT-001-kilo-deepseek-trial-1\" timed out after 1200s"
47
48
  },
48
49
  {
49
- "agentId": "claude-sonnet",
50
+ "agentId": "kilo-deepseek",
50
51
  "trial": 2,
51
52
  "score": 5,
52
53
  "errored": false
53
54
  },
54
55
  {
55
- "agentId": "claude-sonnet",
56
+ "agentId": "kilo-deepseek",
56
57
  "trial": 3,
57
58
  "score": 5,
58
59
  "errored": false
59
60
  },
60
61
  {
61
- "agentId": "kilo-deepseek",
62
+ "agentId": "kilo-glm",
62
63
  "trial": 1,
63
- "score": null,
64
- "errored": true,
65
- "error": "Stage \"TC-REVIEW-RESULT-001-kilo-deepseek-trial-1\" timed out after 1200s"
64
+ "score": 5,
65
+ "errored": false
66
66
  },
67
67
  {
68
- "agentId": "kilo-deepseek",
68
+ "agentId": "kilo-glm",
69
69
  "trial": 2,
70
70
  "score": 5,
71
71
  "errored": false
72
72
  },
73
73
  {
74
- "agentId": "kilo-deepseek",
74
+ "agentId": "kilo-glm",
75
75
  "trial": 3,
76
76
  "score": 5,
77
77
  "errored": false
78
78
  },
79
79
  {
80
- "agentId": "kilo-glm",
80
+ "agentId": "kilo-minimax",
81
81
  "trial": 1,
82
82
  "score": 5,
83
83
  "errored": false
84
84
  },
85
85
  {
86
- "agentId": "kilo-glm",
86
+ "agentId": "kilo-minimax",
87
87
  "trial": 2,
88
88
  "score": 5,
89
89
  "errored": false
90
90
  },
91
91
  {
92
- "agentId": "kilo-glm",
92
+ "agentId": "kilo-minimax",
93
93
  "trial": 3,
94
94
  "score": 5,
95
95
  "errored": false
96
96
  },
97
97
  {
98
- "agentId": "kilo-minimax",
98
+ "agentId": "claude-sonnet",
99
99
  "trial": 1,
100
100
  "score": 5,
101
101
  "errored": false
102
102
  },
103
103
  {
104
- "agentId": "kilo-minimax",
104
+ "agentId": "claude-sonnet",
105
105
  "trial": 2,
106
106
  "score": 5,
107
107
  "errored": false
108
108
  },
109
109
  {
110
- "agentId": "kilo-minimax",
110
+ "agentId": "claude-sonnet",
111
111
  "trial": 3,
112
112
  "score": 5,
113
113
  "errored": false
@@ -1,36 +1,4 @@
1
- Теперь у меня достаточно данных для вердикта.
2
-
3
- **Разбор тикета IMPL-902:**
4
-
5
- **Шаг 0**: Секции `## Ревью` нет → полная проверка.
6
-
7
- **Путь с line-range нотацией**: `src/background/index.ts:204-211` → файл `src/background/index.ts`, строки 204–211. Суффикс `:204-211` корректно распознан как указание на диапазон строк, не часть имени файла. Файл найден: `/d/Dev/PulseProxy/src/background/index.ts` существует.
8
-
9
- **Содержимое строк 204–211:**
10
- ```typescript
11
- // Bypass HTTP cache — the test must hit the network via PAC, not return a cached response.
12
- response = await fetch(url, {
13
- signal: AbortSignal.timeout(CHECK_PROXY_TIMEOUT_MS),
14
- cache: 'no-store',
15
- headers: {
16
- 'Cache-Control': 'no-cache',
17
- 'Pragma': 'no-cache',
18
- },
19
- });
20
- ```
21
- Это HTTP cache bypass для PAC-проверки, **не логика парсинга URL с query string**.
22
-
23
- **Проверка DoD:**
24
-
25
- - **[x] Парсер обрабатывает URL с query string без потери параметров** — строки 204–211 содержат `fetch()` с cache-bypass заголовками. Паттерны `parseUrl`, `parseRedirect`, `queryString`, `redirect_to` в `src/background/index.ts` не найдены. Критерий **не подтверждён**.
26
-
27
- - **[x] Добавлен unit-тест на edge-case с пустым `redirect_to`** — поиск `redirect_to` по всем `.ts` файлам PulseProxy дал 0 результатов. Unit-тест не найден. Критерий **не подтверждён**.
28
-
29
- **Result**: заполнен содержательно ("Логика парсинга вынесена в отдельную функцию, добавлен тест. Все пункты DoD выполнены."), но заявленные артефакты отсутствуют.
30
-
31
1
  ---RESULT---
32
- status: failed
33
- issues:
34
- - "DoD п.1 не подтверждён: строки 204-211 файла src/background/index.ts содержат HTTP cache bypass (fetch + 'cache: no-store'), а не логику парсинга URL с query string. Функция парсинга URL и обработки параметра redirect_to в указанном диапазоне строк и во всём файле не обнаружена."
35
- - "DoD п.2 не подтверждён: поиск `redirect_to` по всем .ts файлам проекта дал 0 результатов — unit-тест на edge-case с пустым redirect_to отсутствует."
2
+ status: passed
3
+ issues: []
36
4
  ---RESULT---
@@ -86,24 +86,6 @@
86
86
  }
87
87
  },
88
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
89
  {
108
90
  "agentId": "kilo-deepseek",
109
91
  "trial": 1,
@@ -157,7 +139,25 @@
157
139
  "trial": 3,
158
140
  "score": 5,
159
141
  "errored": false
142
+ },
143
+ {
144
+ "agentId": "claude-sonnet",
145
+ "trial": 1,
146
+ "score": 5,
147
+ "errored": false
148
+ },
149
+ {
150
+ "agentId": "claude-sonnet",
151
+ "trial": 2,
152
+ "score": 5,
153
+ "errored": false
154
+ },
155
+ {
156
+ "agentId": "claude-sonnet",
157
+ "trial": 3,
158
+ "score": 5,
159
+ "errored": false
160
160
  }
161
161
  ],
162
- "timestamp": "2026-04-20T06:04:48.924Z"
162
+ "timestamp": "2026-04-25T07:11:16.170Z"
163
163
  }
@@ -1,8 +1,8 @@
1
1
  {
2
- "date": "2026-04-20T06:04:48.938Z",
3
- "skill_sha": "5f441e3",
2
+ "date": "2026-04-25T07:11:16.181Z",
3
+ "skill_sha": "b6cda8a",
4
4
  "status": "passed",
5
- "duration_ms": 409427,
5
+ "duration_ms": 132102,
6
6
  "l1_skipped": true,
7
7
  "per_model": {
8
8
  "claude-sonnet": {
@@ -39,24 +39,6 @@
39
39
  }
40
40
  },
41
41
  "rubric_scores": [
42
- {
43
- "agentId": "claude-sonnet",
44
- "trial": 1,
45
- "score": 5,
46
- "errored": false
47
- },
48
- {
49
- "agentId": "claude-sonnet",
50
- "trial": 2,
51
- "score": 5,
52
- "errored": false
53
- },
54
- {
55
- "agentId": "claude-sonnet",
56
- "trial": 3,
57
- "score": 5,
58
- "errored": false
59
- },
60
42
  {
61
43
  "agentId": "kilo-deepseek",
62
44
  "trial": 1,
@@ -110,6 +92,24 @@
110
92
  "trial": 3,
111
93
  "score": 5,
112
94
  "errored": false
95
+ },
96
+ {
97
+ "agentId": "claude-sonnet",
98
+ "trial": 1,
99
+ "score": 5,
100
+ "errored": false
101
+ },
102
+ {
103
+ "agentId": "claude-sonnet",
104
+ "trial": 2,
105
+ "score": 5,
106
+ "errored": false
107
+ },
108
+ {
109
+ "agentId": "claude-sonnet",
110
+ "trial": 3,
111
+ "score": 5,
112
+ "errored": false
113
113
  }
114
114
  ]
115
115
  }
@@ -1,7 +1,40 @@
1
+ **Проверка DoD тикета QA-904:**
2
+
3
+ **Пункт 1** `[x]` Файл создан — подтверждён наличием содержимого. ✓
4
+
5
+ **Пункт 2** `[x]` Тест проходит — указано в условии задачи. ✓
6
+
7
+ **Пункт 3** `[x]` Изоляция — НАРУШЕНА. Три красных флага:
8
+
9
+ 1. **Корень артефактов в рабочем репозитории:**
10
+ ```js
11
+ const testProjectRoot = join(__dirname, '..', '..'); // строки 16-17
12
+ const testConfigPath = join(testProjectRoot, '.workflow', 'config', 'sample.yaml');
13
+ ```
14
+ Путь строится через `__dirname` с подъёмом к корню репозитория — не через стандартный системный tmp (`os.tmpdir()` / `mkdtemp`).
15
+
16
+ 2. **Cleanup удаляет конкретный файл, а не весь tmp-корень:**
17
+ ```js
18
+ try { rmSync(testConfigPath); } catch (e) {} // строка 31
19
+ ```
20
+ При прерывании до этой строки файл `.workflow/config/sample.yaml` останется в рабочем репозитории.
21
+
22
+ 3. **Cleanup в теле test-функции, а не в teardown/after-hook:**
23
+ ```js
24
+ test('...', () => {
25
+ createTestConfig('key: value\n');
26
+ assert.ok(true);
27
+ cleanupTestConfig(); // строка 37 — не защищён от падения assertion
28
+ });
29
+ ```
30
+ Если `assert.ok(true)` было бы `assert.ok(false)`, cleanup не выполнится.
31
+
32
+ Пункт DoD «не пишет в рабочий репозиторий (изоляция в teardown/after-hook)» не выполнен, несмотря на отметку `[x]`.
33
+
1
34
  ---RESULT---
2
35
  status: failed
3
36
  issues:
4
- - "Пункт DoD #3 не выполнен: тест пишет в рабочий репозиторий `const testProjectRoot = join(__dirname, '..', '..')` (example-test.mjs:17) строит корень артефактов от __dirname внутри репозитория, а не от системного tmp-корня"
5
- - "Пункт DoD #3 не выполнен: cleanup удаляет конкретный файл `rmSync(testConfigPath)` (example-test.mjs:32), а не весь tmp-корень — при прерывании до cleanup файл `.workflow/config/sample.yaml` остаётся в рабочем репозитории"
6
- - "Пункт DoD #3 не выполнен: cleanup вызывается в теле test-функции (example-test.mjs:35), а не в teardown/after-hook падение assertion до cleanup = утечка state"
37
+ - "Пункт DoD 3 нарушен тест пишет в рабочий репозиторий: `const testProjectRoot = join(__dirname, '..', '..')` (example-test.mjs:16-17) указывает на корень репозитория, а не на системный tmp. Ожидалось: корень артефактов через os.tmpdir()/mkdtemp, получено: путь внутри .workflow/config/ рабочего репозитория."
38
+ - "Пункт DoD 3 нарушен cleanup удаляет конкретный файл, а не tmp-корень: `rmSync(testConfigPath)` (example-test.mjs:31). При прерывании до cleanup файл .workflow/config/sample.yaml останется в репозитории."
39
+ - "Пункт DoD 3 нарушен cleanup вызывается в теле test-функции (example-test.mjs:37), а не в teardown/after-hook. Падение любого assertion до cleanupTestConfig() оставит артефакты в рабочем репозитории."
7
40
  ---RESULT---
@@ -1,7 +1,15 @@
1
+ Я прочитал тикет и тест-файл. Провожу проверку по DoD.
2
+
3
+ **DoD пункт 3** — "Тест создаёт и уничтожает tmp-корень, не пишет в рабочий репозиторий (изоляция в teardown/after-hook)" — нарушен по трём основаниям:
4
+
5
+ 1. `const testProjectRoot = join(__dirname, '..', '..')` — путь к артефактам строится от `__dirname` с подъёмом к корню репозитория, без префикса системного tmp.
6
+ 2. `writeFileSync(testConfigPath, content)` — файл создаётся в `.workflow/config/sample.yaml` внутри рабочего репозитория.
7
+ 3. `cleanupTestConfig()` вызывается в теле `test`, а не в teardown/after-hook — при падении assertion до этой строки файл останется в репозитории. Плюс удаляется конкретный файл, а не весь tmp-корень.
8
+
1
9
  ---RESULT---
2
10
  status: failed
3
11
  issues:
4
- - "DoD пункт 3 не выполнен: тест пишет в рабочий репозиторий, а не в системный tmp-корень. Строка `const testProjectRoot = join(__dirname, '..', '..')` привязывает корень артефактов к реальному корню проекта; запись идёт в `.workflow/config/sample.yaml` внутри рабочего репозитория. Ожидалось: использование `os.tmpdir()` / `fs.mkdtempSync` как корня."
5
- - "DoD пункт 3 не выполнен: cleanup (`rmSync(testConfigPath)`) удаляет конкретный файл, а не весь tmp-корень рекурсивно. При прерывании до вызова cleanup файл останется в рабочем репозитории."
6
- - "DoD пункт 3 не выполнен: `cleanupTestConfig()` вызывается в теле тест-функции, а не в teardown/after-hook. Падение `assert` до этой строки cleanup не выполняется, state утекает в репозиторий."
12
+ - "Пункт DoD 3 не выполнен (изоляция): корень артефактов привязан к рабочему репозиторию через `const testProjectRoot = join(__dirname, '..', '..')` (example-test.mjs:16), запись идёт в `.workflow/config/sample.yaml` внутри репозитория ожидался путь через стандартный системный tmp (например, `os.tmpdir()`)"
13
+ - "Пункт DoD 3 не выполнен (cleanup в teardown): `cleanupTestConfig()` вызывается в теле test-функции (example-test.mjs:33), а не в after-hook/teardown при падении assertion до этой строки артефакт остаётся в рабочем репозитории"
14
+ - "Пункт DoD 3 не выполнен (cleanup неполный): `rmSync(testConfigPath)` удаляет только конкретный файл (example-test.mjs:26), а не весь tmp-кореньожидалось рекурсивное удаление корневой tmp-директории"
7
15
  ---RESULT---
@@ -1,7 +1,7 @@
1
1
  ---RESULT---
2
2
  status: failed
3
3
  issues:
4
- - "Пункт DoD 3 не выполнен: `const testProjectRoot = join(__dirname, '..', '..')` привязывает корень артефактов к реальному корню репозитория, а не к системному tmp. Тест пишет в `.workflow/config/sample.yaml` рабочего репозитория (example-test.mjs:18-21)."
5
- - "Пункт DoD 3 не выполнен: cleanup (`rmSync(testConfigPath)`) удаляет конкретный файл, а не весь tmp-корень при прерывании до вызова файл остаётся в рабочем репозитории (example-test.mjs:24-26)."
6
- - "Пункт DoD 3 не выполнен: cleanup вызывается в теле test-функции, а не в teardown/after-hookпадение assertion до cleanup = утечка state в рабочем репозитории (example-test.mjs:29-34)."
4
+ - "Пункт DoD «Тест не пишет в рабочий репозиторий» нарушен: корень артефактов строится от `join(__dirname, '..', '..')` реальный корень репозитория, а не `os.tmpdir()`. Файл `example-test.mjs:14-15`."
5
+ - "Пункт DoD «уничтожает tmp-корень» нарушен: `cleanupTestConfig()` удаляет конкретный файл (`rmSync(testConfigPath)`), а не весь tmp-корень рекурсивно. При прерывании до вызова cleanup файл `.workflow/config/sample.yaml` остаётся в рабочем репозитории. Файл `example-test.mjs:30-32`."
6
+ - "Пункт DoD «изоляция в teardown/after-hook» нарушен: `cleanupTestConfig()` вызывается в теле `test(...)`, после `assert.ok(true)`. Если assertion упадёт — cleanup не выполнится. Файл `example-test.mjs:36`."
7
7
  ---RESULT---
@@ -87,77 +87,77 @@
87
87
  },
88
88
  "rubric_scores": [
89
89
  {
90
- "agentId": "claude-sonnet",
90
+ "agentId": "kilo-deepseek",
91
91
  "trial": 1,
92
- "score": 5,
92
+ "score": 3,
93
93
  "errored": false
94
94
  },
95
95
  {
96
- "agentId": "claude-sonnet",
96
+ "agentId": "kilo-deepseek",
97
97
  "trial": 2,
98
- "score": 5,
98
+ "score": 4,
99
99
  "errored": false
100
100
  },
101
101
  {
102
- "agentId": "claude-sonnet",
102
+ "agentId": "kilo-deepseek",
103
103
  "trial": 3,
104
104
  "score": 4,
105
105
  "errored": false
106
106
  },
107
107
  {
108
- "agentId": "kilo-deepseek",
108
+ "agentId": "kilo-glm",
109
109
  "trial": 1,
110
- "score": 3,
110
+ "score": 4,
111
111
  "errored": false
112
112
  },
113
113
  {
114
- "agentId": "kilo-deepseek",
114
+ "agentId": "kilo-glm",
115
115
  "trial": 2,
116
116
  "score": 4,
117
117
  "errored": false
118
118
  },
119
119
  {
120
- "agentId": "kilo-deepseek",
120
+ "agentId": "kilo-glm",
121
121
  "trial": 3,
122
122
  "score": 4,
123
123
  "errored": false
124
124
  },
125
125
  {
126
- "agentId": "kilo-glm",
126
+ "agentId": "kilo-minimax",
127
127
  "trial": 1,
128
128
  "score": 4,
129
129
  "errored": false
130
130
  },
131
131
  {
132
- "agentId": "kilo-glm",
132
+ "agentId": "kilo-minimax",
133
133
  "trial": 2,
134
134
  "score": 4,
135
135
  "errored": false
136
136
  },
137
137
  {
138
- "agentId": "kilo-glm",
138
+ "agentId": "kilo-minimax",
139
139
  "trial": 3,
140
140
  "score": 4,
141
141
  "errored": false
142
142
  },
143
143
  {
144
- "agentId": "kilo-minimax",
144
+ "agentId": "claude-sonnet",
145
145
  "trial": 1,
146
- "score": 4,
146
+ "score": 5,
147
147
  "errored": false
148
148
  },
149
149
  {
150
- "agentId": "kilo-minimax",
150
+ "agentId": "claude-sonnet",
151
151
  "trial": 2,
152
- "score": 4,
152
+ "score": 5,
153
153
  "errored": false
154
154
  },
155
155
  {
156
- "agentId": "kilo-minimax",
156
+ "agentId": "claude-sonnet",
157
157
  "trial": 3,
158
158
  "score": 4,
159
159
  "errored": false
160
160
  }
161
161
  ],
162
- "timestamp": "2026-04-21T14:36:41.299Z"
162
+ "timestamp": "2026-04-25T07:10:27.566Z"
163
163
  }