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
@@ -1,95 +1,94 @@
1
- {
2
- "date": "2026-04-19T12:30:16.947Z",
3
- "skill_sha": "3c4e051",
4
- "status": "passed",
5
- "duration_ms": 2,
6
- "l1_skipped": true,
7
- "per_model": {
8
- "claude-sonnet": {
9
- "passed": true,
10
- "pass_count": 3,
11
- "total": 3,
12
- "threshold": 2
13
- },
14
- "kilo-deepseek": {
15
- "passed": true,
16
- "pass_count": 2,
17
- "total": 3,
18
- "threshold": 2
19
- },
20
- "kilo-minimax": {
21
- "passed": true,
22
- "pass_count": 3,
23
- "total": 3,
24
- "threshold": 2
25
- },
26
- "kilo-glm": {
27
- "passed": true,
28
- "pass_count": 3,
29
- "total": 3,
30
- "threshold": 2
31
- }
32
- },
33
- "rubric_scores": [
34
- {
35
- "agentId": "claude-sonnet",
36
- "trial": 1,
37
- "score": 5
38
- },
39
- {
40
- "agentId": "claude-sonnet",
41
- "trial": 2,
42
- "score": 5
43
- },
44
- {
45
- "agentId": "claude-sonnet",
46
- "trial": 3,
47
- "score": 5
48
- },
49
- {
50
- "agentId": "kilo-deepseek",
51
- "trial": 1,
52
- "score": 1
53
- },
54
- {
55
- "agentId": "kilo-deepseek",
56
- "trial": 2,
57
- "score": 5
58
- },
59
- {
60
- "agentId": "kilo-deepseek",
61
- "trial": 3,
62
- "score": 5
63
- },
64
- {
65
- "agentId": "kilo-minimax",
66
- "trial": 1,
67
- "score": 5
68
- },
69
- {
70
- "agentId": "kilo-minimax",
71
- "trial": 2,
72
- "score": 5
73
- },
74
- {
75
- "agentId": "kilo-minimax",
76
- "trial": 3,
77
- "score": 5
78
- },
79
- {
80
- "agentId": "kilo-glm",
81
- "trial": 1,
82
- "score": 5
83
- },
84
- {
85
- "agentId": "kilo-glm",
86
- "trial": 2,
87
- "score": 5
88
- },
89
- {
90
- "agentId": "kilo-glm",
91
- "trial": 3,
92
- "score": 5
93
- }
94
- ]
1
+ {
2
+ "date": "2026-04-21T16:43:17.718Z",
3
+ "skill_sha": "6df42d0",
4
+ "status": "passed",
5
+ "duration_ms": 3,
6
+ "per_model": {
7
+ "claude-sonnet": {
8
+ "passed": true,
9
+ "pass_count": 3,
10
+ "total": 3,
11
+ "threshold": 2
12
+ },
13
+ "kilo-deepseek": {
14
+ "passed": true,
15
+ "pass_count": 2,
16
+ "total": 3,
17
+ "threshold": 2
18
+ },
19
+ "kilo-minimax": {
20
+ "passed": true,
21
+ "pass_count": 3,
22
+ "total": 3,
23
+ "threshold": 2
24
+ },
25
+ "kilo-glm": {
26
+ "passed": true,
27
+ "pass_count": 3,
28
+ "total": 3,
29
+ "threshold": 2
30
+ }
31
+ },
32
+ "rubric_scores": [
33
+ {
34
+ "agentId": "claude-sonnet",
35
+ "trial": 1,
36
+ "score": 5
37
+ },
38
+ {
39
+ "agentId": "claude-sonnet",
40
+ "trial": 2,
41
+ "score": 5
42
+ },
43
+ {
44
+ "agentId": "claude-sonnet",
45
+ "trial": 3,
46
+ "score": 5
47
+ },
48
+ {
49
+ "agentId": "kilo-deepseek",
50
+ "trial": 1,
51
+ "score": 1
52
+ },
53
+ {
54
+ "agentId": "kilo-deepseek",
55
+ "trial": 2,
56
+ "score": 5
57
+ },
58
+ {
59
+ "agentId": "kilo-deepseek",
60
+ "trial": 3,
61
+ "score": 5
62
+ },
63
+ {
64
+ "agentId": "kilo-minimax",
65
+ "trial": 1,
66
+ "score": 5
67
+ },
68
+ {
69
+ "agentId": "kilo-minimax",
70
+ "trial": 2,
71
+ "score": 5
72
+ },
73
+ {
74
+ "agentId": "kilo-minimax",
75
+ "trial": 3,
76
+ "score": 5
77
+ },
78
+ {
79
+ "agentId": "kilo-glm",
80
+ "trial": 1,
81
+ "score": 5
82
+ },
83
+ {
84
+ "agentId": "kilo-glm",
85
+ "trial": 2,
86
+ "score": 5
87
+ },
88
+ {
89
+ "agentId": "kilo-glm",
90
+ "trial": 3,
91
+ "score": 5
92
+ }
93
+ ]
95
94
  }
@@ -39,6 +39,7 @@ description: >
39
39
  | `knowledge/plan-completeness.md` | **ВСЕГДА** — чеклист полноты плана, правила извлечения данных из ТЗ |
40
40
  | `knowledge/plan-lifecycle.md` | **ВСЕГДА** — статусы планов и правила их установки |
41
41
  | `knowledge/task-verification-pairs.md` | При наличии в плане задач тестирования/верификации ИЛИ задач, изменяющих код — правила TC-структуры: data assertions, entry points, config variations, persistence и парные задачи верификации |
42
+ | `knowledge/test-hygiene.md` | При наличии в плане задач на создание/правку автотестов — правила изоляции теста (корень изоляции, teardown, запрет на запись в рабочий репозиторий) |
42
43
  | `../shared/*` | **Перед началом работы** проверь `../shared/README.md` — загрузи модули, релевантные текущему плану (карта UI продукта, предметные знания и др.) |
43
44
 
44
45
  ## Загрузка алгоритмов
@@ -0,0 +1,47 @@
1
+ # Изоляция тестов в плане
2
+
3
+ Когда план содержит задачи на создание/правку автотестов, в **описании** задачи и в её DoD должно быть зафиксировано требование: **тест не пишет артефакты (файлы, директории, конфиги, БД) в рабочий репозиторий или в общие системные пути**. Все файловые операции теста — во временной директории, создаваемой стандартной библиотекой языка.
4
+
5
+ ## Зачем
6
+
7
+ Тесты, которые пишут в рабочий репозиторий:
8
+ - затирают файлы, нужные параллельно выполняющимся задачам/агентам проекта;
9
+ - оставляют "призрачный" state при прерывании (Ctrl+C, краш, таймаут) — следующий прогон подхватывает оставленные данные как настоящие и даёт ложный результат;
10
+ - делают тесты зависимыми от чистоты CWD — то же поведение на машине разработчика и в CI отличается;
11
+ - провоцируют ложные вердикты механических проверок, завязанных на mtime/наличие файлов (verify-artifacts, git-status-снапшоты);
12
+ - могут случайно коммититься в историю, если test-runner создал файл в tracked-директории.
13
+
14
+ ## Критерий проверки для плана
15
+
16
+ Каждая задача, результат которой — тестовый файл или правка тестового файла, должна явно описывать **корень изоляции**. Варианты:
17
+
18
+ | Источник корня | Когда подходит |
19
+ |----------------|----------------|
20
+ | Стандартный системный tmp языка | Тест создаёт одноразовое окружение на прогон (самое частое) |
21
+ | Специально выделенная fixtures-директория теста | Неизменяемые шаблонные данные, read-only |
22
+ | Изолированный git-worktree | Тест проверяет поведение на полноценной копии репо |
23
+ | Иной способ изоляции | Явно обоснован в плане: почему перечисленных выше недостаточно |
24
+
25
+ Если задача не попадает ни в один вариант — план должен явно обосновать, почему этот тест имеет право писать в рабочий репозиторий (например, тест-генератор, который коммитится в репо как артефакт).
26
+
27
+ **Конкретное имя функции стандартной библиотеки — на стороне исполнителя**, не на стороне плана. План фиксирует требование, не реализацию.
28
+
29
+ ## Что фиксировать в задаче плана
30
+
31
+ - **Корень изоляции** — один из вариантов из таблицы выше (или явно обоснованный иной).
32
+ - **Гарантия очистки** — тест обязан удалять созданный корень при любом исходе, включая падение assertion (teardown/after-hook, а не ad-hoc cleanup в конце test-функции).
33
+ - **Антипаттерн** — явный запрет на запись в реальные каталоги проекта (любые config-, data-, state-, cache-каталоги внутри корня репозитория).
34
+
35
+ ## Что фиксировать в DoD
36
+
37
+ - Пункт DoD явно требует изолированный корень (формулировка вроде «тест создаёт и уничтожает tmp-корень, не пишет в рабочий репозиторий»).
38
+ - При наличии соседних тестовых файлов в модуле — пункт DoD требует сверки с уже принятым в проекте паттерном изоляции (не изобретать новый способ).
39
+
40
+ ## Self-check при создании плана
41
+
42
+ Перед сохранением плана ответь себе по каждой задаче, результат которой связан с тестами:
43
+ 1. Указан ли корень изоляции в описании задачи?
44
+ 2. Зафиксирован ли teardown в DoD?
45
+ 3. Есть ли в проекте уже принятый паттерн изоляции, и задача ссылается на него?
46
+
47
+ Если хотя бы на один вопрос "нет" — задача недооформлена.
@@ -1,49 +1,41 @@
1
- ## Анализ gap: «Нужно исправить дефект маппинга полей»
1
+ ## Декомпозиция недочётов
2
2
 
3
- ### Применение алгоритма scope-check
3
+ ### Обработка Gap: «Нужно исправить дефект маппинга полей»
4
4
 
5
- **Шаг 2a Проверка раздела «Исключено из scope»:**
5
+ **Выполняю проверку scope по алгоритму `algorithms/scope-check.md`:**
6
6
 
7
- Из контекста задачи:
7
+ **Шаг 2a — Проверка exclusions из scope плана:**
8
8
 
9
- | Параметр | Значение |
10
- |----------|----------|
11
- | Gap | «Нужно исправить дефект маппинга полей» |
12
- | Секция плана | «Исключено из scope: исправление дефектов» |
9
+ - `plan_exclusions = ["исправление дефектов"]`
10
+ - Gap описывает: исправление дефекта маппинга полей
11
+ - Сопоставление по смыслу: «исправить дефект маппинга» подпадает под исключение «исправление дефектов»
13
12
 
14
- **Проверка:**
15
- - `plan_exclusions` = `["исправление дефектов"]`
16
- - Gap описывает исправление дефекта (дефект маппинга полей)
17
- - Gap **прямо подпадает** под исключение
18
-
19
- **Результат алгоритма:**
13
+ **Результат проверки:**
20
14
  ```
21
- {
15
+ check_scope(gap) → {
22
16
  in_scope: false,
23
17
  reason: "Gap подпадает под исключение из scope плана: 'исправление дефектов'",
24
18
  check_failed: "2a"
25
19
  }
26
20
  ```
27
21
 
28
- ---
22
+ Тикет **не создаётся**.
29
23
 
30
- ## Новые требования (вне scope)
24
+ ---
31
25
 
32
- Следующий gap **исключён** и не конвертируется в тикет:
26
+ ### Новые требования (вне scope плана)
33
27
 
34
- > **Gap:** «Нужно исправить дефект маппинга полей»
35
- >
36
- > **Причина отклонения:** Gap scope-исключён — план явно содержит раздел «Исключено из scope: исправление дефектов». Данная работа выходит за рамки текущего плана.
37
- >
38
- > **Проверка:** 2a (exclusion check)
39
- >
40
- > **Рекомендация:** Оформить как отдельную инициативу или новый план, если исправление дефекта маппинга полей признаётся приоритетным.
28
+ - **«Нужно исправить дефект маппинга полей»** — причина: gap семантически совпадает с пунктом «Исключено из scope: исправление дефектов». Исправление дефектов явно выведено за рамки плана; создание fix-тикета нарушило бы границы scope. Требует отдельного решения на уровне планирования (новый план или явное снятие исключения).
41
29
 
42
30
  ---
43
31
 
44
- ## ---RESULT---
45
-
46
- **Тикеты созданы:** 0
47
-
48
- **Gaps, отклонённых как вне scope:** 1
49
- - «Нужно исправить дефект маппинга полей» — scope-исключён (проверка 2a: «Исключено из scope: исправление дефектов»)
32
+ ```
33
+ ---RESULT---
34
+ status: default
35
+ created_tickets: (нет)
36
+ rejected_gaps:
37
+ - gap: "Нужно исправить дефект маппинга полей"
38
+ reason: "Вне scope — подпадает под исключение плана: 'исправление дефектов'"
39
+ check_failed: "2a"
40
+ ---RESULT---
41
+ ```
@@ -1,56 +1,41 @@
1
- ## Декомпозиция gaps
2
-
3
- ### Анализ входных данных
4
-
5
- | Параметр | Значение |
6
- |----------|----------|
7
- | Gap | «Нужно исправить дефект маппинга полей» |
8
- | Контекст плана | Секция «Исключено из scope: исправление дефектов» |
1
+ Применяю алгоритм `scope-check.md` к заданному gap.
9
2
 
10
3
  ---
11
4
 
12
- ### Проверка scope (алгоритм scope-check.md)
5
+ ## Проверка scope: «Нужно исправить дефект маппинга полей»
13
6
 
14
- **Шаг 2a — Проверка исключений из scope плана:**
7
+ ### Шаг 1 — Проверка источника
15
8
 
16
- Из плана извлечена секция исключений:
17
- > *«Исключено из scope: исправление дефектов»*
9
+ Gap описывает конкретный сбой в выполненной задаче → источник потенциально валидный. ✅ Продолжаем.
18
10
 
19
- Gap «Нужно исправить дефект маппинга полей» это буквально «исправление дефекта». Он **прямо подпадает** под исключение из scope плана.
11
+ ### Шаг 2Принадлежность к плану
20
12
 
21
- **Результат проверки:**
13
+ Задача маппинга полей присутствует в плане. ✅ Продолжаем.
22
14
 
23
- ```
24
- check_scope(gap) → {
25
- in_scope: false,
26
- reason: "Gap подпадает под исключение из scope плана: 'исправление дефектов'",
27
- check_failed: "2a"
28
- }
29
- ```
15
+ ### Шаг 2a — Проверка exclusions из scope плана
30
16
 
31
- Gap **отклонён на шаге 2a**. Дальнейшие проверки (3, 4) не применяются.
17
+ План содержит явную секцию:
32
18
 
33
- ---
19
+ > **Исключено из scope: исправление дефектов**
34
20
 
35
- ### Созданные тикеты
21
+ Gap «исправить дефект маппинга полей» — это прямое исправление дефекта. Он **подпадает под исключение**.
36
22
 
37
- *(нет ни один gap не прошёл scope-валидацию)*
23
+ **Результат:** `{in_scope: false, check_failed: "2a", reason: "Gap подпадает под исключение из scope плана: 'исправление дефектов'"}`
38
24
 
39
25
  ---
40
26
 
41
- ### Новые требования (вне scope)
27
+ ## Итог
42
28
 
43
- | Gap | Причина отклонения |
44
- |-----|--------------------|
45
- | «Нужно исправить дефект маппинга полей» | Исключено из scope плана: «исправление дефектов» (проверка 2a) |
29
+ Тикет **не создаётся**.
46
30
 
47
- Этот gap следует передать архитектору или PM для включения в **отдельный план** — если исправление дефекта признано приоритетным, оно должно появиться как явная задача в следующем плане, а не как доработка текущего.
31
+ ---RESULT---
48
32
 
49
- ---
33
+ **Создано тикетов:** 0
50
34
 
51
- **---RESULT---**
35
+ **Новые требования (вне scope):**
52
36
 
53
- Тикетов создано: **0**
37
+ | Gap | Причина отклонения | Проверка |
38
+ |-----|--------------------|----------|
39
+ | Исправить дефект маппинга полей | Подпадает под явное исключение из scope плана: «исправление дефектов» | 2a |
54
40
 
55
- Gaps отклонено (вне scope): **1**
56
- - «Нужно исправить дефект маппинга полей» → отклонён по проверке 2a (явно исключено из scope плана)
41
+ > Если исправление дефекта действительно необходимо, его следует включить в **новый план** или скорректировать секцию исключений текущего.
@@ -1,25 +1,42 @@
1
- ## Анализ gap: проверка scope
1
+ Теперь у меня есть всё необходимое. Применяю алгоритм scope-check к переданному gap.
2
2
 
3
- ### Gap: «Нужно исправить дефект маппинга полей»
3
+ ---
4
4
 
5
- Применяю алгоритм `scope-check.md`:
5
+ ## Проверка scope: Gap «Исправить дефект маппинга полей»
6
6
 
7
- ---
7
+ ### Применение алгоритма scope-check
8
+
9
+ **Gap:** «Нужно исправить дефект маппинга полей»
10
+
11
+ **Шаг 1 — Проверка источника:**
12
+ Gap описывает конкретный дефект в выполненной работе → источник валидный (секция «Риски и проблемы» / «Выполненные задачи»). ✅
8
13
 
9
- **Шаг 1Проверка источника:** источник не указан явно, продолжаю.
14
+ **Шаг 2Принадлежность к плану:**
15
+ Задача по маппингу полей присутствовала в плане. ✅
10
16
 
11
- **Шаг 2Принадлежность к плану:** план содержит секцию **«Исключено из scope: исправление дефектов»**.
17
+ **Шаг 2aПроверка секции «Исключено из scope»:**
18
+ План содержит явную запись:
12
19
 
13
- **Шаг 2a Проверка exclusions:**
14
- - `plan_exclusions` = `["исправление дефектов"]`
15
- - Gap «исправить дефект маппинга полей» → описывает исправление дефекта
16
- - Совпадение найдено
20
+ > «Исключено из scope: **исправление дефектов**»
17
21
 
18
- **Результат:** `{in_scope: false, reason: "Gap подпадает под исключение из scope плана: 'исправление дефектов'", check_failed: "2a"}`
22
+ Gap «исправить дефект маппинга полей» непосредственно подпадает под данное исключение.
23
+
24
+ **Результат проверки 2a:**
25
+ ```
26
+ in_scope: false
27
+ reason: "Gap подпадает под исключение из scope плана: 'исправление дефектов'"
28
+ check_failed: "2a"
29
+ ```
30
+
31
+ **Дальнейшие шаги алгоритма:** не выполняются — gap отклонён на шаге 2a.
19
32
 
20
33
  ---
21
34
 
22
- **Тикет не создаётся.**
35
+ ## Итог декомпозиции
36
+
37
+ **Тикетов создано:** 0
38
+
39
+ Тикет на gap **не создаётся**, поскольку план явно исключает исправление дефектов из своего scope. Создание fix-тикета нарушило бы принцип «Scope First».
23
40
 
24
41
  ---
25
42
 
@@ -27,13 +44,13 @@
27
44
 
28
45
  | Gap | Причина отклонения | Рекомендация |
29
46
  |-----|--------------------|--------------|
30
- | Исправить дефект маппинга полей | Явно исключено из scope плана: «исправление дефектов» | Создать отдельную задачу в новом плане или обратиться к Architect для принятия решения о приоритизации |
47
+ | «Нужно исправить дефект маппинга полей» | Исключён из scope плана (секция «Исключено из scope: исправление дефектов»). Проверка 2a. | Зафиксировать как отдельную инициативу в новом плане или создать тикет вручную, если исправление дефекта требуется вне рамок текущего плана. |
31
48
 
32
49
  ---
33
50
 
34
- ```
35
- ---RESULT---
36
- Тикеты созданы: 0
37
- Gaps вне scope: 1
38
- - «Нужно исправить дефект маппинга полей» → исключено из scope плана (Проверка 2a)
39
- ```
51
+ **---RESULT---**
52
+
53
+ - Тикетов создано: **0**
54
+ - Gaps в scope: **0**
55
+ - Gaps вне scope (Новые требования): **1**
56
+ - «Нужно исправить дефект маппинга полей» — отклонён на проверке 2a: gap подпадает под исключение из scope плана («исправление дефектов»)
@@ -160,5 +160,5 @@
160
160
  "errored": false
161
161
  }
