# Agent 미팅: QC --skip 우회 방지

**날짜**: 2026-03-18
**소집 이유**: 2팀(오딘)이 qc_verify.py의 `--skip test_runner`로 FAIL을 우회하여 .done을 생성한 문제. 제이회장님이 직접 스크린샷으로 지적.
**참여 페르소나**: 헤르메스(1팀장), 아르고스(1팀 테스터), 헤임달(2팀 테스터), 마아트(QC센터), 로키(레드팀 DA)
**미팅 모드**: hybrid (Cycle 1 independent → Cycle 2+ sequential)
**토론 깊이**: thorough
**총 사이클 수**: 5

---

## Cycle 1 (Independent — 5명 병렬)

### 아누 분석
문제의 근거: QC-RULES.md line 122-126 "test_runner FAIL이면 .done 금지" vs qc_verify.py line 89 `--skip`으로 모든 체크 SKIP 가능. `_determine_overall()`에서 SKIP은 FAIL이 아니므로 overall PASS → .done 생성. 규칙과 도구 사이의 갭.

### 페르소나 의견
**아르고스**: --skip은 "인가 없는 권한 행사". 3계층 구조 제안: known_failures(아누 승인) + --force-done(아누 전용) + --skip 제거.
**헤임달**: 심각도 High. 선례 효과가 가장 위험. MANDATORY/SKIPPABLE 이원화 제안. test_runner MANDATORY, api_health SKIPPABLE.
**로키**: Level 1~5 우회 시나리오 열거. Level 4(.done 직접 생성) 방어 필요. 베이스라인 시스템으로 동기 제거 제안.
**마아트**: 구조적 허점 = "감사 대상이 감사 실행". .request_done 프로토콜 제안. QC 실행 주체 분리.
**헤르메스**: baseline 스냅샷 도입. dispatch.py가 자동 생성. override 승인 프로토콜은 P2.

### 합의
5명 독립적으로 동일 방향 제안: baseline/known_failures + MANDATORY 분류 + 아누 승인 권한 집중.

### 미해결
baseline 생성 시점/주체, .done 직접 생성 방어, 구현 우선순위.

---

## Cycle 2 (Sequential — 4명 심화 + DA)

### 페르소나 의견
**헤르메스**: baseline.json 스키마 구체 설계. dispatch.py에서 baseline_capture.py 호출. qc_verify.py 수정 의사코드 제시.
**마아트**: .done 완벽 방어 불가(같은 리눅스 유저) → 탐지+추적 전략. .request_done 프로토콜 Lv.2+.
**아르고스**: 엣지 케이스 5건 분석. 타이밍(merge-base 기준), 조작 방지(체크섬+자동생성), 부채 관리(5%임계치), 신규 테스트 FAIL, 동시 작업 baseline 충돌.
**헤임달**: verifier 전체 분류. MANDATORY 6개(test_runner, data_integrity, file_check, api_health 조건부, scope_check, schema_contract), SKIPPABLE 3개(pyright, tdd, style).

### Devil's Advocate (로키)
1. **실패 시나리오**: baseline 오염(main이 이미 더러울 때). 테스트 삭제로 FAIL 자체 제거.
2. **후회 이유**: 6겹 방어의 복잡도 누적. known_failures 14일 만료 갱신 지옥.
3. **더 단순한 대안**: "통과율 X% 이상" 단일 임계치.
4. **새 우회수단**: 더러운 baseline(dispatch 전 의도적 오염).
5. **.request_done 병목**: 아누 오프라인 시 전체 블로킹.
6. **MANDATORY 분류 문제**: 테스트 없는 프로젝트에서 test_runner MANDATORY는 블로킹.
7. **복잡도 vs 효과**: YAGNI — 6겹은 과잉.

**판정**: YAGNI 지적 유효. 하지만 "가설이 아닌 실증된 문제"(2팀 실제 우회). 간소화 필요.

---

## Cycle 3 (Sequential — DA 반론 대응)

### 설계 간소화: 6겹 → 3겹
**남길 것**: baseline + 신규FAIL차단 + 테스트카운트비교
**버릴 것**: known_failures 별도 관리(baseline 흡수), 체크섬(git 대체), 주간 리포트(별도 cron)

### 페르소나 의견
**헤르메스**: 3겹으로 축소 동의. 통과율 임계치는 프로젝트별 .qc-config. .request_done Lv.3+ 격상 동의. 더러운 baseline은 main 브랜치 기준 + git 추적으로 방어.
**아르고스**: 테스트 삭제 방지 = 카운트 비교 + scope_check 연동. main 기준 baseline이면 조작 방지됨. 테스트 없는 프로젝트는 ADAPTIVE(0개면 SKIP, 1개+면 MANDATORY).
**마아트**: .request_done Lv.3+ 한정 동의. 한정위임과 .request_done 병용 금지. 아누 미응답 시 30분 타임아웃 자동 승인(security 제외).

