# task-793.1 완료 보고서

## SCQA

**S**: 시스템 개선 Phase 1(task-792.1, P1~P4)이 완료되어 dispatch.py 중복 방지, 보고서 검증 강화, spec_compliance verifier, 벤치마크 확장이 운영 중이다.

**C**: P5(위임 정확도), P8(black .sh exclude), P9(QC 재실행 이력)가 미구현 상태로 남아 있어, 부적합 팀 배정 시 사전 경고 불가, black이 .sh 파일에 파싱 에러 발생, QC 재실행 횟수 추적이 불투명한 상태이다.

**Q**: 3개 항목을 구현하여 위임 품질, 빌드 안정성, QC 투명성을 개선할 수 있는가?

**A**: P5(dispatch.py 실패율 경고 + team_specialties 매칭), P8(pyproject.toml extend-exclude), P9(qc_verify.py 실행 이력 로깅 + .done qc_attempts) 구현 완료. pytest 125건 전체 PASS, pyright 0 에러.

---

## 작업 결과

### P5: 위임 정확도 개선 (dispatch.py + team_prompts.py)

**5-1: 팀별 qc_result 집계**
- `get_team_failure_stats(team_id, task_type, recent_n)` 함수 추가
- task-timers.json에서 team_id + task_type 기준으로 completed 태스크의 qc_result 집계
- 성공률, 연속 FAIL 수 등 통계 반환

**5-2: 3건 연속 FAIL 경고**
- dispatch() 내 cokacdir 호출 직전에 `get_team_failure_stats()` 체크
- consecutive_fails >= 3이면 logger.warning으로 경고 + `_suggest_alternative_teams()`로 대안 팀 제안
- 경고만 출력하고 작업은 정상 진행 (block하지 않음)

**5-3: team_specialties 필드 + 매칭**
- TEAM_INFO 7개 팀 모두에 `team_specialties` 리스트 추가
- task_type이 팀 specialties에 없으면 logger.info로 알림

**5-4: task_type 메타데이터 저장**
- `_patch_timer_metadata()`에 `task_type=task_type` 추가 → 이후 집계에 활용

### P8: black .sh 제외 (pyproject.toml)

- `[tool.black]` 섹션에 `extend-exclude = '\.sh$'` 추가
- `black .` 실행 시 .sh 파일 0건 처리 확인
- style_check verifier도 `.py` 파일만 필터하므로 이중 안전

### P9: QC 재실행 이력 투명화 (qc_verify.py)

**9-1: 실행 이력 로그**
- `_log_execution()` 함수 추가: 매 QC 실행 결과를 `memory/logs/qc-execution-log.jsonl`에 append
- JSONL 형식 (task_id, timestamp, overall, summary, team, gate)
- try/except으로 로그 실패가 QC 동작을 중단하지 않음

**9-2: 이력 조회**
- `_get_execution_history()` 함수: task_id 기준으로 실행 이력 필터링 조회

**9-3: .done에 qc_attempts 포함**
- `_handle_gate()` 수정: .done 파일에 `qc_attempts` 필드 추가
- 포함 정보: `total`(시도 횟수), `first_pass`(첫 시도 통과 여부), `history`(각 시도별 결과)
- 재시도 2회 이상이면 stderr에 경고 메시지 출력

**9-4: 결과 JSON에 attempt 번호**
- `build_result()` 수정: `qc_attempt_number` 필드 추가 (현재 몇 번째 시도인지)

---

## 변경 파일 목록

- `/home/jay/workspace/dispatch.py` — get_team_failure_stats(), _suggest_alternative_teams(), dispatch() 내 경고/매칭 로직
- `/home/jay/workspace/prompts/team_prompts.py` — TEAM_INFO에 team_specialties 필드 7개 팀
- `/home/jay/workspace/teams/dev1/qc/qc_verify.py` — _log_execution(), _get_execution_history(), _handle_gate() 수정, build_result() 수정, main() 수정
- `/home/jay/workspace/pyproject.toml` — [tool.black] extend-exclude 추가
- `/home/jay/workspace/tests/test_dispatch.py` — TestTeamFailureStats(4), TestSuggestAlternativeTeams(2), TestTeamSpecialties(1)
- `/home/jay/workspace/tests/test_qc_verify.py` — TestQcExecutionLog(5)

---

## 테스트 결과

```
pytest tests/test_dispatch.py tests/test_qc_verify.py: 125 passed in 1.61s
pyright dispatch.py team_prompts.py qc_verify.py: 0 errors, 0 warnings
black .sh exclude: .sh 파일 0건 처리 확인
```

---

## 발견 이슈 및 해결

### 자체 해결 (3건)

1. **pyright가 pyproject.toml을 Python으로 파싱 시도** — check-files에 .toml 파일을 넣지 않고 .py 파일만 지정하여 해결
2. **extend-exclude가 직접 지정 파일에 미적용** — black의 extend-exclude는 디렉토리 탐색에만 적용됨. style_check verifier가 이미 `.py` 파일만 필터하므로 실질적 문제 없음
3. **task-timers.json 대용량(343KB) 읽기** — get_team_failure_stats()에서 전체 파일 읽기 후 팀 필터링. 현재 규모에서 성능 문제 없음 (JSON 파싱 ~50ms 이내)

### 범위 외 미해결 (0건)
없음

---

## QC 자동 검증 결과

- **시도 1**: FAIL (tdd_check — check-files에 테스트 파일 미포함으로 인한 false negative)
- **시도 2**: PASS (9 PASS, 3 SKIP)
- `qc_attempt_number`: 2 (P9 기능으로 자동 기록됨)

```
overall: PASS
file_check: PASS (7/7 files)
data_integrity: PASS
test_runner: PASS (221 passed in 1.84s)
tdd_check: PASS (테스트 2개 + 구현 4개 확인)
pyright_check: PASS (0 errors)
style_check: PASS (black OK, isort OK)
critical_gap: PASS
spec_compliance: PASS (6/6 항목 커버)
duplicate_check: PASS (최대 유사도 9.2%)
```

.done 파일에 qc_attempts 포함 확인:
```json
{
  "qc_attempts": {
    "total": 2,
    "first_pass": false,
    "history": [
      {"attempt": 1, "overall": "FAIL", "summary": "8 PASS, 1 FAIL, 3 SKIP"},
      {"attempt": 2, "overall": "PASS", "summary": "9 PASS, 3 SKIP"}
    ]
  }
}
```
