# task-592.1 완료 보고서

## SCQA

**S**: 멀티모델 봇(잼민이/코덱스/클로디)이 3봇 통합 프로세스(main_bot.py)로 운영 중이며, 유저 메시지에 3봇이 동시 응답하고 이전 대화 맥락 없이 독립적으로 답변하는 구조이다.

**C**: 봇 간 응답이 동시에 발생하여 대화가 어지럽고, 이전 맥락을 참조하지 않아 중복/비일관 답변이 발생한다. 각 봇의 차별화된 관점이 드러나지 않는다.

**Q**: 봇이 이전 대화 맥락을 읽고 순차적으로 응답하며, 각 봇의 페르소나를 반영한 "사고 모드"를 구현할 수 있는가?

**A**: ConversationMemory(링 버퍼 20개)로 대화 맥락을 수집하고, "🤔 생각 중..." → 맥락 기반 프롬프트 → edit_message_text 교체 패턴을 구현했다. 라운드 로빈 순차 응답(랜덤 시작점 회전)과 봇별 페르소나(잼민이=실용적, 코덱스=구현 지향, 클로디=균형 분석)를 적용. pytest 110건 전체 통과, pyright 0 에러.

## 구현 내역

### 신규 파일
- `conversation_memory.py` — ChatMessage 데이터클래스 + ConversationMemory 클래스 (deque 링 버퍼), BOT_PERSONAS 페르소나 딕셔너리, format_context() 맥락 프롬프트 생성
- `tests/test_conversation_memory.py` — 20개 테스트 (add/get/format/ring buffer/multi-chat/ordering)
- `tests/test_thinking_mode.py` — 10개 테스트 (thinking 헬퍼/순차 응답/맥락 프롬프트)

### 수정 파일
- `bot_utils.py` — send_thinking_message(), replace_thinking_message() 추가
- `discussion_manager.py` — is_my_turn() 메서드 추가, _start_index로 라운드 로빈 시작점 회전
- `main_bot.py` — ConversationMemory 공유 인스턴스, trigger_next_bot_response에 사고 모드 통합 (thinking msg → format_context → call_fn → replace → memory.add), remaining_turns로 1라운드 후 토론 종료
- `gemini_bot.py` — handle_message에 memory 파라미터, is_my_turn 순차 체크, 사고 모드 로직, memory=None 폴백
- `codex_bot.py` — 동일 패턴 적용
- `claude_bot.py` — 동일 패턴 적용

## 테스트 결과
- pytest: **110 passed** (0.62초)
  - test_bot_logic.py: 23 passed
  - test_config.py: 9 passed
  - test_conversation_memory.py: 20 passed (신규)
  - test_discussion_manager.py: 28 passed
  - test_engine.py: 20 passed
  - test_thinking_mode.py: 10 passed (신규)
- pyright: **0 errors, 0 warnings** (7개 파일)
- black + isort: **포맷 준수** (7개 파일)

## 발견 이슈 및 해결

### 자체 해결 (4건)
1. **test_thinking_mode.py 환경변수 미설정으로 main_bot import 실패** — patch.dict로 환경변수 주입하여 import 문제 해결
2. **라운드 로빈 시작점 고정(항상 gemini 먼저) 문제** — _start_index 도입으로 매 유저 메시지마다 시작 봇 회전 (gemini → codex → claude → gemini → ...)
3. **봇 간 무한 순환 응답 문제** — remaining_turns 카운터로 3봇 1라운드 응답 후 dm.stop_discussion() 호출
4. **유저 메시지 중복 메모리 저장** — is_my_turn 체크 후 턴인 봇만 1회 저장하도록 로직 배치

### 범위 외 미해결 (1건)
1. **test_engine.py에 call_claude 테스트 부재** — 기존부터 없던 테스트. 본 작업 범위(사고 모드 추가) 외.

## QC 검증 결과

```
qc_verify.py --gate: PASS (6 PASS, 3 SKIP, 1 WARN)
pytest: 110/110 passed (0.58s)
pyright: 0 errors, 0 warnings (9개 파일)
black + isort: 포맷 준수
tdd_check: PASS (테스트 2개, 구현 7개)
.done 자동 생성: /home/jay/workspace/memory/events/task-592.1.done
```

WARN 상세: pyright_check에서 테스트 파일의 `str | None` → `str` 타입 불일치 2건 발견 → assert not None 가드 추가로 해결.

## 머지 판단
- **머지 필요**: No (시스템 작업, worktree 미사용)
