---
task_id: task-1973
type: context
scope: task
created: 2026-04-20
updated: 2026-04-20
status: in-progress
---

# 맥락 노트: task-1973

**task**: task-1973

---

## 결정 근거

### subprocess.run → asyncio.create_subprocess_exec (CLI 유지)
- task 파일의 절대 규칙: "API 직접 호출 금지 — AI 호출은 CLI로만"
- 따라서 Anthropic Python SDK 직접 호출이 아닌, CLI 호출 방식을 native async로 전환
- asyncio.create_subprocess_exec은 이벤트 루프를 블로킹하지 않으면서 프로세스 실행 가능
- anyio.to_thread.run_sync + subprocess.run 조합보다 효율적 (스레드풀 오버헤드 제거)

### 3 Step Why 자문
1st Why: "왜 이 설계가 필요한가?"
→ subprocess.run은 동기 블로킹 호출이라 FastAPI의 async 이벤트 루프를 차단함. anyio.to_thread로 감싸도 스레드풀 리소스를 소비함.

2nd Why: "왜 asyncio.create_subprocess_exec이 최선의 접근인가?"
→ Python 표준 라이브러리의 native async 프로세스 실행. 외부 의존 없이 이벤트 루프와 자연스럽게 통합. CLI 호출이라는 아키텍처 결정을 유지하면서 성능 개선.

3rd Why: "왜 이 접근이 다른 대안보다 나은가?"
→ 대안 1: Anthropic SDK 직접 호출 — 절대 규칙 위반. 대안 2: anyio.to_thread 유지 — 스레드풀 오버헤드 존재. 대안 3: trio/curio 등 — 추가 의존성. asyncio.create_subprocess_exec은 제약 없이 최적.

## 참조 자료

- task-1969 보고서: `/home/jay/workspace/memory/reports/task-1969.md`
- 현재 코드: `/home/jay/projects/InsuRo/server/anu_provider.py`
- 테스트: `/home/jay/projects/InsuRo/server/tests/test_anu_provider.py`

## 주의사항

- task-1969 브랜치(task/task-1969-dev1)가 아직 main 미머지 → worktree에 먼저 머지 필요 (완료)
- generate()가 이미 async → main.py 호출 코드는 변경 불필요
- ai_parser.py의 subprocess는 이번 범위 밖
- 테스트에서 mock 패턴 변경 시 conftest.py의 mock_subprocess_claude fixture 영향 확인 필요
