# Discord Bridge 딥 디버깅 — 시행착오 기록

- **시간**: 2026-03-08 05:30~07:00
- **Vikunja**: #252 → done, #253 진행중, #251 코멘트 추가

## 시행착오 요약 (소거법)

### ❌ 시도 1: Bot 재시작 불필요
- **가설**: Bot이 죽어서 메시지가 안 간다
- **현실**: Bot은 PID 25508로 정상 동작 중이었음
- **배움**: Bot 프로세스 확인은 `Get-Process -Name python | Select PID,StartTime`

### ❌ 시도 2: 수동 테스트 파일 깨짐 (BOM 인코딩)
- **가설**: Bot이 파일을 안 읽는다
- **현실**: `cmd /c echo {...} > file.json`이 BOM(FF FE) 포함 UTF-16 생성
- **배움**: **테스트 파일은 PowerShell Set-Content -Encoding UTF8 사용**
- **증거**: Bot 로그에 `Expecting property name enclosed in double quotes` 반복

### ❌ 시도 3: getDiagnostics 기반 진단 폴링 무의미
- **가설**: getDiagnostics 데이터로 step 변화를 잡을 수 있다
- **현실**: `getDiagnostics.recentTrajectories.lastStepIndex`가 **실시간 업데이트 안 됨**
- **증거**: POLL#1~#2 모두 `steps=1237 known=0` 고정 (실제 step은 1239+)
- **배움**: **getDiagnostics는 세션 메타데이터용, 실시간 step 추적 불가**

### ❌ 시도 4: SDK EventMonitor 의존 불가
- **가설**: SDK monitor.onStepCountChanged가 실시간 감지
- **현실**: EventMonitor._pollTrajectories()가 getDiagnostics 사용 → stale
- **배움**: **SDK EventMonitor는 실시간 step 추적에 부적합**

### ✅ 최종 해결: rawRPC 직접 폴링
- `GetCascadeTrajectorySteps` rawRPC는 **실시간 step 데이터를 정확히 반환**
- 5초 간격 폴링으로 PLANNER_RESPONSE, NOTIFY_USER, TASK_BOUNDARY, WAITING 릴레이
- `getDiagnostics`는 active session ID 확인 용도로만 (최초 + 60초마다)

## 핵심 교훈

| # | 교훈 | 카테고리 |
|---|------|----------|
| 1 | `cmd /c echo`로 JSON 만들지 마라 (BOM) | Windows |
| 2 | `getDiagnostics.lastStepIndex`는 stale | SDK |
| 3 | SDK EventMonitor는 getDiagnostics 의존 | SDK |
| 4 | `rawRPC('GetCascadeTrajectorySteps')`만 실시간 | SDK |
| 5 | Step control은 `vscode.commands` 사용 | SDK |
| 6 | 분석 문서는 brain이 아닌 프로젝트 docs에 저장 | 프로세스 |

## 참조: `docs/discord-bridge-analysis.md`
