# 봇-팀 매핑 구조

**버전**: 2.2
**작성일**: 2026-03-29

---

## 물리적 봇 (텔레그램)

- 봇A — 아누 (개발실장), 제이회장님 전용 채널
- 봇B — 작업 실행용 (개발1팀 기본)
- 봇C — 작업 실행용 (개발2팀 기본)
- 봇D — 작업 실행용 (개발3팀 기본)
- 봇E — 작업 실행용 (개발4팀 기본)
- 봇F — 작업 실행용 (개발5팀 기본)
- 봇G — 작업 실행용 (개발6팀 기본)
- 봇H — 작업 실행용 (개발7팀 기본)
- 봇I — 작업 실행용 (개발8팀 기본)

## 고정 매칭 (개발팀)

- **봇B** → 개발1팀 (헤르메스, 그리스) : `dispatch.py --team dev1-team`
- **봇C** → 개발2팀 (오딘, 북유럽) : `dispatch.py --team dev2-team`
- **봇D** → 개발3팀 (다그다, 켈트) : `dispatch.py --team dev3-team`
- **봇E** → 개발4팀 (비슈누, 힌두) : `dispatch.py --team dev4-team`
- **봇F** → 개발5팀 (마르둑, 메소포타미아) : `dispatch.py --team dev5-team`
- **봇G** → 개발6팀 (페룬, 슬라브) : `dispatch.py --team dev6-team`
- **봇H** → 개발7팀 (이참나, 마야) : `dispatch.py --team dev7-team`
- **봇I** → 개발8팀 (라, 이집트) : `dispatch.py --team dev8-team`

개발팀은 항상 같은 봇을 사용한다.

## 유동 배정 (논리적 팀)

- **마케팅팀** : `dispatch.py --team marketing`
- **컨설팅팀** : `dispatch.py --team consulting`
- **출판팀** : `dispatch.py --team publishing`
- **디자인팀** : `dispatch.py --team design`

논리적 팀은 전용 봇이 없다. 아누가 가용한 봇을 골라서 해당 팀의 프롬프트를 실어 보낸다.

## 핵심 개념

### 봇 ≠ 팀
- **봇** = 물리적 텔레그램 채널 (고정)
- **팀** = 프롬프트에 의해 결정되는 역할 (전환 가능)

### 세션 ≠ 봇
- **세션** = `cokacdir --cron`으로 생성되는 개별 작업 단위
- 하나의 봇이 여러 세션을 순차 처리

### 타입 구분
- **direct (dev1~dev7)**: Opus 팀장이 Task tool로 팀원(Sonnet/Haiku)에게 위임
- **glm (dev8)**: Sonnet 팀장이 OpenClaw(GLM-5)에 위임

## 봇 충돌 방지 규칙 (v2.2)

### 규칙
- composite/marketing/design 작업이 봇을 점유 중이면, 해당 봇의 고정 dev팀 위임 불가 (`--force` 없이)
- 예: composite가 봇C를 점유 중 → 개발2팀(`dev2-team`) 위임 시 에러 반환
- `--force` 플래그를 사용하면 충돌을 무시하고 강제 진행 가능
- **충돌 시 가용 대안 자동 추천**: 에러 응답에 `available_bots` 필드로 가용 봇/팀 목록 포함

### 충돌 에러 응답 형식
```json
{
  "status": "error",
  "message": "봇 bot-b가 marketing 작업(task-1250.1)에 점유 중입니다. 가용 대안: bot-c(dev2-team), bot-d(dev3-team), ...",
  "available_bots": [
    {"bot_id": "bot-c", "default_team": "dev2-team"},
    {"bot_id": "bot-d", "default_team": "dev3-team"}
  ]
}
```

### 구현 위치
- `dispatch.py`의 `_get_busy_bots_info()` 함수가 봇 점유 상태를 조회
- `_get_available_bots_with_teams()` 함수가 가용 봇 목록과 기본 팀 매핑을 반환
- dev팀 dispatch 시 `exclude_task_id`로 자기 자신의 timer entry를 제외하여 정확한 충돌 감지
- 충돌 검사 결과는 `[봇 충돌 검사]` 접두사로 로그 기록

### 변경 이력
- v2.0 (2026-03-24): 초기 문서화
- v2.1 (2026-03-29): 봇 충돌 방지 규칙 섹션 추가, exclude_task_id 메커니즘 문서화 (task-1243.1)
- v2.2 (2026-03-29): 충돌 시 가용 봇 자동 추천 기능 추가 (task-1252.1)
