# 봇 현황 단일 모듈 — dispatch/whisper/라우팅 통합

## 문제
"현재 작업중인 봇 현황"을 dispatch(충돌방지), whisper(상태표시), 논리적 팀 라우팅이 각각 따로 확인하고 있음. 단일 소스 원칙 위반.

## 목표
**하나의 모듈**만 확인하면 봇 충돌방지, whisper 표시, 논리적 팀 라우팅이 전부 해결되는 구조.

## 설계

### 1. 봇 현황 단일 모듈 생성
`/home/jay/workspace/utils/bot_status.py` (또는 적절한 위치)

```python
class BotStatusManager:
    """모든 봇의 현재 상태를 관리하는 단일 소스"""
    
    def get_busy_bots(self) -> dict:
        """현재 작업중인 봇 목록 + 어떤 팀/태스크가 점유 중인지"""
        # task-timers.json에서 running 상태 태스크의 bot 필드 수집
        # 논리적 팀(design 등)이 점유한 봇도 포함
        return {"bot-b": {"team": "design", "task": "task-1446.1"}, ...}
    
    def get_idle_bots(self) -> list:
        """실제 유휴 봇 목록 (논리적 팀 점유 제외)"""
        
    def is_bot_available(self, bot_id: str) -> bool:
        """특정 봇이 사용 가능한지"""
        
    def get_team_status(self, team_id: str) -> str:
        """팀 상태: 작업중/봇점유(논리적팀)/유휴"""
        
    def suggest_team(self, task_desc: str) -> str:
        """작업 설명 기반 적합 팀 추천 (논리적 팀 도메인 매핑)"""
        
    def validate_routing(self, team_id: str, task_desc: str) -> tuple:
        """팀 라우팅 검증 — 디자인 작업을 dev팀에 보내려 하면 WARNING"""
```

### 2. dispatch.py — BotStatusManager 참조
- 기존 `_get_busy_bots_info()` → `BotStatusManager.get_busy_bots()` 호출
- 기존 `_select_and_reserve_bot()` → `BotStatusManager.is_bot_available()` 활용
- 논리적 팀 라우팅 검증: `BotStatusManager.validate_routing(team, task_desc)`
- 논리적 팀 위임 시 --force 자동 적용 로직

### 3. whisper-compile.py — BotStatusManager 참조
- 기존 "유휴" 판단 → `BotStatusManager.get_team_status()` 호출
- 논리적 팀이 물리 봇 점유 시 "봇점유(design:task-XXXX)" 표시

### 4. 논리적 팀 도메인 매핑 (config/constants.json에 추가)
```json
{
  "logical_team_domains": {
    "design": {
      "keywords": ["배너", "이미지", "디자인", "시안", "광고 크리에이티브", "비주얼", "포스터"],
      "anti_keywords": ["HTML 수정", "CSS 버그", "코드 수정", "렌더러 수정"]
    },
    "marketing": {
      "keywords": ["카피", "마케팅 전략", "광고 문구", "SEO", "콘텐츠 전략"]
    },
    "content": {
      "keywords": ["블로그 작성", "콘텐츠 제작", "포스팅 작성"]
    }
  }
}
```

### 5. 논리적 팀 --force 자동 적용
- dispatch.py에서 team이 논리적 팀이면 자동으로 --force 적용
- 호출자가 매번 --force를 기억할 필요 없음

## 테스트
1. 기존 dispatch 테스트 전체 통과
2. 신규 테스트:
   - 논리적 팀이 봇 점유 시 해당 dev팀 상태 = "봇점유"
   - dev팀에 디자인 키워드 태스크 → WARNING
   - 논리적 팀 위임 시 --force 자동 적용
3. whisper 출력에서 봇 점유 정확히 표시

## 산출물
1. utils/bot_status.py (또는 적절한 위치)
2. dispatch.py 수정 (BotStatusManager 참조)
3. whisper-compile.py 수정 (BotStatusManager 참조)
4. config/constants.json 논리적 팀 도메인 추가
5. 테스트
6. 보고서
