# QC Cycle 상한 + 로키 소환 코드 레벨 강제

## 배경
task-1331.1에서 두 가지 규칙 위반 발생:
1. Cycle 3 초과 시 에스컬레이션 안 하고 Cycle 4 자체 진행
2. 로키(opus) 대신 팀장(sonnet)이 자체 평가하고 "~93점" 추정값으로 통과

프롬프트 지시는 무시 가능. finish-task.sh에서 코드 레벨로 차단해야 함.

## 변경 사항

### 1. finish-task.sh에 QC 검증 Step 추가

기존 Step 0 (노하우 체크) 다음에 **Step 0b: QC 프로세스 검증** 추가:

```bash
# Step 0b: QC 프로세스 검증 (디자인/이미지 작업만)
# 조건: task 파일에 디자인/이미지 키워드 존재 시
```

#### 검증 1: Cycle 상한 체크
- 보고서 파일(`memory/reports/{task_id}.md`)을 읽어서 "Cycle 4" 이상 문자열 존재 여부 확인
- "Cycle 4", "Cycle 5", "cycle 4", "cycle 5", "4차", "5차" 등 패턴 검색
- 발견 시:
  ```
  [ERROR] ❌ QC Cycle 상한(3회) 초과 감지. Cycle 3 미달 시 에스컬레이션(제이회장님 보고) 필수.
  [ERROR] Cycle 4 이상 자체 진행은 규칙 위반.
  ```
  → exit 1 (우회: `SKIP_CYCLE_CHECK=1`)

#### 검증 2: 로키 소환 검증
- 보고서의 "모델 사용 기록" 섹션에서 "로키" 또는 "Loki"가 **opus** 모델로 기록되어있는지 확인
- Python으로 보고서 파싱:
  ```python
  import re
  with open(report_path) as f:
      content = f.read()
  
  # "모델 사용 기록" 섹션 찾기
  model_section = re.search(r'## 모델 사용 기록.*?(?=\n## |\Z)', content, re.DOTALL)
  
  if model_section:
      section_text = model_section.group()
      # 로키가 opus로 참여했는지 확인
      has_loki_opus = bool(re.search(r'로키|Loki', section_text)) and bool(re.search(r'opus', section_text))
      if not has_loki_opus:
          print('FAIL')  # 로키 opus 미참여
      else:
          print('PASS')
  else:
      print('FAIL')  # 모델 사용 기록 섹션 자체가 없음
  ```
- FAIL 시:
  ```
  [ERROR] ❌ 디자인 QC에 로키(opus) 참여 기록 없음.
  [ERROR] 디자인 QC는 로키(opus) 단독 필수. 팀장 자체 평가는 규칙 위반.
  ```
  → exit 1 (우회: `SKIP_LOKI_CHECK=1`)

#### 검증 3: "팀장 시각 검수" 패턴 차단
- 보고서에 "팀장 시각 검수", "팀장 검수", "팀장 판단", "자체 평가" 패턴 존재 시 경고
- FAIL은 아니지만 WARNING 출력:
  ```
  [WARN] ⚠️ "팀장 시각 검수" 패턴 감지. 디자인 QC는 로키(opus)만 수행 가능.
  ```

### 2. 우회 메커니즘
- `SKIP_CYCLE_CHECK=1` — Cycle 상한 체크 우회
- `SKIP_LOKI_CHECK=1` — 로키 소환 체크 우회
- 우회 시 WARNING 출력

### 3. 테스트
1. Cycle 4가 포함된 보고서로 finish-task.sh 실행 → 차단 확인
2. 로키 없는 모델 사용 기록으로 → 차단 확인
3. 정상 보고서(Cycle 3 이내 + 로키 opus 기록) → PASS 확인
4. 개발 작업(디자인 키워드 없음) → 영향 없음 확인
5. SKIP_CYCLE_CHECK=1, SKIP_LOKI_CHECK=1 → 우회 통과 확인

## 변경 대상 파일
- 수정: `/home/jay/workspace/scripts/finish-task.sh`

## 절대 변경 금지
- Step 0 (노하우 체크) 로직 — 그대로 유지
- .done 생성, task-timer end, notify-completion 로직
- image_workflow.py, dispatch.py, team_prompts.py