162
162
  ],
163
- "timestamp": "2026-04-20T11:07:05.170Z"
163
+ "timestamp": "2026-04-21T08:51:13.394Z"
164
164
  }
@@ -1,11 +1,17 @@
1
1
  **Результат декомпозиции gaps**
2
2
 
3
- ### Новые требования (вне scope плана)
4
- - «Нужно исправить дефект маппинга полей» — причина: Gap подпадает под исключение из scope плана: «Исключено из scope: исправление дефектов». Работа по исправлению дефектов явно исключена из scope исходного плана, поэтому создание тикета не требуется.
3
+ Проверка scope выполнена по алгоритму `scope-check`. Gap «Нужно исправить дефект маппинга полей» **не прошёл проверку 2a** (принадлежность к scope плана).
4
+
5
+ **Причина отклонения:** В исходном плане присутствует секция «Исключено из scope: исправление дефектов». Данный gap описывает работу, которая явно исключена из scope плана.
6
+
7
+ ---
8
+
9
+ **Новые требования (вне scope)**
10
+
11
+ 1. **«Нужно исправить дефект маппинга полей»**
12
+ Причина: Gap подпадает под исключение из scope плана: «исправление дефектов».
5
13
 
6
14
  ---
7
15
 
8
16
  ---RESULT---