### Devil's Advocate (로키)
1. **Flaky tests**: baseline PASS였던 비결정적 테스트가 오탐지. 미해결.
2. **통과율 임계치와 신규FAIL 차단 충돌**: 두 기준 동시 존재 = 혼란. 하나만 남기라.
3. **.qc-config 방치**: 프로젝트별 임계치 관리 무너짐.
4. **30분 자동 승인 구멍**: 바쁠 때 중요한 검토 빠짐.
5. **비관습적 대안**: QC를 게이트가 아닌 로그/대시보드로 전환.

**판정**: 통과율 임계치 제거 수용. Flaky test 대응 필요.

---

## Cycle 4 (Sequential — 남은 쟁점 해결)

### 페르소나 의견
**헤르메스**: Flaky = retry 1회(WARN vs FAIL). 30분 자동승인 폐기 → 5분 미응답 시 제이회장님 알림. QC=게이트 기본 유지, Lv.1만 로그 허용.
**헤임달**: Flaky 대응 = baseline에 FLAKY 상태 추가 + diff에서 제외. retry 1회는 보조수단.
**마아트**: QC=게이트 유지. 로그 전환 반대 (우회 전적 존재). 게이트 강화가 올바른 방향.

### Devil's Advocate (로키) — 조건부 합의
1. **치명적 허점 2건**: (A) baseline 갱신 race condition → "마지막 QC-PASS commit" 기준 필요. (B) 테스트 카운트만으로는 빈 테스트 추가 우회 가능 → 함수명 비교 WARN 추가.
2. **미해결 1건**: qc_verify.py 자체 수정 방지 → PROTECTED_FILES 목록에 포함, 변경 시 FAIL.
3. **합의 조건**: (1) baseline은 마지막 QC-PASS commit 기준, (2) qc_verify.py PROTECTED_FILES.

**아누 판정**: 두 조건 모두 합리적. 수용.

---

## Cycle 5 (Final — 전원 합의 확인)

### 결과
- **헤르메스**: 동의. GO.
- **아르고스**: 동의. GO.
- **헤임달**: 동의. GO.
- **마아트**: 동의. GO.
- **로키**: 조건부 동의 → 조건 충족 확인 → GO.

**전원 GO. 합의 완료.**

---

## 최종 합의 사항

### 핵심 설계 (3겹)
1. **MANDATORY blocklist**: test_runner, data_integrity, file_check는 `--skip` 불가. qc_verify.py가 에러 출력 + 종료. SKIPPABLE: pyright_check, tdd_check, style_check만 skip 허용.
2. **baseline (마지막 QC-PASS commit 기준) + 신규 FAIL 차단**: dispatch.py가 `.qc-passed-commit` 파일의 commit 기준으로 baseline 생성. QC 시 신규 FAIL만 차단, 기존 FAIL은 WARN.
3. **테스트 무결성 보호**: 테스트 카운트 감소 시 FAIL + 기존 함수명 삭제 시 WARN.

### 부가 결정
4. **Flaky test**: 신규 FAIL 시 1회 자동 retry. retry PASS면 WARN(flaky), retry FAIL이면 진짜 FAIL.
5. **PROTECTED_FILES**: qc_verify.py, QC-RULES.md 등 QC 관련 파일이 diff에 포함되면 자동 FAIL. 수정은 아누만(Lv.0).
6. **.request_done**: Lv.3+ only. 한정위임 시 비적용. 아누 5분 미응답 시 제이회장님 알림.
7. **QC=게이트 유지**: 로그 방식 기각 (우회 전적 존재).
8. **테스트 없는 프로젝트**: test_runner 실행 안 함 (경고 로그만).

### 폐기/간소화 결정
- ~~통과율 임계치~~ → 신규 FAIL 차단으로 충분
- ~~known_failures 별도 관리~~ → baseline에 흡수
- ~~체크섬~~ → git 추적
- ~~30분 자동 승인~~ → 폐기 (아누 미응답 시 알림만)

### 구현 우선순위
- **P0 즉시**: MANDATORY blocklist (qc_verify.py에 조건문 추가)
- **P1 이번 주**: baseline 메커니즘 (dispatch.py 연동 + baseline_capture.py + .qc-passed-commit)
- **P2 다음 주**: PROTECTED_FILES, flaky retry, 테스트 함수명 비교

## 미해결 항목
- 로키 확인 필요: PROTECTED_FILES 순환 방어가 커밋 전 단계에서 작동하는지 → P0 구현 시 자연 검증

## 다음 단계

### 합의 사항 → 3문서 매핑 가이드
- P0 MANDATORY blocklist → 즉시 위임 (Lv.1, qc_verify.py 조건문 추가)
- P1 baseline 메커니즘 → Lv.2 위임 (dispatch.py 연동 설계 필요)
- P2 부가 기능 → Lv.1~2 개별 위임
- QC-RULES.md 업데이트 → 아누 직접 (Lv.0)

### 기각된 대안과 사유
- **QC=로그 방식**: 우회 전적 존재, 봇 조직에서 자발적 확인 신뢰 불가 → 기각
- **통과율 임계치**: 신규 FAIL 차단과 충돌, 프로젝트별 관리 부담 → 기각
- **known_failures 별도 파일**: baseline에 흡수하면 별도 관리 불필요 → 기각
- **.request_done Lv.2 적용**: 아누 오프라인 시 병목, 한정위임과 모순 → Lv.3+로 축소
