# Task: 팀 단톡 (Team Group Chat) — Phase 1 MVP

## 개요
AI 페르소나들이 Telegram에서 실시간으로 대화하는 기능 구현.
유저가 자연어 트리거("팀 모여")로 세션 시작 → 페르소나들이 대화 → 자연어 종료("잘래", "빠이").

## 산출물
- `/home/jay/workspace/group_chat.py` — 메인 데몬 스크립트 (단일 파일)
- `/home/jay/workspace/config/personas.json` — 페르소나 설정 파일

## 아키텍처

### 1. 데몬 프로세스
```
group_chat.py (백그라운드 실행)
  ├─ 트리거 파일 폴링 (1초 간격)
  ├─ 세션 관리 (인메모리 + 파일 덤프)
  ├─ Claude API 호출 (페르소나별 시스템 프롬프트)
  └─ Telegram Bot API 직접 호출 (sendMessage)
```

### 2. 인터페이스: 트리거 파일
경로: `/home/jay/workspace/memory/events/group_chat_trigger.json`

#### 액션 타입 3종:

**start** (아누가 생성):
```json
{
    "action": "start",
    "topic": "단톡 기능 설계",
    "personas": ["hermes", "athena", "thor"],
    "chat_id": "6937032012",
    "user_message": "팀 모여, 설계 얘기하자",
    "timestamp": 1741234567.0
}
```

**user_input** (아누가 세션 중 유저 메시지 전달):
```json
{
    "action": "user_input",
    "message": "그 부분은 어떻게 생각해?",
    "timestamp": 1741234580.0
}
```

**end** (아누가 종료 감지 시):
```json
{
    "action": "end",
    "reason": "user_exit",
    "timestamp": 1741234600.0
}
```

### 3. Telegram 메시지 전송
- Bot A 토큰으로 `sendMessage` API 직접 호출
- 토큰 소스: `/home/jay/.cokacdir/bot_settings.json`의 `c119085addb0f8b7.token`
- parse_mode: "HTML"
- 메시지 간 0.5초 sleep (레이트리밋 방지 + 자연스러운 흐름)

### 4. 페르소나 응답 생성
- anthropic SDK 사용 (서버에 설치됨)
- 모델: `claude-sonnet-4-6`
- max_tokens: 300
- 시스템 프롬프트 캐싱: `cache_control={"type": "ephemeral"}`

## 페르소나 설정 (`config/personas.json`)

```json
{
    "hermes": {
        "name": "헤르메스",
        "emoji": "⚡",
        "role": "개발1팀장",
        "expertise": "백엔드 아키텍처, API 설계, 시스템 성능",
        "personality": "실용적, 경험 기반 판단, 간결한 표현"
    },
    "odin": {
        "name": "오딘",
        "emoji": "👁️",
        "role": "개발2팀장",
        "expertise": "풀스택 개발, 프로젝트 관리",
        "personality": "신중하고 전략적, 큰 그림을 봄"
    },
    "thor": {
        "name": "토르",
        "emoji": "🔨",
        "role": "개발2팀 백엔드",
        "expertise": "백엔드 구현, 데이터베이스, 성능 최적화",
        "personality": "직설적, 구현 중심적"
    },
    "athena": {
        "name": "아테나",
        "emoji": "🏛️",
        "role": "개발1팀 UX/UI",
        "expertise": "사용자 경험, 인터페이스 설계",
        "personality": "사용자 관점 우선, 디테일 중시"
    },
    "freya": {
        "name": "프레이야",
        "emoji": "✨",
        "role": "개발2팀 프론트엔드",
        "expertise": "프론트엔드, 반응형 UI",
        "personality": "창의적, 트렌드 민감"
    },
    "iris": {
        "name": "이리스",
        "emoji": "🌈",
        "role": "개발1팀 프론트엔드",
        "expertise": "React/Next.js, 컴포넌트 설계",
        "personality": "꼼꼼하고 체계적"
    },
    "mimir": {
        "name": "미미르",
        "emoji": "📚",
        "role": "개발2팀 UX/UI",
        "expertise": "정보 아키텍처, 사용성 테스트",
        "personality": "분석적, 데이터 기반"
    },
    "argos": {
        "name": "아르고스",
        "emoji": "🔍",
        "role": "개발1팀 테스터",
        "expertise": "QA, 엣지 케이스 탐지, 보안",
        "personality": "비판적 사고, 문제 발견에 집중"
    },
    "heimdal": {
        "name": "헤임달",
        "emoji": "🛡️",
        "role": "개발2팀 테스터",
        "expertise": "통합 테스트, 성능 테스트",
        "personality": "철저하고 놓치는 것 없음"
    },
    "venus": {
        "name": "비너스",
        "emoji": "🎨",
        "role": "디자인센터",
        "expertise": "UI 디자인, 시각적 일관성",
        "personality": "미학 중시, 심플함 추구"
    },
    "loki": {
        "name": "로키",
        "emoji": "🎭",
        "role": "레드팀",
        "expertise": "보안 취약점, 악용 시나리오",
        "personality": "도발적, 약점을 파고듦"
    }
}
```

## 핵심 로직

