workflow-ai 1.0.64 → 1.0.66

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 (160) hide show
  1. package/README.md +377 -277
  2. package/configs/agent-health-rules.yaml +75 -0
  3. package/configs/pipeline.yaml +24 -7
  4. package/package.json +1 -1
  5. package/src/init.mjs +20 -3
  6. package/src/lib/agent-health-registry.mjs +245 -0
  7. package/src/lib/agent-spawner.mjs +47 -6
  8. package/src/lib/artifact-snapshot.mjs +233 -0
  9. package/src/lib/error-classifier.mjs +311 -0
  10. package/src/lib/test-error-classifier.mjs +60 -0
  11. package/src/lib/test-extends.mjs +58 -0
  12. package/src/lib/test-version.mjs +21 -0
  13. package/src/runner.mjs +215 -58
  14. package/src/scripts/move-to-review.js +5 -7
  15. package/src/scripts/reset-agent-health.js +62 -0
  16. package/src/skills/coach/SKILL.md +1 -0
  17. package/src/skills/coach/tests/cases/TC-COACH-001/current/meta.json +93 -94
  18. package/src/skills/coach/tests/cases/TC-COACH-002/current/meta.json +93 -94
  19. package/src/skills/create-plan/SKILL.md +1 -0
  20. package/src/skills/create-plan/knowledge/test-hygiene.md +47 -0
  21. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-001/current/claude-sonnet/trial-1.md +23 -31
  22. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-001/current/claude-sonnet/trial-2.md +20 -35
  23. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-001/current/claude-sonnet/trial-3.md +36 -19
  24. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-001/current/judge.json +1 -1
  25. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-001/current/kilo-deepseek/trial-2.md +11 -5
  26. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-001/current/kilo-deepseek/trial-3.md +12 -16
  27. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-001/current/kilo-glm/trial-1.md +15 -9
  28. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-001/current/kilo-glm/trial-3.md +15 -14
  29. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-001/current/kilo-minimax/trial-1.md +22 -18
  30. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-001/current/kilo-minimax/trial-2.md +24 -16
  31. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-001/current/kilo-minimax/trial-3.md +13 -20
  32. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-001/current/meta.json +2 -2
  33. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-002/current/claude-sonnet/trial-1.md +14 -19
  34. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-002/current/claude-sonnet/trial-2.md +24 -14
  35. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-002/current/claude-sonnet/trial-3.md +20 -19
  36. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-002/current/judge.json +16 -17
  37. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-002/current/kilo-deepseek/trial-1.md +0 -7
  38. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-002/current/kilo-deepseek/trial-2.md +9 -10
  39. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-002/current/kilo-deepseek/trial-3.md +5 -5
  40. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-002/current/kilo-glm/trial-1.md +20 -4
  41. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-002/current/kilo-glm/trial-2.md +36 -9
  42. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-002/current/kilo-glm/trial-3.md +9 -6
  43. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-002/current/kilo-minimax/trial-1.md +4 -12
  44. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-002/current/kilo-minimax/trial-2.md +6 -8
  45. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-002/current/kilo-minimax/trial-3.md +8 -4
  46. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-002/current/meta.json +10 -11
  47. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-003/current/claude-sonnet/trial-1.md +30 -0
  48. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-003/current/claude-sonnet/trial-2.md +30 -0
  49. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-003/current/claude-sonnet/trial-3.md +30 -0
  50. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-003/current/judge.json +165 -0
  51. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-003/current/kilo-deepseek/trial-1.md +5 -0
  52. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-003/current/kilo-deepseek/trial-2.md +26 -0
  53. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-003/current/kilo-deepseek/trial-3.md +5 -0
  54. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-003/current/kilo-glm/trial-1.md +39 -0
  55. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-003/current/kilo-glm/trial-2.md +37 -0
  56. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-003/current/kilo-glm/trial-3.md +45 -0
  57. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-003/current/kilo-minimax/trial-1.md +26 -0
  58. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-003/current/kilo-minimax/trial-2.md +27 -0
  59. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-003/current/kilo-minimax/trial-3.md +7 -0
  60. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-003/current/meta.json +117 -0
  61. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-003-parent-plan-mandatory.yaml +41 -0
  62. package/src/skills/decompose-gaps/tests/index.yaml +5 -0
  63. package/src/skills/decompose-gaps/tests/rubrics/parent-plan-mandatory.md +22 -0
  64. package/src/skills/decompose-gaps/workflows/decompose.md +5 -2
  65. package/src/skills/decompose-plan/knowledge/atomicity-checklist.md +31 -5
  66. package/src/skills/decompose-plan/knowledge/capabilities.md +29 -5
  67. package/src/skills/decompose-plan/knowledge/human-task-rules.md +15 -0
  68. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-004/current/claude-sonnet/trial-1.md +55 -0
  69. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-004/current/claude-sonnet/trial-2.md +49 -0
  70. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-004/current/claude-sonnet/trial-3.md +49 -0
  71. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-004/current/judge.json +163 -0
  72. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-004/current/kilo-deepseek/trial-1.md +104 -0
  73. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-004/current/kilo-deepseek/trial-2.md +45 -0
  74. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-004/current/kilo-deepseek/trial-3.md +58 -0
  75. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-004/current/kilo-glm/trial-1.md +193 -0
  76. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-004/current/kilo-glm/trial-2.md +202 -0
  77. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-004/current/kilo-glm/trial-3.md +155 -0
  78. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-004/current/kilo-minimax/trial-1.md +52 -0
  79. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-004/current/kilo-minimax/trial-2.md +17 -0
  80. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-004/current/kilo-minimax/trial-3.md +0 -0
  81. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-004/current/meta.json +115 -0
  82. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-004-executor-atomicity.yaml +64 -0
  83. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-005/current/claude-sonnet/trial-1.md +59 -0
  84. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-005/current/claude-sonnet/trial-2.md +204 -0
  85. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-005/current/claude-sonnet/trial-3.md +213 -0
  86. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-005/current/judge.json +163 -0
  87. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-005/current/kilo-deepseek/trial-1.md +0 -0
  88. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-005/current/kilo-deepseek/trial-2.md +57 -0
  89. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-005/current/kilo-deepseek/trial-3.md +54 -0
  90. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-005/current/kilo-glm/trial-1.md +147 -0
  91. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-005/current/kilo-glm/trial-2.md +165 -0
  92. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-005/current/kilo-glm/trial-3.md +133 -0
  93. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-005/current/kilo-minimax/trial-1.md +81 -0
  94. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-005/current/kilo-minimax/trial-2.md +108 -0
  95. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-005/current/kilo-minimax/trial-3.md +3 -0
  96. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-005/current/meta.json +114 -0
  97. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-005-capabilities-registry.yaml +78 -0
  98. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-006/current/claude-sonnet/trial-1.md +225 -0
  99. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-006/current/claude-sonnet/trial-2.md +66 -0
  100. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-006/current/claude-sonnet/trial-3.md +36 -0
  101. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-006/current/judge.json +163 -0
  102. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-006/current/kilo-deepseek/trial-1.md +42 -0
  103. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-006/current/kilo-deepseek/trial-2.md +67 -0
  104. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-006/current/kilo-deepseek/trial-3.md +40 -0
  105. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-006/current/kilo-glm/trial-1.md +122 -0
  106. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-006/current/kilo-glm/trial-2.md +131 -0
  107. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-006/current/kilo-glm/trial-3.md +138 -0
  108. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-006/current/kilo-minimax/trial-1.md +41 -0
  109. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-006/current/kilo-minimax/trial-2.md +88 -0
  110. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-006/current/kilo-minimax/trial-3.md +0 -0
  111. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-006/current/meta.json +115 -0
  112. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-006-dod-threshold.yaml +72 -0
  113. package/src/skills/decompose-plan/tests/index.yaml +15 -0
  114. package/src/skills/decompose-plan/tests/rubrics/capabilities-registry.md +21 -0
  115. package/src/skills/decompose-plan/tests/rubrics/dod-threshold.md +21 -0
  116. package/src/skills/decompose-plan/tests/rubrics/executor-atomicity.md +21 -0
  117. package/src/skills/decompose-plan/workflows/decompose.md +38 -5
  118. package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-001/current/meta.json +87 -88
  119. package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-005/current/meta.json +87 -88
  120. package/src/skills/manual-testing/SKILL.md +6 -4
  121. package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-001/current/claude-sonnet/trial-1.md +29 -16
  122. package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-001/current/claude-sonnet/trial-2.md +21 -54
  123. package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-001/current/claude-sonnet/trial-3.md +18 -23
  124. package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-001/current/judge.json +17 -17
  125. package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-001/current/meta.json +19 -19
  126. package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-002/current/claude-sonnet/trial-1.md +27 -30
  127. package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-002/current/claude-sonnet/trial-2.md +16 -23
  128. package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-002/current/claude-sonnet/trial-3.md +35 -28
  129. package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-002/current/judge.json +13 -13
  130. package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-002/current/meta.json +15 -15
  131. package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-003/current/claude-sonnet/trial-1.md +76 -0
  132. package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-003/current/claude-sonnet/trial-2.md +71 -0
  133. package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-003/current/claude-sonnet/trial-3.md +85 -0
  134. package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-003/current/judge.json +46 -0
  135. package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-003/current/meta.json +36 -0
  136. package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-003-qa-non-ui-assertion.yaml +65 -0
  137. package/src/skills/manual-testing/tests/index.yaml +5 -0
  138. package/src/skills/manual-testing/tests/rubrics/qa-non-ui-assertion.md +31 -0
  139. package/src/skills/review-result/SKILL.md +1 -0
  140. package/src/skills/review-result/knowledge/test-hygiene.md +44 -0
  141. package/src/skills/review-result/scripts/verify-artifacts.js +157 -14
  142. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-003/current/claude-sonnet/trial-1.md +7 -0
  143. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-003/current/claude-sonnet/trial-2.md +7 -0
  144. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-003/current/claude-sonnet/trial-3.md +7 -0
  145. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-003/current/judge.json +163 -0
  146. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-003/current/kilo-deepseek/trial-1.md +5 -0
  147. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-003/current/kilo-deepseek/trial-2.md +5 -0
  148. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-003/current/kilo-deepseek/trial-3.md +11 -0
  149. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-003/current/kilo-glm/trial-1.md +16 -0
  150. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-003/current/kilo-glm/trial-2.md +18 -0
  151. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-003/current/kilo-glm/trial-3.md +17 -0
  152. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-003/current/kilo-minimax/trial-1.md +17 -0
  153. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-003/current/kilo-minimax/trial-2.md +31 -0
  154. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-003/current/kilo-minimax/trial-3.md +5 -0
  155. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-003/current/meta.json +115 -0
  156. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-003-test-isolation.yaml +50 -0
  157. package/src/skills/review-result/tests/fixtures/QA-904-test-isolation-violation/QA-904.md +51 -0
  158. package/src/skills/review-result/tests/fixtures/QA-904-test-isolation-violation/example-test.mjs +36 -0
  159. package/src/skills/review-result/tests/index.yaml +5 -0
  160. package/src/skills/review-result/tests/rubrics/test-isolation.md +20 -0
