# dispatch.py 봇 충돌 시 가용 봇 자동 추천 기능

## 레벨: Lv.2
## 한정승인: 끝까지 진행

---

## 배경

봇 충돌 감지는 구현되어 있으나(task-1223.1, task-1243.1), 충돌 시 단순 에러만 반환하고 대안을 제시하지 않아서 아누가 수동으로 다른 팀을 찾아야 했음.

**실제 사고 사례 (2026-03-29)**:
- 마케팅팀 task-1250.1이 bot-b에서 진행 중
- 아누가 dev1-team(bot-b)에 task-1251.1 위임 시도 → 충돌 에러
- 수동으로 dev2-team(bot-c)으로 전환하여 해결
- 이 과정에서 task-timer 꼬임 + 불필요한 시간 소모

---

## 작업 내용

### 1. dispatch.py 봇 충돌 시 가용 봇 추천

현재 코드 (dispatch.py line 1050~1064): 충돌 감지 후 에러 반환만 함.

**변경사항**: 에러 메시지에 가용한 대안 봇/팀 목록을 포함.

```
현재: "봇 bot-b가 marketing 작업(task-1250.1)에 점유 중입니다. 완료 후 재시도하세요."
변경: "봇 bot-b가 marketing 작업(task-1250.1)에 점유 중입니다. 가용 대안: bot-c(dev2-team), bot-d(dev3-team), bot-e(dev4-team)..."
```

구현:
- `_get_busy_bots_info()`로 바쁜 봇 목록 확보
- 전체 봇 목록(bot-b ~ bot-i)에서 바쁜 봇 제외 → 가용 봇 계산
- 가용 봇의 기본 팀명 매핑 (`BOT_TEAM_MAP` 또는 기존 상수 활용)
- 에러 response JSON에 `"available_bots"` 필드 추가

### 2. 논리적 팀 봇 할당 개선

현재 논리적 팀(marketing, consulting, design, publishing)은 "유동 배정"이라고 문서에 있지만, 실제로는 특정 봇에 고정 배정되는 경우가 있음.

**확인 필요**: dispatch.py에서 논리적 팀의 봇 할당 로직 확인 → 진짜 유동 배정(가용 봇 중 선택)이 되는지, 아니면 고정인지.

만약 고정이라면:
- `_find_available_bot()` 함수(line 222)를 논리적 팀 위임 시에도 사용하도록 변경
- 논리적 팀은 바쁘지 않은 봇 중 하나를 자동 선택

### 3. 아누 가이드 문서 업데이트

`/home/jay/workspace/memory/specs/anu-guide.md` 또는 MEMORY.md에 추가:
- "위임 전 봇 가용성 확인" 규칙은 dispatch.py가 자동으로 처리하므로, 아누 레벨에서는 에러 시 추천된 대안 팀을 사용

---

## 참고 파일
- dispatch.py: `/home/jay/workspace/dispatch.py` (line 184 `_get_busy_bots_info`, line 222 `_find_available_bot`, line 1044~1070 봇 충돌 검사)
- bot-team-mapping.md: `/home/jay/workspace/memory/specs/bot-team-mapping.md`

## 검증
- bot-b 충돌 시 에러 메시지에 가용 대안 봇 목록 포함 확인
- 논리적 팀(marketing 등) 위임 시 자동으로 가용 봇 선택되는지 확인
- 기존 개발팀 위임 동작 영향 없음 확인
- `_find_available_bot()` 테스트
