workflow-ai 1.0.68 → 1.2.1
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/CHANGELOG.md +49 -0
- package/README.md +105 -7
- package/configs/pipeline.yaml +23 -2
- package/package.json +44 -41
- package/src/lib/operations/plans.mjs +85 -0
- package/src/lib/operations/skills.mjs +124 -0
- package/src/lib/operations/tickets.mjs +430 -0
- package/src/lib/utils.mjs +286 -286
- package/src/runner.mjs +314 -34
- package/src/scripts/check-conditions.js +2 -2
- package/src/scripts/get-next-id.js +8 -31
- package/src/scripts/pick-next-task.js +3 -9
- package/src/skills/coach/SKILL.md +1 -1
- package/src/skills/manual-testing/SKILL.md +2 -0
- package/src/skills/review-result/SKILL.md +1 -0
- package/src/scripts/tests/timeout-cascade.test.js +0 -28
- package/src/skills/analyze-report/README.md +0 -44
- package/src/skills/analyze-report/algorithms/progress-assessment.md +0 -108
- package/src/skills/analyze-report/knowledge/analysis-frameworks.md +0 -66
- package/src/skills/analyze-report/knowledge/report-structure.md +0 -61
- package/src/skills/analyze-report/scripts/calc-plan-metrics.js +0 -234
- package/src/skills/analyze-report/templates/analysis-report.md +0 -80
- package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-001/current/claude-sonnet/trial-1.md +0 -69
- package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-001/current/claude-sonnet/trial-2.md +0 -103
- package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-001/current/claude-sonnet/trial-3.md +0 -99
- package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-001/current/judge.json +0 -163
- package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-001/current/kilo-deepseek/trial-1.md +0 -89
- package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-001/current/kilo-deepseek/trial-2.md +0 -88
- package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-001/current/kilo-deepseek/trial-3.md +0 -100
- package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-001/current/kilo-glm/trial-1.md +0 -77
- package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-001/current/kilo-glm/trial-2.md +0 -64
- package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-001/current/kilo-glm/trial-3.md +0 -110
- package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-001/current/kilo-minimax/trial-1.md +0 -74
- package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-001/current/kilo-minimax/trial-2.md +0 -38
- package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-001/current/kilo-minimax/trial-3.md +0 -61
- package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-001/current/meta.json +0 -115
- package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-001-evidence-from-log.yaml +0 -60
- package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-002/current/claude-sonnet/trial-1.md +0 -90
- package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-002/current/claude-sonnet/trial-2.md +0 -89
- package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-002/current/claude-sonnet/trial-3.md +0 -77
- package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-002/current/judge.json +0 -163
- package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-002/current/kilo-deepseek/trial-1.md +0 -84
- package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-002/current/kilo-deepseek/trial-2.md +0 -77
- package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-002/current/kilo-deepseek/trial-3.md +0 -89
- package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-002/current/kilo-glm/trial-1.md +0 -103
- package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-002/current/kilo-glm/trial-2.md +0 -103
- package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-002/current/kilo-glm/trial-3.md +0 -103
- package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-002/current/kilo-minimax/trial-1.md +0 -93
- package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-002/current/kilo-minimax/trial-2.md +0 -93
- package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-002/current/kilo-minimax/trial-3.md +0 -86
- package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-002/current/meta.json +0 -115
- package/src/skills/analyze-report/tests/cases/TC-ANALYZE-REPORT-002-result-block-format.yaml +0 -44
- package/src/skills/analyze-report/tests/fixtures/REPORT-002-incorrect-attribution.md +0 -27
- package/src/skills/analyze-report/tests/fixtures/pipeline-2026-04-06_qa-001-skip.log +0 -32
- package/src/skills/analyze-report/tests/index.yaml +0 -25
- package/src/skills/analyze-report/tests/rubrics/evidence-from-log.md +0 -22
- package/src/skills/analyze-report/tests/rubrics/result-block-format.md +0 -22
- package/src/skills/analyze-report/workflows/progress.md +0 -158
- package/src/skills/analyze-report/workflows/retrospective.md +0 -143
- package/src/skills/coach/README.md +0 -43
- package/src/skills/coach/SKILL.md.legacy +0 -157
- package/src/skills/coach/algorithms/gap-analysis.md +0 -69
- package/src/skills/coach/algorithms/improvement-prioritization.md +0 -62
- package/src/skills/coach/algorithms/skill-scoring.md +0 -80
- package/src/skills/coach/knowledge/audit-applied-changes-clean.txt +0 -11
- package/src/skills/coach/knowledge/backlog-management.md +0 -67
- package/src/skills/coach/knowledge/backlog-management.md.legacy +0 -90
- package/src/skills/coach/knowledge/common-antipatterns.md +0 -76
- package/src/skills/coach/knowledge/prompt-engineering.md +0 -45
- package/src/skills/coach/knowledge/shared-knowledge-guide.md +0 -44
- package/src/skills/coach/knowledge/skill-anatomy.md +0 -49
- package/src/skills/coach/knowledge/test-authorship.md +0 -141
- package/src/skills/coach/templates/audit-report.md +0 -39
- package/src/skills/coach/templates/coach-backlog-init.yaml +0 -14
- package/src/skills/coach/templates/coach-backlog-init.yaml.legacy +0 -10
- package/src/skills/coach/templates/improvement-plan.md +0 -42
- package/src/skills/coach/templates/new-skill.md +0 -95
- package/src/skills/coach/tests/cases/TC-COACH-001/current/claude-sonnet/trial-1.md +0 -58
- package/src/skills/coach/tests/cases/TC-COACH-001/current/claude-sonnet/trial-2.md +0 -65
- package/src/skills/coach/tests/cases/TC-COACH-001/current/claude-sonnet/trial-3.md +0 -58
- package/src/skills/coach/tests/cases/TC-COACH-001/current/judge.json +0 -151
- package/src/skills/coach/tests/cases/TC-COACH-001/current/kilo-deepseek/trial-1.md +0 -46
- package/src/skills/coach/tests/cases/TC-COACH-001/current/kilo-deepseek/trial-2.md +0 -0
- package/src/skills/coach/tests/cases/TC-COACH-001/current/kilo-deepseek/trial-3.md +0 -75
- package/src/skills/coach/tests/cases/TC-COACH-001/current/kilo-glm/trial-1.md +0 -81
- package/src/skills/coach/tests/cases/TC-COACH-001/current/kilo-glm/trial-2.md +0 -101
- package/src/skills/coach/tests/cases/TC-COACH-001/current/kilo-glm/trial-3.md +0 -91
- package/src/skills/coach/tests/cases/TC-COACH-001/current/kilo-minimax/trial-1.md +0 -48
- package/src/skills/coach/tests/cases/TC-COACH-001/current/kilo-minimax/trial-2.md +0 -30
- package/src/skills/coach/tests/cases/TC-COACH-001/current/kilo-minimax/trial-3.md +0 -55
- package/src/skills/coach/tests/cases/TC-COACH-001/current/meta.json +0 -94
- package/src/skills/coach/tests/cases/TC-COACH-001-evidence-based-temporal-diagram.yaml +0 -53
- package/src/skills/coach/tests/cases/TC-COACH-002/current/claude-sonnet/trial-1.md +0 -46
- package/src/skills/coach/tests/cases/TC-COACH-002/current/claude-sonnet/trial-2.md +0 -50
- package/src/skills/coach/tests/cases/TC-COACH-002/current/claude-sonnet/trial-3.md +0 -48
- package/src/skills/coach/tests/cases/TC-COACH-002/current/judge.json +0 -151
- package/src/skills/coach/tests/cases/TC-COACH-002/current/kilo-deepseek/trial-1.md +0 -0
- package/src/skills/coach/tests/cases/TC-COACH-002/current/kilo-deepseek/trial-2.md +0 -37
- package/src/skills/coach/tests/cases/TC-COACH-002/current/kilo-deepseek/trial-3.md +0 -30
- package/src/skills/coach/tests/cases/TC-COACH-002/current/kilo-glm/trial-1.md +0 -23
- package/src/skills/coach/tests/cases/TC-COACH-002/current/kilo-glm/trial-2.md +0 -29
- package/src/skills/coach/tests/cases/TC-COACH-002/current/kilo-glm/trial-3.md +0 -35
- package/src/skills/coach/tests/cases/TC-COACH-002/current/kilo-minimax/trial-1.md +0 -13
- package/src/skills/coach/tests/cases/TC-COACH-002/current/kilo-minimax/trial-2.md +0 -19
- package/src/skills/coach/tests/cases/TC-COACH-002/current/kilo-minimax/trial-3.md +0 -33
- package/src/skills/coach/tests/cases/TC-COACH-002/current/meta.json +0 -94
- package/src/skills/coach/tests/cases/TC-COACH-002-root-cause-first.yaml +0 -57
- package/src/skills/coach/tests/fixtures/pipeline-2026-04-06_id-collision.log +0 -77
- package/src/skills/coach/tests/index.yaml +0 -29
- package/src/skills/coach/tests/rubrics/calibration/evidence-based-bad.md +0 -13
- package/src/skills/coach/tests/rubrics/calibration/evidence-based-good.md +0 -29
- package/src/skills/coach/tests/rubrics/evidence-based.md +0 -26
- package/src/skills/coach/tests/rubrics/root-cause-first.md +0 -21
- package/src/skills/coach/workflows/analyze.md +0 -79
- package/src/skills/coach/workflows/analyze.md.legacy +0 -64
- package/src/skills/coach/workflows/audit.md +0 -74
- package/src/skills/coach/workflows/audit.md.legacy +0 -59
- package/src/skills/coach/workflows/create.md +0 -80
- package/src/skills/coach/workflows/create.md.legacy +0 -67
- package/src/skills/coach/workflows/improve.md +0 -71
- package/src/skills/coach/workflows/improve.md.legacy +0 -60
- package/src/skills/coach/workflows/research.md +0 -55
- package/src/skills/coach/workflows/review.md +0 -52
- package/src/skills/coach/workflows/review.md.legacy +0 -48
- package/src/skills/coach/workflows/test.md +0 -97
- package/src/skills/create-plan/README.md +0 -39
- package/src/skills/create-plan/algorithms/risk-assessment.md +0 -73
- package/src/skills/create-plan/knowledge/plan-completeness.md +0 -67
- package/src/skills/create-plan/knowledge/plan-lifecycle.md +0 -33
- package/src/skills/create-plan/knowledge/task-verification-pairs.md +0 -151
- package/src/skills/create-plan/knowledge/test-hygiene.md +0 -47
- package/src/skills/create-plan/scripts/validate-completeness.js +0 -182
- package/src/skills/create-plan/tests/cases/TC-CREATE-PLAN-001/current/claude-sonnet/trial-1.md +0 -5
- package/src/skills/create-plan/tests/cases/TC-CREATE-PLAN-001/current/claude-sonnet/trial-2.md +0 -39
- package/src/skills/create-plan/tests/cases/TC-CREATE-PLAN-001/current/claude-sonnet/trial-3.md +0 -35
- package/src/skills/create-plan/tests/cases/TC-CREATE-PLAN-001/current/judge.json +0 -167
- package/src/skills/create-plan/tests/cases/TC-CREATE-PLAN-001/current/kilo-deepseek/trial-1.md +0 -5
- package/src/skills/create-plan/tests/cases/TC-CREATE-PLAN-001/current/kilo-deepseek/trial-2.md +0 -10
- package/src/skills/create-plan/tests/cases/TC-CREATE-PLAN-001/current/kilo-deepseek/trial-3.md +0 -5
- package/src/skills/create-plan/tests/cases/TC-CREATE-PLAN-001/current/kilo-glm/trial-1.md +0 -26
- package/src/skills/create-plan/tests/cases/TC-CREATE-PLAN-001/current/kilo-glm/trial-2.md +0 -86
- package/src/skills/create-plan/tests/cases/TC-CREATE-PLAN-001/current/kilo-glm/trial-3.md +0 -5
- package/src/skills/create-plan/tests/cases/TC-CREATE-PLAN-001/current/kilo-minimax/trial-1.md +0 -11
- package/src/skills/create-plan/tests/cases/TC-CREATE-PLAN-001/current/kilo-minimax/trial-2.md +0 -15
- package/src/skills/create-plan/tests/cases/TC-CREATE-PLAN-001/current/kilo-minimax/trial-3.md +0 -14
- package/src/skills/create-plan/tests/cases/TC-CREATE-PLAN-001/current/meta.json +0 -119
- package/src/skills/create-plan/tests/cases/TC-CREATE-PLAN-001-validate-completeness.yaml +0 -41
- package/src/skills/create-plan/tests/cases/TC-CREATE-PLAN-002/current/claude-sonnet/trial-1.md +0 -25
- package/src/skills/create-plan/tests/cases/TC-CREATE-PLAN-002/current/claude-sonnet/trial-2.md +0 -30
- package/src/skills/create-plan/tests/cases/TC-CREATE-PLAN-002/current/claude-sonnet/trial-3.md +0 -37
- package/src/skills/create-plan/tests/cases/TC-CREATE-PLAN-002/current/judge.json +0 -164
- package/src/skills/create-plan/tests/cases/TC-CREATE-PLAN-002/current/kilo-deepseek/trial-1.md +0 -3
- package/src/skills/create-plan/tests/cases/TC-CREATE-PLAN-002/current/kilo-deepseek/trial-2.md +0 -11
- package/src/skills/create-plan/tests/cases/TC-CREATE-PLAN-002/current/kilo-deepseek/trial-3.md +0 -13
- package/src/skills/create-plan/tests/cases/TC-CREATE-PLAN-002/current/kilo-glm/trial-1.md +0 -44
- package/src/skills/create-plan/tests/cases/TC-CREATE-PLAN-002/current/kilo-glm/trial-2.md +0 -5
- package/src/skills/create-plan/tests/cases/TC-CREATE-PLAN-002/current/kilo-glm/trial-3.md +0 -49
- package/src/skills/create-plan/tests/cases/TC-CREATE-PLAN-002/current/kilo-minimax/trial-1.md +0 -6
- package/src/skills/create-plan/tests/cases/TC-CREATE-PLAN-002/current/kilo-minimax/trial-2.md +0 -11
- package/src/skills/create-plan/tests/cases/TC-CREATE-PLAN-002/current/kilo-minimax/trial-3.md +0 -16
- package/src/skills/create-plan/tests/cases/TC-CREATE-PLAN-002/current/meta.json +0 -116
- package/src/skills/create-plan/tests/cases/TC-CREATE-PLAN-002-task-granularity.yaml +0 -39
- package/src/skills/create-plan/tests/index.yaml +0 -25
- package/src/skills/create-plan/tests/rubrics/task-granularity.md +0 -21
- package/src/skills/create-plan/tests/rubrics/validate-completeness.md +0 -21
- package/src/skills/create-plan/workflows/create.md +0 -136
- package/src/skills/create-report/README.md +0 -40
- package/src/skills/create-report/algorithms/metric-calculation.md +0 -93
- package/src/skills/create-report/knowledge/report-metrics.md +0 -82
- package/src/skills/create-report/scripts/calc-metrics.js +0 -383
- package/src/skills/create-report/tests/cases/TC-CREATE-REPORT-001/current/claude-sonnet/trial-1.md +0 -25
- package/src/skills/create-report/tests/cases/TC-CREATE-REPORT-001/current/claude-sonnet/trial-2.md +0 -26
- package/src/skills/create-report/tests/cases/TC-CREATE-REPORT-001/current/claude-sonnet/trial-3.md +0 -28
- package/src/skills/create-report/tests/cases/TC-CREATE-REPORT-001/current/judge.json +0 -163
- package/src/skills/create-report/tests/cases/TC-CREATE-REPORT-001/current/kilo-deepseek/trial-1.md +0 -4
- package/src/skills/create-report/tests/cases/TC-CREATE-REPORT-001/current/kilo-deepseek/trial-2.md +0 -3
- package/src/skills/create-report/tests/cases/TC-CREATE-REPORT-001/current/kilo-deepseek/trial-3.md +0 -6
- package/src/skills/create-report/tests/cases/TC-CREATE-REPORT-001/current/kilo-glm/trial-1.md +0 -8
- package/src/skills/create-report/tests/cases/TC-CREATE-REPORT-001/current/kilo-glm/trial-2.md +0 -12
- package/src/skills/create-report/tests/cases/TC-CREATE-REPORT-001/current/kilo-glm/trial-3.md +0 -7
- package/src/skills/create-report/tests/cases/TC-CREATE-REPORT-001/current/kilo-minimax/trial-1.md +0 -12
- package/src/skills/create-report/tests/cases/TC-CREATE-REPORT-001/current/kilo-minimax/trial-2.md +0 -22
- package/src/skills/create-report/tests/cases/TC-CREATE-REPORT-001/current/kilo-minimax/trial-3.md +0 -13
- package/src/skills/create-report/tests/cases/TC-CREATE-REPORT-001/current/meta.json +0 -115
- package/src/skills/create-report/tests/cases/TC-CREATE-REPORT-001-root-cause-attribution.yaml +0 -57
- package/src/skills/create-report/tests/index.yaml +0 -20
- package/src/skills/create-report/tests/rubrics/root-cause-attribution.md +0 -21
- package/src/skills/create-report/workflows/standard.md +0 -175
- package/src/skills/decompose-gaps/README.md +0 -39
- package/src/skills/decompose-gaps/algorithms/scope-check.md +0 -110
- package/src/skills/decompose-gaps/knowledge/scope-validation.md +0 -65
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-001/current/claude-sonnet/trial-1.md +0 -41
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-001/current/claude-sonnet/trial-2.md +0 -41
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-001/current/claude-sonnet/trial-3.md +0 -56
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-001/current/judge.json +0 -164
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-001/current/kilo-deepseek/trial-1.md +0 -25
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-001/current/kilo-deepseek/trial-2.md +0 -17
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-001/current/kilo-deepseek/trial-3.md +0 -22
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-001/current/kilo-glm/trial-1.md +0 -25
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-001/current/kilo-glm/trial-2.md +0 -5
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-001/current/kilo-glm/trial-3.md +0 -29
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-001/current/kilo-minimax/trial-1.md +0 -27
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-001/current/kilo-minimax/trial-2.md +0 -35
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-001/current/kilo-minimax/trial-3.md +0 -18
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-001/current/meta.json +0 -116
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-001-scope-exclusion.yaml +0 -46
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-002/current/claude-sonnet/trial-1.md +0 -27
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-002/current/claude-sonnet/trial-2.md +0 -30
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-002/current/claude-sonnet/trial-3.md +0 -27
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-002/current/judge.json +0 -163
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-002/current/kilo-deepseek/trial-1.md +0 -0
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-002/current/kilo-deepseek/trial-2.md +0 -15
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-002/current/kilo-deepseek/trial-3.md +0 -7
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-002/current/kilo-glm/trial-1.md +0 -21
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-002/current/kilo-glm/trial-2.md +0 -38
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-002/current/kilo-glm/trial-3.md +0 -16
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-002/current/kilo-minimax/trial-1.md +0 -5
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-002/current/kilo-minimax/trial-2.md +0 -10
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-002/current/kilo-minimax/trial-3.md +0 -9
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-002/current/meta.json +0 -115
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-002-glob-before-write.yaml +0 -36
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-003/current/claude-sonnet/trial-1.md +0 -30
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-003/current/claude-sonnet/trial-2.md +0 -30
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-003/current/claude-sonnet/trial-3.md +0 -30
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-003/current/judge.json +0 -165
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-003/current/kilo-deepseek/trial-1.md +0 -5
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-003/current/kilo-deepseek/trial-2.md +0 -26
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-003/current/kilo-deepseek/trial-3.md +0 -5
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-003/current/kilo-glm/trial-1.md +0 -39
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-003/current/kilo-glm/trial-2.md +0 -37
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-003/current/kilo-glm/trial-3.md +0 -45
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-003/current/kilo-minimax/trial-1.md +0 -26
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-003/current/kilo-minimax/trial-2.md +0 -27
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-003/current/kilo-minimax/trial-3.md +0 -7
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-003/current/meta.json +0 -117
- package/src/skills/decompose-gaps/tests/cases/TC-DECOMPOSE-GAPS-003-parent-plan-mandatory.yaml +0 -41
- package/src/skills/decompose-gaps/tests/index.yaml +0 -30
- package/src/skills/decompose-gaps/tests/rubrics/glob-before-write.md +0 -21
- package/src/skills/decompose-gaps/tests/rubrics/parent-plan-mandatory.md +0 -22
- package/src/skills/decompose-gaps/tests/rubrics/scope-exclusion.md +0 -21
- package/src/skills/decompose-gaps/workflows/decompose.md +0 -123
- package/src/skills/decompose-plan/README.md +0 -43
- package/src/skills/decompose-plan/algorithms/deduplication.md +0 -101
- package/src/skills/decompose-plan/knowledge/atomicity-checklist.md +0 -139
- package/src/skills/decompose-plan/knowledge/capabilities.md +0 -68
- package/src/skills/decompose-plan/knowledge/human-task-rules.md +0 -82
- package/src/skills/decompose-plan/knowledge/scope-guard-checklist.md +0 -73
- package/src/skills/decompose-plan/scripts/check-atomicity-limit.js +0 -47
- package/src/skills/decompose-plan/scripts/check-duplicates.js +0 -323
- package/src/skills/decompose-plan/scripts/verify-atomicity.js +0 -408
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-001/current/claude-sonnet/trial-1.md +0 -30
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-001/current/claude-sonnet/trial-2.md +0 -36
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-001/current/claude-sonnet/trial-3.md +0 -37
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-001/current/judge.json +0 -163
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-001/current/kilo-deepseek/trial-1.md +0 -20
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-001/current/kilo-deepseek/trial-2.md +0 -17
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-001/current/kilo-deepseek/trial-3.md +0 -28
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-001/current/kilo-glm/trial-1.md +0 -114
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-001/current/kilo-glm/trial-2.md +0 -137
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-001/current/kilo-glm/trial-3.md +0 -188
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-001/current/kilo-minimax/trial-1.md +0 -0
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-001/current/kilo-minimax/trial-2.md +0 -32
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-001/current/kilo-minimax/trial-3.md +0 -110
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-001/current/meta.json +0 -115
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-001-atomicity-no-1to1.yaml +0 -56
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-002/current/claude-sonnet/trial-1.md +0 -47
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-002/current/claude-sonnet/trial-2.md +0 -54
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-002/current/claude-sonnet/trial-3.md +0 -43
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-002/current/judge.json +0 -163
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-002/current/kilo-deepseek/trial-1.md +0 -15
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-002/current/kilo-deepseek/trial-2.md +0 -5
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-002/current/kilo-deepseek/trial-3.md +0 -12
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-002/current/kilo-glm/trial-1.md +0 -34
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-002/current/kilo-glm/trial-2.md +0 -30
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-002/current/kilo-glm/trial-3.md +0 -35
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-002/current/kilo-minimax/trial-1.md +0 -0
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-002/current/kilo-minimax/trial-2.md +0 -31
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-002/current/kilo-minimax/trial-3.md +0 -0
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-002/current/meta.json +0 -115
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-002-get-next-id-mandatory.yaml +0 -44
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-003/current/claude-sonnet/trial-1.md +0 -21
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-003/current/claude-sonnet/trial-2.md +0 -38
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-003/current/claude-sonnet/trial-3.md +0 -30
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-003/current/judge.json +0 -163
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-003/current/kilo-deepseek/trial-1.md +0 -31
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-003/current/kilo-deepseek/trial-2.md +0 -35
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-003/current/kilo-deepseek/trial-3.md +0 -48
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-003/current/kilo-glm/trial-1.md +0 -167
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-003/current/kilo-glm/trial-2.md +0 -62
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-003/current/kilo-glm/trial-3.md +0 -174
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-003/current/kilo-minimax/trial-1.md +0 -0
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-003/current/kilo-minimax/trial-2.md +0 -0
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-003/current/kilo-minimax/trial-3.md +0 -0
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-003/current/meta.json +0 -115
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-003-verbatim-dod-transfer.yaml +0 -42
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-004/current/claude-sonnet/trial-1.md +0 -55
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-004/current/claude-sonnet/trial-2.md +0 -49
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-004/current/claude-sonnet/trial-3.md +0 -49
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-004/current/judge.json +0 -163
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-004/current/kilo-deepseek/trial-1.md +0 -104
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-004/current/kilo-deepseek/trial-2.md +0 -45
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-004/current/kilo-deepseek/trial-3.md +0 -58
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-004/current/kilo-glm/trial-1.md +0 -193
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-004/current/kilo-glm/trial-2.md +0 -202
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-004/current/kilo-glm/trial-3.md +0 -155
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-004/current/kilo-minimax/trial-1.md +0 -52
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-004/current/kilo-minimax/trial-2.md +0 -17
- 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 +0 -115
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-004-executor-atomicity.yaml +0 -64
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-005/current/claude-sonnet/trial-1.md +0 -59
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-005/current/claude-sonnet/trial-2.md +0 -204
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-005/current/claude-sonnet/trial-3.md +0 -213
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-005/current/judge.json +0 -163
- 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 +0 -57
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-005/current/kilo-deepseek/trial-3.md +0 -54
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-005/current/kilo-glm/trial-1.md +0 -147
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-005/current/kilo-glm/trial-2.md +0 -165
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-005/current/kilo-glm/trial-3.md +0 -133
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-005/current/kilo-minimax/trial-1.md +0 -81
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-005/current/kilo-minimax/trial-2.md +0 -108
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-005/current/kilo-minimax/trial-3.md +0 -3
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-005/current/meta.json +0 -114
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-005-capabilities-registry.yaml +0 -78
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-006/current/claude-sonnet/trial-1.md +0 -225
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-006/current/claude-sonnet/trial-2.md +0 -66
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-006/current/claude-sonnet/trial-3.md +0 -36
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-006/current/judge.json +0 -163
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-006/current/kilo-deepseek/trial-1.md +0 -42
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-006/current/kilo-deepseek/trial-2.md +0 -67
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-006/current/kilo-deepseek/trial-3.md +0 -40
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-006/current/kilo-glm/trial-1.md +0 -122
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-006/current/kilo-glm/trial-2.md +0 -131
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-006/current/kilo-glm/trial-3.md +0 -138
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-006/current/kilo-minimax/trial-1.md +0 -41
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-006/current/kilo-minimax/trial-2.md +0 -88
- 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 +0 -115
- package/src/skills/decompose-plan/tests/cases/TC-DECOMPOSE-PLAN-006-dod-threshold.yaml +0 -72
- package/src/skills/decompose-plan/tests/index.yaml +0 -45
- package/src/skills/decompose-plan/tests/rubrics/atomicity-no-1to1.md +0 -21
- package/src/skills/decompose-plan/tests/rubrics/capabilities-registry.md +0 -21
- package/src/skills/decompose-plan/tests/rubrics/dod-threshold.md +0 -21
- package/src/skills/decompose-plan/tests/rubrics/executor-atomicity.md +0 -21
- package/src/skills/decompose-plan/tests/rubrics/get-next-id-mandatory.md +0 -21
- package/src/skills/decompose-plan/tests/rubrics/verbatim-dod-transfer.md +0 -21
- package/src/skills/decompose-plan/workflows/decompose.md +0 -305
- package/src/skills/deep-research/README.md +0 -36
- package/src/skills/deep-research/algorithms/source-scoring.md +0 -63
- package/src/skills/deep-research/algorithms/synthesis.md +0 -67
- package/src/skills/deep-research/knowledge/data-validation.md +0 -44
- package/src/skills/deep-research/knowledge/perplexity-config.md +0 -30
- package/src/skills/deep-research/knowledge/research-methodology.md +0 -54
- package/src/skills/deep-research/knowledge/source-evaluation.md +0 -33
- package/src/skills/deep-research/scripts/perplexity-research.js +0 -315
- package/src/skills/deep-research/templates/brief-summary.md +0 -25
- package/src/skills/deep-research/templates/research-report.md +0 -76
- package/src/skills/deep-research/tests/cases/TC-DEEP-RESEARCH-001/current/claude-haiku/trial-1.md +0 -48
- package/src/skills/deep-research/tests/cases/TC-DEEP-RESEARCH-001/current/claude-haiku/trial-2.md +0 -88
- package/src/skills/deep-research/tests/cases/TC-DEEP-RESEARCH-001/current/claude-haiku/trial-3.md +0 -56
- package/src/skills/deep-research/tests/cases/TC-DEEP-RESEARCH-001/current/judge.json +0 -163
- package/src/skills/deep-research/tests/cases/TC-DEEP-RESEARCH-001/current/kilo-free/trial-1.md +0 -58
- package/src/skills/deep-research/tests/cases/TC-DEEP-RESEARCH-001/current/kilo-free/trial-2.md +0 -249
- package/src/skills/deep-research/tests/cases/TC-DEEP-RESEARCH-001/current/kilo-free/trial-3.md +0 -44
- package/src/skills/deep-research/tests/cases/TC-DEEP-RESEARCH-001/current/kilo-glm/trial-1.md +0 -96
- package/src/skills/deep-research/tests/cases/TC-DEEP-RESEARCH-001/current/kilo-glm/trial-2.md +0 -56
- package/src/skills/deep-research/tests/cases/TC-DEEP-RESEARCH-001/current/kilo-glm/trial-3.md +0 -94
- package/src/skills/deep-research/tests/cases/TC-DEEP-RESEARCH-001/current/kilo-glm-air/trial-1.md +0 -11
- package/src/skills/deep-research/tests/cases/TC-DEEP-RESEARCH-001/current/kilo-glm-air/trial-2.md +0 -1
- package/src/skills/deep-research/tests/cases/TC-DEEP-RESEARCH-001/current/kilo-glm-air/trial-3.md +0 -1
- package/src/skills/deep-research/tests/cases/TC-DEEP-RESEARCH-001/current/meta.json +0 -115
- package/src/skills/deep-research/tests/cases/TC-DEEP-RESEARCH-001-self-check-url.yaml +0 -58
- package/src/skills/deep-research/tests/index.yaml +0 -20
- package/src/skills/deep-research/tests/rubrics/self-check-url.md +0 -34
- package/src/skills/deep-research/workflows/base-checklist.md +0 -19
- package/src/skills/deep-research/workflows/benchmark.md +0 -38
- package/src/skills/deep-research/workflows/competitor.md +0 -44
- package/src/skills/deep-research/workflows/custom.md +0 -32
- package/src/skills/deep-research/workflows/market.md +0 -44
- package/src/skills/deep-research/workflows/technology.md +0 -40
- package/src/skills/deep-research/workflows/trend.md +0 -40
- package/src/skills/execute-task/README.md +0 -44
- package/src/skills/execute-task/algorithms/execution-strategy.md +0 -136
- package/src/skills/execute-task/knowledge/context-checkpoints.md +0 -75
- package/src/skills/execute-task/knowledge/ticket-structure.md +0 -70
- package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-001/current/claude-haiku/trial-1.md +0 -5
- package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-001/current/claude-haiku/trial-2.md +0 -5
- package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-001/current/claude-haiku/trial-3.md +0 -5
- package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-001/current/judge.json +0 -124
- package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-001/current/kilo-free/trial-1.md +0 -4
- package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-001/current/kilo-free/trial-2.md +0 -4
- package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-001/current/kilo-free/trial-3.md +0 -4
- package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-001/current/kilo-glm-air/trial-1.md +0 -4
- package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-001/current/kilo-glm-air/trial-2.md +0 -4
- package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-001/current/kilo-glm-air/trial-3.md +0 -11
- package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-001/current/meta.json +0 -88
- package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-001-no-ticket-creation.yaml +0 -48
- package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-002/current/claude-haiku/trial-1.md +0 -5
- package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-002/current/claude-haiku/trial-2.md +0 -6
- package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-002/current/claude-haiku/trial-3.md +0 -5
- package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-002/current/judge.json +0 -124
- package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-002/current/kilo-free/trial-1.md +0 -4
- package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-002/current/kilo-free/trial-2.md +0 -4
- package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-002/current/kilo-free/trial-3.md +0 -8
- package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-002/current/kilo-glm-air/trial-1.md +0 -9
- package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-002/current/kilo-glm-air/trial-2.md +0 -26
- package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-002/current/kilo-glm-air/trial-3.md +0 -4
- package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-002/current/meta.json +0 -89
- package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-002-no-duplicate-dod.yaml +0 -44
- package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-003/current/claude-haiku/trial-1.md +0 -5
- package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-003/current/claude-haiku/trial-2.md +0 -5
- package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-003/current/claude-haiku/trial-3.md +0 -5
- package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-003/current/judge.json +0 -46
- package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-003/current/meta.json +0 -37
- package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-003-verification-proportionality.yaml +0 -46
- package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-004/current/claude-haiku/trial-1.md +0 -18
- package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-004/current/claude-haiku/trial-2.md +0 -16
- package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-004/current/claude-haiku/trial-3.md +0 -14
- package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-004/current/judge.json +0 -124
- package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-004/current/kilo-free/trial-1.md +0 -5
- package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-004/current/kilo-free/trial-2.md +0 -5
- package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-004/current/kilo-free/trial-3.md +0 -1
- package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-004/current/kilo-glm-air/trial-1.md +0 -8
- package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-004/current/kilo-glm-air/trial-2.md +0 -5
- package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-004/current/kilo-glm-air/trial-3.md +0 -4
- package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-004/current/meta.json +0 -89
- package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-004-no-foreign-ticket-edit.yaml +0 -50
- package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-005/current/claude-haiku/trial-1.md +0 -5
- package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-005/current/claude-haiku/trial-2.md +0 -5
- package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-005/current/claude-haiku/trial-3.md +0 -5
- package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-005/current/judge.json +0 -124
- package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-005/current/kilo-free/trial-1.md +0 -15
- package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-005/current/kilo-free/trial-2.md +0 -4
- package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-005/current/kilo-free/trial-3.md +0 -5
- package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-005/current/kilo-glm-air/trial-1.md +0 -11
- package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-005/current/kilo-glm-air/trial-2.md +0 -11
- package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-005/current/kilo-glm-air/trial-3.md +0 -4
- package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-005/current/meta.json +0 -88
- package/src/skills/execute-task/tests/cases/TC-EXECUTE-TASK-005-ticket-fields-updated.yaml +0 -39
- package/src/skills/execute-task/tests/fixtures/IMPL-902-create-file.md +0 -41
- package/src/skills/execute-task/tests/fixtures/IMPL-904-current-task.md +0 -40
- package/src/skills/execute-task/tests/fixtures/IMPL-906-fill-ticket.md +0 -42
- package/src/skills/execute-task/tests/fixtures/QA-901-button-click.md +0 -41
- package/src/skills/execute-task/tests/fixtures/QA-903-visual-figma.md +0 -40
- package/src/skills/execute-task/tests/fixtures/TASK-905-done-with-typo.md +0 -36
- package/src/skills/execute-task/tests/index.yaml +0 -39
- package/src/skills/execute-task/tests/rubrics/no-duplicate-dod.md +0 -22
- package/src/skills/execute-task/tests/rubrics/no-foreign-ticket-edit.md +0 -20
- package/src/skills/execute-task/tests/rubrics/no-ticket-creation.md +0 -21
- package/src/skills/execute-task/tests/rubrics/ticket-fields-updated.md +0 -23
- package/src/skills/execute-task/tests/rubrics/verification-proportionality.md +0 -22
- package/src/skills/execute-task/workflows/execute.md +0 -104
- package/src/skills/manual-testing/README.md +0 -63
- package/src/skills/manual-testing/algorithms/blocked-tool-strategy.md +0 -74
- package/src/skills/manual-testing/algorithms/bug-severity.md +0 -73
- package/src/skills/manual-testing/algorithms/mcp-budget.md +0 -97
- package/src/skills/manual-testing/algorithms/test-prioritization.md +0 -69
- package/src/skills/manual-testing/knowledge/browser-extension-testing.md +0 -102
- package/src/skills/manual-testing/knowledge/browser-tools.md +0 -114
- package/src/skills/manual-testing/knowledge/desktop-tools-advanced.md +0 -92
- package/src/skills/manual-testing/knowledge/desktop-tools-core.md +0 -76
- package/src/skills/manual-testing/knowledge/sandbox-advanced.md +0 -83
- package/src/skills/manual-testing/knowledge/sandbox-core.md +0 -67
- package/src/skills/manual-testing/knowledge/stateful-edge-cases.md +0 -69
- package/src/skills/manual-testing/knowledge/test-case-design.md +0 -107
- package/src/skills/manual-testing/knowledge/testing-types.md +0 -45
- package/src/skills/manual-testing/templates/bug-report.md +0 -52
- package/src/skills/manual-testing/templates/test-case.md +0 -34
- package/src/skills/manual-testing/templates/test-plan.md +0 -97
- package/src/skills/manual-testing/templates/test-session-report.md +0 -56
- package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-001/current/claude-sonnet/trial-1.md +0 -34
- package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-001/current/claude-sonnet/trial-2.md +0 -32
- package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-001/current/claude-sonnet/trial-3.md +0 -30
- package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-001/current/judge.json +0 -163
- package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-001/current/kilo-deepseek/trial-1.md +0 -0
- package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-001/current/kilo-deepseek/trial-2.md +0 -7
- package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-001/current/kilo-deepseek/trial-3.md +0 -0
- package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-001/current/kilo-glm/trial-1.md +0 -4
- package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-001/current/kilo-glm/trial-2.md +0 -15
- package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-001/current/kilo-glm/trial-3.md +0 -8
- package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-001/current/kilo-minimax/trial-1.md +0 -5
- package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-001/current/kilo-minimax/trial-2.md +0 -7
- package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-001/current/kilo-minimax/trial-3.md +0 -7
- package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-001/current/meta.json +0 -114
- package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-001-sandbox-mandatory.yaml +0 -38
- package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-002/current/claude-sonnet/trial-1.md +0 -44
- package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-002/current/claude-sonnet/trial-2.md +0 -32
- package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-002/current/claude-sonnet/trial-3.md +0 -47
- package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-002/current/judge.json +0 -163
- package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-002/current/kilo-deepseek/trial-1.md +0 -19
- package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-002/current/kilo-deepseek/trial-2.md +0 -15
- package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-002/current/kilo-deepseek/trial-3.md +0 -24
- package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-002/current/kilo-glm/trial-1.md +0 -19
- package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-002/current/kilo-glm/trial-2.md +0 -13
- package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-002/current/kilo-glm/trial-3.md +0 -18
- package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-002/current/kilo-minimax/trial-1.md +0 -21
- package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-002/current/kilo-minimax/trial-2.md +0 -15
- package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-002/current/kilo-minimax/trial-3.md +0 -14
- package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-002/current/meta.json +0 -114
- package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-002-visual-tc-screenshot.yaml +0 -37
- package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-003/current/claude-sonnet/trial-1.md +0 -76
- package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-003/current/claude-sonnet/trial-2.md +0 -71
- package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-003/current/claude-sonnet/trial-3.md +0 -85
- package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-003/current/judge.json +0 -46
- package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-003/current/meta.json +0 -36
- package/src/skills/manual-testing/tests/cases/TC-MANUAL-TESTING-003-qa-non-ui-assertion.yaml +0 -65
- package/src/skills/manual-testing/tests/index.yaml +0 -30
- package/src/skills/manual-testing/tests/last-run-tc001-sonnet.log +0 -140
- package/src/skills/manual-testing/tests/last-run-tc002.log +0 -1
- package/src/skills/manual-testing/tests/last-run.log +0 -1469
- package/src/skills/manual-testing/tests/rubrics/qa-non-ui-assertion.md +0 -31
- package/src/skills/manual-testing/tests/rubrics/sandbox-mandatory.md +0 -20
- package/src/skills/manual-testing/tests/rubrics/visual-tc-screenshot.md +0 -21
- package/src/skills/manual-testing/workflows/acceptance.md +0 -80
- package/src/skills/manual-testing/workflows/exploratory.md +0 -84
- package/src/skills/manual-testing/workflows/regression.md +0 -76
- package/src/skills/manual-testing/workflows/smoke.md +0 -109
- package/src/skills/manual-testing/workflows/test-plan.md +0 -75
- package/src/skills/review-result/README.md +0 -59
- package/src/skills/review-result/algorithms/verification.md +0 -112
- package/src/skills/review-result/knowledge/dod-patterns.md +0 -115
- package/src/skills/review-result/knowledge/test-hygiene.md +0 -44
- package/src/skills/review-result/scripts/verify-artifacts.js +0 -497
- package/src/skills/review-result/templates/verdict.md +0 -153
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-001/current/claude-haiku/trial-1.md +0 -22
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-001/current/claude-haiku/trial-2.md +0 -7
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-001/current/claude-haiku/trial-3.md +0 -21
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-001/current/claude-sonnet/trial-1.md +0 -6
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-001/current/claude-sonnet/trial-2.md +0 -6
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-001/current/claude-sonnet/trial-3.md +0 -18
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-001/current/judge.json +0 -164
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-001/current/kilo-deepseek/trial-1.md +0 -5
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-001/current/kilo-deepseek/trial-2.md +0 -7
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-001/current/kilo-deepseek/trial-3.md +0 -6
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-001/current/kilo-glm/trial-1.md +0 -49
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-001/current/kilo-glm/trial-2.md +0 -28
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-001/current/kilo-glm/trial-3.md +0 -37
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-001/current/kilo-minimax/trial-1.md +0 -22
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-001/current/kilo-minimax/trial-2.md +0 -13
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-001/current/kilo-minimax/trial-3.md +0 -21
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-001/current/meta.json +0 -116
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-001-visual-tc-trigger.yaml +0 -51
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-002/current/claude-haiku/trial-1.md +0 -23
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-002/current/claude-haiku/trial-2.md +0 -22
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-002/current/claude-haiku/trial-3.md +0 -28
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-002/current/claude-sonnet/trial-1.md +0 -4
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-002/current/claude-sonnet/trial-2.md +0 -36
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-002/current/claude-sonnet/trial-3.md +0 -4
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-002/current/judge.json +0 -163
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-002/current/kilo-deepseek/trial-1.md +0 -4
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-002/current/kilo-deepseek/trial-2.md +0 -0
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-002/current/kilo-deepseek/trial-3.md +0 -4
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-002/current/kilo-glm/trial-1.md +0 -39
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-002/current/kilo-glm/trial-2.md +0 -25
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-002/current/kilo-glm/trial-3.md +0 -32
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-002/current/kilo-minimax/trial-1.md +0 -34
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-002/current/kilo-minimax/trial-2.md +0 -8
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-002/current/kilo-minimax/trial-3.md +0 -23
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-002/current/meta.json +0 -115
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-002-path-line-suffix.yaml +0 -39
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-003/current/claude-sonnet/trial-1.md +0 -7
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-003/current/claude-sonnet/trial-2.md +0 -7
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-003/current/claude-sonnet/trial-3.md +0 -7
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-003/current/judge.json +0 -163
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-003/current/kilo-deepseek/trial-1.md +0 -5
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-003/current/kilo-deepseek/trial-2.md +0 -5
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-003/current/kilo-deepseek/trial-3.md +0 -11
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-003/current/kilo-glm/trial-1.md +0 -16
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-003/current/kilo-glm/trial-2.md +0 -18
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-003/current/kilo-glm/trial-3.md +0 -17
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-003/current/kilo-minimax/trial-1.md +0 -17
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-003/current/kilo-minimax/trial-2.md +0 -31
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-003/current/kilo-minimax/trial-3.md +0 -5
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-003/current/meta.json +0 -115
- package/src/skills/review-result/tests/cases/TC-REVIEW-RESULT-003-test-isolation.yaml +0 -50
- package/src/skills/review-result/tests/fixtures/IMPL-902-path-with-line.md +0 -43
- package/src/skills/review-result/tests/fixtures/QA-901-visual-button.md +0 -46
- package/src/skills/review-result/tests/fixtures/QA-904-test-isolation-violation/QA-904.md +0 -51
- package/src/skills/review-result/tests/fixtures/QA-904-test-isolation-violation/example-test.mjs +0 -36
- package/src/skills/review-result/tests/index.yaml +0 -30
- package/src/skills/review-result/tests/rubrics/path-line-suffix.md +0 -19
- package/src/skills/review-result/tests/rubrics/test-isolation.md +0 -20
- package/src/skills/review-result/tests/rubrics/visual-tc-trigger.md +0 -19
- package/src/skills/review-result/workflows/review.md +0 -209
package/src/runner.mjs
CHANGED
|
@@ -1406,6 +1406,38 @@ class StageExecutor {
|
|
|
1406
1406
|
class PipelineRunner {
|
|
1407
1407
|
constructor(config, args) {
|
|
1408
1408
|
this.config = config;
|
|
1409
|
+
|
|
1410
|
+
// Validate manual-gate stages in pipeline.yaml at startup
|
|
1411
|
+
if (config.pipeline && config.pipeline.stages) {
|
|
1412
|
+
for (const [stageId, stage] of Object.entries(config.pipeline.stages)) {
|
|
1413
|
+
if (stage.type === 'manual-gate') {
|
|
1414
|
+
// Validate goto.approved
|
|
1415
|
+
if (!stage.goto || !stage.goto.approved) {
|
|
1416
|
+
throw new Error(`pipeline.yaml validation error in stage '${stageId}' (type: manual-gate): missing required 'goto.approved'`);
|
|
1417
|
+
}
|
|
1418
|
+
|
|
1419
|
+
// Validate goto.rejected
|
|
1420
|
+
if (!stage.goto || !stage.goto.rejected) {
|
|
1421
|
+
throw new Error(`pipeline.yaml validation error in stage '${stageId}' (type: manual-gate): missing required 'goto.rejected'`);
|
|
1422
|
+
}
|
|
1423
|
+
|
|
1424
|
+
// Validate poll_interval_ms if present
|
|
1425
|
+
if (stage.poll_interval_ms !== undefined) {
|
|
1426
|
+
if (typeof stage.poll_interval_ms !== 'number' || stage.poll_interval_ms < 100) {
|
|
1427
|
+
throw new Error(`pipeline.yaml validation error in stage '${stageId}' (type: manual-gate): poll_interval_ms must be a number >= 100`);
|
|
1428
|
+
}
|
|
1429
|
+
}
|
|
1430
|
+
|
|
1431
|
+
// Validate timeout_seconds if present
|
|
1432
|
+
if (stage.timeout_seconds !== undefined) {
|
|
1433
|
+
if (typeof stage.timeout_seconds !== 'number' || stage.timeout_seconds <= 0) {
|
|
1434
|
+
throw new Error(`pipeline.yaml validation error in stage '${stageId}' (type: manual-gate): timeout_seconds must be a number > 0`);
|
|
1435
|
+
}
|
|
1436
|
+
}
|
|
1437
|
+
}
|
|
1438
|
+
}
|
|
1439
|
+
}
|
|
1440
|
+
|
|
1409
1441
|
this.args = args;
|
|
1410
1442
|
this.pipeline = config.pipeline;
|
|
1411
1443
|
this.context = { ...this.pipeline.context };
|
|
@@ -1464,36 +1496,266 @@ class PipelineRunner {
|
|
|
1464
1496
|
}
|
|
1465
1497
|
}
|
|
1466
1498
|
|
|
1467
|
-
|
|
1468
|
-
|
|
1469
|
-
|
|
1470
|
-
|
|
1471
|
-
|
|
1472
|
-
|
|
1473
|
-
|
|
1474
|
-
|
|
1475
|
-
|
|
1476
|
-
|
|
1477
|
-
|
|
1478
|
-
|
|
1479
|
-
|
|
1480
|
-
|
|
1481
|
-
|
|
1482
|
-
|
|
1483
|
-
|
|
1499
|
+
/**
|
|
1500
|
+
* Вычисляет детерминированный идентификатор шага для approval-файла.
|
|
1501
|
+
* Формат: {ticket_id}_{stageId}_{attempt}
|
|
1502
|
+
*
|
|
1503
|
+
* @param {Object} context - Контекст выполнения пайплайна
|
|
1504
|
+
* @param {string} [context.ticket_id] - ID тикета (может быть undefined)
|
|
1505
|
+
* @param {string} stageId - Идентификатор стадии
|
|
1506
|
+
* @param {Object} counters - Счётчики выполнения
|
|
1507
|
+
* @param {number} [counters.task_attempts] - Номер попытки выполнения (0 если не задано)
|
|
1508
|
+
* @returns {string} Детерминированный step_id
|
|
1509
|
+
*/
|
|
1510
|
+
computeStepId(context, stageId, counters) {
|
|
1511
|
+
const ticketId = context.ticket_id || 'no-ticket';
|
|
1512
|
+
const attempt = counters.task_attempts ?? 0;
|
|
1513
|
+
return `${ticketId}_${stageId}_${attempt}`;
|
|
1514
|
+
}
|
|
1515
|
+
|
|
1516
|
+
/**
|
|
1517
|
+
* Создаёт approval-файл со статусом "pending" (идемпотентно).
|
|
1518
|
+
* Если файл уже существует — не перезаписывает, возвращает его содержимое.
|
|
1519
|
+
*
|
|
1520
|
+
* @param {string} filePath - Путь к approval-файлу (абсолютный)
|
|
1521
|
+
* @param {Object} payload - Данные для approval-файла
|
|
1522
|
+
* @param {string} payload.step_id - Идентификатор шага (должен совпадать с именем файла)
|
|
1523
|
+
* @param {string} payload.ticket_id - ID тикета
|
|
1524
|
+
* @param {string} payload.stage_id - ID стадии
|
|
1525
|
+
* @param {number} payload.attempt - Номер попытки
|
|
1526
|
+
* @param {Object} [payload.context_snapshot] - Снапшот контекста (опционально)
|
|
1527
|
+
* @returns {Promise<Object>} Объект approval-файла (прочитанный или созданный)
|
|
1528
|
+
* @throws {Error} При ошибке создания директории или записи файла
|
|
1529
|
+
*/
|
|
1530
|
+
async writeApprovalPending(filePath, payload) {
|
|
1531
|
+
// Создаём директорию заранее (recursive, безопасно)
|
|
1532
|
+
const dir = path.dirname(filePath);
|
|
1533
|
+
await fs.promises.mkdir(dir, { recursive: true });
|
|
1534
|
+
|
|
1535
|
+
// Формируем данные approval-файла
|
|
1536
|
+
const now = new Date().toISOString();
|
|
1537
|
+
const approvalData = {
|
|
1538
|
+
step_id: payload.step_id,
|
|
1539
|
+
ticket_id: payload.ticket_id,
|
|
1540
|
+
stage_id: payload.stage_id,
|
|
1541
|
+
attempt: payload.attempt,
|
|
1542
|
+
status: 'pending',
|
|
1543
|
+
created_at: now,
|
|
1544
|
+
updated_at: now,
|
|
1545
|
+
decided_by: null,
|
|
1546
|
+
comment: null,
|
|
1547
|
+
context_snapshot: payload.context_snapshot || {}
|
|
1548
|
+
};
|
|
1484
1549
|
|
|
1485
|
-
|
|
1486
|
-
const value = this.counters[counterName];
|
|
1550
|
+
const content = JSON.stringify(approvalData, null, 2);
|
|
1487
1551
|
|
|
1488
|
-
|
|
1489
|
-
|
|
1552
|
+
// Атомарно создаём файл с флагом 'wx' (fail if exists)
|
|
1553
|
+
try {
|
|
1554
|
+
const handle = await fs.promises.open(filePath, 'wx');
|
|
1555
|
+
await handle.write(content);
|
|
1556
|
+
await handle.close();
|
|
1557
|
+
return approvalData;
|
|
1558
|
+
} catch (err) {
|
|
1559
|
+
if (err.code === 'EEXIST') {
|
|
1560
|
+
// Файл уже был создан (например, при recovery) — читаем и возвращаем
|
|
1561
|
+
const existing = await fs.promises.readFile(filePath, 'utf8');
|
|
1562
|
+
return JSON.parse(existing);
|
|
1563
|
+
}
|
|
1564
|
+
throw err;
|
|
1565
|
+
}
|
|
1566
|
+
}
|
|
1567
|
+
|
|
1568
|
+
/**
|
|
1569
|
+
* Читает approval-файл и парсит его как JSON.
|
|
1570
|
+
*
|
|
1571
|
+
* @param {string} filePath - Путь к approval-файлу (абсолютный)
|
|
1572
|
+
* @returns {Promise<Object|null>} Объект approval-файла или null если файл не существует
|
|
1573
|
+
* @throws {Error} При невалидном JSON — с сообщением "corrupt approval file at {path}: {parse error}"
|
|
1574
|
+
*/
|
|
1575
|
+
async readApprovalFile(filePath) {
|
|
1576
|
+
try {
|
|
1577
|
+
const content = await fs.promises.readFile(filePath, 'utf8');
|
|
1578
|
+
return JSON.parse(content);
|
|
1579
|
+
} catch (err) {
|
|
1580
|
+
if (err.code === 'ENOENT') {
|
|
1581
|
+
return null;
|
|
1582
|
+
}
|
|
1583
|
+
if (err instanceof SyntaxError) {
|
|
1584
|
+
throw new Error(`corrupt approval file at ${filePath}: ${err.message}`);
|
|
1585
|
+
}
|
|
1586
|
+
// Перебрасываем другие ошибки (например, fs-ошибки) без изменений
|
|
1587
|
+
throw err;
|
|
1588
|
+
}
|
|
1589
|
+
}
|
|
1590
|
+
|
|
1591
|
+
/**
|
|
1592
|
+
* Выполняет встроенный стейдж типа update-counter:
|
|
1593
|
+
* инкрементирует счётчик и возвращает статус для goto-перехода.
|
|
1594
|
+
*
|
|
1595
|
+
* Конфигурация стейджа:
|
|
1596
|
+
* type: update-counter
|
|
1597
|
+
* counter: <name> — имя счётчика
|
|
1598
|
+
* max: <number> — максимальное значение (опционально)
|
|
1599
|
+
* goto:
|
|
1600
|
+
* default: <stage> — следующий стейдж
|
|
1601
|
+
* max_reached: <stage> — стейдж при достижении max
|
|
1602
|
+
*/
|
|
1603
|
+
executeUpdateCounter(stageId, stage) {
|
|
1604
|
+
const counterName = stage.counter;
|
|
1605
|
+
if (!counterName) {
|
|
1606
|
+
throw new Error(`Stage "${stageId}" has type update-counter but no counter specified`);
|
|
1607
|
+
}
|
|
1608
|
+
|
|
1609
|
+
this.counters[counterName] = (this.counters[counterName] || 0) + 1;
|
|
1610
|
+
const value = this.counters[counterName];
|
|
1611
|
+
|
|
1612
|
+
if (this.logger) {
|
|
1613
|
+
this.logger.info(`Counter "${counterName}" incremented to ${value}`, stageId);
|
|
1614
|
+
}
|
|
1615
|
+
|
|
1616
|
+
const max = stage.max;
|
|
1617
|
+
const status = (max && value >= max) ? 'max_reached' : 'default';
|
|
1618
|
+
|
|
1619
|
+
return { status, result: { counter: counterName, value } };
|
|
1490
1620
|
}
|
|
1491
1621
|
|
|
1492
|
-
|
|
1493
|
-
|
|
1622
|
+
/**
|
|
1623
|
+
* Выполняет встроенный стейдж типа manual-gate: создаёт approval-файл
|
|
1624
|
+
* и ждёт решения (approved/rejected) через polling файловой системы.
|
|
1625
|
+
*
|
|
1626
|
+
* Конфигурация стейджа:
|
|
1627
|
+
* type: manual-gate
|
|
1628
|
+
* poll_interval_ms: <number> — интервал опроса в мс (опц., default 2000)
|
|
1629
|
+
* timeout_seconds: <number> — таймаут в секундах (опц., default null)
|
|
1630
|
+
* goto:
|
|
1631
|
+
* approved: <stage> — обязательный, при одобрении
|
|
1632
|
+
* rejected: <stage> — обязательный, при отклонении
|
|
1633
|
+
* timeout: <stage> — опц., при истечении таймаута
|
|
1634
|
+
* aborted: <stage> — опц., при остановке runner'а
|
|
1635
|
+
*
|
|
1636
|
+
* @param {string} stageId - ID стадии
|
|
1637
|
+
* @param {object} stage - конфигурация стадии
|
|
1638
|
+
* @returns {Promise<{status: 'approved'|'rejected'|'timeout'|'aborted', result: object}>}
|
|
1639
|
+
*/
|
|
1640
|
+
async executeManualGate(stageId, stage) {
|
|
1641
|
+
const stepId = this.computeStepId(this.context, stageId, this.counters);
|
|
1642
|
+
const filePath = path.join(this.projectRoot, '.workflow', 'approvals', `${stepId}.json`);
|
|
1643
|
+
|
|
1644
|
+
const payload = {
|
|
1645
|
+
step_id: stepId,
|
|
1646
|
+
ticket_id: this.context.ticket_id || 'no-ticket',
|
|
1647
|
+
stage_id: stageId,
|
|
1648
|
+
attempt: this.counters.task_attempts || 0,
|
|
1649
|
+
context_snapshot: { ...this.context }
|
|
1650
|
+
};
|
|
1494
1651
|
|
|
1495
|
-
|
|
1496
|
-
|
|
1652
|
+
const existing = await this.writeApprovalPending(filePath, payload);
|
|
1653
|
+
|
|
1654
|
+
// Если файл уже был и статус уже resolved — сразу возвращаем результат (recovery)
|
|
1655
|
+
if (existing.status === 'approved' || existing.status === 'rejected') {
|
|
1656
|
+
if (this.logger) {
|
|
1657
|
+
this.logger.info(
|
|
1658
|
+
`[${stageId}] manual-gate: already ${existing.status} by ${existing.decided_by || 'unknown'}${existing.comment ? `, comment="${existing.comment}"` : ''}`,
|
|
1659
|
+
stageId
|
|
1660
|
+
);
|
|
1661
|
+
}
|
|
1662
|
+
return {
|
|
1663
|
+
status: existing.status,
|
|
1664
|
+
result: {
|
|
1665
|
+
step_id: stepId,
|
|
1666
|
+
decided_by: existing.decided_by,
|
|
1667
|
+
comment: existing.comment
|
|
1668
|
+
}
|
|
1669
|
+
};
|
|
1670
|
+
}
|
|
1671
|
+
|
|
1672
|
+
// Создан новый pending-файл
|
|
1673
|
+
if (this.logger) {
|
|
1674
|
+
this.logger.info(`[${stageId}] manual-gate: created pending approval at ${filePath}`, stageId);
|
|
1675
|
+
}
|
|
1676
|
+
|
|
1677
|
+
const pollIntervalMs = stage.poll_interval_ms || 2000;
|
|
1678
|
+
const timeoutSeconds = stage.timeout_seconds || null;
|
|
1679
|
+
const startTime = Date.now();
|
|
1680
|
+
|
|
1681
|
+
// Polling-цикл
|
|
1682
|
+
while (this.running) {
|
|
1683
|
+
await new Promise(resolve => setTimeout(resolve, pollIntervalMs));
|
|
1684
|
+
|
|
1685
|
+
// Проверка остановки runner'а
|
|
1686
|
+
if (!this.running) {
|
|
1687
|
+
if (this.logger) {
|
|
1688
|
+
this.logger.warn(`[${stageId}] manual-gate: aborted (runner stopped)`, stageId);
|
|
1689
|
+
}
|
|
1690
|
+
return { status: 'aborted', result: { step_id: stepId } };
|
|
1691
|
+
}
|
|
1692
|
+
|
|
1693
|
+
// Проверка таймаута
|
|
1694
|
+
if (timeoutSeconds !== null) {
|
|
1695
|
+
const elapsed = (Date.now() - startTime) / 1000;
|
|
1696
|
+
if (elapsed >= timeoutSeconds) {
|
|
1697
|
+
if (this.logger) {
|
|
1698
|
+
this.logger.warn(`[${stageId}] manual-gate: timeout after ${timeoutSeconds}s, no decision`, stageId);
|
|
1699
|
+
}
|
|
1700
|
+
return { status: 'timeout', result: { step_id: stepId } };
|
|
1701
|
+
}
|
|
1702
|
+
}
|
|
1703
|
+
|
|
1704
|
+
// Читаем текущее состояние файла
|
|
1705
|
+
let data;
|
|
1706
|
+
try {
|
|
1707
|
+
data = await this.readApprovalFile(filePath);
|
|
1708
|
+
} catch (err) {
|
|
1709
|
+
// Corrupt JSON — пробрасываем ошибку для goto.error
|
|
1710
|
+
throw err;
|
|
1711
|
+
}
|
|
1712
|
+
|
|
1713
|
+
if (data && data.status === 'approved') {
|
|
1714
|
+
if (this.logger) {
|
|
1715
|
+
this.logger.info(
|
|
1716
|
+
`[${stageId}] manual-gate: approved by ${data.decided_by || 'unknown'}${data.comment ? `, comment="${data.comment}"` : ''}`,
|
|
1717
|
+
stageId
|
|
1718
|
+
);
|
|
1719
|
+
}
|
|
1720
|
+
return {
|
|
1721
|
+
status: 'approved',
|
|
1722
|
+
result: {
|
|
1723
|
+
step_id: stepId,
|
|
1724
|
+
decided_by: data.decided_by,
|
|
1725
|
+
comment: data.comment
|
|
1726
|
+
}
|
|
1727
|
+
};
|
|
1728
|
+
}
|
|
1729
|
+
|
|
1730
|
+
if (data && data.status === 'rejected') {
|
|
1731
|
+
if (this.logger) {
|
|
1732
|
+
this.logger.info(
|
|
1733
|
+
`[${stageId}] manual-gate: rejected by ${data.decided_by || 'unknown'}${data.comment ? `, comment="${data.comment}"` : ''}`,
|
|
1734
|
+
stageId
|
|
1735
|
+
);
|
|
1736
|
+
}
|
|
1737
|
+
return {
|
|
1738
|
+
status: 'rejected',
|
|
1739
|
+
result: {
|
|
1740
|
+
step_id: stepId,
|
|
1741
|
+
decided_by: data.decided_by,
|
|
1742
|
+
comment: data.comment
|
|
1743
|
+
}
|
|
1744
|
+
};
|
|
1745
|
+
}
|
|
1746
|
+
|
|
1747
|
+
// DEBUG-лог polling (оставляем только если нужен)
|
|
1748
|
+
if (this.logger && this.logger.level === 'debug') {
|
|
1749
|
+
this.logger.debug(`[${stageId}] manual-gate: polling, current status=pending`, stageId);
|
|
1750
|
+
}
|
|
1751
|
+
}
|
|
1752
|
+
|
|
1753
|
+
// Выход по this.running = false
|
|
1754
|
+
if (this.logger) {
|
|
1755
|
+
this.logger.warn(`[${stageId}] manual-gate: aborted (runner stopped)`, stageId);
|
|
1756
|
+
}
|
|
1757
|
+
return { status: 'aborted', result: { step_id: stepId } };
|
|
1758
|
+
}
|
|
1497
1759
|
|
|
1498
1760
|
/**
|
|
1499
1761
|
* Запускает основной цикл выполнения
|
|
@@ -1528,16 +1790,18 @@ class PipelineRunner {
|
|
|
1528
1790
|
throw new Error(`Stage not found: ${this.currentStage}`);
|
|
1529
1791
|
}
|
|
1530
1792
|
|
|
1531
|
-
|
|
1793
|
+
let result;
|
|
1532
1794
|
|
|
1533
|
-
|
|
1534
|
-
|
|
1535
|
-
|
|
1536
|
-
|
|
1537
|
-
|
|
1538
|
-
|
|
1539
|
-
|
|
1540
|
-
|
|
1795
|
+
// Встроенные типы стейджа — выполняются без вызова внешних агентов
|
|
1796
|
+
if (stage.type === 'update-counter') {
|
|
1797
|
+
result = this.executeUpdateCounter(this.currentStage, stage);
|
|
1798
|
+
} else if (stage.type === 'manual-gate') {
|
|
1799
|
+
result = await this.executeManualGate(this.currentStage, stage);
|
|
1800
|
+
} else {
|
|
1801
|
+
this.currentExecutor = new StageExecutor(this.config, this.context, this.counters, {}, this.fileGuard, this.logger, this.projectRoot);
|
|
1802
|
+
result = await this.currentExecutor.execute(this.currentStage);
|
|
1803
|
+
this.currentExecutor = null;
|
|
1804
|
+
}
|
|
1541
1805
|
|
|
1542
1806
|
this.logger.info(`Stage ${this.currentStage} completed with status: ${result.status}`, 'PipelineRunner');
|
|
1543
1807
|
|
|
@@ -1843,6 +2107,22 @@ function validateConfig(config) {
|
|
|
1843
2107
|
errors.push(`Stage "${stageId}" references non-existent agent: ${resolvedAgent}`);
|
|
1844
2108
|
}
|
|
1845
2109
|
|
|
2110
|
+
// Валидация для manual-gate стадии
|
|
2111
|
+
if (stage.type === 'manual-gate') {
|
|
2112
|
+
if (!stage.goto || !stage.goto.approved) {
|
|
2113
|
+
errors.push(`Stage "${stageId}" has type manual-gate but missing required goto.approved`);
|
|
2114
|
+
}
|
|
2115
|
+
if (!stage.goto || !stage.goto.rejected) {
|
|
2116
|
+
errors.push(`Stage "${stageId}" has type manual-gate but missing required goto.rejected`);
|
|
2117
|
+
}
|
|
2118
|
+
if (stage.poll_interval_ms !== undefined && (typeof stage.poll_interval_ms !== 'number' || stage.poll_interval_ms < 100)) {
|
|
2119
|
+
errors.push(`Stage "${stageId}" has invalid poll_interval_ms: must be a number >= 100`);
|
|
2120
|
+
}
|
|
2121
|
+
if (stage.timeout_seconds !== undefined && (typeof stage.timeout_seconds !== 'number' || stage.timeout_seconds <= 0)) {
|
|
2122
|
+
errors.push(`Stage "${stageId}" has invalid timeout_seconds: must be a number > 0`);
|
|
2123
|
+
}
|
|
2124
|
+
}
|
|
2125
|
+
|
|
1846
2126
|
if (stage.goto) {
|
|
1847
2127
|
for (const [status, transition] of Object.entries(stage.goto)) {
|
|
1848
2128
|
if (status === 'default') continue;
|
|
@@ -46,10 +46,10 @@ function checkCondition(condition) {
|
|
|
46
46
|
|
|
47
47
|
switch (type) {
|
|
48
48
|
case 'file_exists':
|
|
49
|
-
return fs.existsSync(path.join(PROJECT_DIR, value));
|
|
49
|
+
return fs.existsSync(path.isAbsolute(value) ? value : path.join(PROJECT_DIR, value));
|
|
50
50
|
|
|
51
51
|
case 'file_not_exists':
|
|
52
|
-
return !fs.existsSync(path.join(PROJECT_DIR, value));
|
|
52
|
+
return !fs.existsSync(path.isAbsolute(value) ? value : path.join(PROJECT_DIR, value));
|
|
53
53
|
|
|
54
54
|
case 'tasks_completed': {
|
|
55
55
|
if (!value || (Array.isArray(value) && value.length === 0)) return true;
|
|
@@ -21,6 +21,7 @@ import fs from "fs";
|
|
|
21
21
|
import path from "path";
|
|
22
22
|
import { findProjectRoot } from "workflow-ai/lib/find-root.mjs";
|
|
23
23
|
import { printResult } from "workflow-ai/lib/utils.mjs";
|
|
24
|
+
import { getNextId } from "workflow-ai/lib/operations/tickets.mjs";
|
|
24
25
|
|
|
25
26
|
const PROJECT_DIR = findProjectRoot();
|
|
26
27
|
|
|
@@ -77,15 +78,6 @@ function findMaxNumber(targetDir, prefix) {
|
|
|
77
78
|
return maxNum;
|
|
78
79
|
}
|
|
79
80
|
|
|
80
|
-
function formatNumber(num) {
|
|
81
|
-
return num.toString().padStart(3, "0");
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
/**
|
|
85
|
-
* Извлекает значения prefix из .workflow/config/config.yaml → task_types.*.prefix.
|
|
86
|
-
* Минимальный YAML-парсер: не тянем зависимость, читаем только нужную секцию.
|
|
87
|
-
* Возвращает массив уникальных префиксов в порядке появления.
|
|
88
|
-
*/
|
|
89
81
|
function readPrefixesFromConfig() {
|
|
90
82
|
const configPath = path.join(PROJECT_DIR, ".workflow", "config", "config.yaml");
|
|
91
83
|
|
|
@@ -93,7 +85,7 @@ function readPrefixesFromConfig() {
|
|
|
93
85
|
throw new Error(`config.yaml not found: ${configPath}`);
|
|
94
86
|
}
|
|
95
87
|
|
|
96
|
-
const text = fs.readFileSync(configPath, "utf8");
|
|
88
|
+
const text = fs.readFileSync(configPath, "utf8");
|
|
97
89
|
const lines = text.split(/\r?\n/);
|
|
98
90
|
|
|
99
91
|
const prefixes = [];
|
|
@@ -136,30 +128,15 @@ function readPrefixesFromConfig() {
|
|
|
136
128
|
return prefixes;
|
|
137
129
|
}
|
|
138
130
|
|
|
139
|
-
function resolveTargetDir(dir) {
|
|
140
|
-
if (dir === "tickets") {
|
|
141
|
-
return path.join(PROJECT_DIR, ".workflow", "tickets");
|
|
142
|
-
} else if (dir === "plans") {
|
|
143
|
-
return path.join(PROJECT_DIR, ".workflow", "plans");
|
|
144
|
-
} else {
|
|
145
|
-
return path.join(PROJECT_DIR, dir);
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
|
|
149
131
|
async function runSinglePrefix(prefix, dir) {
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
if (!fs.existsSync(targetDir)) {
|
|
153
|
-
const nextId = `${prefix}-001`;
|
|
132
|
+
try {
|
|
133
|
+
const nextId = await getNextId(PROJECT_DIR, prefix, { dir });
|
|
154
134
|
printResult({ status: "success", id: nextId });
|
|
155
|
-
|
|
135
|
+
} catch (err) {
|
|
136
|
+
console.error(err.message);
|
|
137
|
+
printResult({ status: "error", error: err.message });
|
|
138
|
+
process.exit(1);
|
|
156
139
|
}
|
|
157
|
-
|
|
158
|
-
const maxNum = findMaxNumber(targetDir, prefix);
|
|
159
|
-
const nextNum = maxNum + 1;
|
|
160
|
-
const nextId = `${prefix}-${formatNumber(nextNum)}`;
|
|
161
|
-
|
|
162
|
-
printResult({ status: "success", id: nextId });
|
|
163
140
|
}
|
|
164
141
|
|
|
165
142
|
async function runAllFromConfig() {
|
|
@@ -48,11 +48,11 @@ function checkCondition(condition) {
|
|
|
48
48
|
|
|
49
49
|
switch (type) {
|
|
50
50
|
case 'file_exists':
|
|
51
|
-
const filePath = path.join(PROJECT_DIR, value);
|
|
51
|
+
const filePath = path.isAbsolute(value) ? value : path.join(PROJECT_DIR, value);
|
|
52
52
|
return fs.existsSync(filePath);
|
|
53
53
|
|
|
54
54
|
case 'file_not_exists':
|
|
55
|
-
const filePath2 = path.join(PROJECT_DIR, value);
|
|
55
|
+
const filePath2 = path.isAbsolute(value) ? value : path.join(PROJECT_DIR, value);
|
|
56
56
|
return !fs.existsSync(filePath2);
|
|
57
57
|
|
|
58
58
|
case 'tasks_completed':
|
|
@@ -768,13 +768,7 @@ async function main() {
|
|
|
768
768
|
...result,
|
|
769
769
|
auto_corrected: correctionResult.moved.length,
|
|
770
770
|
moved_tickets: correctionResult.moved.map(m => m.id).join(','),
|
|
771
|
-
review_metrics:
|
|
772
|
-
tickets_with_reviews: reviewMetrics.tickets_with_reviews,
|
|
773
|
-
total_failed: reviewMetrics.total_failed,
|
|
774
|
-
total_passed: reviewMetrics.total_passed,
|
|
775
|
-
avg_time_to_first_passed_days: reviewMetrics.avg_time_to_first_passed_days,
|
|
776
|
-
iterations_per_ticket: reviewMetrics.iterations_per_ticket
|
|
777
|
-
}
|
|
771
|
+
review_metrics: JSON.stringify(reviewMetrics)
|
|
778
772
|
};
|
|
779
773
|
|
|
780
774
|
printResult(finalResult);
|
|
@@ -148,7 +148,7 @@ ticket_prefix: COACH
|
|
|
148
148
|
Если на (1), (2) или (4) ответ «да» — замени на общую формулировку или критерий, либо перенеси в shared knowledge проекта. Правка должна быть применима к любому проекту, использующему этот скил.
|
|
149
149
|
|
|
150
150
|
**Дополнительная проверка на копирование старого текста:** если правка **заменяет** существующий блок, не воспроизводи автоматически терминологию исходника. Pre-existing нарушения в заменяемом тексте — твоя ответственность; молча скопировав их в новый текст, ты унаследуешь нарушения и они станут частью твоей правки. Прогон чеклиста по 4 вопросам обязателен **по новому тексту целиком**, а не только по дельте «новое - старое».
|
|
151
|
-
10. **Self-Correct** — после каждой правки в скил **обязательно** перечитай принципы коуча (1-12) и проверь, не нарушает ли внесённая правка какой-либо из них. Не жди указания стейкхолдера — проверяй проактивно. **Процедура:** после каждого Edit/Write в файл скила — прежде чем отвечать пользователю — (1) перечитай `Read` записанный файл, (2) пройди по каждому принципу 1-12, (3) если нарушение найдено — исправь сразу, не дожидаясь фидбека. **(4) Проверка доставки:** если правка добавляет знание в shared или knowledge — открой SKILL.md целевого скила и убедись, что файл загружается по триггеру текущей задачи. Если триггер загрузки отсутствует или слишком слабый (последняя строка таблицы, без ⛔, без «обязательно») — **усиль триггер в том же CHG**, иначе правка не дойдёт до агента-исполнителя. Когда стейкхолдер указывает на ошибку — это сигнал, что проактивная проверка не сработала: исправь не только текущую работу и целевой скил, но и усиль собственные инструкции коуча, чтобы ошибка не повторялась.
|
|
151
|
+
10. **Self-Correct** — после каждой правки в скил **обязательно** перечитай принципы коуча (1-12) и проверь, не нарушает ли внесённая правка какой-либо из них. Не жди указания стейкхолдера — проверяй проактивно. **Процедура:** после каждого Edit/Write в файл скила — прежде чем отвечать пользователю — (1) перечитай `Read` записанный файл, (2) пройди по каждому принципу 1-12, (3) если нарушение найдено — исправь сразу, не дожидаясь фидбека. **(4) Проверка доставки:** если правка добавляет знание в shared или knowledge — открой SKILL.md целевого скила и убедись, что файл загружается по триггеру текущей задачи. Если триггер загрузки отсутствует или слишком слабый (последняя строка таблицы, без ⛔, без «обязательно») — **усиль триггер в том же CHG**, иначе правка не дойдёт до агента-исполнителя. **(5) Тест:** после проверки принципов 1-12 **обязательно** выполни секцию «Обязательный шаг: Тест» (→ `workflows/test.md`). Self-check без теста — незавершённый self-check: принципы проверяют корректность текста, тест проверяет корректность поведения агента при чтении этого текста. Когда стейкхолдер указывает на ошибку — это сигнал, что проактивная проверка не сработала: исправь не только текущую работу и целевой скил, но и усиль собственные инструкции коуча, чтобы ошибка не повторялась.
|
|
152
152
|
11. **Context Budget** — при анализе и аудите скила обязательно оценивай его **суммарный размер** (SKILL.md + все файлы из knowledge/ + algorithms/ + workflows/). Агент загружает эти файлы в контекст перед работой. **Порог:** если суммарный размер > 800 строк — это finding уровня HIGH. Каждая правка, добавляющая текст, должна оцениваться: «Не приведёт ли это к context overflow у агента-исполнителя?» **При аудите:** измерь `wc -l` всех файлов скила, укажи суммарный размер и сравни с порогом. Если превышен — рекомендуй консолидацию: объединение дублирующих секций, вынос редко используемых блоков в отдельные файлы с ленивой загрузкой (загружать только по триггеру, а не всегда), сжатие примеров.
|
|
153
153
|
12. **Consistency** — скил не должен содержать взаимоисключающих или противоречащих друг другу инструкций. При каждой правке и аудите проверяй: не конфликтует ли новая инструкция с существующими. **Процедура:** после внесения правки grep'ни файл на ключевые термины правки и прочитай все совпадения — убедись, что нигде не сказано противоположное. **Типичные противоречия:** «всегда делай X» в одном месте и «никогда не делай X» в другом; разные значения по умолчанию для одного параметра; разные приоритеты действий в SKILL.md и в workflow. При обнаружении противоречия — устрани его сразу, выбрав одну версию и обновив все места.
|
|
154
154
|
|
|
@@ -119,6 +119,8 @@ ticket_prefix: QA
|
|
|
119
119
|
|
|
120
120
|
Перед сохранением убедись, что директория `reports/` существует. Если нет — создай её.
|
|
121
121
|
|
|
122
|
+
**⚠️ Переиспользование существующего теста (discovery вариант C):** если тест уже существует и сохраняет артефакты с hardcoded prefix другого тикета — **обнови prefix на ID текущего тикета в тест-файле перед запуском**. Ручное копирование/переименование файлов после запуска — антипаттерн: создаёт гонку mtime между артефактами и `updated_at` тикета, ломает artifact-snapshot diff верификатора.
|
|
123
|
+
|
|
122
124
|
### Cleanup evidence
|
|
123
125
|
|
|
124
126
|
После завершения тестирования в `reports/` должны остаться **только файлы, на которые ссылается тикет**. Удали промежуточные и отладочные файлы (пробные скриншоты, дубликаты, скриншоты с неверным содержимым). Имя файла evidence должно соответствовать TC, для которого он используется — если evidence для TC-001 фактически сохранён как `TC-002-*.png`, переименуй или пересохрани с корректным именем.
|
|
@@ -36,6 +36,7 @@ description: >
|
|
|
36
36
|
|--------|----------------|
|
|
37
37
|
| `knowledge/dod-patterns.md` | При определении типа проверки для конкретного пункта DoD |
|
|
38
38
|
| `knowledge/test-hygiene.md` | Когда DoD требует создать/изменить автотест — красные и зелёные флаги изоляции, что считать нарушением и как оформить issue |
|
|
39
|
+
| `knowledge/baseline-snapshot-validation.md` | **⛔ Обязательно**, когда DoD/план тикета содержит формулировки уровня эталона: baseline, snapshot, inline-snapshot, побайтное/точное совпадение, регрессионный эталон, «output не должен меняться». Проверяет способ реализации теста (точное сравнение с литералом-эталоном vs регекс/includes), а не только зелёный прогон |
|
|
39
40
|
| `../shared/*` | **ВСЕГДА** перед началом работы — общие знания проекта |
|
|
40
41
|
|
|
41
42
|
## Загрузка шаблонов
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
function parseTimeout(testCase, index) {
|
|
2
|
-
return testCase.execution?.timeout_s || index.execution?.default_timeout_s || 300;
|
|
3
|
-
}
|
|
4
|
-
|
|
5
|
-
function testTimeoutCascade() {
|
|
6
|
-
const index = { execution: { default_timeout_s: 300 } };
|
|
7
|
-
|
|
8
|
-
const testCases = [
|
|
9
|
-
{ name: 'TC-001', execution: { timeout_s: 600 } },
|
|
10
|
-
{ name: 'TC-002', execution: {} },
|
|
11
|
-
{ name: 'TC-003' }
|
|
12
|
-
];
|
|
13
|
-
|
|
14
|
-
const results = testCases.map(tc => ({
|
|
15
|
-
case: tc.name,
|
|
16
|
-
timeout: parseTimeout(tc, index)
|
|
17
|
-
}));
|
|
18
|
-
|
|
19
|
-
console.log('Timeout cascade results:', results);
|
|
20
|
-
|
|
21
|
-
const expected = [600, 300, 300];
|
|
22
|
-
const passed = results.every((r, i) => r.timeout === expected[i]);
|
|
23
|
-
|
|
24
|
-
console.log(`Test ${passed ? 'PASSED' : 'FAILED'}`);
|
|
25
|
-
process.exit(passed ? 0 : 1);
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
testTimeoutCascade();
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
# Analyze Report — Agent Skill
|
|
2
|
-
|
|
3
|
-
Аналитик отчётов для workflow-ai. Анализирует отчёты о выполненных задачах, оценивает прогресс по планам, проводит ретроспективы и формирует actionable рекомендации.
|
|
4
|
-
|
|
5
|
-
## Структура
|
|
6
|
-
|
|
7
|
-
```
|
|
8
|
-
analyze-report/
|
|
9
|
-
├── SKILL.md # Ядро: роль, маршрутизация, принципы
|
|
10
|
-
├── README.md # Документация
|
|
11
|
-
├── workflows/
|
|
12
|
-
│ ├── progress.md # Оценка прогресса по плану
|
|
13
|
-
│ └── retrospective.md # Ретроспектива завершённого плана
|
|
14
|
-
├── knowledge/
|
|
15
|
-
│ ├── analysis-frameworks.md # Методологии анализа, метрики, паттерны
|
|
16
|
-
│ └── report-structure.md # Структура отчётов, правила извлечения данных
|
|
17
|
-
├── algorithms/
|
|
18
|
-
│ └── progress-assessment.md # Алгоритм оценки прогресса (формулы, пороги)
|
|
19
|
-
└── templates/
|
|
20
|
-
└── analysis-report.md # Шаблон результата анализа
|
|
21
|
-
```
|
|
22
|
-
|
|
23
|
-
## Как это работает
|
|
24
|
-
|
|
25
|
-
1. Любой скил проекта создаёт тикет `ANL-*` с запросом на анализ
|
|
26
|
-
2. Analyze Report определяет тип (PROGRESS / RETROSPECTIVE)
|
|
27
|
-
3. Загружает соответствующий workflow
|
|
28
|
-
4. Собирает данные из отчётов, тикетов, планов
|
|
29
|
-
5. Рассчитывает метрики, выявляет проблемы, формулирует рекомендации
|
|
30
|
-
6. Формирует структурированный результат анализа
|
|
31
|
-
|
|
32
|
-
## Как расширять
|
|
33
|
-
|
|
34
|
-
### Новый тип анализа
|
|
35
|
-
1. Создай файл в `workflows/{type}.md`
|
|
36
|
-
2. Добавь запись в таблицу маршрутизации в `SKILL.md`
|
|
37
|
-
|
|
38
|
-
### Новый knowledge-модуль
|
|
39
|
-
1. Создай файл в `knowledge/{module}.md`
|
|
40
|
-
2. Добавь запись в таблицу загрузки знаний в `SKILL.md`
|
|
41
|
-
|
|
42
|
-
### Новый шаблон вывода
|
|
43
|
-
1. Создай файл в `templates/{template}.md`
|
|
44
|
-
2. Добавь запись в таблицу шаблонов в `SKILL.md`
|