---
type: context
scope: project
project: dispatch-quality-gates
created: 2026-04-24
updated: 2026-04-24
status: active
parent: anu-guide-system (Phase 4)
---

# 맥락 노트: Dispatch Quality Gates

---

## 결정 근거

### 왜 post-flight(finish-task.sh) 중심인가?
- 로키 제안: pre-flight(dispatch.py)는 아누가 태스크 파일 작성할 때 의존 → 아누가 빠뜨리면 무력화
- post-flight는 봇이 작업 완료 후 코드가 자동 실행 → 아누 의존도 제거
- 합의: pre-flight(자동 주입) + post-flight(자동 검증) 양면 방어, post-flight에 무게

### 왜 Phase 1A/1B 분리인가?
- 로키 경고: grep 기반 false positive 폭발 + CI 타임아웃 → 정당한 작업 차단 위험
- 합의: 명백한 위반(l1_smoketest, goal_assertions)만 즉시 FAIL
- 나머지는 WARN 모드 2주 운영 → false positive < 10% 확인 후 FAIL 승격

### 왜 grep 기반이고 AST/LSP가 아닌가?
- Python: AST 사용 (ast.parse → FunctionDef/ClassDef)
- TypeScript: regex 기반 (tsc 파서 의존성 과다, regex로 충분)
- 패턴: `export (function|class|type|interface|const|enum) (\w+)`
- 로키 반론 반영: 백틱 코드 토큰만 추출 + COMMON_FILTER로 정밀도 확보

### 왜 Goal Assertions 패턴인가?
- 오딘 제안: task 파일에 실행 가능한 shell command로 완료 기준 명시
- 코딩 4원칙 "Goal-Driven Execution"과 완벽 합치
- dispatch.py가 검증 시나리오에서 자동 생성 → 아누 수동 작성 불필요

### 왜 gate-config.json 중앙 관리인가?
- 마아트 제안: 게이트 ON/OFF, mode(warn/fail), 임계치를 코드에 하드코딩하면 수정 시 deploy 필요
- gate-config.json 한 곳에서 관리 → 운영 중 즉시 조정 가능
- 예: false positive 급증 시 mode=warn으로 즉시 전환

---

## 기각된 대안

### Shadow Run (라 제안)
- 내용: finish-task.sh 완료 직전 Haiku 세션 spawn → 독립 diff 검증
- 기각 사유: 세션 관리 복잡도 + 완료 지연 + Haiku 세션 실패 시 .done 블로킹
- 부분 참조: 향후 Phase 5에서 재검토 가능

### affected_files 전면 AST (헤르메스 초안)
- 내용: Python + TypeScript 모두 AST 분석
- 기각 사유: TypeScript AST 파서(ts-morph/typescript) 의존성 추가 부담
- 부분 참조: Python은 AST, TypeScript는 regex로 타협

### CI 전체 실행 (엔키 초안)
- 내용: finish-task.sh에서 프로젝트 전체 test suite 실행
- 기각 사유: InsuRo 4000+ TS 파일 → tsc 3분 → 봇 세션 타임아웃 위험
- 부분 참조: 러너당 120초 타임아웃 + --affected-only 모드로 타협

### 미해결 이슈 전면 차단 (쿠쿨칸 초안)
- 내용: 보고서에 "미해결" 1건이라도 있으면 .done 차단
- 기각 사유: "범위 외" 정당한 미해결도 차단 → 작업 불가능
- 부분 참조: "범위 내" 미해결만 카운트, 3건 한도

---

## 컴포넌트 간 의존성

```
dispatch.py                    finish-task.sh
  ├─ auto_inject_affected      ├─ Step 2.6: impact_scanner.py ←── gate-config.json
  └─ auto_generate_goals       ├─ Step 2.6.5: ci_preflight.sh ←── gate-config.json
                                ├─ Step 2.11: unresolved_gate ←── gate-config.json
                                ├─ Step 2.12: goal_assertions ←── gate-config.json
                                └─ qc_verify.py
                                     └─ l1_smoketest_check.py ←── gate-config.json
```

의존성 주의:
- finish-task.sh(task-2148)는 impact_scanner(task-2146)와 ci_preflight(task-2149) 완료 후 통합
- gate-config.json(task-2150)은 모든 게이트의 설정 소스 → 가장 먼저 스키마 확정 필요
- dispatch.py(task-2147)는 독립적 — pre-flight만 담당

---

## 위험 요소

### False Positive 관리
- 위험: grep 기반 심볼 검색 → common 변수명에 수백 파일 매칭
- 대응: COMMON_FILTER 20단어 + 백틱 토큰만 + 최대 5심볼 + 20파일 초과 시 주입 안 함
- 모니터링: .done gate_results에 false positive 후보 기록 → 2주 후 분석

### 봇 세션 타임아웃
- 위험: CI 실행이 봇 세션 토큰 한도 소진
- 대응: 러너당 120초, 전체 300초 타임아웃 + 타임아웃 시 WARN만 (차단 안 함)

### 게이트 cascading failure
- 위험: 한 게이트 에러가 후속 게이트 실행 방해
- 대응: 각 게이트 subshell 격리 실행 (C-FINAL-9)

---

## 참조 자료
- 미팅 기록: `memory/meetings/2026-04-24-dispatch-quality-automation.md`
- 상위 계획: `memory/plans/anu-guide-system/plan.md` Phase 4
- dispatch.py 기존 함수: _parse_affected_files(766행), _enrich_affected_files_with_ast(812행)
- finish-task.sh 기존 게이트: Step 0~2.10
- qc_verify.py verifier 21개 목록: 미팅 기록 부록 참조
- zero-error-dispatch 계획: `memory/plans/zero-error-dispatch/plan.md`
