---
type: context
scope: task
project: dispatch-quality-gates
task_ids: [task-2145, task-2146, task-2147, task-2148, task-2149, task-2150, task-2151]
created: 2026-04-24
updated: 2026-04-24
status: active
level: 4
---

# 맥락 노트: Dispatch Quality Gates 구현

---

## 이 작업이 왜 필요한가

2026-04-23~24 기간에 task-2140~2144에서 동일 패턴의 오류가 반복 발생:
- task-2142: FeatureGate.tsx 1줄 수정 → Gemini 리뷰가 use-feature-access.ts 누락 발견
- task-2143: Vitest supabaseUrl 에러 수정 → task-2144에서 pytest doc_parser 에러 또 발생
- task-2140: "UI 직접 확인 불가"라고 보고서에 쓰고 완료 처리

3건 모두 문서 규칙으로는 방지 불가. 코드 자동화가 유일한 해결책.

---

## 각 태스크의 핵심 맥락

### task-2145 (l1_smoketest 강화)
- 현재 상태: l1_smoketest_check.py가 "해당없음"을 허용하여 RC-3 미방지
- 수정 방향: BLOCK_PATTERNS로 회피 문구 차단 + 증거(스크린샷/curl/test) 필수
- 주의: EXEMPT 조건 필요 — 유틸리티 함수 수정 시 스크린샷은 정말 "해당없음"
- 판별 기준: task 파일 키워드에 "UI", "컴포넌트", "화면", "페이지", "프론트" 포함 여부

### task-2146 (impact_scanner)
- 현재 상태: dispatch.py에 _enrich_affected_files_with_ast()가 있으나 Python 전용
- 수정 방향: finish-task.sh post-flight에서 역방향 스캔 (수정 파일 → 참조 파일 역추적)
- 주의: COMMON_FILTER 없이 grep하면 `data`, `config` 같은 변수명에 수백 파일 매칭
- TypeScript regex: `export\s+(function|class|type|interface|const|enum)\s+(\w+)`

### task-2147 (dispatch.py 확장)
- 현재 상태: affected_files 수동 기재 + goal_assertions 미지원
- 수정 방향: 백틱 코드 토큰 자동 grep → affected_files 주입 + goal_assertions 자동 생성
- 주의: 기존 _parse_affected_files()(766행), _warn_missing_affected_files()(932행)와 충돌 없이 추가
- 호출 위치: dispatch() 내 task_file.write_text() 직전 (약 2900행)

### task-2148 (finish-task.sh 통합)
- 현재 상태: Step 0~2.10까지 존재. 2.6~2.12 사이에 공간 있음
- 수정 방향: 4개 신규 step + .done gate_results 추가
- 주의: P1 결과물(impact_scanner, ci_preflight, gate-config)을 import하므로 P2에서 진행
- 기존 Step 2.7(member-status 복원)은 task-2141에서 수정됨 → 충돌 주의

### task-2149 (ci_preflight)
- 현재 상태: finish-task.sh의 test_runner가 --check-files 기반 부분 테스트만 실행
- 수정 방향: 멀티 러너 전체 스택 검증 (pytest + tsc + vitest)
- 주의: InsuRo 4000+ TS → tsc 3분 소요 가능 → 러너당 120초 타임아웃 필수
- --affected-only: git diff → test_X.py / X.test.ts 패턴 매칭

### task-2150 (gate-config)
- 현재 상태: 게이트 설정 없음 (하드코딩 상태)
- 수정 방향: 중앙 설정 파일 + 로더 유틸리티
- 주의: finish-task.sh(bash)와 Python 양쪽에서 읽어야 함 → python3 -c "json.load..." 형태

---

## 팀간 인터페이스 약속

### impact_scanner.py → finish-task.sh
- stdout 마지막 줄: JSON `{"gate_result": "PASS|WARN|BLOCK", ...}`
- exit code: 0=PASS, 1=WARN, 2=BLOCK
- finish-task.sh가 JSON 파싱하여 gate_results에 저장

### ci_preflight.sh → finish-task.sh
- stdout: `[CI-PREFLIGHT] overall=PASS|FAIL`
- exit code: 0=PASS, 1=FAIL
- 타임아웃 시: exit code=0 + `[CI-PREFLIGHT] overall=WARN (timeout)`

### gate-config.json → 모든 게이트
- Python 로더: `json.load(open("config/gate-config.json"))`
- Bash 로더: `python3 -c "import json; c=json.load(open('$CONFIG')); print(c['impact_scanner']['mode'])"`

---

## 참조
- 프로젝트 계획서: `memory/plans/system/dispatch-quality-gates/plan.md`
- 미팅 기록: `memory/meetings/2026-04-24-dispatch-quality-automation.md`
- 아누 시스템 계획서: `memory/plans/anu-guide-system/plan.md` Phase 4