### 세션 시작 플로우
```
1. 트리거 파일 감지 (action: "start")
2. 트리거 파일 삭제 (처리 완료)
3. 페르소나 목록에서 참여자 로드
4. 입장 시퀀스 전송:
   - 아누: "잠깐요, 관련 팀원들 모을게요."
   - 각 페르소나: "<b>⚡ [헤르메스]</b> 참여합니다. {한마디}"
   - 아누: "N명 모였습니다. 시작하시죠."
5. 메인 대화 루프 진입
```

### 메인 대화 루프
```
while session.active:
    1. 트리거 파일 체크 (user_input 또는 end 액션)
    2. user_input 있으면 → 히스토리에 추가, auto_turns 리셋
    3. end 있으면 → 퇴장 시퀀스 → 세션 종료
    4. 5분 타임아웃 체크 → 초과 시 자동 종료
    5. auto_turns >= MAX_AUTO_TURNS(6) 이면 → 유저 입력 대기 (1초 폴링)
    6. 다음 발화자 선택:
       - 직전 발화자 제외
       - 덜 말한 페르소나에 가중치
       - 주제 관련성 고려 (Claude 판단)
    7. Claude API 호출 → 응답 생성
    8. Telegram sendMessage → 응답 전송
    9. 히스토리 추가, auto_turns++, last_activity 갱신
    10. 0.5초 대기
```

### 다음 발화자 선택
Claude API를 호출하여 대화 흐름에 따라 다음 발화자를 결정:
```python
# 발화자 선택 프롬프트 (간단한 Claude 호출)
speaker_prompt = f"""현재 대화 참여자: {', '.join(persona_names)}
대화 히스토리: {last_5_messages}
직전 발화자: {last_speaker}
각 발화 횟수: {speak_counts}

다음에 가장 자연스럽게 말할 참여자 1명을 선택하세요.
JSON으로 응답: {{"next_speaker": "persona_key", "reason": "한줄이유"}}"""
```
- 모델: claude-haiku-4-5 (비용 절감, 발화자 선택은 단순 판단)
- max_tokens: 50

### 퇴장 시퀀스
```
1. 각 페르소나 퇴장 인사 (짧게, 1문장):
   "<b>⚡ [헤르메스]</b> 수고하셨습니다, 제이회장님."
2. 아누 마무리:
   "단톡 종료합니다. (주제: {topic}, 참여: {N}인, 발화: {total_turns}회)"
3. 세션 로그 저장: memory/daily/에 기록
```

### 세션 상태 파일 (복구용)
경로: `/home/jay/workspace/memory/events/group_chat_session.json`
```json
{
    "active": true,
    "topic": "...",
    "personas": ["hermes", "athena", "thor"],
    "history": [...],
    "last_activity": 1741234567.0,
    "auto_turns": 3,
    "speak_counts": {"hermes": 2, "athena": 1, "thor": 2}
}
```
- 매 발화 후 덤프
- 데몬 재시작 시 이 파일이 있으면 세션 복구

### 에러 핸들링
```python
try:
    response = client.messages.create(...)
except anthropic.RateLimitError:
    time.sleep(2)
    response = client.messages.create(...)  # 1회 재시도
except anthropic.APITimeoutError:
    send_telegram(f"<b>{emoji} [{name}]</b> (잠시 생각 중...)")
    continue  # 다음 발화자로
except Exception as e:
    send_telegram(f"⚠️ 시스템 오류로 단톡을 종료합니다: {str(e)[:100]}")
    end_session()
```

## 검증 항목
1. `python3 group_chat.py &` → 데몬 정상 시작, 트리거 대기 상태
2. 트리거 파일 생성 → 입장 시퀀스 → Telegram 메시지 수신 확인
3. user_input 트리거 → 히스토리 반영 + 대화 이어짐
4. MAX_AUTO_TURNS(6) 도달 시 자동 대기 전환
5. end 트리거 → 퇴장 시퀀스 → 세션 종료
6. 5분 무응답 → 자동 종료
7. API 에러 시 그레이스풀 핸들링 (세션 유지 or 안전 종료)
8. 세션 상태 파일 덤프 + 복구 테스트

## 주의사항
- **bot_settings.json 읽기 전용**. 절대 수정하지 말 것
- `c119085addb0f8b7` 키의 token 필드만 사용 (Bot A)
- Telegram sendMessage에 `chat_id: "6937032012"` 고정
- 페르소나 시스템 프롬프트에 반드시 포함: "2-4문장 이내 짧게", "한국어", "자연스러운 대화체"
- anthropic SDK import 확인: `import anthropic` (서버에 설치됨)
- `.env.keys`의 `ANTHROPIC_API_KEY` 환경변수가 필요. 스크립트 시작 시 `source /home/jay/workspace/.env.keys` 실행하거나 환경변수 확인
- 트리거 파일은 처리 후 반드시 삭제 (중복 처리 방지)
- 시스템 프롬프트에 페르소나 간 호칭 규칙 포함: 유저는 "제이회장님", 다른 페르소나는 이름 직접 호칭

## 파일 변경 범위
- 신규: `/home/jay/workspace/group_chat.py` (약 200~250줄)
- 신규: `/home/jay/workspace/config/personas.json`
- 기존 파일 수정 없음