9
- status: default
10
- created_tickets:
11
- ---RESULT---
17
+ Создано тикетов: 0
@@ -1,26 +1,22 @@
1
- **Проверка scope для gap**
1
+ **Проверка scope gap «Нужно исправить дефект маппинга полей»**
2
2
 
3
- Gap: «Нужно исправить дефект маппинга полей».
3
+ **Алгоритм scope‑check:**
4
+ 1. **Источник gap** – не указан (предполагаем, что из секции «Выполненные задачи» или «Риски и проблемы»).
5
+ 2. **Принадлежность к плану** – gap описывает исправление дефекта. В плане присутствует явное исключение: «Исключено из scope: исправление дефектов». → **gap подпадает под исключение** (check_failed: 2a).
6
+ 3. **Статус плана** – не указан (предполагаем `in_progress`).
7
+ 4. **Workflow‑управление** – отсутствует.
4
8
 
5
- **Проверка 1 (Источник)** предположительно из секции «Выполненные задачи» или «Риски и проблемы» – источник валиден.
6
-
7
- **Проверка 2a (Исключения scope плана)** – план содержит явное исключение: «Исключено из scope: исправление дефектов». Gap описывает исправление дефекта, что полностью подпадает под это исключение.
8
-
9
- → **Gap вне scope декомпозиции.**
10
- Причина: «Gap подпадает под исключение из scope плана: 'исправление дефектов'» (проверка 2a).
9
+ **Решение:** Gap **не входит в scope** декомпозиции. Создание тикета не требуется.
11
10
 