@@ -32,11 +32,11 @@
32
32
 
33
33
  **⛔ Задача плана ≠ тикет.** Задача плана — это кандидат на разбиение, а не готовый тикет. Одна задача плана может (и часто должна) превратиться в 2+ тикетов. Количество тикетов ≥ количества задач плана. Маппинг «1 задача = 1 тикет» — антипаттерн: он означает, что чеклист атомарности не был применён, а задачи плана были просто переформатированы в шаблон тикета.
34
34
 
35
- **ОБЯЗАТЕЛЬНО** для каждого тикета-кандидата — чеклист атомарности (6 проверок). Если хотя бы одна проверка не пройдена — разбей тикет по паттернам из чеклиста.
35
+ **ОБЯЗАТЕЛЬНО** для каждого тикета-кандидата — чеклист атомарности (7 проверок). Если хотя бы одна проверка не пройдена — разбей тикет по паттернам из чеклиста.
36
36
 
37
37
  **⛔ Единственная допустимая реакция на FAIL — разбиение на 2+ тикетов.** Объединение, сжатие или слияние шагов/пунктов внутри тикета для формального снижения числа ниже порога — **запрещено**. Такая стратегия не делает тикет атомарнее — она маскирует неатомарность, скрывая независимые действия внутри одного пункта. Если verify-atomicity вернул FAIL (например, «6 шагов, порог 5»), ответ — разделить тикет на два, а не объединить шаги 4 и 5 в один.
