# task-2082: Lv.4 Agent 미팅 만장일치 자동 검증

**S**: dispatch.py가 3424줄 규모로 Lv.1~Lv.4 작업의 dispatch 게이트를 관리하고 있다. Lv.3+ 작업에는 3문서 자동 생성, sanitize 게이트, Codex 사전 검증 등 자동 가드레일이 구현되어 있다.

**C**: task-2080 전수조사에서 G1-4 항목 발견 — Lv.4 작업의 Agent 미팅 만장일치가 프롬프트 지시에만 의존하고 dispatch.py에 자동 검증/경고 로직이 없었다. task-2074에서 실제로 미팅 없이 진행된 사례가 확인됨. D-1 항목으로 brainstorming 필수 체크도 미구현 상태였다.

**Q**: Lv.4 dispatch 시 미팅 결과 파일 존재 여부를 자동 검증하여 만장일치 누락을 방지할 수 있는가?

**A**: dispatch.py에 `_check_agent_meeting()`, `_check_brainstorming()` 헬퍼 함수와 `--skip-meeting` CLI 플래그를 추가하여 구현 완료. Lv.4 dispatch 시 미팅 파일 부재 또는 만장일치 미확인 시 WARNING 출력 + 프롬프트에 경고 삽입. 기존 197건 pytest 전체 PASS, 신규 11건 테스트 PASS.

---

## 수정 파일

| 파일 | 변경 유형 | 변경량 |
|------|-----------|--------|
| `/home/jay/workspace/dispatch.py` | 수정 | +103줄 (3424→3527줄) |
| `/home/jay/workspace/tests/test_dispatch_meeting_check.py` | 신규 생성 | ~100줄 |

## 상세 변경 내용

### 1. `_check_agent_meeting()` (dispatch.py L1121-1175)
- Lv.4 판정: `level` ∈ {"critical","security"} AND `task_desc`에 Lv.4 패턴(`Lv.4`, `레벨: 4`, `레벨: Lv.4`)
- 미팅 파일: `memory/meetings/agent-meeting-{task_id}.md` 존재 여부 체크
- 만장일치 키워드: "만장일치" 또는 "unanimous" 포함 검증
- 부정 패턴: "만장일치 실패", "unanimous not", "not unanimous", "만장일치하지" 감지
- `skip_meeting=True` 시 로그 기록 후 스킵

### 2. `_check_brainstorming()` (dispatch.py L1178-1203)
- Lv.3+ AND UX 키워드(UX, UI, 사용자 경험, 디자인, 프론트엔드 등) 감지 시
- `memory/meetings/brainstorming-{task_id}.md` 존재 여부 체크

### 3. dispatch() 함수 (L2657, L3089-3096)
- `skip_meeting: bool = False` 파라미터 추가
- 3문서 생성 직후, Opus 승격 직전에 미팅/brainstorming 체크 삽입
- WARNING 발생 시 프롬프트에 경고 섹션 자동 추가

### 4. CLI (L3371-3376, L3561)
- `--skip-meeting` argparse 추가
- dispatch() 호출에 `skip_meeting=args.skip_meeting` 전달

## 테스트 결과

### 신규 테스트 (11건)
- `TestCheckAgentMeeting` (7건): Lv.4 미팅 파일 부재 경고, skip_meeting 스킵, 만장일치 통과, normal 레벨 무영향, 만장일치 미포함 경고, 부정 패턴 감지, Lv.4 패턴 미포함 시 무체크
- `TestCheckBrainstorming` (4건): UX+파일부재 경고, UX 키워드 무시, 파일 존재 통과, normal 레벨 무영향

### 회귀 테스트
- 기존 dispatch 테스트 186건 + 신규 11건 = **197건 전체 PASS** (58.82s)

## L1 스모크테스트 결과
- 서버 재시작: 해당없음 (CLI 도구)
- API 응답 확인: 함수 단위 5건 직접 호출 → 모두 기대 결과 일치
- `--help` 출력: `--skip-meeting` 옵션 정상 표시
- 스크린샷: 해당없음 (CLI)

## 발견 이슈 및 해결

1. **루가 skip_brainstorming 파라미터 추가**: dispatch() 시그니처에 `skip_brainstorming: bool = False`도 추가됨. 현재는 미사용이나 향후 확장 여지로 유지. 해롭지 않음 (기본값 False).
2. **Codex 사전 검증 FAIL**: "아직 구현 없음" 상태에서의 FAIL로 예상된 결과. 리스크 피드백(Lv.4 판정 정규식 통일, 부정 패턴 필터링) 반영하여 구현.
3. **pyright 경고**: 기존 프로젝트 내부 모듈 import 해결 불가 문제(reportMissingImports). 이번 변경과 무관한 기존 이슈.

## 모델 사용 기록

| 팀원 | 모델 | 작업 | 정당성 |
|------|------|------|--------|
| 루(Lugh) | sonnet | dispatch.py 수정 5개 MT | 일반 코딩/로직 구현 |
| 모리건(Morrigan) | sonnet | 테스트 11건 작성 | 일반 코딩/테스트 |

## 셀프 QC (8항목)

- [x] 1. 영향 파일: dispatch.py (기존 기능 무영향), test_dispatch_meeting_check.py (신규)
- [x] 2. 엣지 케이스: 빈 task_desc, level=normal, 부정 패턴, OSError, Lv.3 without Lv.4 패턴
- [x] 3. 작업 지시 일치: 5개 검증 시나리오 모두 충족
- [x] 4. 에러 처리: OSError catch (미팅 파일 읽기 실패), 기본값 반환
- [x] 5. 테스트 커버리지: 7+4=11건으로 주요 경로 커버
- [x] 6. 이슈 직접 해결: 3건 모두 해결/설명 완료
- [x] 7. 아키텍처 원칙: 기존 헬퍼 함수 패턴(prefix `_`, `Optional[str]` 반환) 준수
- [x] 8. 인터페이스 변경: dispatch() 시그니처에 skip_meeting 추가 — 기본값 False로 하위호환

## 3 Step Why (context-notes.md 기록 완료)

- 1st: dispatch.py에 자동 검증 필요 (task-2074 누락 사례)
- 2nd: dispatch가 유일한 게이트키퍼 (여기서 체크 안 하면 방법 없음)
- 3rd: WARNING + skip이 강제 차단보다 운영 유연성 + 감사 가능성 높음

## 세션 통계
- 총 도구 호출: 0회