12
11
  ---
13
-
14
12
  **Новые требования (вне scope)**
15
13
 
16
- | Gap | Причина отклонения |
17
- |-----|-------------------|
18
- | «Нужно исправить дефект маппинга полей» | Gap подпадает под исключение из scope плана: «Исключено из scope: исправление дефектов». Работа является новым требованием, не входящим в текущий план. |
14
+ 1. **Исправление дефекта маппинга полей**
15
+ *Причина отклонения:* gap подпадает под исключение из scope плана (секция «Исключено из scope: исправление дефектов»).
16
+ *Рекомендация:* если дефект критичен, рассмотреть как отдельную инициативу вне текущего плана.
19
17
 
20
18
  ---
21
-
22
19
  **---RESULT---**
23
20
 
24
- Создано тикетов: 0
25
-
26
- Отклонённых gaps (вне scope): 1
21
+ **Созданные тикеты:** нет
22
+ **Новые требования:** 1 (см. выше)
@@ -1,19 +1,25 @@
1
- ## Результат scope-проверки
1
+ ## Проверка scope: gap «Нужно исправить дефект маппинга полей»
2
2
 
3
- **Проверка 2a (исключения из scope):** Gap «Нужно исправить дефект маппинга полей» семантически подпадает под исключение «Исключено из scope: исправление дефектов». Ключевое слово «дефект» в формулировке gap напрямую соответствует пункту исключения.
3
+ ### Алгоритм scope-check
4
4
 
