# task-2151 완료 보고서

## SCQA

**S**: dispatch.py에서 affected_files를 아누가 수동 기재하고, 완료 기준(goal_assertions)이 문서 규칙에만 존재하여 코드로 자동 검증이 불가능한 상태였다.

**C**: task-2142에서 FeatureGate.tsx 수정 시 use-feature-access.ts를 누락하는 등 영향 범위 체크가 무력화되는 사고가 반복 발생. affected_files 미기재율 추적 불가, goal_assertions 미지원.

**Q**: 백틱 코드 토큰 기반 자동 탐지로 affected_files를 자동 주입하고, 검증 시나리오에서 실행 가능한 goal_assertions를 자동 생성할 수 있는가?

**A**: `_auto_inject_affected_files()`와 `_auto_generate_goal_assertions()` 2개 함수를 dispatch.py에 구현하여, task_file.write_text() 직전에 자동 호출되도록 삽입. 단위 테스트 8건 PASS, 기존 dispatch 테스트 329건 전체 PASS로 회귀 없음 확인.

## 작업 내용

### 1. `_auto_inject_affected_files()` (dispatch.py L948-985)
- 백틱 코드 토큰 추출 (`re.findall`)
- COMMON_FILTER 20단어 제외 (data, result, config 등)
- grep -rl로 .py/.ts/.tsx 파일 자동 탐색
- 20파일 초과 시 주입 안 함 (정밀도 부족 경고)
- `## affected_files (auto-detected)` 섹션 자동 추가

### 2. `_auto_generate_goal_assertions()` (dispatch.py L991-1015)
- 검증 시나리오에서 ALLOWED_COMMANDS 화이트리스트 명령 추출
- 보안: grep, curl, pytest, python3, tsc, cat, jq, npx, npm만 허용
- 최대 5개 명령을 `## goal_assertions (auto-generated)` 섹션으로 추가
- task_type == "coding" 일 때만 호출

### 3. dispatch() 호출 삽입 (dispatch.py L2968-2971)
- `_auto_inject_affected_files`: 항상 호출 (task_type 무관)
- `_auto_generate_goal_assertions`: task_type == "coding" 조건부 호출
- 위치: task_file.write_text() 직전

## 수정 파일
- `/home/jay/workspace/dispatch.py` — 2개 함수 + 호출 삽입 (+67줄)
- `/home/jay/workspace/tests/test_dispatch_auto_inject.py` — 신규 (8개 테스트)

## 테스트 결과
- 신규 테스트 8건: 8/8 PASS (0.14s)
- 전체 테스트 2482건: 2482/2482 PASS (104.03s)
- 회귀: 없음

## L1 스모크테스트
- dispatch.py import 검증: `python3 -c "import dispatch; print('OK')"` → OK
- 함수 존재 확인: `grep -c "_auto_inject_affected_files" dispatch.py` → 2건 (정의+호출)
- 함수 존재 확인: `grep -c "_auto_generate_goal_assertions" dispatch.py` → 2건 (정의+호출)
- 상수 존재 확인: `grep -c "ALLOWED_COMMANDS" dispatch.py` → 3건 (정의+참조)
- pytest 전체 PASS: 2482 passed in 104.03s

## 보안 감사 (로키 레드팀)
- ALLOWED_COMMANDS 화이트리스트: 9개 안전 명령만 허용 (grep, curl, pytest, python3, tsc, cat, jq, npx, npm). rm, sh, bash 등 위험 명령 차단
- subprocess.run(shell=False): command injection 불가
- os.path.relpath: workspace 외부 경로 노출 방지
- 결론: PASS — 보안 취약점 없음

## 모델 사용 기록
- 오딘(팀장/Opus): 설계, 분배, 검증, 보고서
- 불칸(Sonnet): dispatch.py 함수 구현 + 호출 삽입
- 불칸(Sonnet): 단위 테스트 8건 작성