38
38
 
39
- **⛔ Обязательная фиксация результата чеклиста.** Перед записью каждого тикета в файл выпиши inline-таблицу результатов 6 проверок атомарности:
39
+ **⛔ Обязательная фиксация результата чеклиста.** Перед записью каждого тикета в файл выпиши inline-таблицу результатов 7 проверок атомарности:
40
40
 
41
41
  ```
42
42
  Тикет-кандидат: «{title}»
@@ -48,6 +48,7 @@
48
48
  | 4. Нет скрытых подзадач | PASS/FAIL | ... |
49
49
  | 5. Размер | PASS/FAIL | ... |
50
50
  | 6. Независимая верификация | PASS/FAIL | ... |
51
+ | 7. Один исполнитель | PASS/FAIL | ... |
51
52
  → Решение: СОЗДАТЬ / РАЗБИТЬ на N тикетов
52
53
  ```
53
54
 
@@ -107,11 +108,23 @@
107
108
 
108
109
  → Загрузи `knowledge/human-task-rules.md`
109
110
 
111
+ Маршрутизация — **двухступенчатая проверка**, оба условия обязательны для HUMAN:
112
+
113
+ 1. **Условие недоступности:** агент физически не может выполнить задачу (нет инструмента, нет доступа, нет прав).
114
+ 2. **Условие HUMAN-семантики:** задача подпадает под один из критериев таблицы «Когда задача = HUMAN» из `knowledge/human-task-rules.md` (внешние системы с аутентификацией, физические действия, бизнес-решения, приватные данные, финансовые транзакции).
115
+
110
116
  | Категория | Критерий | Действие |
