--- name: bf-metrics description: sprint-status.yaml의 메트릭 데이터를 분석하여 모델 배당 최적화 및 난이도 재태깅을 제안한다. 읽기 전용 스킬로, 파일 변경 없이 대화로만 결과를 출력한다. --- # Metrics Analysis ## Overview 스프린트 메트릭을 집계·분석하여 모델 배당 최적화와 난이도 재태깅을 **제안**한다. 자동 적용하지 않으며, 사람이 판단한다. ## When to Use - 사용자가 `/bf-metrics`를 입력했을 때 - `/bf-archive-sprint` 완료 후 안내에 따라 실행할 때 - 여러 스프린트를 거친 후 패턴 분석이 필요할 때 ## Prerequisites - `docs/sprint-status.yaml` 또는 `docs/archive/*/sprint-status.yaml` 중 하나 이상 존재 - 분석 대상 Story에 메트릭 필드가 기록되어 있어야 함 (레거시 Story는 건너뜀) - **권장 실행 순서**: `/bf-archive-sprint` → `/bf-metrics` → `/bf-update-conventions`. 아카이빙 전에 실행해도 동작하지만, 아카이빙 후 실행하면 현재 + 아카이브 전체 데이터를 분석하여 더 정확한 결과를 제공 ## Error Handling - sprint-status.yaml도 archive도 없으면: "분석 가능한 스프린트 데이터가 없습니다. `/bf-execute`로 워크플로우를 먼저 실행하세요." 안내 - 모든 Story가 레거시이면: "메트릭 필드가 기록된 Story가 없습니다. 현행 워크플로우(v2+)로 실행한 스프린트만 분석할 수 있습니다." 안내 - 완료된 Story가 없으면: "완료(done) 상태의 Story가 없습니다. 진행 중인 스프린트의 분석은 완료 후 수행하세요." 안내 ## Instructions ### 1. 데이터 수집 a. 현재 스프린트 데이터를 수집한다: - `docs/sprint-status.yaml` 읽기 b. 아카이브된 스프린트 데이터를 수집한다: - `docs/archive/*/sprint-status.yaml` 패턴으로 모든 아카이브 파일 읽기 c. 분석 대상 필터링: - `status: done`인 Story만 분석 대상에 포함 - 레거시 Story 판정 기준: `model_used` **AND** `ralph_retries` YAML key가 **모두** 존재하지 않는 Story는 레거시로 간주하여 건너뜀. 두 키 중 하나라도 존재하면 현행 포맷으로 처리한다. (`model_used: null`은 미완료 Story이므로 `status: done` 조건에서 이미 필터됨) - 건너뛴 Story 수를 기록하여 리포트에 표시 ### 2. 집계 테이블 생성 **(difficulty, model_used) 페어별로 다음 지표를 집계한다:** | 지표 | 계산 방법 | |------|----------| | story_count | 해당 페어의 Story 수 | | avg_ralph_retries | 평균 재시도 횟수 | | avg_ralph_approaches | 평균 접근 전환 횟수 | | stuck_rate | `ralph_stuck: true` 비율 (%) | | avg_review_blockers | 평균 🔴 Blocker 건수 | | avg_review_recommended | 평균 🟡 Recommended 건수 | | regression_rate | `is_regression: true` 비율 (%) | ### 3. 모델 배당 최적화 제안 아래 임계값에 해당하는 (difficulty, model_used) 페어에 대해 제안을 생성한다: | 조건 | 임계값 | 제안 | |------|--------|------| | 높은 블로커 | avg_review_blockers >= 2.0 | 더 강한 모델 배당 제안 (예: sonnet → opus-lead) | | 높은 재시도 | avg_ralph_retries >= 3.0 | 구현 모델 업그레이드 제안 | | 높은 stuck | stuck_rate >= 20% | Agent Teams 전략 전환 제안 (예: ralph-loop → opus-lead) | | 높은 회귀 | regression_rate >= 25% | 리뷰 모델 강화 제안 | - 임계값에 해당하지 않으면 "현재 모델 배당 적정" 메시지를 표시한다. - 제안에는 해당 조건을 충족한 구체적 수치를 함께 표시한다. ### 4. 난이도 재태깅 제안 완료된 개별 Story의 메트릭을 기준으로 난이도 조정을 제안한다: **과소평가 (상향 제안):** | 현재 → 제안 | 조건 | |------------|------| | S → M | ralph_retries >= 3 OR review_blockers >= 2 OR ralph_stuck == true | | M → L | ralph_retries >= 4 OR review_blockers >= 3 OR ralph_approaches >= 2 | | L → XL | ralph_stuck == true AND ralph_approaches >= 3 | **과대평가 (하향 제안):** | 현재 → 제안 | 조건 | |------------|------| | M → S | ralph_retries == 0 AND review_blockers == 0 AND review_recommended <= 1 | | L → M | ralph_retries <= 1 AND review_blockers == 0 | | XL → L | ralph_retries <= 1 AND review_blockers == 0 AND ralph_approaches == 0 | - 해당 Story ID와 함께 구체적 메트릭 수치를 표시한다. - 제안이 없으면 "난이도 태깅 적정" 메시지를 표시한다. ### 5. E2E 실패 패턴 분석 `failure_tag`별로 건수와 비율을 집계한다: | failure_tag | 건수 | 비율 | |------------|------|------| | spec-gap | N | N% | | impl-bug | N | N% | | test-design | N | N% | | convention-violation | N | N% | | integration | N | N% | - regression Story가 없으면 "E2E 회귀 없음" 메시지를 표시한다. - 특정 태그가 50% 이상이면 해당 영역 집중 개선 제안을 추가한다. ### 6. 종합 요약 위 분석 결과를 종합하여 우선순위별 액션 아이템을 정리한다: - 🔴 즉시 조치: 높은 stuck_rate, 높은 블로커 등 심각한 패턴 - 🟡 검토 권장: 과소/과대평가된 난이도, 모델 최적화 기회 - 🟢 양호: 임계값 내 정상 범위 ## Output Format 대화로만 출력한다 (파일 저장 없음, read-only 스킬). ``` ## 📊 BF Workflow Metrics Report ### 분석 범위 - 스프린트: {수집된 스프린트 목록} - 분석 대상: {N}개 Story (레거시 {M}개 제외) ### 1. (Difficulty, Model) 페어별 집계 {집계 테이블} ### 2. 모델 배당 최적화 제안 {제안 목록 또는 "현재 모델 배당 적정"} ### 3. 난이도 재태깅 제안 {과소/과대평가 제안 목록 또는 "난이도 태깅 적정"} ### 4. E2E 실패 패턴 {failure_tag 집계 테이블 또는 "E2E 회귀 없음"} ### 5. 종합 액션 아이템 🔴 즉시 조치: ... 🟡 검토 권장: ... 🟢 양호: ... ```