5
- **Решение:** `in_scope: false`тикет **не создаётся**.
5
+ **Шаг 1 Источник gap:** gap передан как входной параметр, источник раздел недочётов отчёта. Валидный источник. ✅
6
6
 
7
- ---
7
+ **Шаг 2 — Принадлежность к плану:**
8
8
 
9
- ### Новые требования (вне scope плана)
9
+ **Шаг 2a Проверка исключений из scope плана:**
10
+ Секция «Исключено из scope» плана содержит: **«исправление дефектов»**.
11
+
12
+ Gap «Нужно исправить дефект маппинга полей» по смыслу подпадает под исключение «исправление дефектов» — формулировка gap буквально описывает исправление дефекта.
13
+
14
+ **Результат проверки 2a:** gap **исключён** из scope плана. Причина: `Gap подпадает под исключение из scope плана: «исправление дефектов»`.
10
15
 
11
- - «Нужно исправить дефект маппинга полей» — причина: gap подпадает под исключение из scope плана: «исправление дефектов» (проверка 2a)
16
+ **in_scope = false**, check_failed = "2a"
17
+
18
+ ### Новые требования (вне scope плана)
12
19
 
13
- ---
20
+ - **Исправить дефект маппинга полей** — причина: работа по исправлению дефектов явно исключена из scope плана (секция «Исключено из scope: исправление дефектов»). Данный gap является новым требованием, не входящим в текущий план. Для включения в работу требуется отдельная инициатива или новый план.
14
21
 
15
22
  ---RESULT---
16
23
  status: default
17
- created_tickets: (нет)
18
- rejected_gaps: 1
24
+ created_tickets:
19
25
  ---RESULT---