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