# task-1923: QC Verifier 무결성 가드레일 구현 (에이전트 미팅 합의 2~5번)

## 배경
2026-04-17 에이전트 미팅(5사이클 만장일치)에서 합의된 재발 방지 대책 구현.
미팅 기록: `memory/meetings/2026-04-17-verifiers-sync-prevention.md`

## 구현 항목

### 항목 2: qc_verify.py self-integrity check
- 파일: `teams/shared/qc_verify.py`
- qc_verify.py 실행 시작 시 `_check_verifiers_integrity()` 함수 추가
- 체크 내용:
  1. `os.path.islink(verifiers_dir)` — symlink인지 확인
  2. `os.path.realpath(verifiers_dir)` — shared/verifiers를 가리키는지 확인
  3. `verifiers/__pycache__/` 존재하면 삭제 (캐시 오염 방지)
- INTEGRITY_FAIL 시 모든 verifier 실행 거부, 결과에 "INTEGRITY_FAIL: verifiers 디렉토리가 shared로의 심볼릭 링크가 아닙니다" 출력
- dev8(GLM)은 예외 처리 (dev8은 독립 구조 허용)

### 항목 3: dispatch.py QC 환경 사전 체크
- 파일: `dispatch.py`
- 위임 직전에 해당 팀의 `teams/{team}/qc/verifiers` 상태 확인
- `os.path.islink()` 체크. 비정상이면:
  - 위임은 진행하되 WARNING 로그 출력 + 텔레그램 경고
  - (블로킹이 아닌 경고 — 마아트 합의)
- dev8은 예외

### 항목 4: tests/test_team_structure.py
- 파일: `tests/test_team_structure.py` (신규)
- 테스트 케이스:
  1. dev1~dev7 각 팀의 `teams/devN/qc/verifiers`가 symlink인지
  2. symlink 대상이 `teams/shared/verifiers`인지
  3. `teams/devN/qc/qc_verify.py`가 symlink인지
  4. dev8은 제외 (독립 구조 허용)
- 전체 테스트 스위트에 포함되어 `pytest tests/` 시 자동 실행

### 항목 5: add_team.py 수정 (또는 팀 생성 스크립트)
- 파일: `scripts/add_team.py` (확인 후 수정)
- 팀 생성 시 verifiers 디렉토리를 cp가 아닌 `os.symlink()` 또는 `ln -s`로 생성
- 코드에 주석: "# ★ cp 금지, symlink만 — 2026-04-17 미팅 합의"

## 검증 시나리오
1. dev1~dev7에서 qc_verify.py 실행 → integrity check PASS
2. 의도적으로 symlink를 깨트린 후 qc_verify.py 실행 → INTEGRITY_FAIL 출력
3. dispatch.py로 symlink 깨진 팀에 위임 → WARNING 로그 확인
4. `pytest tests/test_team_structure.py` → 전팀 PASS
5. `pytest tests/ -q` → 0 failed (전체 스위트 회귀 없음)

## 레벨
- normal