111
117
  |-----------|----------|----------|
112
- | **Полностью автономная** | Агент может выполнить все шаги | `executor_type: agent` |
113
- | **Полностью ручная** | Требует действий, недоступных агенту | Префикс `HUMAN`, `executor_type: human` |
114
- | **Гибридная** | Часть — агент, часть человек | Разбить на 2 тикета с зависимостью |
118
+ | **Полностью автономная** | Агент может выполнить все шаги | `executor_type: agent`, тип по маршрутизации шага 4 |
119
+ | **Полностью ручная** | Оба условия (недоступность **и** HUMAN-семантика) выполнены | Префикс `HUMAN`, `executor_type: human` |
120
+ | **Гибридная** | Часть — агент, часть подпадает под оба условия HUMAN | Разбить на 2 тикета с зависимостью |
121
+ | **Вне scope декомпозиции** | Недоступность агенту **есть**, но HUMAN-семантика **не подтверждена** | Тикет не создаётся; действие выполняется стейкхолдером вне пайплайна; при необходимости — строка в «Рекомендации для следующего плана» |
122
+
123
+ **⛔ Антипаттерн «fallback в HUMAN»:** получить FAIL на условии 1 (агент не может) и сразу назначить префикс `HUMAN`, не проверив условие 2. Недоступность агенту — необходимое, но не достаточное условие HUMAN. Типичные ошибки маршрутизации: git-операции проекта (commit, push, merge, release, tag), CI/CD-триггеры, ручной деплой через стандартные инструменты стейкхолдера — это **не HUMAN**, потому что не соответствуют HUMAN-семантике из `knowledge/human-task-rules.md`. Они выпадают из scope декомпозиции целиком.
124
+
125
+ **Как отличить HUMAN от «вне scope»:** задай два вопроса подряд.
126
+ - Вопрос 1: может ли агент технически выполнить это действие сейчас? Если да — категория «автономная», HUMAN не рассматривается.
127
+ - Вопрос 2 (только при «нет» на вопрос 1): задача относится к одному из критериев таблицы «Когда задача = HUMAN»? Если да — HUMAN. Если нет — «вне scope декомпозиции».
115
128
 
116
129
  ### 4. Определить тип каждого тикета
117
130
 
@@ -227,6 +240,24 @@
227
240
 
228
241
  **Антипаттерн:** «возьму номера из головы, раз скрипт теперь не вызывается напрямую». `id_ranges` — **единственный** допустимый источник. Любое отклонение (включая «начну с 001, потом исправлю») ломает ссылочную целостность: после записи файла ID уже попадает в перекрёстные ссылки (`depends_on`, `parent_plan`, упоминания в плане и отчётах) — переименование становится масштабной правкой с риском рассинхрона.
229
242
 
243
+ #### 9.C ⛔ СТОП-ГЕЙТ: выписка реестра `required_capabilities` из конфига (выполняется до любых Write/Edit тикетов)
244
+
245
+ До создания **любого** файла тикета обязательно выполни процедуру из `knowledge/capabilities.md` → «Обязательная процедура перед заполнением `required_capabilities`»:
246
+
247
+ 1. **Прочитай** pipeline-конфиг проекта (стандартный путь — `.workflow/config/pipeline.yaml`; если в проекте другой — ориентируйся на фактический). Агенты и их capabilities — в секции `agents.*.capabilities`.
248
+ 2. **Выпиши в рассуждении явным списком** union всех значений `agents.*.capabilities` из конфига. Например (иллюстрация формата, не значения):
249
+ ```
250
+ capabilities_registry: [<ключ_1>, <ключ_2>, ...]
251
+ ```
252
+ Конкретные значения берутся **только** из фактического конфига текущего проекта — не из памяти, не из других проектов.
253
+ 3. Эта выписка — **единственный допустимый словарь** для поля `required_capabilities` на всю декомпозицию. При заполнении поля на шаге 9.1 каждый ключ должен присутствовать в `capabilities_registry`. Ключ, которого в выписке нет, — изобретённый, его нельзя записывать в тикет.
254
+
255
+ **Без явной фиксации `capabilities_registry` в рассуждении стоп-гейт считается пропущенным.** Отсутствие выписки = нарушение контракта стадии.
256
+
257
+ **Почему это стоп-гейт:** тикет с изобретённым capability физически не может быть исполнен — ни один агент не покрывает несуществующий ключ, пайплайн блокирует execute-task по `no_capable_agent`. Цикл retry → blocked расходует слоты попыток и блокирует весь план. Исправление задним числом требует ручной правки тикетов + перезапуска — проще один раз свериться с реестром перед записью.
258
+
259
+ **Антипаттерн (описание задачи вместо способности агента):** записать в `required_capabilities` ключ, описывающий **предметную область задачи** (язык, платформу, подсистему), а не способность агента-исполнителя. Подробнее см. `knowledge/capabilities.md` → «Антипаттерн: изобретение ключей по предметной области». Критерий отсечения: если ключа нет в `capabilities_registry` — не записывай, как бы хорошо он ни «описывал задачу».
260
+
230
261
  #### 9.1 Создание каждого тикета
