# task: dispatch.py 가용 봇 판단 — composite 점유 봇 체크 추가

## 배경
dispatch.py의 `_find_available_bot()`이 composite 작업에 점유된 봇을 "가용"으로 판단.
결과: 같은 봇(bot-g)에 composite task-1220.1 + dev6-team task-1222.1이 동시 할당됨.

## 원인
`_find_available_bot()` (dispatch.py:184~)가 task-timers.json에서 busy 봇을 확인할 때,
`team_id`가 고정 dev팀(dev1-team~dev8-team)인 것만 `TEAM_TO_BOT_ID`로 매핑하여 제외.
`team_id: "composite"`인 태스크의 `bot` 필드는 체크하지 않음.

## 수정 방향
`_find_available_bot()`에서:
1. task-timers.json의 running 태스크 순회
2. 기존: `team_id → TEAM_TO_BOT_ID[team_id]`로 busy 봇 판단
3. **추가**: `bot` 필드가 직접 존재하면 해당 봇도 busy로 판단
   - composite, marketing, design 등 논리적 팀 태스크의 `bot` 필드 활용

```python
# 기존
if team_id in TEAM_TO_BOT_ID:
    busy_bots.add(TEAM_TO_BOT_ID[team_id])

# 추가
bot_field = task_entry.get("bot", "")
if bot_field:
    busy_bots.add(bot_field)
```

4. 고정 팀(dev6-team 등) 위임 시에도, 해당 봇이 이미 busy_bots에 있으면 에러 반환 또는 경고

## 테스트
- composite가 bot-g를 점유 중일 때 dev6-team 위임 시 에러/경고 발생 확인
- composite가 bot-b를 점유 중일 때 dev1-team 위임 시 에러/경고 발생 확인
- composite 없을 때 정상 위임 확인 (회귀 없음)

## 주의
- 고정 팀 위임이 차단되는 건 의도된 동작 (같은 봇에 2개 세션 방지)
- 에러 메시지: "봇 bot-g가 composite 작업(task-XXXX.1)에 점유 중입니다. 완료 후 재시도하세요."
