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.
- package/README.md +377 -277
- package/configs/agent-health-rules.yaml +75 -0
- package/configs/pipeline.yaml +24 -7
- package/package.json +1 -1
- package/src/init.mjs +20 -3
- package/src/lib/agent-health-registry.mjs +245 -0
- package/src/lib/agent-spawner.mjs +47 -6
- package/src/lib/artifact-snapshot.mjs +233 -0
- package/src/lib/error-classifier.mjs +311 -0
- package/src/lib/test-error-classifier.mjs +60 -0
- package/src/lib/test-extends.mjs +58 -0
- package/src/lib/test-version.mjs +21 -0
- package/src/runner.mjs +215 -58
- package/src/scripts/move-to-review.js +5 -7
- package/src/scripts/reset-agent-health.js +62 -0
- package/src/skills/coach/SKILL.md +1 -0
- package/src/skills/coach/tests/cases/TC-COACH-001/current/meta.json +93 -94
- package/src/skills/coach/tests/cases/TC-COACH-002/current/meta.json +93 -94
- package/src/skills/create-plan/SKILL.md +1 -0
- package/src/skills/create-plan/knowledge/test-hygiene.md +47 -0
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-001/current/claude-sonnet/trial-1.md +23 -31
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-001/current/claude-sonnet/trial-2.md +20 -35
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-001/current/claude-sonnet/trial-3.md +36 -19
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-001/current/judge.json +1 -1
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-001/current/kilo-deepseek/trial-2.md +11 -5
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-001/current/kilo-deepseek/trial-3.md +12 -16
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-001/current/kilo-glm/trial-1.md +15 -9
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-001/current/kilo-glm/trial-3.md +15 -14
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-001/current/kilo-minimax/trial-1.md +22 -18
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-001/current/kilo-minimax/trial-2.md +24 -16
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-001/current/kilo-minimax/trial-3.md +13 -20
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-001/current/meta.json +2 -2
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-002/current/claude-sonnet/trial-1.md +14 -19
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-002/current/claude-sonnet/trial-2.md +24 -14
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-002/current/claude-sonnet/trial-3.md +20 -19
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-002/current/judge.json +16 -17
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-002/current/kilo-deepseek/trial-1.md +0 -7
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-002/current/kilo-deepseek/trial-2.md +9 -10
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-002/current/kilo-deepseek/trial-3.md +5 -5
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-002/current/kilo-glm/trial-1.md +20 -4
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-002/current/kilo-glm/trial-2.md +36 -9
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-002/current/kilo-glm/trial-3.md +9 -6
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-002/current/kilo-minimax/trial-1.md +4 -12
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-002/current/kilo-minimax/trial-2.md +6 -8
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-002/current/kilo-minimax/trial-3.md +8 -4
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-002/current/meta.json +10 -11
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-003/current/claude-sonnet/trial-1.md +30 -0
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-003/current/claude-sonnet/trial-2.md +30 -0
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-003/current/claude-sonnet/trial-3.md +30 -0
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-003/current/judge.json +165 -0
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-003/current/kilo-deepseek/trial-1.md +5 -0
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-003/current/kilo-deepseek/trial-2.md +26 -0
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-003/current/kilo-deepseek/trial-3.md +5 -0
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-003/current/kilo-glm/trial-1.md +39 -0
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-003/current/kilo-glm/trial-2.md +37 -0
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-003/current/kilo-glm/trial-3.md +45 -0
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-003/current/kilo-minimax/trial-1.md +26 -0
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-003/current/kilo-minimax/trial-2.md +27 -0
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-003/current/kilo-minimax/trial-3.md +7 -0
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-003/current/meta.json +117 -0
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-003-parent-plan-mandatory.yaml +41 -0
- package/src/skills/decompose-gaps/tests/index.yaml +5 -0
- package/src/skills/decompose-gaps/tests/rubrics/parent-plan-mandatory.md +22 -0
- package/src/skills/decompose-gaps/workflows/decompose.md +5 -2
- package/src/skills/decompose-plan/knowledge/atomicity-checklist.md +31 -5
- package/src/skills/decompose-plan/knowledge/capabilities.md +29 -5
- package/src/skills/decompose-plan/knowledge/human-task-rules.md +15 -0
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-004/current/claude-sonnet/trial-1.md +55 -0
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-004/current/claude-sonnet/trial-2.md +49 -0
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-004/current/claude-sonnet/trial-3.md +49 -0
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-004/current/judge.json +163 -0
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-004/current/kilo-deepseek/trial-1.md +104 -0
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-004/current/kilo-deepseek/trial-2.md +45 -0
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-004/current/kilo-deepseek/trial-3.md +58 -0
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-004/current/kilo-glm/trial-1.md +193 -0
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-004/current/kilo-glm/trial-2.md +202 -0
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-004/current/kilo-glm/trial-3.md +155 -0
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-004/current/kilo-minimax/trial-1.md +52 -0
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-004/current/kilo-minimax/trial-2.md +17 -0
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-004/current/kilo-minimax/trial-3.md +0 -0
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-004/current/meta.json +115 -0
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-004-executor-atomicity.yaml +64 -0
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-005/current/claude-sonnet/trial-1.md +59 -0
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-005/current/claude-sonnet/trial-2.md +204 -0
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-005/current/claude-sonnet/trial-3.md +213 -0
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-005/current/judge.json +163 -0
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-005/current/kilo-deepseek/trial-1.md +0 -0
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-005/current/kilo-deepseek/trial-2.md +57 -0
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-005/current/kilo-deepseek/trial-3.md +54 -0
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-005/current/kilo-glm/trial-1.md +147 -0
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-005/current/kilo-glm/trial-2.md +165 -0
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-005/current/kilo-glm/trial-3.md +133 -0
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-005/current/kilo-minimax/trial-1.md +81 -0
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-005/current/kilo-minimax/trial-2.md +108 -0
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-005/current/kilo-minimax/trial-3.md +3 -0
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-005/current/meta.json +114 -0
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-005-capabilities-registry.yaml +78 -0
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-006/current/claude-sonnet/trial-1.md +225 -0
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-006/current/claude-sonnet/trial-2.md +66 -0
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-006/current/claude-sonnet/trial-3.md +36 -0
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-006/current/judge.json +163 -0
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-006/current/kilo-deepseek/trial-1.md +42 -0
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-006/current/kilo-deepseek/trial-2.md +67 -0
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-006/current/kilo-deepseek/trial-3.md +40 -0
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-006/current/kilo-glm/trial-1.md +122 -0
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-006/current/kilo-glm/trial-2.md +131 -0
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-006/current/kilo-glm/trial-3.md +138 -0
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-006/current/kilo-minimax/trial-1.md +41 -0
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-006/current/kilo-minimax/trial-2.md +88 -0
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-006/current/kilo-minimax/trial-3.md +0 -0
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-006/current/meta.json +115 -0
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-006-dod-threshold.yaml +72 -0
- package/src/skills/decompose-plan/tests/index.yaml +15 -0
- package/src/skills/decompose-plan/tests/rubrics/capabilities-registry.md +21 -0
- package/src/skills/decompose-plan/tests/rubrics/dod-threshold.md +21 -0
- package/src/skills/decompose-plan/tests/rubrics/executor-atomicity.md +21 -0
- package/src/skills/decompose-plan/workflows/decompose.md +38 -5
- package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-001/current/meta.json +87 -88
- package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-005/current/meta.json +87 -88
- package/src/skills/manual-testing/SKILL.md +6 -4
- package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-001/current/claude-sonnet/trial-1.md +29 -16
- package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-001/current/claude-sonnet/trial-2.md +21 -54
- package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-001/current/claude-sonnet/trial-3.md +18 -23
- package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-001/current/judge.json +17 -17
- package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-001/current/meta.json +19 -19
- package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-002/current/claude-sonnet/trial-1.md +27 -30
- package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-002/current/claude-sonnet/trial-2.md +16 -23
- package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-002/current/claude-sonnet/trial-3.md +35 -28
- package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-002/current/judge.json +13 -13
- package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-002/current/meta.json +15 -15
- package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-003/current/claude-sonnet/trial-1.md +76 -0
- package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-003/current/claude-sonnet/trial-2.md +71 -0
- package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-003/current/claude-sonnet/trial-3.md +85 -0
- package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-003/current/judge.json +46 -0
- package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-003/current/meta.json +36 -0
- package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-003-qa-non-ui-assertion.yaml +65 -0
- package/src/skills/manual-testing/tests/index.yaml +5 -0
- package/src/skills/manual-testing/tests/rubrics/qa-non-ui-assertion.md +31 -0
- package/src/skills/review-result/SKILL.md +1 -0
- package/src/skills/review-result/knowledge/test-hygiene.md +44 -0
- package/src/skills/review-result/scripts/verify-artifacts.js +157 -14
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-003/current/claude-sonnet/trial-1.md +7 -0
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-003/current/claude-sonnet/trial-2.md +7 -0
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-003/current/claude-sonnet/trial-3.md +7 -0
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-003/current/judge.json +163 -0
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-003/current/kilo-deepseek/trial-1.md +5 -0
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-003/current/kilo-deepseek/trial-2.md +5 -0
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-003/current/kilo-deepseek/trial-3.md +11 -0
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-003/current/kilo-glm/trial-1.md +16 -0
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-003/current/kilo-glm/trial-2.md +18 -0
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-003/current/kilo-glm/trial-3.md +17 -0
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-003/current/kilo-minimax/trial-1.md +17 -0
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-003/current/kilo-minimax/trial-2.md +31 -0
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-003/current/kilo-minimax/trial-3.md +5 -0
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-003/current/meta.json +115 -0
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-003-test-isolation.yaml +50 -0
- package/src/skills/review-result/tests/fixtures/QA-904-test-isolation-violation/QA-904.md +51 -0
- package/src/skills/review-result/tests/fixtures/QA-904-test-isolation-violation/example-test.mjs +36 -0
- package/src/skills/review-result/tests/index.yaml +5 -0
- package/src/skills/review-result/tests/rubrics/test-isolation.md +20 -0
|
@@ -1,95 +1,94 @@
|
|
|
1
|
-
{
|
|
2
|
-
"date": "2026-04-
|
|
3
|
-
"skill_sha": "
|
|
4
|
-
"status": "passed",
|
|
5
|
-
"duration_ms":
|
|
6
|
-
"
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
"
|
|
10
|
-
"
|
|
11
|
-
"
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
"
|
|
16
|
-
"
|
|
17
|
-
"
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
"
|
|
22
|
-
"
|
|
23
|
-
"
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
"
|
|
28
|
-
"
|
|
29
|
-
"
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
"
|
|
36
|
-
"
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
"
|
|
41
|
-
"
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
"
|
|
46
|
-
"
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
"
|
|
51
|
-
"
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
"
|
|
56
|
-
"
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
"
|
|
61
|
-
"
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
"
|
|
66
|
-
"
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
"
|
|
71
|
-
"
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
"
|
|
76
|
-
"
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
"
|
|
81
|
-
"
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
"
|
|
86
|
-
"
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
"
|
|
91
|
-
"
|
|
92
|
-
|
|
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
|
+
Если хотя бы на один вопрос "нет" — задача недооформлена.
|
package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-001/current/claude-sonnet/trial-1.md
CHANGED
|
@@ -1,49 +1,41 @@
|
|
|
1
|
-
##
|
|
1
|
+
## Декомпозиция недочётов
|
|
2
2
|
|
|
3
|
-
###
|
|
3
|
+
### Обработка Gap: «Нужно исправить дефект маппинга полей»
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
**Выполняю проверку scope по алгоритму `algorithms/scope-check.md`:**
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
**Шаг 2a — Проверка exclusions из scope плана:**
|
|
8
8
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
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
|
-
|
|
24
|
+
---
|
|
31
25
|
|
|
32
|
-
|
|
26
|
+
### Новые требования (вне scope плана)
|
|
33
27
|
|
|
34
|
-
|
|
35
|
-
>
|
|
36
|
-
> **Причина отклонения:** Gap scope-исключён — план явно содержит раздел «Исключено из scope: исправление дефектов». Данная работа выходит за рамки текущего плана.
|
|
37
|
-
>
|
|
38
|
-
> **Проверка:** 2a (exclusion check)
|
|
39
|
-
>
|
|
40
|
-
> **Рекомендация:** Оформить как отдельную инициативу или новый план, если исправление дефекта маппинга полей признаётся приоритетным.
|
|
28
|
+
- **«Нужно исправить дефект маппинга полей»** — причина: gap семантически совпадает с пунктом «Исключено из scope: исправление дефектов». Исправление дефектов явно выведено за рамки плана; создание fix-тикета нарушило бы границы scope. Требует отдельного решения на уровне планирования (новый план или явное снятие исключения).
|
|
41
29
|
|
|
42
30
|
---
|
|
43
31
|
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
-
|
|
32
|
+
```
|
|
33
|
+
---RESULT---
|
|
34
|
+
status: default
|
|
35
|
+
created_tickets: (нет)
|
|
36
|
+
rejected_gaps:
|
|
37
|
+
- gap: "Нужно исправить дефект маппинга полей"
|
|
38
|
+
reason: "Вне scope — подпадает под исключение плана: 'исправление дефектов'"
|
|
39
|
+
check_failed: "2a"
|
|
40
|
+
---RESULT---
|
|
41
|
+
```
|
package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-001/current/claude-sonnet/trial-2.md
CHANGED
|
@@ -1,56 +1,41 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
### Анализ входных данных
|
|
4
|
-
|
|
5
|
-
| Параметр | Значение |
|
|
6
|
-
|----------|----------|
|
|
7
|
-
| Gap | «Нужно исправить дефект маппинга полей» |
|
|
8
|
-
| Контекст плана | Секция «Исключено из scope: исправление дефектов» |
|
|
1
|
+
Применяю алгоритм `scope-check.md` к заданному gap.
|
|
9
2
|
|
|
10
3
|
---
|
|
11
4
|
|
|
12
|
-
|
|
5
|
+
## Проверка scope: «Нужно исправить дефект маппинга полей»
|
|
13
6
|
|
|
14
|
-
|
|
7
|
+
### Шаг 1 — Проверка источника
|
|
15
8
|
|
|
16
|
-
|
|
17
|
-
> *«Исключено из scope: исправление дефектов»*
|
|
9
|
+
Gap описывает конкретный сбой в выполненной задаче → источник потенциально валидный. ✅ Продолжаем.
|
|
18
10
|
|
|
19
|
-
|
|
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
|
-
|
|
17
|
+
План содержит явную секцию:
|
|
32
18
|
|
|
33
|
-
|
|
19
|
+
> **Исключено из scope: исправление дефектов**
|
|
34
20
|
|
|
35
|
-
|
|
21
|
+
Gap «исправить дефект маппинга полей» — это прямое исправление дефекта. Он **подпадает под исключение**.
|
|
36
22
|
|
|
37
|
-
|
|
23
|
+
**Результат:** `{in_scope: false, check_failed: "2a", reason: "Gap подпадает под исключение из scope плана: 'исправление дефектов'"}`
|
|
38
24
|
|
|
39
25
|
---
|
|
40
26
|
|
|
41
|
-
|
|
27
|
+
## Итог
|
|
42
28
|
|
|
43
|
-
|
|
44
|
-
|-----|--------------------|
|
|
45
|
-
| «Нужно исправить дефект маппинга полей» | Исключено из scope плана: «исправление дефектов» (проверка 2a) |
|
|
29
|
+
Тикет **не создаётся**.
|
|
46
30
|
|
|
47
|
-
|
|
31
|
+
---RESULT---
|
|
48
32
|
|
|
49
|
-
|
|
33
|
+
**Создано тикетов:** 0
|
|
50
34
|
|
|
51
|
-
|
|
35
|
+
**Новые требования (вне scope):**
|
|
52
36
|
|
|
53
|
-
|
|
37
|
+
| Gap | Причина отклонения | Проверка |
|
|
38
|
+
|-----|--------------------|----------|
|
|
39
|
+
| Исправить дефект маппинга полей | Подпадает под явное исключение из scope плана: «исправление дефектов» | 2a |
|
|
54
40
|
|
|
55
|
-
|
|
56
|
-
- «Нужно исправить дефект маппинга полей» → отклонён по проверке 2a (явно исключено из scope плана)
|
|
41
|
+
> Если исправление дефекта действительно необходимо, его следует включить в **новый план** или скорректировать секцию исключений текущего.
|
package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-001/current/claude-sonnet/trial-3.md
CHANGED
|
@@ -1,25 +1,42 @@
|
|
|
1
|
-
|
|
1
|
+
Теперь у меня есть всё необходимое. Применяю алгоритм scope-check к переданному gap.
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
---
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
## Проверка scope: Gap «Исправить дефект маппинга полей»
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
### Применение алгоритма scope-check
|
|
8
|
+
|
|
9
|
+
**Gap:** «Нужно исправить дефект маппинга полей»
|
|
10
|
+
|
|
11
|
+
**Шаг 1 — Проверка источника:**
|
|
12
|
+
Gap описывает конкретный дефект в выполненной работе → источник валидный (секция «Риски и проблемы» / «Выполненные задачи»). ✅
|
|
8
13
|
|
|
9
|
-
**Шаг
|
|
14
|
+
**Шаг 2 — Принадлежность к плану:**
|
|
15
|
+
Задача по маппингу полей присутствовала в плане. ✅
|
|
10
16
|
|
|
11
|
-
**Шаг
|
|
17
|
+
**Шаг 2a — Проверка секции «Исключено из scope»:**
|
|
18
|
+
План содержит явную запись:
|
|
12
19
|
|
|
13
|
-
|
|
14
|
-
- `plan_exclusions` = `["исправление дефектов"]`
|
|
15
|
-
- Gap «исправить дефект маппинга полей» → описывает исправление дефекта
|
|
16
|
-
- Совпадение найдено
|
|
20
|
+
> «Исключено из scope: **исправление дефектов**»
|
|
17
21
|
|
|
18
|
-
|
|
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
|
-
|
|
|
47
|
+
| «Нужно исправить дефект маппинга полей» | Исключён из scope плана (секция «Исключено из scope: исправление дефектов»). Проверка 2a. | Зафиксировать как отдельную инициативу в новом плане или создать тикет вручную, если исправление дефекта требуется вне рамок текущего плана. |
|
|
31
48
|
|
|
32
49
|
---
|
|
33
50
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
Gaps
|
|
38
|
-
|
|
39
|
-
|
|
51
|
+
**---RESULT---**
|
|
52
|
+
|
|
53
|
+
- Тикетов создано: **0**
|
|
54
|
+
- Gaps в scope: **0**
|
|
55
|
+
- Gaps вне scope (Новые требования): **1**
|
|
56
|
+
- «Нужно исправить дефект маппинга полей» — отклонён на проверке 2a: gap подпадает под исключение из scope плана («исправление дефектов»)
|
package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-001/current/kilo-deepseek/trial-2.md
CHANGED
|
@@ -1,11 +1,17 @@
|
|
|
1
1
|
**Результат декомпозиции gaps**
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
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
|
-
|
|
10
|
-
created_tickets:
|
|
11
|
-
---RESULT---
|
|
17
|
+
Создано тикетов: 0
|
package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-001/current/kilo-deepseek/trial-3.md
CHANGED
|
@@ -1,26 +1,22 @@
|
|
|
1
|
-
**Проверка scope
|
|
1
|
+
**Проверка scope gap «Нужно исправить дефект маппинга полей»**
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
**Алгоритм scope‑check:**
|
|
4
|
+
1. **Источник gap** – не указан (предполагаем, что из секции «Выполненные задачи» или «Риски и проблемы»).
|
|
5
|
+
2. **Принадлежность к плану** – gap описывает исправление дефекта. В плане присутствует явное исключение: «Исключено из scope: исправление дефектов». → **gap подпадает под исключение** (check_failed: 2a).
|
|
6
|
+
3. **Статус плана** – не указан (предполагаем `in_progress`).
|
|
7
|
+
4. **Workflow‑управление** – отсутствует.
|
|
4
8
|
|
|
5
|
-
|
|
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
|
-
|
|
17
|
-
|
|
18
|
-
|
|
14
|
+
1. **Исправление дефекта маппинга полей**
|
|
15
|
+
*Причина отклонения:* gap подпадает под исключение из scope плана (секция «Исключено из scope: исправление дефектов»).
|
|
16
|
+
*Рекомендация:* если дефект критичен, рассмотреть как отдельную инициативу вне текущего плана.
|
|
19
17
|
|
|
20
18
|
---
|
|
21
|
-
|
|
22
19
|
**---RESULT---**
|
|
23
20
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
Отклонённых gaps (вне scope): 1
|
|
21
|
+
**Созданные тикеты:** нет
|
|
22
|
+
**Новые требования:** 1 (см. выше)
|
package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-001/current/kilo-glm/trial-1.md
CHANGED
|
@@ -1,19 +1,25 @@
|
|
|
1
|
-
##
|
|
1
|
+
## Проверка scope: gap «Нужно исправить дефект маппинга полей»
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
### Алгоритм scope-check
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
**Шаг 1 — Источник gap:** gap передан как входной параметр, источник — раздел недочётов отчёта. Валидный источник. ✅
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
**Шаг 2 — Принадлежность к плану:**
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
**Шаг 2a — Проверка исключений из scope плана:**
|
|
10
|
+
Секция «Исключено из scope» плана содержит: **«исправление дефектов»**.
|
|
11
|
+
|
|
12
|
+
Gap «Нужно исправить дефект маппинга полей» по смыслу подпадает под исключение «исправление дефектов» — формулировка gap буквально описывает исправление дефекта.
|
|
13
|
+
|
|
14
|
+
**Результат проверки 2a:** gap **исключён** из scope плана. Причина: `Gap подпадает под исключение из scope плана: «исправление дефектов»`.
|
|
10
15
|
|
|
11
|
-
|
|
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---
|