231
262
 
232
263
  Для **каждого** тикета:
@@ -240,6 +271,8 @@
240
271
 
241
272
  > **⛔ Структура заголовков тикета должна точно соответствовать шаблону.** Секция DoD обязана быть на уровне `##` (`## Критерии готовности (Definition of Done)` или `## Definition of Done`) и находиться как самостоятельный блок верхнего уровня — **не вкладывай её внутрь другой секции** (`## Детали задачи` и т.п.). Нарушение уровня заголовка (например, `###` вместо `##`) делает тикет невидимым для автоматических проверок пайплайна (verify-artifacts) и приведёт к бесконечному циклу ретраев.
242
273
 
274
+ > **⛔ Валидация `required_capabilities` по реестру (СТОП-гейт на каждый тикет).** Перед записью тикета пройди по каждому ключу, который собираешься положить в `required_capabilities`, и убедись, что он присутствует в `capabilities_registry`, выписанном в 9.C. Если ключа нет в реестре — **не записывай его**: это изобретённый ключ, тикет будет немедленно заблокирован пайплайном по `no_capable_agent`. Допустимые реакции: (а) убрать ключ, если это описание задачи (язык, платформа, подсистема), а не способность агента; (б) заменить на ключ из реестра, если смысл сохраняется; (в) оставить поле `required_capabilities` пустым, если ни один ключ реестра не подходит. Подробности — `knowledge/capabilities.md`.
275
+
243
276
  4. Сохрани в `.workflow/tickets/backlog/{TYPE}-{NNN}.md`
244
277
  5. **Пост-валидация уникальности** (обязательно после каждого сохранения):
245
278
  - Выполни `Glob` по `.workflow/tickets/**/{TYPE}-{NNN}.md`
@@ -1,89 +1,88 @@
1
- {
2
- "date": "2026-04-19T18:01:41.819Z",
3
- "skill_sha": "4ef92dc",
4
- "status": "passed",
5
- "duration_ms": 116198,
6
- "l1_skipped": true,
7
- "per_model": {
8
- "claude-haiku": {
9
- "passed": true,
10
- "errored": false,
11
- "pass_count": 3,
12
- "error_count": 0,
13
- "total": 3,
14
- "threshold": 2
15
- },
16
- "kilo-free": {
17
- "passed": true,
18
- "errored": false,
19
- "pass_count": 3,
20
- "error_count": 0,
21
- "total": 3,
22
- "threshold": 2
23
- },
24
- "kilo-glm-air": {
25
- "passed": true,
26
- "errored": false,
27
- "pass_count": 3,
28
- "error_count": 0,
29
- "total": 3,
30
- "threshold": 2
31
- }
32
- },
33
- "rubric_scores": [
34
- {
35
- "agentId": "claude-haiku",
36
- "trial": 1,
37
- "score": 4,
38
- "errored": false
39
- },
40
- {
41
- "agentId": "claude-haiku",
42
- "trial": 2,
43
- "score": 4,
44
- "errored": false
45
- },
46
- {
47
- "agentId": "claude-haiku",
48
- "trial": 3,
49
- "score": 4,
50
- "errored": false
51
- },
52
- {
53
- "agentId": "kilo-free",
54
- "trial": 1,
55
- "score": 4,
56
- "errored": false
57
- },
58
- {
59
- "agentId": "kilo-free",
60
- "trial": 2,
61
- "score": 4,
62
- "errored": false
63
- },
64
- {
65
- "agentId": "kilo-free",
66
- "trial": 3,
67
- "score": 4,
68
- "errored": false
69
- },
70
- {
71
- "agentId": "kilo-glm-air",
72
- "trial": 1,
73
- "score": 4,
74
- "errored": false
75
- },
76
- {
77
- "agentId": "kilo-glm-air",
78
- "trial": 2,
79
- "score": 4,
80
- "errored": false
81
- },
82
- {
83
- "agentId": "kilo-glm-air",
84
- "trial": 3,
85
- "score": 4,
86
- "errored": false
87
- }
88
- ]
1
+ {
2
+ "date": "2026-04-21T16:43:17.768Z",
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
+ ]
89
88
  }
