# task-2031: finish-task.sh git 커밋 검증 게이트 추가

## 배경
에이전트 미팅 2사이클 합의. task-2030에서 봇이 코드 커밋 없이 .done 생성한 문제 방지.

## ★ 반드시 먼저 읽을 파일 ★
- `scripts/finish-task.sh` — 현재 코드 (task-2028에서 일원화 완료)
- `teams/shared/qc_verify.py`

## 구현 3건

### 1. finish-task.sh에 git 검증 게이트
.done 생성 직전에 3단계 검증 추가:
```bash
PROJ_DIR=$(git -C "$WORK_DIR" rev-parse --show-toplevel 2>/dev/null || echo "$WORK_DIR")

# 1) task ID 커밋 최소 1건
COMMIT_COUNT=$(git -C "$PROJ_DIR" log --oneline --all --grep="$TASK_ID" | wc -l)
if [ "$COMMIT_COUNT" -eq 0 ]; then
  echo "[GIT-GATE] BLOCKED: $TASK_ID 커밋 0건. git commit 후 재실행." >&2
  exit 1
fi

# 2) uncommitted 변경 없음
if ! git -C "$PROJ_DIR" diff --quiet 2>/dev/null || ! git -C "$PROJ_DIR" diff --cached --quiet 2>/dev/null; then
  echo "[GIT-GATE] BLOCKED: uncommitted 변경 존재." >&2
  exit 1
fi

# 3) 빈 커밋 방어
LAST_HASH=$(git -C "$PROJ_DIR" log --all --grep="$TASK_ID" --format="%H" -1)
DIFF_FILES=$(git -C "$PROJ_DIR" diff --name-only "${LAST_HASH}^..${LAST_HASH}" 2>/dev/null | wc -l)
if [ "$DIFF_FILES" -eq 0 ]; then
  echo "[GIT-GATE] BLOCKED: 빈 커밋(변경 파일 0건)." >&2
  exit 1
fi
```

### 2. non-code task SKIP 처리
- task 파일에 `## 레벨` 아래 코드 수정 여부를 판별
- "코드 수정 없음" 또는 "문서만" 포함 시 git 게이트 SKIP
- grep으로 판별: `grep -q "코드 수정 없음\|문서 업데이트만\|문서만\|리서치만" task_file`

### 3. qc_verify.py에 verify_git_evidence verifier 추가
- ALL_CHECKS에 `git_evidence` 등록
- COMMIT_EXISTS + NO_UNCOMMITTED + NON_EMPTY_COMMIT 3항목
- non-code task → SKIP

## 완료 시그니처
- [grep] `GIT-GATE\|git.*evidence\|COMMIT_COUNT` @ `scripts/finish-task.sh`
- [grep] `git_evidence\|verify_git_evidence` @ `teams/shared/`
- [pytest] `tests/test_dispatch.py`

## 검증 시나리오
1. 커밋 있는 task → 게이트 통과 → .done 생성
2. 커밋 없는 task → BLOCKED 출력 → .done 미생성
3. 빈 커밋 task → BLOCKED 출력
4. non-code task (문서만) → SKIP → .done 정상 생성
5. 기존 pytest PASS

## 레벨
- critical

## 프로젝트
- dev-system
