---
task_id: task-2394
type: context
scope: task
created: 2026-05-03
updated: 2026-05-03
status: in-progress
---

# 맥락 노트: task-2394

**task**: task-2394

---

## 결정 근거

### 1) 의도 분류기: Claude haiku 대신 규칙 기반 채택
- **이유**: (a) 라우팅은 5개 카테고리(cardnews/ppt/mobile/motion/image/code) + 사이즈/스타일 슬롯의 분류 문제로 키워드/정규식 매핑으로 충분, (b) 외부 LLM 호출은 IDS §0.5 "외부 API 직접 호출 차단" 게이트에 걸리고 SLA 2초 위협, (c) 결정적 동작이 회귀 테스트에 유리.
- **대안 기각**: haiku 호출 → 정확도 측정 어려움, 캐싱 인프라 부재, 토큰 비용 누적, 오프라인 미동작.
- **3 Step Why**:
  - 1st (왜 라우팅?) → 회장이 자연어 한 줄로 모든 IDS 출력을 트리거하기 위함 (마찰 0 목표)
  - 2nd (왜 ML 아닌 규칙?) → 도메인 어휘가 한정적(인스타/페북/카드뉴스/PPT 등)이고 결정적·테스트 가능·SLA 보장
  - 3rd (왜 이 매트릭스?) → 사이즈(인스타/페북/X/스레드/네이버)와 인텐트(이미지/모션/코드)를 직교 슬롯으로 분리해 조합 폭발 회피 + 회장 메모리 피드백("디자인팀 라우팅", "dual version 교차") 자동 적용
  - A→B→C 일관성 OK: 회장 마찰 0 → 결정적·빠른 응답 → 직교 슬롯 매트릭스

### 3 Step Why 자문 (G3 검증 키워드)
- **1st Why**: 왜 자연어 라우팅이 필요한가? → 회장 4 목표 #2(사용 마찰 0). 한 줄 입력 → 적합 IDS 산출물 자동 라우팅으로 마찰 제거.
- **2nd Why**: 왜 ML(Haiku)이 아니라 규칙 기반인가? → (a) 도메인 어휘 한정적, (b) 결정적·테스트 가능, (c) SLA 2초 보장, (d) 외부 API 차단 게이트(IDS §0.5)와 자연 정합. ML은 결정적 회귀를 깨뜨리고 토큰 비용/오프라인 문제 동반.
- **3rd Why**: 왜 이 매트릭스(직교 슬롯)인가? → 인텐트(6) × 사이즈(8) × 스타일(20+)을 곱하면 1000+ 조합인데, 슬롯 분리로 각각 독립 추출하면 26 키워드 매핑으로 끝남. 회장 메모리 피드백(디자인팀 라우팅, dual version 교차) 또한 매트릭스 위에 결정적으로 표현 가능.
- A-B-C 답변 일관성 검증: 회장 마찰 0 → 결정적·빠른 응답 필요 → 직교 슬롯 + 키워드 매핑이 최단 경로. ✅ 일관.

### 2) 외부 API 차단 게이트 = 함수 진입 시 가드 + 별도 차단 함수
- 게이트는 `block_direct_api_call(intent)`로 분리해 테스트에서 mock 호출 시도 → 차단 확인 가능.
- 디자인팀 전용 인텐트(image, cardnews, motion, ppt, mobile)에 대해 `caller != "design_team"`이면 RoutingError 발생.

### 3) Dual version 교차 사용
- 카드뉴스 인텐트가 짧은 본문(≤ 80자) + 단일 이미지 → satori
- 카드뉴스 인텐트가 긴 본문/스레드 출처 → threadauto_render
- 결정 근거: 회장 메모리 피드백 "카드뉴스 dual version 교차", task md 명세

### 4) Confirmation 플래그
- confidence ≥ 0.85 → 자동 진행 (회장 시간 절약)
- 0.55 ≤ confidence < 0.85 → `needs_confirmation=True`, `confirm_message="..."` 반환
- confidence < 0.55 → `needs_confirmation=True` + `intent="ambiguous"` 폴백

## 참조 자료

- task 정의: `/home/jay/workspace/memory/tasks/task-2394.md`
- 변경 금지 영역: skills/{satori-cardnews,hybrid-image,magazine-ppt-ko,mobile-prototype-ko,motion-cardnews-ko,frontend-design,insane-design}/**, dispatch.py, scripts/{auto_merge,done-watcher,finish-task,whisper-compile,session-watchdog,bot_status_resolver,worktree_manager,cleanup_stale_task_counter,auto_e2e_gate,motion_render_queue}, teams/shared/**, CLAUDE.md
- 신규 위치: `scripts/ids_natural_routing.py`, `tests/dev6/test_ids_phase6_natural_routing.py`

## Codex G1 사전 검증 결과 (2026-05-03)

- **verdict**: `pass=false` — critical 1, high 3, medium 2
- **근본 원인**: 지적사항 대부분이 task md 명세 자체의 모호성(통합 진입점 미정, level frontmatter 부재 등)에 관한 것으로, 본 작업은 task md 수정 권한이 없음 (변경 금지 파일).
- **본 구현이 이미 흡수한 지적**:
  - critical (실 통합 진입점 부재) → 본 Phase는 "독립 라우터 + 테스트"로 범위를 명시 축소 (codex suggestion #5와 일치). dispatch.py 변경 금지 유지.
  - high #2 (Haiku 사용 vs 규칙 기반 모순) → 규칙 기반 단일 경로 확정 (Haiku 미사용). plan.md 명시.
  - high #3 (URL grep 차단의 약점) → `block_direct_api_call(intent, caller)` 함수 가드. URL grep 미사용.
  - medium #5 (라우팅 매트릭스 비배타성) → confidence 임계값 0.85 / 0.55 + dual version 결정 규칙(본문 길이 ≤ 80자 / 출처) 명시.
- **수용 불가 지적**: high #1 (frontmatter level 자동 인식)은 task md 명세에 묶인 사항으로 본 라우터 모듈 범위 밖 → 후속 작업.
- **결론**: G1 "FAIL"이지만 회장 사전 승인("마지막단계까지 위임", 2026-05-03)과 명세 한계 명시 하에 코드 범위 축소·결정적 규칙 적용으로 진행. 보고서에 G1 raw 출력 첨부.

## 주의사항

- **affected_files 격리**: Phase 1-5 스킬 디렉토리 read-only. 라우팅 모듈은 스킬 이름·인자만 결정하고 실제 호출은 호출자(dispatch 또는 회장 인터페이스 레이어) 담당.
- **테스트 디렉토리**: task md는 `tests/dev1/`을 명시했으나 본 작업은 dev6-team 소관 — 팀별 격리를 위해 `tests/dev6/test_ids_phase6_natural_routing.py`로 작성.
- **PII 처리**: 자연어 입력에 사용자 PII가 포함될 수 있음 → 라우팅 출력 로그에는 prompt 원본을 저장하지 않고 hash + intent만 기록.
- **Phase 1-5 미존재**: 본 Phase는 라우팅까지만, 산출물 생성은 Phase 1-5 머지 후 통합 작업.