@@ -1,89 +1,88 @@
1
- {
2
- "date": "2026-04-19T18:01:43.724Z",
3
- "skill_sha": "4ef92dc",
4
- "status": "passed",
5
- "duration_ms": 99372,
6
- "l1_skipped": true,
7
- "per_model": {
8
- "claude-haiku": {
9
- "passed": true,
10
- "errored": false,
11
- "pass_count": 3,
12
- "error_count": 0,
13
- "total": 3,
14
- "threshold": 2
15
- },
16
- "kilo-free": {
17
- "passed": true,
18
- "errored": false,
19
- "pass_count": 3,
20
- "error_count": 0,
21
- "total": 3,
22
- "threshold": 2
23
- },
24
- "kilo-glm-air": {
25
- "passed": true,
26
- "errored": false,
27
- "pass_count": 3,
28
- "error_count": 0,
29
- "total": 3,
30
- "threshold": 2
31
- }
32
- },
33
- "rubric_scores": [
34
- {
35
- "agentId": "claude-haiku",
36
- "trial": 1,
37
- "score": 5,
38
- "errored": false
39
- },
40
- {
41
- "agentId": "claude-haiku",
42
- "trial": 2,
43
- "score": 5,
44
- "errored": false
45
- },
46
- {
47
- "agentId": "claude-haiku",
48
- "trial": 3,
49
- "score": 5,
50
- "errored": false
51
- },
52
- {
53
- "agentId": "kilo-free",
54
- "trial": 1,
55
- "score": 5,
56
- "errored": false
57
- },
58
- {
59
- "agentId": "kilo-free",
60
- "trial": 2,
61
- "score": 5,
62
- "errored": false
63
- },
64
- {
65
- "agentId": "kilo-free",
66
- "trial": 3,
67
- "score": 5,
68
- "errored": false
69
- },
70
- {
71
- "agentId": "kilo-glm-air",
72
- "trial": 1,
73
- "score": 5,
74
- "errored": false
75
- },
76
- {
77
- "agentId": "kilo-glm-air",
78
- "trial": 2,
79
- "score": 5,
80
- "errored": false
81
- },
82
- {
83
- "agentId": "kilo-glm-air",
84
- "trial": 3,
85
- "score": 5,
86
- "errored": false
87
- }
88
- ]
1
+ {
2
+ "date": "2026-04-21T16:43:17.772Z",
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": 5,
37
+ "errored": false
38
+ },
39
+ {
40
+ "agentId": "claude-haiku",
41
+ "trial": 2,
42
+ "score": 5,
43
+ "errored": false
44
+ },
45
+ {
46
+ "agentId": "claude-haiku",
47
+ "trial": 3,
48
+ "score": 5,
49
+ "errored": false
50
+ },
51
+ {
52
+ "agentId": "kilo-free",
53
+ "trial": 1,
54
+ "score": 5,
55
+ "errored": false
56
+ },
57
+ {
58
+ "agentId": "kilo-free",
59
+ "trial": 2,
60
+ "score": 5,
61
+ "errored": false
62
+ },
63
+ {
64
+ "agentId": "kilo-free",
65
+ "trial": 3,
66
+ "score": 5,
67
+ "errored": false
68
+ },
69
+ {
70
+ "agentId": "kilo-glm-air",
71
+ "trial": 1,
72
+ "score": 5,
73
+ "errored": false
74
+ },
75
+ {
76
+ "agentId": "kilo-glm-air",
77
+ "trial": 2,
78
+ "score": 5,
79
+ "errored": false
80
+ },
81
+ {
82
+ "agentId": "kilo-glm-air",
83
+ "trial": 3,
84
+ "score": 5,
85
+ "errored": false
86
+ }
87
+ ]
89
88
  }
@@ -18,11 +18,13 @@ ticket_prefix: QA
18
18
 
19
19
  **Ты НЕ делаешь:** нагрузочное/перформанс-тестирование (передай соответствующему скилу), исправление найденных багов (зафиксируй дефект в QA-тикете — исправление выполнит соответствующий скил), принятие решений о релизе (только предоставляешь данные для решения).
20
20
 
