workflow-ai 1.0.62 → 1.0.64

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 (505) hide show
  1. package/README.md +61 -0
  2. package/agent-templates/CLAUDE.md.tpl +2 -0
  3. package/agent-templates/QWEN.md.tpl +2 -0
  4. package/configs/config.yaml +134 -0
  5. package/configs/pipeline.yaml +884 -0
  6. package/configs/ticket-movement-rules.yaml +80 -0
  7. package/package.json +2 -1
  8. package/src/global-dir.mjs +25 -1
  9. package/src/init.mjs +5 -4
  10. package/src/lib/agent-spawner.mjs +338 -0
  11. package/src/runner.mjs +15 -14
  12. package/src/scripts/get-next-test-id.js +94 -0
  13. package/src/scripts/migrate-backlog-to-tests.js +406 -0
  14. package/src/scripts/run-skill-tests.js +1703 -0
  15. package/src/scripts/scan-fixtures-for-secrets.js +248 -0
  16. package/src/scripts/tests/timeout-cascade.test.js +28 -0
  17. package/src/skills/analyze-report/README.md +44 -0
  18. package/src/skills/analyze-report/SKILL.md +121 -0
  19. package/src/skills/analyze-report/algorithms/progress-assessment.md +108 -0
  20. package/src/skills/analyze-report/knowledge/analysis-frameworks.md +66 -0
  21. package/src/skills/analyze-report/knowledge/report-structure.md +61 -0
  22. package/src/skills/analyze-report/scripts/calc-plan-metrics.js +234 -0
  23. package/src/skills/analyze-report/templates/analysis-report.md +80 -0
  24. package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-001/current/claude-sonnet/trial-1.md +69 -0
  25. package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-001/current/claude-sonnet/trial-2.md +103 -0
  26. package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-001/current/claude-sonnet/trial-3.md +99 -0
  27. package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-001/current/judge.json +163 -0
  28. package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-001/current/kilo-deepseek/trial-1.md +89 -0
  29. package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-001/current/kilo-deepseek/trial-2.md +88 -0
  30. package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-001/current/kilo-deepseek/trial-3.md +100 -0
  31. package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-001/current/kilo-glm/trial-1.md +77 -0
  32. package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-001/current/kilo-glm/trial-2.md +64 -0
  33. package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-001/current/kilo-glm/trial-3.md +110 -0
  34. package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-001/current/kilo-minimax/trial-1.md +74 -0
  35. package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-001/current/kilo-minimax/trial-2.md +38 -0
  36. package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-001/current/kilo-minimax/trial-3.md +61 -0
  37. package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-001/current/meta.json +115 -0
  38. package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-001-evidence-from-log.yaml +60 -0
  39. package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-002/current/claude-sonnet/trial-1.md +90 -0
  40. package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-002/current/claude-sonnet/trial-2.md +89 -0
  41. package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-002/current/claude-sonnet/trial-3.md +77 -0
  42. package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-002/current/judge.json +163 -0
  43. package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-002/current/kilo-deepseek/trial-1.md +84 -0
  44. package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-002/current/kilo-deepseek/trial-2.md +77 -0
  45. package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-002/current/kilo-deepseek/trial-3.md +89 -0
  46. package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-002/current/kilo-glm/trial-1.md +103 -0
  47. package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-002/current/kilo-glm/trial-2.md +103 -0
  48. package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-002/current/kilo-glm/trial-3.md +103 -0
  49. package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-002/current/kilo-minimax/trial-1.md +93 -0
  50. package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-002/current/kilo-minimax/trial-2.md +93 -0
  51. package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-002/current/kilo-minimax/trial-3.md +86 -0
  52. package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-002/current/meta.json +115 -0
  53. package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-002-result-block-format.yaml +44 -0
  54. package/src/skills/analyze-report/tests/fixtures/REPORT-002-incorrect-attribution.md +27 -0
  55. package/src/skills/analyze-report/tests/fixtures/pipeline-2026-04-06_qa-001-skip.log +32 -0
  56. package/src/skills/analyze-report/tests/index.yaml +25 -0
  57. package/src/skills/analyze-report/tests/rubrics/evidence-from-log.md +22 -0
  58. package/src/skills/analyze-report/tests/rubrics/result-block-format.md +22 -0
  59. package/src/skills/analyze-report/workflows/progress.md +158 -0
  60. package/src/skills/analyze-report/workflows/retrospective.md +143 -0
  61. package/src/skills/coach/README.md +43 -0
  62. package/src/skills/coach/SKILL.md +166 -0
  63. package/src/skills/coach/SKILL.md.legacy +157 -0
  64. package/src/skills/coach/algorithms/gap-analysis.md +69 -0
  65. package/src/skills/coach/algorithms/improvement-prioritization.md +62 -0
  66. package/src/skills/coach/algorithms/skill-scoring.md +80 -0
  67. package/src/skills/coach/knowledge/audit-applied-changes-clean.txt +11 -0
  68. package/src/skills/coach/knowledge/backlog-management.md +67 -0
  69. package/src/skills/coach/knowledge/backlog-management.md.legacy +90 -0
  70. package/src/skills/coach/knowledge/common-antipatterns.md +76 -0
  71. package/src/skills/coach/knowledge/prompt-engineering.md +45 -0
  72. package/src/skills/coach/knowledge/shared-knowledge-guide.md +44 -0
  73. package/src/skills/coach/knowledge/skill-anatomy.md +49 -0
  74. package/src/skills/coach/knowledge/test-authorship.md +141 -0
  75. package/src/skills/coach/templates/audit-report.md +39 -0
  76. package/src/skills/coach/templates/coach-backlog-init.yaml +14 -0
  77. package/src/skills/coach/templates/coach-backlog-init.yaml.legacy +10 -0
  78. package/src/skills/coach/templates/improvement-plan.md +42 -0
  79. package/src/skills/coach/templates/new-skill.md +95 -0
  80. package/src/skills/coach/tests/cases/TC-COACH-001/current/claude-sonnet/trial-1.md +58 -0
  81. package/src/skills/coach/tests/cases/TC-COACH-001/current/claude-sonnet/trial-2.md +65 -0
  82. package/src/skills/coach/tests/cases/TC-COACH-001/current/claude-sonnet/trial-3.md +58 -0
  83. package/src/skills/coach/tests/cases/TC-COACH-001/current/judge.json +151 -0
  84. package/src/skills/coach/tests/cases/TC-COACH-001/current/kilo-deepseek/trial-1.md +46 -0
  85. package/src/skills/coach/tests/cases/TC-COACH-001/current/kilo-deepseek/trial-2.md +0 -0
  86. package/src/skills/coach/tests/cases/TC-COACH-001/current/kilo-deepseek/trial-3.md +75 -0
  87. package/src/skills/coach/tests/cases/TC-COACH-001/current/kilo-glm/trial-1.md +81 -0
  88. package/src/skills/coach/tests/cases/TC-COACH-001/current/kilo-glm/trial-2.md +101 -0
  89. package/src/skills/coach/tests/cases/TC-COACH-001/current/kilo-glm/trial-3.md +91 -0
  90. package/src/skills/coach/tests/cases/TC-COACH-001/current/kilo-minimax/trial-1.md +48 -0
  91. package/src/skills/coach/tests/cases/TC-COACH-001/current/kilo-minimax/trial-2.md +30 -0
  92. package/src/skills/coach/tests/cases/TC-COACH-001/current/kilo-minimax/trial-3.md +55 -0
  93. package/src/skills/coach/tests/cases/TC-COACH-001/current/meta.json +95 -0
  94. package/src/skills/coach/tests/cases/TC-COACH-001-evidence-based-temporal-diagram.yaml +53 -0
  95. package/src/skills/coach/tests/cases/TC-COACH-002/current/claude-sonnet/trial-1.md +46 -0
  96. package/src/skills/coach/tests/cases/TC-COACH-002/current/claude-sonnet/trial-2.md +50 -0
  97. package/src/skills/coach/tests/cases/TC-COACH-002/current/claude-sonnet/trial-3.md +48 -0
  98. package/src/skills/coach/tests/cases/TC-COACH-002/current/judge.json +151 -0
  99. package/src/skills/coach/tests/cases/TC-COACH-002/current/kilo-deepseek/trial-1.md +0 -0
  100. package/src/skills/coach/tests/cases/TC-COACH-002/current/kilo-deepseek/trial-2.md +37 -0
  101. package/src/skills/coach/tests/cases/TC-COACH-002/current/kilo-deepseek/trial-3.md +30 -0
  102. package/src/skills/coach/tests/cases/TC-COACH-002/current/kilo-glm/trial-1.md +23 -0
  103. package/src/skills/coach/tests/cases/TC-COACH-002/current/kilo-glm/trial-2.md +29 -0
  104. package/src/skills/coach/tests/cases/TC-COACH-002/current/kilo-glm/trial-3.md +35 -0
  105. package/src/skills/coach/tests/cases/TC-COACH-002/current/kilo-minimax/trial-1.md +13 -0
  106. package/src/skills/coach/tests/cases/TC-COACH-002/current/kilo-minimax/trial-2.md +19 -0
  107. package/src/skills/coach/tests/cases/TC-COACH-002/current/kilo-minimax/trial-3.md +33 -0
  108. package/src/skills/coach/tests/cases/TC-COACH-002/current/meta.json +95 -0
  109. package/src/skills/coach/tests/cases/TC-COACH-002-root-cause-first.yaml +57 -0
  110. package/src/skills/coach/tests/fixtures/pipeline-2026-04-06_id-collision.log +77 -0
  111. package/src/skills/coach/tests/index.yaml +29 -0
  112. package/src/skills/coach/tests/rubrics/calibration/evidence-based-bad.md +13 -0
  113. package/src/skills/coach/tests/rubrics/calibration/evidence-based-good.md +29 -0
  114. package/src/skills/coach/tests/rubrics/evidence-based.md +26 -0
  115. package/src/skills/coach/tests/rubrics/root-cause-first.md +21 -0
  116. package/src/skills/coach/workflows/analyze.md +79 -0
  117. package/src/skills/coach/workflows/analyze.md.legacy +64 -0
  118. package/src/skills/coach/workflows/audit.md +74 -0
  119. package/src/skills/coach/workflows/audit.md.legacy +59 -0
  120. package/src/skills/coach/workflows/create.md +80 -0
  121. package/src/skills/coach/workflows/create.md.legacy +67 -0
  122. package/src/skills/coach/workflows/improve.md +71 -0
  123. package/src/skills/coach/workflows/improve.md.legacy +60 -0
  124. package/src/skills/coach/workflows/research.md +55 -0
  125. package/src/skills/coach/workflows/review.md +52 -0
  126. package/src/skills/coach/workflows/review.md.legacy +48 -0
  127. package/src/skills/coach/workflows/test.md +97 -0
  128. package/src/skills/create-plan/README.md +39 -0
  129. package/src/skills/create-plan/SKILL.md +104 -0
  130. package/src/skills/create-plan/algorithms/risk-assessment.md +73 -0
  131. package/src/skills/create-plan/knowledge/plan-completeness.md +67 -0
  132. package/src/skills/create-plan/knowledge/plan-lifecycle.md +33 -0
  133. package/src/skills/create-plan/knowledge/task-verification-pairs.md +151 -0
  134. package/src/skills/create-plan/scripts/validate-completeness.js +182 -0
  135. package/src/skills/create-plan/tests/cases/TC-CREATE-PLAN-001/current/claude-sonnet/trial-1.md +5 -0
  136. package/src/skills/create-plan/tests/cases/TC-CREATE-PLAN-001/current/claude-sonnet/trial-2.md +39 -0
  137. package/src/skills/create-plan/tests/cases/TC-CREATE-PLAN-001/current/claude-sonnet/trial-3.md +35 -0
  138. package/src/skills/create-plan/tests/cases/TC-CREATE-PLAN-001/current/judge.json +167 -0
  139. package/src/skills/create-plan/tests/cases/TC-CREATE-PLAN-001/current/kilo-deepseek/trial-1.md +5 -0
  140. package/src/skills/create-plan/tests/cases/TC-CREATE-PLAN-001/current/kilo-deepseek/trial-2.md +10 -0
  141. package/src/skills/create-plan/tests/cases/TC-CREATE-PLAN-001/current/kilo-deepseek/trial-3.md +5 -0
  142. package/src/skills/create-plan/tests/cases/TC-CREATE-PLAN-001/current/kilo-glm/trial-1.md +26 -0
  143. package/src/skills/create-plan/tests/cases/TC-CREATE-PLAN-001/current/kilo-glm/trial-2.md +86 -0
  144. package/src/skills/create-plan/tests/cases/TC-CREATE-PLAN-001/current/kilo-glm/trial-3.md +5 -0
  145. package/src/skills/create-plan/tests/cases/TC-CREATE-PLAN-001/current/kilo-minimax/trial-1.md +11 -0
  146. package/src/skills/create-plan/tests/cases/TC-CREATE-PLAN-001/current/kilo-minimax/trial-2.md +15 -0
  147. package/src/skills/create-plan/tests/cases/TC-CREATE-PLAN-001/current/kilo-minimax/trial-3.md +14 -0
  148. package/src/skills/create-plan/tests/cases/TC-CREATE-PLAN-001/current/meta.json +119 -0
  149. package/src/skills/create-plan/tests/cases/TC-CREATE-PLAN-001-validate-completeness.yaml +41 -0
  150. package/src/skills/create-plan/tests/cases/TC-CREATE-PLAN-002/current/claude-sonnet/trial-1.md +25 -0
  151. package/src/skills/create-plan/tests/cases/TC-CREATE-PLAN-002/current/claude-sonnet/trial-2.md +30 -0
  152. package/src/skills/create-plan/tests/cases/TC-CREATE-PLAN-002/current/claude-sonnet/trial-3.md +37 -0
  153. package/src/skills/create-plan/tests/cases/TC-CREATE-PLAN-002/current/judge.json +164 -0
  154. package/src/skills/create-plan/tests/cases/TC-CREATE-PLAN-002/current/kilo-deepseek/trial-1.md +3 -0
  155. package/src/skills/create-plan/tests/cases/TC-CREATE-PLAN-002/current/kilo-deepseek/trial-2.md +11 -0
  156. package/src/skills/create-plan/tests/cases/TC-CREATE-PLAN-002/current/kilo-deepseek/trial-3.md +13 -0
  157. package/src/skills/create-plan/tests/cases/TC-CREATE-PLAN-002/current/kilo-glm/trial-1.md +44 -0
  158. package/src/skills/create-plan/tests/cases/TC-CREATE-PLAN-002/current/kilo-glm/trial-2.md +5 -0
  159. package/src/skills/create-plan/tests/cases/TC-CREATE-PLAN-002/current/kilo-glm/trial-3.md +49 -0
  160. package/src/skills/create-plan/tests/cases/TC-CREATE-PLAN-002/current/kilo-minimax/trial-1.md +6 -0
  161. package/src/skills/create-plan/tests/cases/TC-CREATE-PLAN-002/current/kilo-minimax/trial-2.md +11 -0
  162. package/src/skills/create-plan/tests/cases/TC-CREATE-PLAN-002/current/kilo-minimax/trial-3.md +16 -0
  163. package/src/skills/create-plan/tests/cases/TC-CREATE-PLAN-002/current/meta.json +116 -0
  164. package/src/skills/create-plan/tests/cases/TC-CREATE-PLAN-002-task-granularity.yaml +39 -0
  165. package/src/skills/create-plan/tests/index.yaml +25 -0
  166. package/src/skills/create-plan/tests/rubrics/task-granularity.md +21 -0
  167. package/src/skills/create-plan/tests/rubrics/validate-completeness.md +21 -0
  168. package/src/skills/create-plan/workflows/create.md +136 -0
  169. package/src/skills/create-report/README.md +40 -0
  170. package/src/skills/create-report/SKILL.md +73 -0
  171. package/src/skills/create-report/algorithms/metric-calculation.md +93 -0
  172. package/src/skills/create-report/knowledge/report-metrics.md +82 -0
  173. package/src/skills/create-report/scripts/calc-metrics.js +383 -0
  174. package/src/skills/create-report/tests/cases/TC-CREATE-REPORT-001/current/claude-sonnet/trial-1.md +25 -0
  175. package/src/skills/create-report/tests/cases/TC-CREATE-REPORT-001/current/claude-sonnet/trial-2.md +26 -0
  176. package/src/skills/create-report/tests/cases/TC-CREATE-REPORT-001/current/claude-sonnet/trial-3.md +28 -0
  177. package/src/skills/create-report/tests/cases/TC-CREATE-REPORT-001/current/judge.json +163 -0
  178. package/src/skills/create-report/tests/cases/TC-CREATE-REPORT-001/current/kilo-deepseek/trial-1.md +4 -0
  179. package/src/skills/create-report/tests/cases/TC-CREATE-REPORT-001/current/kilo-deepseek/trial-2.md +3 -0
  180. package/src/skills/create-report/tests/cases/TC-CREATE-REPORT-001/current/kilo-deepseek/trial-3.md +6 -0
  181. package/src/skills/create-report/tests/cases/TC-CREATE-REPORT-001/current/kilo-glm/trial-1.md +8 -0
  182. package/src/skills/create-report/tests/cases/TC-CREATE-REPORT-001/current/kilo-glm/trial-2.md +12 -0
  183. package/src/skills/create-report/tests/cases/TC-CREATE-REPORT-001/current/kilo-glm/trial-3.md +7 -0
  184. package/src/skills/create-report/tests/cases/TC-CREATE-REPORT-001/current/kilo-minimax/trial-1.md +12 -0
  185. package/src/skills/create-report/tests/cases/TC-CREATE-REPORT-001/current/kilo-minimax/trial-2.md +22 -0
  186. package/src/skills/create-report/tests/cases/TC-CREATE-REPORT-001/current/kilo-minimax/trial-3.md +13 -0
  187. package/src/skills/create-report/tests/cases/TC-CREATE-REPORT-001/current/meta.json +115 -0
  188. package/src/skills/create-report/tests/cases/TC-CREATE-REPORT-001-root-cause-attribution.yaml +57 -0
  189. package/src/skills/create-report/tests/index.yaml +20 -0
  190. package/src/skills/create-report/tests/rubrics/root-cause-attribution.md +21 -0
  191. package/src/skills/create-report/workflows/standard.md +175 -0
  192. package/src/skills/decompose-gaps/README.md +39 -0
  193. package/src/skills/decompose-gaps/SKILL.md +78 -0
  194. package/src/skills/decompose-gaps/algorithms/scope-check.md +110 -0
  195. package/src/skills/decompose-gaps/knowledge/scope-validation.md +65 -0
  196. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-001/current/claude-sonnet/trial-1.md +49 -0
  197. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-001/current/claude-sonnet/trial-2.md +56 -0
  198. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-001/current/claude-sonnet/trial-3.md +39 -0
  199. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-001/current/judge.json +164 -0
  200. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-001/current/kilo-deepseek/trial-1.md +25 -0
  201. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-001/current/kilo-deepseek/trial-2.md +11 -0
  202. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-001/current/kilo-deepseek/trial-3.md +26 -0
  203. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-001/current/kilo-glm/trial-1.md +19 -0
  204. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-001/current/kilo-glm/trial-2.md +5 -0
  205. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-001/current/kilo-glm/trial-3.md +28 -0
  206. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-001/current/kilo-minimax/trial-1.md +23 -0
  207. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-001/current/kilo-minimax/trial-2.md +27 -0
  208. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-001/current/kilo-minimax/trial-3.md +25 -0
  209. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-001/current/meta.json +116 -0
  210. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-001-scope-exclusion.yaml +46 -0
  211. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-002/current/claude-sonnet/trial-1.md +32 -0
  212. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-002/current/claude-sonnet/trial-2.md +20 -0
  213. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-002/current/claude-sonnet/trial-3.md +26 -0
  214. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-002/current/judge.json +164 -0
  215. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-002/current/kilo-deepseek/trial-1.md +7 -0
  216. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-002/current/kilo-deepseek/trial-2.md +16 -0
  217. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-002/current/kilo-deepseek/trial-3.md +7 -0
  218. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-002/current/kilo-glm/trial-1.md +5 -0
  219. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-002/current/kilo-glm/trial-2.md +11 -0
  220. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-002/current/kilo-glm/trial-3.md +13 -0
  221. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-002/current/kilo-minimax/trial-1.md +13 -0
  222. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-002/current/kilo-minimax/trial-2.md +12 -0
  223. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-002/current/kilo-minimax/trial-3.md +5 -0
  224. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-002/current/meta.json +116 -0
  225. package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-002-glob-before-write.yaml +36 -0
  226. package/src/skills/decompose-gaps/tests/index.yaml +25 -0
  227. package/src/skills/decompose-gaps/tests/rubrics/glob-before-write.md +21 -0
  228. package/src/skills/decompose-gaps/tests/rubrics/scope-exclusion.md +21 -0
  229. package/src/skills/decompose-gaps/workflows/decompose.md +120 -0
  230. package/src/skills/decompose-plan/README.md +43 -0
  231. package/src/skills/decompose-plan/SKILL.md +87 -0
  232. package/src/skills/decompose-plan/algorithms/deduplication.md +101 -0
  233. package/src/skills/decompose-plan/knowledge/atomicity-checklist.md +113 -0
  234. package/src/skills/decompose-plan/knowledge/capabilities.md +44 -0
  235. package/src/skills/decompose-plan/knowledge/human-task-rules.md +67 -0
  236. package/src/skills/decompose-plan/knowledge/scope-guard-checklist.md +73 -0
  237. package/src/skills/decompose-plan/scripts/check-atomicity-limit.js +47 -0
  238. package/src/skills/decompose-plan/scripts/check-duplicates.js +323 -0
  239. package/src/skills/decompose-plan/scripts/verify-atomicity.js +408 -0
  240. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-001/current/claude-sonnet/trial-1.md +30 -0
  241. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-001/current/claude-sonnet/trial-2.md +36 -0
  242. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-001/current/claude-sonnet/trial-3.md +37 -0
  243. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-001/current/judge.json +163 -0
  244. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-001/current/kilo-deepseek/trial-1.md +20 -0
  245. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-001/current/kilo-deepseek/trial-2.md +17 -0
  246. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-001/current/kilo-deepseek/trial-3.md +28 -0
  247. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-001/current/kilo-glm/trial-1.md +114 -0
  248. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-001/current/kilo-glm/trial-2.md +137 -0
  249. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-001/current/kilo-glm/trial-3.md +188 -0
  250. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-001/current/kilo-minimax/trial-1.md +0 -0
  251. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-001/current/kilo-minimax/trial-2.md +32 -0
  252. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-001/current/kilo-minimax/trial-3.md +110 -0
  253. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-001/current/meta.json +115 -0
  254. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-001-atomicity-no-1to1.yaml +56 -0
  255. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-002/current/claude-sonnet/trial-1.md +47 -0
  256. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-002/current/claude-sonnet/trial-2.md +54 -0
  257. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-002/current/claude-sonnet/trial-3.md +43 -0
  258. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-002/current/judge.json +163 -0
  259. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-002/current/kilo-deepseek/trial-1.md +15 -0
  260. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-002/current/kilo-deepseek/trial-2.md +5 -0
  261. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-002/current/kilo-deepseek/trial-3.md +12 -0
  262. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-002/current/kilo-glm/trial-1.md +34 -0
  263. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-002/current/kilo-glm/trial-2.md +30 -0
  264. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-002/current/kilo-glm/trial-3.md +35 -0
  265. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-002/current/kilo-minimax/trial-1.md +0 -0
  266. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-002/current/kilo-minimax/trial-2.md +31 -0
  267. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-002/current/kilo-minimax/trial-3.md +0 -0
  268. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-002/current/meta.json +115 -0
  269. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-002-get-next-id-mandatory.yaml +44 -0
  270. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-003/current/claude-sonnet/trial-1.md +21 -0
  271. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-003/current/claude-sonnet/trial-2.md +38 -0
  272. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-003/current/claude-sonnet/trial-3.md +30 -0
  273. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-003/current/judge.json +163 -0
  274. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-003/current/kilo-deepseek/trial-1.md +31 -0
  275. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-003/current/kilo-deepseek/trial-2.md +35 -0
  276. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-003/current/kilo-deepseek/trial-3.md +48 -0
  277. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-003/current/kilo-glm/trial-1.md +167 -0
  278. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-003/current/kilo-glm/trial-2.md +62 -0
  279. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-003/current/kilo-glm/trial-3.md +174 -0
  280. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-003/current/kilo-minimax/trial-1.md +0 -0
  281. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-003/current/kilo-minimax/trial-2.md +0 -0
  282. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-003/current/kilo-minimax/trial-3.md +0 -0
  283. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-003/current/meta.json +115 -0
  284. package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-003-verbatim-dod-transfer.yaml +42 -0
  285. package/src/skills/decompose-plan/tests/index.yaml +30 -0
  286. package/src/skills/decompose-plan/tests/rubrics/atomicity-no-1to1.md +21 -0
  287. package/src/skills/decompose-plan/tests/rubrics/get-next-id-mandatory.md +21 -0
  288. package/src/skills/decompose-plan/tests/rubrics/verbatim-dod-transfer.md +21 -0
  289. package/src/skills/decompose-plan/workflows/decompose.md +272 -0
  290. package/src/skills/deep-research/README.md +36 -0
  291. package/src/skills/deep-research/SKILL.md +106 -0
  292. package/src/skills/deep-research/algorithms/source-scoring.md +63 -0
  293. package/src/skills/deep-research/algorithms/synthesis.md +67 -0
  294. package/src/skills/deep-research/knowledge/data-validation.md +44 -0
  295. package/src/skills/deep-research/knowledge/perplexity-config.md +30 -0
  296. package/src/skills/deep-research/knowledge/research-methodology.md +54 -0
  297. package/src/skills/deep-research/knowledge/source-evaluation.md +33 -0
  298. package/src/skills/deep-research/scripts/perplexity-research.js +315 -0
  299. package/src/skills/deep-research/templates/brief-summary.md +25 -0
  300. package/src/skills/deep-research/templates/research-report.md +76 -0
  301. package/src/skills/deep-research/tests/cases/TC-DEEP-RESEARCH-001/current/claude-haiku/trial-1.md +48 -0
  302. package/src/skills/deep-research/tests/cases/TC-DEEP-RESEARCH-001/current/claude-haiku/trial-2.md +88 -0
  303. package/src/skills/deep-research/tests/cases/TC-DEEP-RESEARCH-001/current/claude-haiku/trial-3.md +56 -0
  304. package/src/skills/deep-research/tests/cases/TC-DEEP-RESEARCH-001/current/judge.json +163 -0
  305. package/src/skills/deep-research/tests/cases/TC-DEEP-RESEARCH-001/current/kilo-free/trial-1.md +58 -0
  306. package/src/skills/deep-research/tests/cases/TC-DEEP-RESEARCH-001/current/kilo-free/trial-2.md +249 -0
  307. package/src/skills/deep-research/tests/cases/TC-DEEP-RESEARCH-001/current/kilo-free/trial-3.md +44 -0
  308. package/src/skills/deep-research/tests/cases/TC-DEEP-RESEARCH-001/current/kilo-glm/trial-1.md +96 -0
  309. package/src/skills/deep-research/tests/cases/TC-DEEP-RESEARCH-001/current/kilo-glm/trial-2.md +56 -0
  310. package/src/skills/deep-research/tests/cases/TC-DEEP-RESEARCH-001/current/kilo-glm/trial-3.md +94 -0
  311. package/src/skills/deep-research/tests/cases/TC-DEEP-RESEARCH-001/current/kilo-glm-air/trial-1.md +11 -0
  312. package/src/skills/deep-research/tests/cases/TC-DEEP-RESEARCH-001/current/kilo-glm-air/trial-2.md +1 -0
  313. package/src/skills/deep-research/tests/cases/TC-DEEP-RESEARCH-001/current/kilo-glm-air/trial-3.md +1 -0
  314. package/src/skills/deep-research/tests/cases/TC-DEEP-RESEARCH-001/current/meta.json +115 -0
  315. package/src/skills/deep-research/tests/cases/TC-DEEP-RESEARCH-001-self-check-url.yaml +58 -0
  316. package/src/skills/deep-research/tests/index.yaml +20 -0
  317. package/src/skills/deep-research/tests/rubrics/self-check-url.md +34 -0
  318. package/src/skills/deep-research/workflows/base-checklist.md +19 -0
  319. package/src/skills/deep-research/workflows/benchmark.md +38 -0
  320. package/src/skills/deep-research/workflows/competitor.md +44 -0
  321. package/src/skills/deep-research/workflows/custom.md +32 -0
  322. package/src/skills/deep-research/workflows/market.md +44 -0
  323. package/src/skills/deep-research/workflows/technology.md +40 -0
  324. package/src/skills/deep-research/workflows/trend.md +40 -0
  325. package/src/skills/execute-task/README.md +44 -0
  326. package/src/skills/execute-task/SKILL.md +292 -0
  327. package/src/skills/execute-task/algorithms/execution-strategy.md +136 -0
  328. package/src/skills/execute-task/knowledge/context-checkpoints.md +75 -0
  329. package/src/skills/execute-task/knowledge/ticket-structure.md +70 -0
  330. package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-001/current/claude-haiku/trial-1.md +5 -0
  331. package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-001/current/claude-haiku/trial-2.md +5 -0
  332. package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-001/current/claude-haiku/trial-3.md +5 -0
  333. package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-001/current/judge.json +124 -0
  334. package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-001/current/kilo-free/trial-1.md +4 -0
  335. package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-001/current/kilo-free/trial-2.md +4 -0
  336. package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-001/current/kilo-free/trial-3.md +4 -0
  337. package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-001/current/kilo-glm-air/trial-1.md +4 -0
  338. package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-001/current/kilo-glm-air/trial-2.md +4 -0
  339. package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-001/current/kilo-glm-air/trial-3.md +11 -0
  340. package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-001/current/meta.json +89 -0
  341. package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-001-no-ticket-creation.yaml +48 -0
  342. package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-002/current/claude-haiku/trial-1.md +5 -0
  343. package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-002/current/claude-haiku/trial-2.md +6 -0
  344. package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-002/current/claude-haiku/trial-3.md +5 -0
  345. package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-002/current/judge.json +124 -0
  346. package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-002/current/kilo-free/trial-1.md +4 -0
  347. package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-002/current/kilo-free/trial-2.md +4 -0
  348. package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-002/current/kilo-free/trial-3.md +8 -0
  349. package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-002/current/kilo-glm-air/trial-1.md +9 -0
  350. package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-002/current/kilo-glm-air/trial-2.md +26 -0
  351. package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-002/current/kilo-glm-air/trial-3.md +4 -0
  352. package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-002/current/meta.json +89 -0
  353. package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-002-no-duplicate-dod.yaml +44 -0
  354. package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-003/current/claude-haiku/trial-1.md +5 -0
  355. package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-003/current/claude-haiku/trial-2.md +5 -0
  356. package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-003/current/claude-haiku/trial-3.md +5 -0
  357. package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-003/current/judge.json +46 -0
  358. package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-003/current/meta.json +37 -0
  359. package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-003-verification-proportionality.yaml +46 -0
  360. package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-004/current/claude-haiku/trial-1.md +18 -0
  361. package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-004/current/claude-haiku/trial-2.md +16 -0
  362. package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-004/current/claude-haiku/trial-3.md +14 -0
  363. package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-004/current/judge.json +124 -0
  364. package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-004/current/kilo-free/trial-1.md +5 -0
  365. package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-004/current/kilo-free/trial-2.md +5 -0
  366. package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-004/current/kilo-free/trial-3.md +1 -0
  367. package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-004/current/kilo-glm-air/trial-1.md +8 -0
  368. package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-004/current/kilo-glm-air/trial-2.md +5 -0
  369. package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-004/current/kilo-glm-air/trial-3.md +4 -0
  370. package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-004/current/meta.json +89 -0
  371. package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-004-no-foreign-ticket-edit.yaml +50 -0
  372. package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-005/current/claude-haiku/trial-1.md +5 -0
  373. package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-005/current/claude-haiku/trial-2.md +5 -0
  374. package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-005/current/claude-haiku/trial-3.md +5 -0
  375. package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-005/current/judge.json +124 -0
  376. package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-005/current/kilo-free/trial-1.md +15 -0
  377. package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-005/current/kilo-free/trial-2.md +4 -0
  378. package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-005/current/kilo-free/trial-3.md +5 -0
  379. package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-005/current/kilo-glm-air/trial-1.md +11 -0
  380. package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-005/current/kilo-glm-air/trial-2.md +11 -0
  381. package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-005/current/kilo-glm-air/trial-3.md +4 -0
  382. package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-005/current/meta.json +89 -0
  383. package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-005-ticket-fields-updated.yaml +39 -0
  384. package/src/skills/execute-task/tests/fixtures/IMPL-902-create-file.md +41 -0
  385. package/src/skills/execute-task/tests/fixtures/IMPL-904-current-task.md +40 -0
  386. package/src/skills/execute-task/tests/fixtures/IMPL-906-fill-ticket.md +42 -0
  387. package/src/skills/execute-task/tests/fixtures/QA-901-button-click.md +41 -0
  388. package/src/skills/execute-task/tests/fixtures/QA-903-visual-figma.md +40 -0
  389. package/src/skills/execute-task/tests/fixtures/TASK-905-done-with-typo.md +36 -0
  390. package/src/skills/execute-task/tests/index.yaml +39 -0
  391. package/src/skills/execute-task/tests/rubrics/no-duplicate-dod.md +22 -0
  392. package/src/skills/execute-task/tests/rubrics/no-foreign-ticket-edit.md +20 -0
  393. package/src/skills/execute-task/tests/rubrics/no-ticket-creation.md +21 -0
  394. package/src/skills/execute-task/tests/rubrics/ticket-fields-updated.md +23 -0
  395. package/src/skills/execute-task/tests/rubrics/verification-proportionality.md +22 -0
  396. package/src/skills/execute-task/workflows/execute.md +104 -0
  397. package/src/skills/manual-testing/README.md +63 -0
  398. package/src/skills/manual-testing/SKILL.md +174 -0
  399. package/src/skills/manual-testing/algorithms/blocked-tool-strategy.md +74 -0
  400. package/src/skills/manual-testing/algorithms/bug-severity.md +73 -0
  401. package/src/skills/manual-testing/algorithms/mcp-budget.md +97 -0
  402. package/src/skills/manual-testing/algorithms/test-prioritization.md +69 -0
  403. package/src/skills/manual-testing/knowledge/browser-extension-testing.md +102 -0
  404. package/src/skills/manual-testing/knowledge/browser-tools.md +114 -0
  405. package/src/skills/manual-testing/knowledge/desktop-tools-advanced.md +92 -0
  406. package/src/skills/manual-testing/knowledge/desktop-tools-core.md +76 -0
  407. package/src/skills/manual-testing/knowledge/sandbox-advanced.md +83 -0
  408. package/src/skills/manual-testing/knowledge/sandbox-core.md +67 -0
  409. package/src/skills/manual-testing/knowledge/stateful-edge-cases.md +69 -0
  410. package/src/skills/manual-testing/knowledge/test-case-design.md +107 -0
  411. package/src/skills/manual-testing/knowledge/testing-types.md +45 -0
  412. package/src/skills/manual-testing/templates/bug-report.md +52 -0
  413. package/src/skills/manual-testing/templates/test-case.md +34 -0
  414. package/src/skills/manual-testing/templates/test-plan.md +97 -0
  415. package/src/skills/manual-testing/templates/test-session-report.md +56 -0
  416. package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-001/current/claude-sonnet/trial-1.md +21 -0
  417. package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-001/current/claude-sonnet/trial-2.md +65 -0
  418. package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-001/current/claude-sonnet/trial-3.md +35 -0
  419. package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-001/current/judge.json +163 -0
  420. package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-001/current/kilo-deepseek/trial-1.md +0 -0
  421. package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-001/current/kilo-deepseek/trial-2.md +7 -0
  422. package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-001/current/kilo-deepseek/trial-3.md +0 -0
  423. package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-001/current/kilo-glm/trial-1.md +4 -0
  424. package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-001/current/kilo-glm/trial-2.md +15 -0
  425. package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-001/current/kilo-glm/trial-3.md +8 -0
  426. package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-001/current/kilo-minimax/trial-1.md +5 -0
  427. package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-001/current/kilo-minimax/trial-2.md +7 -0
  428. package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-001/current/kilo-minimax/trial-3.md +7 -0
  429. package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-001/current/meta.json +114 -0
  430. package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-001-sandbox-mandatory.yaml +38 -0
  431. package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-002/current/claude-sonnet/trial-1.md +47 -0
  432. package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-002/current/claude-sonnet/trial-2.md +39 -0
  433. package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-002/current/claude-sonnet/trial-3.md +40 -0
  434. package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-002/current/judge.json +163 -0
  435. package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-002/current/kilo-deepseek/trial-1.md +19 -0
  436. package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-002/current/kilo-deepseek/trial-2.md +15 -0
  437. package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-002/current/kilo-deepseek/trial-3.md +24 -0
  438. package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-002/current/kilo-glm/trial-1.md +19 -0
  439. package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-002/current/kilo-glm/trial-2.md +13 -0
  440. package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-002/current/kilo-glm/trial-3.md +18 -0
  441. package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-002/current/kilo-minimax/trial-1.md +21 -0
  442. package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-002/current/kilo-minimax/trial-2.md +15 -0
  443. package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-002/current/kilo-minimax/trial-3.md +14 -0
  444. package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-002/current/meta.json +114 -0
  445. package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-002-visual-tc-screenshot.yaml +37 -0
  446. package/src/skills/manual-testing/tests/index.yaml +25 -0
  447. package/src/skills/manual-testing/tests/last-run-tc001-sonnet.log +140 -0
  448. package/src/skills/manual-testing/tests/last-run-tc002.log +1 -0
  449. package/src/skills/manual-testing/tests/last-run.log +1469 -0
  450. package/src/skills/manual-testing/tests/rubrics/sandbox-mandatory.md +20 -0
  451. package/src/skills/manual-testing/tests/rubrics/visual-tc-screenshot.md +21 -0
  452. package/src/skills/manual-testing/workflows/acceptance.md +80 -0
  453. package/src/skills/manual-testing/workflows/exploratory.md +84 -0
  454. package/src/skills/manual-testing/workflows/regression.md +76 -0
  455. package/src/skills/manual-testing/workflows/smoke.md +109 -0
  456. package/src/skills/manual-testing/workflows/test-plan.md +75 -0
  457. package/src/skills/review-result/README.md +59 -0
  458. package/src/skills/review-result/SKILL.md +138 -0
  459. package/src/skills/review-result/algorithms/verification.md +112 -0
  460. package/src/skills/review-result/knowledge/dod-patterns.md +115 -0
  461. package/src/skills/review-result/scripts/verify-artifacts.js +354 -0
  462. package/src/skills/review-result/templates/verdict.md +153 -0
  463. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-001/current/claude-haiku/trial-1.md +22 -0
  464. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-001/current/claude-haiku/trial-2.md +7 -0
  465. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-001/current/claude-haiku/trial-3.md +21 -0
  466. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-001/current/claude-sonnet/trial-1.md +6 -0
  467. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-001/current/claude-sonnet/trial-2.md +6 -0
  468. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-001/current/claude-sonnet/trial-3.md +18 -0
  469. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-001/current/judge.json +164 -0
  470. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-001/current/kilo-deepseek/trial-1.md +5 -0
  471. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-001/current/kilo-deepseek/trial-2.md +7 -0
  472. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-001/current/kilo-deepseek/trial-3.md +6 -0
  473. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-001/current/kilo-glm/trial-1.md +49 -0
  474. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-001/current/kilo-glm/trial-2.md +28 -0
  475. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-001/current/kilo-glm/trial-3.md +37 -0
  476. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-001/current/kilo-minimax/trial-1.md +22 -0
  477. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-001/current/kilo-minimax/trial-2.md +13 -0
  478. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-001/current/kilo-minimax/trial-3.md +21 -0
  479. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-001/current/meta.json +116 -0
  480. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-001-visual-tc-trigger.yaml +51 -0
  481. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-002/current/claude-haiku/trial-1.md +23 -0
  482. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-002/current/claude-haiku/trial-2.md +22 -0
  483. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-002/current/claude-haiku/trial-3.md +28 -0
  484. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-002/current/claude-sonnet/trial-1.md +4 -0
  485. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-002/current/claude-sonnet/trial-2.md +36 -0
  486. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-002/current/claude-sonnet/trial-3.md +4 -0
  487. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-002/current/judge.json +163 -0
  488. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-002/current/kilo-deepseek/trial-1.md +4 -0
  489. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-002/current/kilo-deepseek/trial-2.md +0 -0
  490. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-002/current/kilo-deepseek/trial-3.md +4 -0
  491. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-002/current/kilo-glm/trial-1.md +39 -0
  492. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-002/current/kilo-glm/trial-2.md +25 -0
  493. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-002/current/kilo-glm/trial-3.md +32 -0
  494. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-002/current/kilo-minimax/trial-1.md +34 -0
  495. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-002/current/kilo-minimax/trial-2.md +8 -0
  496. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-002/current/kilo-minimax/trial-3.md +23 -0
  497. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-002/current/meta.json +115 -0
  498. package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-002-path-line-suffix.yaml +39 -0
  499. package/src/skills/review-result/tests/fixtures/IMPL-902-path-with-line.md +43 -0
  500. package/src/skills/review-result/tests/fixtures/QA-901-visual-button.md +46 -0
  501. package/src/skills/review-result/tests/index.yaml +25 -0
  502. package/src/skills/review-result/tests/rubrics/path-line-suffix.md +19 -0
  503. package/src/skills/review-result/tests/rubrics/visual-tc-trigger.md +19 -0
  504. package/src/skills/review-result/workflows/review.md +209 -0
  505. package/templates/plan-template.md +1 -0
