# 작업: 집단지성 토론 수렴 메커니즘 구현

## 배경
현재 집단지성 채팅(3봇: Gemini/Codex/Claude)은 멀티라운드 토론이 가능하지만, 구조적으로 합의에 도달할 수 없는 문제가 있다.

### 현재 문제점
1. **컨텍스트 한계**: `get_context(limit=10)` — 최근 10개 메시지만 봄. 50분 토론(~45메시지)이면 3라운드 전 내용 소실
2. **수렴 메커니즘 없음**: "새로운 관점을 제시해라" 프롬프트만 있어 발산만 계속
3. **Phase 없음**: 시간 지정해도 마지막까지 동일 패턴으로 대화

## 구현 항목 (3가지)

---

### 1. 컨텍스트 확장 + 롤링 서머리

#### 1-1. get_context limit 확장
- `/home/jay/workspace/services/multimodel-bot/conversation_memory.py` line 307
- `get_context(limit=10)` → `get_context(limit=30)` 으로 변경
- format_context 호출부도 확인하여 일관되게 적용

#### 1-2. 롤링 서머리 (핵심 기능)
매 3라운드(9메시지)마다 자동으로 지금까지의 토론을 요약하여 컨텍스트에 포함.

**구현 위치**: `conversation_memory.py`에 새 메서드 추가

```python
async def generate_rolling_summary(self, chat_id: int) -> str:
    """현재 세션의 전체 메시지를 요약하여 롤링 서머리 생성.

    Claude CLI를 호출하여 요약 생성.
    결과를 self._rolling_summaries[chat_id]에 저장.
    """
```

**트리거 위치**: `main_bot.py`의 `trigger_next_bot_response()` 내부
- `DiscussionManager`에 라운드 카운터 추가 (3봇 응답 = 1라운드)
- 라운드 카운터가 3의 배수일 때 롤링 서머리 생성
- 서머리는 메모리 내 dict에 보관 (파일 저장 불필요)

**format_context에 반영**:
```python
def format_context(self, chat_id, bot_username, current_message=""):
    # 기존 요약 (이전 세션)
    # + 롤링 서머리 (현재 토론 압축) ← 새로 추가
    # + 최근 30개 메시지
    # + 현재 질문
    # + 페르소나 + Phase별 지시
```

---

### 2. Phase 자동 전환 (발산 → 수렴 → 합의)

#### DiscussionManager에 Phase 계산 추가

`/home/jay/workspace/services/multimodel-bot/discussion_manager.py`

```python
class DiscussionPhase(str, Enum):
    DIVERGE = "diverge"      # 발산: 새로운 관점 제시
    CONVERGE = "converge"    # 수렴: 공통점 정리, 이견 좁히기
    CONSENSUS = "consensus"  # 합의: 합의문 작성

def get_current_phase(self, chat_id: int) -> DiscussionPhase:
    """현재 토론 Phase를 시간 비율로 계산.

    시간 지정 모드 (duration_minutes != None):
      - 0~60%: DIVERGE
      - 60~90%: CONVERGE
      - 90~100%: CONSENSUS

    idle 모드 (duration_minutes == None):
      - 라운드 1~3: DIVERGE
      - 라운드 4~6: CONVERGE
      - 라운드 7+: CONSENSUS
    """
```

#### Phase별 프롬프트 지시

`format_context()`에서 Phase에 따라 다른 지시를 주입:

```python
PHASE_PROMPTS = {
    "diverge": "새로운 관점과 아이디어를 자유롭게 제시하라. 다른 참여자의 의견에 동의할 필요 없다.",
    "converge": "지금까지 논의에서 공통점을 먼저 정리하라. 이견이 있는 부분만 간결하게 언급하라. 새로운 주제를 꺼내지 마라.",
    "consensus": "최종 합의문을 작성하라. 형식: [합의사항] 모두가 동의한 내용 / [미합의] 이견이 남은 부분 / [다음 단계] 추가 논의가 필요한 항목. 새로운 의견 제시 금지."
}
```

---

### 3. 토론 종료 시 자동 합의문 생성

토론이 종료될 때 (시간 만료 또는 idle) 자동으로 전체 대화를 합의문으로 정리.

**구현 위치**: `main_bot.py`의 `trigger_next_bot_response()`에서 `on_bot_response()`가 None 반환 시

```python
if next_next is None:
    # 토론 종료 → 합의문 자동 생성
    consensus = await generate_consensus_report(chat_id, memory)
    await app.bot.send_message(chat_id=chat_id, text=consensus)
```

**합의문 생성 함수**:
```python
async def generate_consensus_report(chat_id: int, memory: ConversationMemory) -> str:
    """전체 대화 내용을 분석하여 합의문 생성.

    Claude CLI를 호출하여 다음 형식으로 생성:
    📋 토론 합의문

    [주제]: ...
    [참여]: 잼민이(Gemini), 코덱스(GPT), 클로디(Claude)
    [시간]: X분, Y라운드

    ✅ 합의사항:
    1. ...
    2. ...

    ⚠️ 미합의:
    1. ...

    📌 다음 단계:
    1. ...
    """
```

---

## 수정 대상 파일
1. `/home/jay/workspace/services/multimodel-bot/conversation_memory.py`
   - `get_context()` limit 10→30
   - `generate_rolling_summary()` 메서드 추가
   - `format_context()` 수정: 롤링 서머리 + Phase 프롬프트 포함
2. `/home/jay/workspace/services/multimodel-bot/discussion_manager.py`
   - `DiscussionState`에 `round_count` 필드 추가
   - `get_current_phase()` 메서드 추가
   - `on_bot_response()`에서 라운드 카운트 업데이트
3. `/home/jay/workspace/services/multimodel-bot/main_bot.py`
   - `trigger_next_bot_response()`에서 롤링 서머리 트리거 + 토론 종료 시 합의문 생성

## 주의사항
- 롤링 서머리 생성에 `call_claude()`를 사용하되, 짧은 프롬프트로 빠르게 (요약 전용)
- 기존 `/정리` 커맨드와 롤링 서머리는 별개 (롤링은 토론 중 자동, /정리는 수동)
- Phase 프롬프트는 기존 페르소나 프롬프트에 **추가**하는 것 (대체 아님)
- 합의문은 토론 종료 시 그룹챗에 자동 전송
- 봇 재시작 필요 (완료 후 보고서에 명시)
- `format_context()`의 Phase 프롬프트 적용 시, `DiscussionManager` 인스턴스를 `ConversationMemory`에 전달하거나, `format_context()` 시그니처에 phase 파라미터 추가

## 테스트 방법
1. "5분동안 인슈위키 토론하자" 입력
2. Phase 전환 확인: 0~3분 발산 → 3~4.5분 수렴 → 4.5~5분 합의
3. 롤링 서머리가 3라운드 후 생성되는지 로그 확인
4. 5분 후 자동 합의문이 그룹챗에 전송되는지 확인
5. 시간 미지정 ("토론하자")에서도 Phase 전환 작동 확인

## 산출물
- 보고서: `/home/jay/workspace/memory/reports/task-609.1.md`