21
- **⛔ ЗАПРЕЩЕНО даже если инструменты заблокированы:** подменять реальное тестирование написанием кода без его прогона, code review исходников вместо реального тестирования, генерация тестовых данных как замена запуска тест-кейсов, **запуск уже существующих автотестов разработки и выдача их за ручную проверку**. Граница: написать тест и **реально его запустить** с записью результата — легитимное тестирование (если это разрешено правилами проекта в `../shared/`); написать тест без запуска или с фейковым результатом призрачное выполнение, антипаттерн. При блокировке инструмента — загрузи `algorithms/blocked-tool-strategy.md`.
21
+ **⛔ ЗАПРЕЩЕНО даже если инструменты заблокированы:** code review исходников вместо реальной проверки, генерация тестовых данных как замена запуска тест-кейсов, написание теста без его фактического запуска или с фейковым результатом (призрачное выполнение), **подмена ручной проверки UI-наблюдаемого поведения запуском уже существующих автотестов разработки**. При блокировке инструмента — загрузи `algorithms/blocked-tool-strategy.md`.
22
+
23
+ **Легитимная работа QA:** написание и **реальный запуск** ассертов как инструмент проверки инварианта — допустимы и являются частью роли. Критерий применимости: содержит ли DoD тикета **UI-наблюдаемый** критерий (визуальный рендеринг, реакция на действия пользователя, интеграция с хостом, accessibility)? Если да — ассерт не может заменить ручную проверку, она всё равно обязательна (см. антипаттерн ниже). Если нет (инвариант выражается через ФС, данные, структуру файла, содержимое конфига) — написание и запуск ассерта сам по себе является достаточной проверкой, это и есть выполнение QA-тикета. Проектные правила размещения и именования тестов — в `../shared/` (если проект его определяет); отсутствие `../shared/` не является запретом писать тесты для не-UI инвариантов.
22
24
 
23
25
  **⛔ Антипаттерн «подмена ручной проверки запуском чужих автотестов»:** если задача требует ручной проверки наблюдаемого поведения (UI, рендеринг, реакция на действия пользователя), и в проекте уже существуют unit/integration-тесты, покрывающие эти же объекты, **запуск этих тестов не является ручной проверкой** — даже если они зелёные. Эти тесты уже были зелёными после задачи реализации; их повторный запуск не даёт нового evidence и не подтверждает, что объект работает в реальной среде исполнения. Назначение ручной проверки — обнаружить дефекты, которые автотесты пропускают (визуальный рендеринг, интеграция с хостом, поведение под реальным runtime, accessibility, edge cases UI). Подмена тавтологична: «X работает, потому что тесты на X зелёные» — это уже было известно до создания QA-тикета. **Правильное действие при недоступности UI-инструмента:** см. `algorithms/blocked-tool-strategy.md` → BLOCKED, не fallback на запуск автотестов.
24
26
 
25
- **Проектные правила тестирования:** перед написанием/изменением тестов, выбором места для артефактов, именованием файлов — **обязательно** прочитай `../shared/README.md` и загрузи модули по триггеру «работа с тестами проекта». Универсальный скил не знает, разрешает ли конкретный проект писать тесты, где они живут и как именуются это проектная специфика.
27
+ **Проектные правила тестирования:** перед написанием/изменением тестов, выбором места для артефактов, именованием файлов — если `../shared/README.md` есть в проекте, прочитай его и загрузи модули по триггеру «работа с тестами проекта»: проект мог задать специфику размещения и именования. Если `../shared/` отсутствует разместить тест рядом с существующими тестами того же уровня и использовать принятые в репозитории конвенции именования. Отсутствие shared не отменяет и не запрещает QA-работу по написанию ассертов для не-UI инвариантов.
26
28
 
27
29
  ## Взаимодействие
28
30
 
@@ -64,7 +66,7 @@ ticket_prefix: QA
64
66
 
65
67
  ## Загрузка знаний
66
68
 
