---
task_id: task-1973
type: plan
scope: task
created: 2026-04-20
updated: 2026-04-20
status: completed
---

# 계획서: task-1973

**task**: task-1973
**목표**: anu_provider.py의 subprocess.run → asyncio.create_subprocess_exec 전환
**승인**: 아누 2026-04-20 "별도 task 분리"
**근거**: task-1969 보고서 — M3 subprocess→API 전환 항목

---

## 목표

anu_provider.py에서 `subprocess` 모듈 의존을 완전 제거하고, `asyncio.create_subprocess_exec`로 전환. CLI 호출은 유지하되 native async I/O로 전환하여 이벤트 루프 블로킹을 제거.

## 범위

### 포함
1. `anu_provider.py`: subprocess.run → asyncio.create_subprocess_exec 전환
2. `_run_claude_cli` 동기 헬퍼 → async `_run_claude_cli_async`
3. `anyio.to_thread.run_sync` 래퍼 제거 (native async로 불필요)
4. 에러 핸들링: subprocess.TimeoutExpired → asyncio.TimeoutError
5. 테스트 업데이트: subprocess.run mock → asyncio.create_subprocess_exec mock
6. main.py 테스트: subprocess.run mock → 새로운 mock 패턴

### 제외 (다음 페이즈 이후)
- ai_parser.py의 subprocess 사용 (별도 파일, 별도 작업)
- Anthropic Python SDK 직접 호출 전환 (절대 규칙: AI 호출은 CLI로만)
- premiumOnly 관련 코드 변경

## 위임 계획

- anu_provider.py 리팩토링: **불칸(백엔드)** — subprocess→asyncio 전환 ✅
- 테스트 업데이트: **아르고스(테스터)** — mock 패턴 변경 ✅

## 검증 기준

- subprocess.run|call|check 사용 0건: ✅ confirmed
- pytest 전체 PASS: ✅ 139 passed, 0 failed
- tsc 0 errors: ✅
- 서버 정상 기동 (uvicorn): ✅ /api/status → ok