@@ -0,0 +1,354 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * verify-artifacts.js — механическая предпроверка тикета перед AI-ревью.
5
+ *
6
+ * Парсит тикет и проверяет:
7
+ * - Существование файлов из секции "Изменённые файлы"
8
+ * - DoD completion %
9
+ * - Заполненность секции Result (Summary)
10
+ *
11
+ * Использование (как стейдж пайплайна):
12
+ * node verify-artifacts.js "<prompt>"
13
+ * Парсит ticket_id из Context-блока в промпте, резолвит в .workflow/tickets/review/{id}.md
14
+ *
15
+ * Использование (как standalone-скрипт):
16
+ * node verify-artifacts.js <path-to-ticket>
17
+ * node verify-artifacts.js <TICKET-ID>
18
+ *
19
+ * Вывод (для runner'а):
20
+ * ---RESULT---
21
+ * status: passed|failed
22
+ * dod_completion_pct: <int>
23
+ * result_filled: <bool>
24
+ * missing_files: <comma-separated list or empty>
25
+ * ---RESULT---
26
+ */
27
+
28
+ import fs from 'fs';
29
+ import path from 'path';
30
+ import { findProjectRoot } from 'workflow-ai/lib/find-root.mjs';
31
+ import { parseFrontmatter } from 'workflow-ai/lib/utils.mjs';
32
+
33
+ const PROJECT_DIR = findProjectRoot();
34
+ const TICKETS_DIR = path.join(PROJECT_DIR, '.workflow', 'tickets');
35
+ const REVIEW_STATUSES = ['review', 'in-progress', 'done', 'ready', 'backlog'];
36
+
37
+ function parseChangedFiles(body) {
38
+ const files = [];
39
+ const changedFilesRegex = /^###\s*(?:Изменённые файлы|Changed files)\s*$/gm;
40
+ const match = changedFilesRegex.exec(body);
41
+
42
+ if (!match) return files;
43
+
44
+ // Граница H3-секции — следующий H3 ИЛИ H2 (что встретится раньше),
45
+ // иначе захватываем соседние подзаголовки вроде "### Время выполнения",
46
+ // где в backticks лежат команды и цитаты, которые парсер принимает за пути.
47
+ const startIdx = match.index + match[0].length;
48
+ const nextH3 = body.indexOf('\n### ', startIdx);
49
+ const nextH2 = body.indexOf('\n## ', startIdx);
50
+ const candidates = [nextH3, nextH2].filter((i) => i !== -1);
51
+ const sectionEnd = candidates.length > 0 ? Math.min(...candidates) : body.length;
52
+ const sectionContent = body.substring(startIdx, sectionEnd);
53
+
54
+ // Пути принимаем только из строк-буллетов ("- `path`" или "* `path`"):
55
+ // это страхует от ложных срабатываний на цитатах/командах в инлайн-коде.
56
+ const bulletFileRegex = /^[-*]\s+`([^`]+)`/gm;
57
+ let fileMatch;
58
+ while ((fileMatch = bulletFileRegex.exec(sectionContent)) !== null) {
59
+ files.push(stripLineSuffix(fileMatch[1]));
60
+ }
61
+
62
+ return files;
63
+ }
64
+
65
+ // Поддержка отраслевой нотации ссылок на код: `path:line`, `path:start-end`.
66
+ // Суффикс указывает на строки в файле, но не является частью имени файла —
67
+ // отрезаем его перед проверкой существования на диске. Не трогаем `C:\...` на
68
+ // Windows (после двоеточия идёт не число, а разделитель пути).
69
+ function stripLineSuffix(filePath) {
70
+ const match = filePath.match(/^(.*?):(\d+)(?:-\d+)?$/);
71
+ return match ? match[1] : filePath;
72
+ }
73
+
74
+ function checkFilesExist(filePaths) {
75
+ return filePaths.map(filePath => {
76
+ const fullPath = path.isAbsolute(filePath) ? filePath : path.join(PROJECT_DIR, filePath);
77
+ return {
78
+ path: filePath,
79
+ exists: fs.existsSync(fullPath)
80
+ };
81
+ });
82
+ }
83
+
84
+ function parseDoDCompletion(body) {
85
+ // Канонический формат в этом проекте — "## Критерии готовности (Definition of Done)",
86
+ // но поддерживаем и чистые варианты (обе локали, с/без уточнения в скобках).
87
+ const dodSectionRegex = /^##\s*(?:Критерии готовности|Definition of Done)(?:\s*\([^)]*\))?\s*$/gm;
88
+ const match = dodSectionRegex.exec(body);
89
+
90
+ if (!match) return { checked: 0, completed: 0, percentage: 0 };
91
+
92
+ const startIdx = match.index + match[0].length;
93
+ const nextH2 = body.indexOf('\n## ', startIdx);
94
+ const sectionEnd = nextH2 === -1 ? body.length : nextH2;
95
+ const sectionContent = body.substring(startIdx, sectionEnd);
96
+
97
+ const checkedBoxes = (sectionContent.match(/\[x\]/gi) || []).length;
98
+ const totalBoxes = (sectionContent.match(/\[ \]|\[x\]/gi) || []).length;
99
+
100
+ const percentage = totalBoxes > 0 ? Math.round((checkedBoxes / totalBoxes) * 100) : 0;
101
+
102
+ return {
103
+ checked: totalBoxes,
104
+ completed: checkedBoxes,
105
+ percentage
106
+ };
107
+ }
108
+
109
+ function checkResultSection(body) {
110
+ // Порядок альтернатив важен: «Результат выполнения» перед «Результат»,
111
+ // чтобы более длинный вариант матчился первым.
112
+ const resultSectionRegex = /^##\s*(Результат выполнения|Результат|Result)\s*$/m;
113
+ const sectionMatch = resultSectionRegex.exec(body);
114
+
115
+ if (!sectionMatch) return { exists: false, summaryFilled: false };
116
+
117
+ const startIdx = sectionMatch.index + sectionMatch[0].length;
118
+ const nextH2 = body.indexOf('\n## ', startIdx);
119
+ const sectionEnd = nextH2 === -1 ? body.length : nextH2;
120
+ const sectionContent = body.substring(startIdx, sectionEnd);
121
+
122
+ // Сначала пытаемся найти явную подсекцию Summary
123
+ const summaryRegex = /^###\s*(Summary|Что сделано)\s*$/m;
124
+ const summaryMatch = summaryRegex.exec(sectionContent);
125
+
126
+ let summaryContent;
127
+ if (summaryMatch) {
128
+ // Есть явная подсекция — берём контент только из неё
129
+ const summaryStartIdx = summaryMatch.index + summaryMatch[0].length;
130
+ const nextSubsection = sectionContent.indexOf('\n### ', summaryStartIdx);
131
+ const summaryEnd = nextSubsection === -1 ? sectionContent.length : nextSubsection;
132
+ summaryContent = sectionContent.substring(summaryStartIdx, summaryEnd);
133
+ } else {
134
+ // Нет явной Summary — проверяем, есть ли вообще контент в секции Result
135
+ // (любые подсекции, таблицы, текст считаются заполненной секцией)
136
+ summaryContent = sectionContent;
137
+ }
138
+
139
+ const withoutComments = summaryContent.replace(/<!--[\s\S]*?-->/g, '').trim();
140
+ const hasContent = withoutComments.length > 0;
141
+
142
+ return {
143
+ exists: true,
144
+ summaryFilled: hasContent
145
+ };
146
+ }
147
+
148
+ function verifyTicket(ticketPath) {
149
+ if (!fs.existsSync(ticketPath)) {
150
+ throw new Error(`Ticket file not found: ${ticketPath}`);
151
+ }
152
+
153
+ const content = fs.readFileSync(ticketPath, 'utf8');
154
+ const { frontmatter, body } = parseFrontmatter(content);
155
+
156
+ const filePaths = parseChangedFiles(body);
157
+ const filesExist = checkFilesExist(filePaths);
158
+
159
+ const dodStats = parseDoDCompletion(body);
160
+
161
+ const resultStats = checkResultSection(body);
162
+
163
+ return {
164
+ ticket_id: frontmatter.id,
165
+ files_exist: filesExist,
166
+ dod_completion_pct: dodStats.percentage,
167
+ dod_checked: dodStats.checked,
168
+ dod_completed: dodStats.completed,
169
+ result_exists: resultStats.exists,
170
+ result_filled: resultStats.summaryFilled
171
+ };
172
+ }
173
+
174
+ function resolveTicketPath(arg) {
175
+ // 1. Промпт от runner'а — ищем "ticket_id: XXX" в тексте.
176
+ // Проверяем первым, потому что промпт содержит пути (plans/current/...)
177
+ // и символы '/', '\', '.md', которые ложно срабатывают в проверке на путь.
178
+ const promptMatch = arg.match(/ticket_id:\s*([A-Z]+-\d+)/i);
179
+ if (promptMatch) {
180
+ return resolveTicketPath(promptMatch[1]);
181
+ }
182
+
183
+ // 2. Явный путь — absolute или relative
184
+ if (arg.includes('/') || arg.includes('\\') || arg.endsWith('.md')) {
185
+ return path.isAbsolute(arg) ? arg : path.resolve(process.cwd(), arg);
186
+ }
187
+
188
+ // 3. Чистый ticket_id (QA-009) — резолвим по статусам
189
+ if (/^[A-Z]+-\d+$/i.test(arg)) {
190
+ for (const status of REVIEW_STATUSES) {
191
+ const candidate = path.join(TICKETS_DIR, status, `${arg}.md`);
192
+ if (fs.existsSync(candidate)) return candidate;
193
+ }
194
+ return path.join(TICKETS_DIR, 'review', `${arg}.md`);
195
+ }
196
+
197
+ return null;
198
+ }
199
+
200
+ function formatVerdict(result) {
201
+ const missingFiles = result.files_exist
202
+ .filter((f) => !f.exists)
203
+ .map((f) => f.path);
204
+
205
+ // Критерии failed:
206
+ // - result_filled == false (секция Result пуста)
207
+ // - dod_completion_pct == 0 (ни один пункт DoD не отмечен)
208
+ // - есть отсутствующие файлы из "Изменённые файлы"
209
+ const failReasons = [];
210
+ const humanIssues = [];
211
+ if (!result.result_filled) {
212
+ failReasons.push('result_filled=false');
213
+ humanIssues.push(result.result_exists
214
+ ? 'секция Результата пуста (Summary не заполнен)'
215
+ : 'секция Результата отсутствует');
216
+ }
217
+ if (result.dod_completion_pct === 0) {
218
+ failReasons.push('dod_completion_pct=0');
219
+ humanIssues.push(`ни один пункт DoD не отмечен (0/${result.dod_checked || 0})`);
220
+ }
221
+ if (missingFiles.length > 0) {
222
+ failReasons.push(`missing_files=${missingFiles.join(',')}`);
223
+ humanIssues.push(`не найдены заявленные файлы: ${missingFiles.join(', ')}`);
224
+ }
225
+
226
+ const status = failReasons.length === 0 ? 'passed' : 'failed';
227
+
228
+ return { status, missingFiles, failReasons, humanIssues };
229
+ }
230
+
231
+ function buildReviewRow(humanIssues) {
232
+ const date = new Date().toISOString().slice(0, 10);
233
+ const summary = `verify-artifacts: ${humanIssues.join('; ')}`;
234
+ return `| ${date} | ❌ failed | ${summary} |`;
235
+ }
236
+
237
+ function appendReviewNote(ticketPath, humanIssues) {
238
+ const content = fs.readFileSync(ticketPath, 'utf8');
239
+ const newRow = buildReviewRow(humanIssues);
240
+
241
+ const reviewHeaderRegex = /^##\s*(Ревью|Review)\s*$/m;
242
+ const headerMatch = reviewHeaderRegex.exec(content);
243
+
244
+ if (headerMatch) {
245
+ // Секция существует — добавить строку в конец таблицы.
246
+ const startIdx = headerMatch.index + headerMatch[0].length;
247
+ const nextH2 = content.indexOf('\n## ', startIdx);
248
+ const sectionEnd = nextH2 === -1 ? content.length : nextH2;
249
+ const sectionContent = content.substring(startIdx, sectionEnd);
250
+
251
+ // Идемпотентность: не дублировать, если последняя непустая строка
252
+ // таблицы уже совпадает с новой по самари (дата игнорируется).
253
+ const lines = sectionContent.split('\n').map((l) => l.trimEnd()).filter(Boolean);
254
+ const lastRow = [...lines].reverse().find((l) => l.startsWith('|'));
255
+ if (lastRow) {
256
+ const lastSummary = lastRow.split('|').slice(3, -1).join('|').trim();
257
+ const newSummary = newRow.split('|').slice(3, -1).join('|').trim();
258
+ if (lastSummary === newSummary) return false;
259
+ }
260
+
261
+ const trimmedSection = sectionContent.replace(/\s+$/, '');
262
+ const hasTable = /\|\s*Дата\s*\|/i.test(trimmedSection);
263
+ const tableHeader = hasTable
264
+ ? ''
265
+ : '\n\n| Дата | Статус | Самари |\n|------|--------|--------|';
266
+ const updatedSection = `${trimmedSection}${tableHeader}\n${newRow}\n`;
267
+ const suffix = nextH2 === -1 ? '' : content.substring(sectionEnd);
268
+ const updated = content.substring(0, startIdx) + updatedSection + (suffix.startsWith('\n') ? suffix : `\n${suffix}`);
269
+ fs.writeFileSync(ticketPath, updated, 'utf8');
270
+ return true;
271
+ }
272
+
273
+ // Секции нет — создать перед "## Результат выполнения" / "## Result".
274
+ const resultHeaderRegex = /^##\s*(Результат выполнения|Результат|Result)\s*$/m;
275
+ const resultMatch = resultHeaderRegex.exec(content);
276
+
277
+ const newSection = `## Ревью\n\n| Дата | Статус | Самари |\n|------|--------|--------|\n${newRow}\n\n`;
278
+
279
+ let updated;
280
+ if (resultMatch) {
281
+ updated = content.substring(0, resultMatch.index) + newSection + content.substring(resultMatch.index);
282
+ } else {
283
+ // Fallback: в конец файла.
284
+ const sep = content.endsWith('\n') ? '' : '\n';
285
+ updated = `${content}${sep}\n${newSection}`;
286
+ }
287
+ fs.writeFileSync(ticketPath, updated, 'utf8');
288
+ return true;
289
+ }
290
+
291
+ function main() {
292
+ const args = process.argv.slice(2);
293
+
294
+ if (args.length === 0) {
295
+ console.error('Usage: node verify-artifacts.js <path-to-ticket|ticket_id|prompt>');
296
+ process.exit(1);
297
+ }
298
+
299
+ const arg = args.join(' ');
300
+ const ticketPath = resolveTicketPath(arg);
301
+
302
+ if (!ticketPath) {
303
+ console.error('Error: could not resolve ticket path from argument');
304
+ console.log('---RESULT---');
305
+ console.log('status: failed');
306
+ console.log('reason: ticket_path_unresolved');
307
+ console.log('---RESULT---');
308
+ process.exit(1);
309
+ }
310
+
311
+ if (!fs.existsSync(ticketPath)) {
312
+ console.error(`Error: ticket file not found: ${ticketPath}`);
313
+ console.log('---RESULT---');
314
+ console.log('status: failed');
315
+ console.log(`reason: ticket_file_not_found`);
316
+ console.log(`ticket_path: ${ticketPath}`);
317
+ console.log('---RESULT---');
318
+ process.exit(1);
319
+ }
320
+
321
+ try {
322
+ const result = verifyTicket(ticketPath);
323
+ const verdict = formatVerdict(result);
324
+
325
+ let reviewNoteWritten = false;
326
+ if (verdict.status === 'failed' && verdict.humanIssues.length > 0) {
327
+ reviewNoteWritten = appendReviewNote(ticketPath, verdict.humanIssues);
328
+ }
329
+
330
+ console.log('---RESULT---');
331
+ console.log(`status: ${verdict.status}`);
332
+ console.log(`ticket_id: ${result.ticket_id || ''}`);
333
+ console.log(`dod_completion_pct: ${result.dod_completion_pct}`);
334
+ console.log(`dod_total: ${result.dod_checked}`);
335
+ console.log(`dod_completed: ${result.dod_completed}`);
336
+ console.log(`result_filled: ${result.result_filled}`);
337
+ console.log(`missing_files: ${verdict.missingFiles.join(',')}`);
338
+ if (verdict.failReasons.length > 0) {
339
+ console.log(`fail_reasons: ${verdict.failReasons.join('; ')}`);
340
+ console.log(`issues: ${verdict.humanIssues.join('; ')}`);
341
+ console.log(`review_note_written: ${reviewNoteWritten}`);
342
+ }
343
+ console.log('---RESULT---');
344
+ } catch (err) {
345
+ console.error(`Error: ${err.message}`);
346
+ console.log('---RESULT---');
347
+ console.log('status: failed');
348
+ console.log(`reason: ${err.message.replace(/\n/g, ' ')}`);
349
+ console.log('---RESULT---');
350
+ process.exit(1);
351
+ }
352
+ }
353
+
354
+ main();
@@ -0,0 +1,153 @@
1
+ # Шаблон вердикта ревью
2
+
3
+ Шаблон используется для структурированного формирования вердикта после проверки выполнения тикета. Заполняется агентом-ревьюером в секции `## Ревью` тикета.
4
+
5
+ ## Обязательные поля
6
+
7
+ | Поле | Описание | Формат |
8
+ |------|----------|--------|
9
+ | **ticket_id** | ID проверяемого тикета | `[a-zA-Z]+-\d+` (например, `IMPL-123`, `COACH-009`) |
10
+ | **verdict** | Итоговый статус проверки | `PASS` / `FAIL` |
11
+ | **criteria_checked** | Список проверенных критериев с результатом | Массив объектов `{criterion, result, evidence}` |
12
+ | **issues** | Найденные проблемы | Массив строк, пустой если проблем нет |
13
+ | **recommendations** | Рекомендации для следующего агента | Массив строк с конкретными действиями |
14
+
15
+ ## Формат JSON (для автоматической обработки)
16
+
17
+ ```json
18
+ {
19
+ "ticket_id": "XXX-001",
20
+ "verdict": "PASS",
21
+ "criteria_checked": [
22
+ {
23
+ "criterion": "Описание критерия из DoD",
24
+ "result": "passed",
25
+ "evidence": "file:line или ссылка на артефакт"
26
+ }
27
+ ],
28
+ "issues": [],
29
+ "recommendations": []
30
+ }
31
+ ```
32
+
33
+ ## Расшифровка статусов
34
+
35
+ - **PASS** → `status: passed` — все критерии DoD выполнены, артефакты верифицированы, результат соответствует ожиданиям.
36
+ - **FAIL** → `status: failed` — хотя бы один критерий DoD не выполнен, артефакты отсутствуют или не соответствуют требованиям.
37
+
38
+ > **КРИТИЧНО:** `status` в блоке `---RESULT---` принимает ТОЛЬКО `passed` или `failed`. `PARTIAL`, `default`, `ok` и любые другие значения — ОШИБКА, тикет попадёт в `blocked`.
39
+
40
+ ## Правила заполнения
41
+
42
+ ### 1. `criteria_checked`
43
+
44
+ Для каждого пункта DoD в тикете добавь запись:
45
+
46
+ ```json
47
+ {
48
+ "criterion": "Создан файл src/components/Button.tsx",
49
+ "result": "passed",
50
+ "evidence": "src/components/Button.tsx:1-50"
51
+ }
52
+ ```
53
+
54
+ Если критерий не выполнен:
55
+
56
+ ```json
57
+ {
58
+ "criterion": "Написаны unit-тесты для компонента",
59
+ "result": "failed",
60
+ "evidence": "tests/components/Button.test.tsx отсутствует"
61
+ }
62
+ ```
63
+
64
+ ### 2. `issues`
65
+
66
+ Перечисли конкретные проблемы, мешающие принять результат:
67
+
68
+ ```yaml
69
+ - "Пункт DoD #3 не выполнен: отсутствует файл config.yaml"
70
+ - "Артефакт содержит синтаксические ошибки (см. src/utils/parser.ts:45)"
71
+ - "Не все зависимости обновлены (package.json:12)"
72
+ ```
73
+
74
+ ### 3. `recommendations`
75
+
76
+ Дай actionable советы для следующего исполнителя (если требуется retry):
77
+
78
+ ```yaml
79
+ - "Добавить недостающий файл config.yaml по шаблону из .workflow/templates/"
80
+ - "Исправить синтаксическую ошибку в строке 45 файла parser.ts"
81
+ - "Обновить версию lodash в package.json до ^4.17.21"
82
+ ```
83
+
84
+ ## Пример заполнения
85
+
86
+ **Тикет:** `IMPL-045`
87
+ **DoD:**
88
+ - [x] Создан компонент `Header`
89
+ - [x] Добавлены пропсы `title`, `onClick`
90
+ - [ ] Написаны тесты для `Header`
91
+
92
+ **Вердикт:**
93
+
94
+ ```json
95
+ {
96
+ "ticket_id": "IMPL-045",
97
+ "verdict": "FAIL",
98
+ "criteria_checked": [
99
+ {
100
+ "criterion": "Создан компонент Header",
101
+ "result": "passed",
102
+ "evidence": "src/components/Header.tsx:1-30"
103
+ },
104
+ {
105
+ "criterion": "Добавлены пропсы title, onClick",
106
+ "result": "passed",
107
+ "evidence": "src/components/Header.tsx:5-15"
108
+ },
109
+ {
110
+ "criterion": "Написаны тесты для Header",
111
+ "result": "failed",
112
+ "evidence": "tests/components/Header.test.tsx отсутствует"
113
+ }
114
+ ],
115
+ "issues": [
116
+ "Пункт DoD #3 не выполнен: отсутствует файл tests/components/Header.test.tsx"
117
+ ],
118
+ "recommendations": [
119
+ "Создать файл tests/components/Header.test.tsx с тестами на рендеринг и клики"
120
+ ]
121
+ }
122
+ ```
123
+
124
+ ## Интеграция с секцией ревью тикета
125
+
126
+ После формирования вердикта добавь в тикет таблицу:
127
+
128
+ ```markdown
129
+ ## Ревью
130
+
131
+ | Дата | Статус | Самари |
132
+ |------|--------|--------|
133
+ | 2026-03-30 14:20 | ✅ PASS | Все критерии выполнены, артефакты верифицированы |
134
+ ```
135
+
136
+ И приложи детали вердикта в виде спойлера:
137
+
138
+ <details>
139
+ <summary>Детали вердикта (JSON)</summary>
140
+
141
+ ```json
142
+ {...}
143
+ ```
144
+
145
+ </details>
146
+ ```
147
+
148
+ ## Примечания
149
+
150
+ - Шаблон содержит 78 строк (включая пустые), что укладывается в лимит ≤100 строк.
151
+ - Поля `verdict` и `status` в блоке `---RESULT---` должны совпадать.
152
+ - Для тикетов с `executor_type: human` достаточно текстового описания, JSON не обязателен.
153
+ - Используй этот шаблон как руководство, адаптируя уровень детализации под сложность тикета.
@@ -0,0 +1,22 @@
1
+ **Шаг 4.7 — Проверка визуального evidence:**
2
+
3
+ Обнаружен визуальный критерий DoD: "Кнопка визуально соответствует макету". По алгоритму шага 4.7 требуется:
4
+ 1. Поиск скриншотов по типичным местам → не найдены
5
+ 2. Проверка файла-артефакта `src/components/SubmitButton.tsx` → не существует
6
+
7
+ **Критические проблемы:**
8
+
9
+ 1. **Визуальный критерий без скриншота** — DoD содержит критерий "Кнопка визуально соответствует макету", но скриншотов приложено не было. Исполнитель указал "Скриншоты не прикладывал — проверял локально в браузере". Визуальное свойство кнопки не может быть верифицировано без визуального артефакта.
10
+
11
+ 2. **Отсутствие файла-артефакта** — В «Изменённые файлы» указан `src/components/SubmitButton.tsx`, но физически файл не существует в проекте. Проверка через Glob и поиск в директории не дали результатов.
12
+
13
+ Оба условия соответствуют критериям `failed` для QA-тикетов из dod-patterns.md:
14
+ - HIGH issue об отсутствующих файлах-артефактах блокирует `passed`
15
+ - Визуальный TC без скриншота не может быть подтверждён
16
+
17
+ ---RESULT---
18
+ status: failed
19
+ issues:
20
+ - "DoD пункт 1 содержит визуальный критерий 'Кнопка визуально соответствует макету', но visual evidence (скриншот) отсутствует. Исполнитель указал 'проверял локально в браузере' без приложения артефактов. Визуальное соответствие макету не может быть верифицировано программной проверкой — требуется скриншот или видеозапись."
21
+ - "Файл src/components/SubmitButton.tsx из раздела 'Изменённые файлы' не существует. Проверка через Glob и файловую систему не дала результатов. Артефакт не обнаружен."
22
+ ---RESULT---
@@ -0,0 +1,7 @@
1
+ ---RESULT---
2
+ status: failed
3
+ issues:
4
+ - "DoD п.1 (Кнопка визуально соответствует макету): визуальный критерий требует скриншота, но evidence отсутствует"
5
+ - "DoD п.3 (Скругление углов 8px): визуальный критерий требует скриншота или проверки в коде через визуальное свойство, скриншоты не приложены"
6
+ - "По правилу QA-ревью (п.5.1 review.md): скриншоты обязательны если указаны в DoD. Исполнитель заявил скриншоты не прикладывал, что блокирует валидацию визуальных свойств"
7
+ ---RESULT---
@@ -0,0 +1,21 @@
1
+ **Вердикт: FAILED**
2
+
3
+ ### Замечания по DoD
4
+
5
+ | № | Критерий | Статус | Причина |
6
+ |----|----------|--------|---------|
7
+ | 1 | Кнопка визуально соответствует макету | ❌ | Скриншот не приложен. Невозможно верифицировать соответствие макету Figma без визуального подтверждения. |
8
+ | 2 | Цвет совпадает с design tokens | ❌ | Скриншот не приложен. Невозможно подтвердить совпадение цвета визуально. |
9
+ | 3 | Скругление углов 8px | ❌ | Скриншот не приложен. Хотя это можно верифицировать из кода, исполнитель не предоставил визуальное подтверждение. |
10
+
11
+ ### Итог
12
+
13
+ Исполнитель отметил все критерии как выполненные, но не приложил **ни одного скриншота**. Это нарушает принцип **Evidence-Based** ревью: для визуальных критериев требуется реальное визуальное доказательство (скриншот из браузера/dev-tools, сравнение с макетом).
14
+
15
+ ---RESULT---
16
+ status: failed
17
+ issues:
18
+ - "Критерий 1 (Кнопка визуально соответствует макету): требуется скриншот для верификации соответствия макету"
19
+ - "Критерий 2 (Цвет совпадает с design tokens): требуется скриншот для подтверждения цвета"
20
+ - "Критерий 3 (Скругление углов 8px): требуется скриншот или код-inspection для визуального подтверждения"
21
+ ---RESULT---
@@ -0,0 +1,6 @@
1
+ ---RESULT---
2
+ status: failed
3
+ issues:
4
+ - "DoD пп.1-3 (все визуальные критерии): evidence отсутствует — нет скриншотов, нет a11y assertions, нет описания шагов тестирования. Result содержит только текстовое утверждение «проверял локально в браузере», что не является верифицируемым доказательством визуального соответствия. По п.5.1 workflow: FAIL если не приложил evidence (ни a11y assertion, ни описания шагов). [HIGH]"
5
+ - "Файл src/components/SubmitButton.tsx указан в «Изменённые файлы», но физически не существует в рабочей директории. [HIGH]"
6
+ ---RESULT---
@@ -0,0 +1,6 @@
1
+ ---RESULT---
2
+ status: failed
3
+ issues:
4
+ - "DoD п.1 «Кнопка визуально соответствует макету»: визуальный критерий не подтверждён — скриншоты не приложены, исполнитель сообщил о проверке локально в браузере без визуального артефакта. Шаг 4.7.0: HIGH issue — ревьюер не может подтвердить визуальное соответствие макету без скриншота."
5
+ - "Файл src/components/SubmitButton.tsx указан в «Изменённые файлы», но физически не существует в рабочей директории."
6
+ ---RESULT---
@@ -0,0 +1,18 @@
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
+ ---RESULT---
12
+ status: failed
13
+ issues:
14
+ - "DoD п.1 «Кнопка визуально соответствует макету»: визуальный критерий без evidence (HIGH) — скриншоты не найдены, исполнитель явно указал что их не прикладывал. Ревьюер не может подтвердить соответствие макету без визуального артефакта."
15
+ - "DoD п.2 «Цвет кнопки совпадает с design tokens»: отсутствует evidence (нет скриншота, нет ссылки на токены, нет assertion)."
16
+ - "DoD п.3 «Скругление углов 8px»: отсутствует evidence (нет скриншота, нет CSS-проверки)."
17
+ - "Файл src/components/SubmitButton.tsx физически не найден в рабочей директории."
18
+ ---RESULT---