67
- ⛔ **Обязательный первый шаг:** прочитай `../shared/README.md` и загрузи все релевантные модули (карта UI, тестовые workspace'ы, проектные правила). Без shared ты не знаешь пути, конфигурацию и ограничения конкретного продуктаначинать тестирование без этого запрещено.
69
+ ⛔ **Обязательный первый шаг (если `../shared/README.md` присутствует):** прочитай его и загрузи все релевантные модули (карта UI, тестовые workspace'ы, проектные правила). Без shared ты не знаешь проектно-специфичные пути, конфигурацию и ограничения продукта. Если `../shared/` в проекте отсутствует действуй по общим правилам скила; это не блокирует выполнение QA-тикета, а означает, что проект не задал проектные настройки поверх дефолтов.
68
70
 
69
71
  | Модуль | Когда загружать |
70
72
  |--------|----------------|
@@ -163,7 +165,7 @@ ticket_prefix: QA
163
165
 
164
166
  ## Границы компетенции
165
167
 
166
- - **Написание автотестов в коде как зона ответственности**соответствующий скил разработки. Исключение: если правила проекта в `../shared/` явно разрешают QA писать/дополнять тесты как инструмент проверкидействуй по правилам shared обязательным реальным запуском, см. выше)
168
+ - **Подмена ручной проверки UI-наблюдаемого поведения запуском автотестов**запрещено (см. антипаттерн выше). Написание и реальный запуск ассертов для инвариантов, не выражающихся через UI (ФС, данные, структура файла), в зоне QA; правила размещения/именования тестов, если заданы проектом, ищи в `../shared/`
167
169
  - **Нагрузочное тестирование** → соответствующий скил проекта
168
170
  - **Исправление багов** → соответствующий скил через тикет
169
171
  - **Решение о релизе** → принимает ответственный скил проекта
@@ -1,21 +1,34 @@
1
- Согласно таблице инструментов в скиле:
1
+ ## Стратегия тестирования VSCode-расширения
2
2
 
3
- | Критерий | Выбор |
4
- |----------|-------|
5
- | **Тип приложения** | Desktop (VSCode-расширение) |
6
- | **Основной инструмент** | Windows-MCP **через Sandbox** |
7
- | **Knowledge-модули** | `knowledge/desktop-tools-core.md` + `knowledge/sandbox-core.md` |
3
+ ### Инструмент
8
4
 
9
- **Среда запуска: Windows Sandbox — обязательно.**
5
+ **Windows-MCP через Windows Sandbox**единственный допустимый вариант для desktop-приложений согласно матрице выбора инструмента:
10
6
 
11
- Прямое тестирование на хосте запрещено по двум причинам:
12
- 1. Загрязняет рабочую среду разработчика (глобальные настройки VSCode, установленные расширения).
13
- 2. Не воспроизводит чистое состояние нельзя гарантировать изоляцию между тест-запусками.
7
+ | Тип приложения | Инструмент | Knowledge |
8
+ |---|---|---|
9
+ | Desktop (VSCode-расширение) | **Windows-MCP через Sandbox** | `desktop-tools-core.md` + `sandbox-core.md` |
14
10
 
15
- **Порядок подготовки:**
11
+ ### Среда запуска: Windows Sandbox
16
12
 
17
- 1. Прочитать `../shared/README.md` узнать пути, конфигурацию, проектные ограничения.
18
- 2. Загрузить `knowledge/sandbox-core.md`настройка Sandbox, quick-start, персистенция evidence.
19
- 3. Загрузить `knowledge/desktop-tools-core.md`команды Windows-MCP, паттерны навигации, бюджет Snapshot.
20
- 4. Поднять Sandbox → установить расширение → выполнить тест-кейсы через Windows-MCP.
21
- 5. Сохранить evidence (скриншоты/a11y assertions) из Sandbox до завершения сессии — файлы внутри Sandbox эфемерны.
13
+ **Обязательно** прямое тестирование на хосте запрещено по двум причинам:
14
+ 1. **Загрязнение рабочей среды** расширение может изменить настройки VSCode, установить зависимости, создать файлы
15
+ 2. **Нет чистого состояния** хост уже содержит расширения, настройки, историю; воспроизводимость нарушена
16
+
17
+ Sandbox даёт изолированную Windows-среду с чистым VSCode при каждом запуске.
18
+
19
+ ### Последовательность подготовки
20
+
21
+ 1. Загрузить `knowledge/sandbox-core.md` — quick-start Sandbox, персистенция evidence
22
+ 2. Загрузить `knowledge/desktop-tools-core.md` — команды Windows-MCP, навигация, бюджет Snapshot
23
+ 3. Прочитать `../shared/README.md` (если существует) — проектно-специфичные пути и конфигурация
24
+ 4. Установить VSCode + расширение в Sandbox
25
+ 5. Выполнять тест-кейсы через Windows-MCP (клики, ввод, навигация)
26
+ 6. Получать evidence через **a11y tree (Snapshot)** — основной инструмент проверки состояния UI; скриншоты — только для визуальных критериев (принцип 8)
27
+
28
+ ### Важно про evidence в Sandbox
29
+
30
+ Файлы внутри Sandbox эфемерны — при закрытии Sandbox всё уничтожается. Скриншоты и другие артефакты нужно выносить на хост до завершения сессии. Детали — в `knowledge/sandbox-core.md` → «Персистенция evidence».
31
+
32
+ ---
33
+
34
+ Если у тебя есть конкретный тикет `QA-*` — передай его, и я загружу нужные модули и начну выполнение по соответствующему workflow.