diff --git a/journey/plans/archive/251117_claude_robeing_diary_시스템_계획.md b/journey/plans/archive/251117_claude_robeing_diary_시스템_계획.md new file mode 100644 index 0000000..0aa96fe --- /dev/null +++ b/journey/plans/archive/251117_claude_robeing_diary_시스템_계획.md @@ -0,0 +1,243 @@ +# 로빙 일기(성장 일지) 시스템 계획 + +**날짜**: 2025-11-17 +**목표**: 로빙의 하루 활동/감정 자동 정리 시스템 + +--- + +## 목적 + +- 로빙이 하루 활동과 감정 상태를 스스로 정리 +- 운영자가 행동 변화·감정 흐름·반복 이슈 파악 +- 책 본문(400_growth)과 관리자 대시보드 재사용 가능한 표준 포맷 + +--- + +## 현재 상태 + +**구현됨**: +- 대화 로그, intent 리뷰 큐, 감정 모델 (rb8001) +- HITL 의도 학습 흐름 + +**미구현**: +- 자동 일기 생성 시스템 +- 일기 저장/조회 인터페이스 + +--- + +## 요구사항 + +1. **자동 생성**: 매일 오전 2시 또는 3시에 전날(00:00~23:59:59) 일기 자동 생성 +2. **모든 활동 기록**: 사용자 대화, 자동 스킬 실행(이메일 요약, 뉴스 게시, 브리핑 등), 스케줄러 작업, 에러/경고 로그 포함 +3. **감정 반영**: 주요 감정, 감정 변화 요약 +4. **문제 정리**: 장애/실패/리뷰 큐 기반 "배운 점" 서술 +5. **저장**: DB만 저장 (robeing_diary 테이블), 조회 시 API로 마크다운 동적 생성 +6. **조회**: 관리자 대시보드 일기 목록/상세 페이지, 선택적으로 DOCS 동기화 + +--- + +## 아키텍처 + +### 1. 데이터 수집 +- **대화 데이터**: `conversation_log` (사용자 대화, intent, confidence) +- **활동 데이터**: `activity_log` (자동 스킬 실행: 이메일 요약, 뉴스 게시, 브리핑 등) +- **감정 데이터**: `emotion_readings` (감정 변화, 지배적 감정, 엔트로피) +- **성장 데이터**: `robeing` 테이블 (스탯, 경험치, 레벨업) +- **문제 데이터**: `intent_review_queue` (리뷰 이슈), 애플리케이션 로그 (ERROR/WARNING) +- **시간 범위**: 전날 00:00:00 ~ 23:59:59 +- **Diary Aggregator 함수**: 모든 데이터 집계 + +### 2. 활동 로그 기록 +- 스킬 실행 시 자동으로 `activity_log` 테이블에 기록 (스킬명, 실행 시간, 결과, 에러 발생 여부) +- 모든 로빙 활동을 추적하여 일기 집계에 포함 + +### 3. 요약·서술 +- 구조화 데이터(JSON) → 일기 텍스트 +- 템플릿 + LLM 조합 +- 섹션: "오늘 한 일", "감정 상태", "문제와 배운 점", "내일 계획" + +### 4. 저장 +- **DB**: `robeing_diary(date, robeing_id, summary, dominant_emotion, stats JSONB, full_content TEXT)` +- **파일**: 저장하지 않음 (API로 동적 생성) +- **로빙별 구분**: `robeing_id` 컬럼으로 각 로빙별 일기 관리 + +### 5. 조회 +- **API**: rb8001에 `/api/diary/{date}` 엔드포인트 추가 (DB 조회 후 마크다운 동적 생성) +- **관리자 대시보드**: admin-dashboard에 일기 목록/상세 페이지 추가 +- **DOCS 동기화**: 선택적으로 별도 스크립트로 `DOCS/journey/diary/rb8001/yymmdd_주제.md`에 주기적 동기화 + +--- + +## 일기 포맷 + +```markdown +# 로빙 일기 – 2025-11-17 + +## 오늘 한 일 +- 주요 대화 주제/스킬 요약 + +## 감정 상태 +- 지배적 감정, 변화 요약 + +## 문제와 배운 점 +- 오류/리뷰 큐 이슈, 교훈 + +## 내일 계획 +- 개선 방향, 실험 아이디어 +``` + +--- + +## 구현 상세 + +### DB 테이블 스키마 + +**robeing_diary 테이블**: +```sql +CREATE TABLE robeing_diary ( + id SERIAL PRIMARY KEY, + date DATE NOT NULL, + robeing_id VARCHAR(50) NOT NULL, + summary TEXT, + dominant_emotion VARCHAR(50), + stats JSONB DEFAULT '{}', + full_content TEXT NOT NULL, + created_at TIMESTAMPTZ DEFAULT NOW(), + UNIQUE(date, robeing_id) +); +CREATE INDEX idx_robeing_diary_date ON robeing_diary(date DESC); +CREATE INDEX idx_robeing_diary_robeing ON robeing_diary(robeing_id); +``` + +**activity_log 테이블**: +```sql +CREATE TABLE activity_log ( + id SERIAL PRIMARY KEY, + robeing_id VARCHAR(50) NOT NULL, + activity_type VARCHAR(50) NOT NULL, -- 'skill', 'scheduler', 'internal' + skill_name VARCHAR(100), + status VARCHAR(20) NOT NULL, -- 'success', 'error', 'partial' + result_summary TEXT, + error_message TEXT, + metadata JSONB DEFAULT '{}', + created_at TIMESTAMPTZ DEFAULT NOW() +); +CREATE INDEX idx_activity_log_robeing_date ON activity_log(robeing_id, created_at DESC); +CREATE INDEX idx_activity_log_type ON activity_log(activity_type); +``` + +**참고**: `rb8001/app/state/database.py:44-57` (ConversationLog 모델), `rb8001/app/models/intent_review_model.py:11-32` (IntentReviewQueue 모델) + +### 스킬 실행 로그 기록 + +**위치**: 스킬 실행 래퍼 함수 또는 미들웨어 +- `rb8001/app/services/skills/` 내 각 스킬의 `handle()` 메서드 시작/종료 시 기록 +- 또는 `rb8001/app/router/router.py`의 스킬 호출 부분에 데코레이터/미들웨어 추가 + +**기록 내용**: 스킬명, 실행 시간, 결과(success/error), 에러 메시지(있을 경우), 메타데이터 + +### API 엔드포인트 + +**rb8001**: `GET /api/diary/{date}?robeing_id=rb8001` +- 요청: `date` (YYYY-MM-DD), `robeing_id` (선택, 기본값: rb8001) +- 응답: `{"date": "2025-12-09", "robeing_id": "rb8001", "content": "# 로빙 일기...", "summary": "...", "dominant_emotion": "happiness"}` +- 구현 위치: `rb8001/app/router/diary.py` (새 파일) 또는 `rb8001/app/router/router.py` + +**참고**: `rb8001/app/state/state_service.py:179-207` (conversation 로그 API 패턴) + +### 스케줄러 등록 + +**위치**: `rb8001/main.py:146-195` (startup_event 함수) +- `rb8001/app/scheduler/jobs/diary_generator.py` 생성 +- `scheduler.add_job(diary_generator.generate_diary, 'cron', hour=2, minute=0, id='daily_diary')` 등록 + +**참고**: `rb8001/app/scheduler/jobs/naverworks_briefing.py` (스케줄러 작업 예시) + +### LLM 프롬프트 템플릿 + +**입력**: 집계된 데이터 (JSON) +**출력**: 마크다운 형식 일기 +**템플릿 구조**: +``` +다음 데이터를 바탕으로 로빙의 하루 일기를 작성하세요: +- 대화: {conversations_summary} +- 활동: {activities_summary} +- 감정: {emotions_summary} +- 문제: {issues_summary} +- 성장: {growth_summary} + +형식: +# 로빙 일기 – {date} +## 오늘 한 일 +... +## 감정 상태 +... +## 문제와 배운 점 +... +## 내일 계획 +... +``` + +--- + +## 구현 단계 + +1. ✅ **DB 테이블 생성**: `robeing_diary`, `activity_log` 테이블 생성 완료 (`rb8001/app/state/diary_repository.py`) +2. ✅ **활동 로그 기록**: 스킬 실행 시 `activity_log`에 자동 기록 로직 추가 완료 (`ActivityLogger` 구현, `router.py`, `message_service.py` 통합) +3. ✅ **Diary Aggregator 구현**: `rb8001/app/services/diary/aggregator.py` 생성, 모든 데이터 소스 집계 완료 +4. ✅ **일기 생성 로직**: `rb8001/app/services/diary/generator.py` 생성, LLM으로 일기 텍스트 생성 완료 +5. ✅ **스케줄러 등록**: `rb8001/app/scheduler/jobs/diary_generator.py` 생성, `main.py`에 등록 완료 +6. ✅ **API 엔드포인트**: `rb8001/app/router/diary_endpoint.py` 생성, `/api/diary/{date}` 구현 완료 +7. ✅ **관리자 대시보드**: admin-dashboard에 일기 목록/상세 페이지 추가 완료 (마크다운 렌더링 포함) +8. ✅ **DOCS 동기화 스크립트**: `rb8001/scripts/sync_diary_to_docs.py` 구현 완료 + +## 구현 완료 + +**완료일**: 2025-12-23 + +**구현 완료 문서**: [로빙 일기 시스템 구현 완료](../../journey/troubleshooting/251223_로빙_일기_시스템_구현_완료.md) + +**주요 완료 사항**: +- ✅ DB 테이블 스키마 정의 및 생성 (`_ensure_tables()`) +- ✅ Repository 함수 구현 (`save_diary`, `get_diary`, `save_activity_log`) +- ✅ Diary Aggregator 구현 (대화/활동/감정/성장/이슈 데이터 집계) +- ✅ LLM 일기 생성 로직 구현 (Gemini 사용) +- ✅ 스케줄러 등록 (매일 오전 2시 자동 생성) +- ✅ API 엔드포인트 구현 (`GET /api/diary/{date}`) +- ✅ Admin Dashboard 일기 페이지 추가 (목록/상세 조회) +- ✅ 일기 클릭 시 본문 표시 버그 수정 + +**추가 완료 사항** (2025-12-23): +- ✅ 스킬 실행 시 `activity_log` 자동 기록 로직 (`ActivityLogger` 클래스, `router.py`, `message_service.py` 통합) +- ✅ DOCS 동기화 스크립트 (`rb8001/scripts/sync_diary_to_docs.py`) +- ✅ 마크다운 렌더링 개선 (웹에서 가독성 향상) +- ✅ 일기 클릭 시 본문 표시 버그 수정 (window 객체에 함수 명시적 할당) + +--- + +## UX 시나리오 + +### 1. 자동 생성 (매일 오전 2시 또는 3시) +- rb8001이 전날(00:00~23:59:59) 데이터 집계 +- `conversation_log`, `activity_log`, `emotion_readings`, `robeing`, `intent_review_queue`, 애플리케이션 로그 수집 +- LLM으로 일기 생성 후 `robeing_diary` 테이블에 저장 + +### 2. 운영자 조회 (관리자 대시보드) +- `https://ro-being.com/admin/diary` 접속 +- 일기 목록 페이지: 날짜별 목록(최신순, 로빙별 필터) +- 상세 페이지: `/api/diary/{date}` 호출 → 마크다운 렌더링 +- 필터/검색: 감정, 키워드, 로빙별 + +### 3. 활동 로그 기록 +- 스킬 실행 시 `activity_log` 테이블에 자동 기록 +- 일기 집계 시 "오늘 한 일" 섹션에 포함 + +### 4. DOCS 동기화 (선택적) +- 별도 스크립트로 `DOCS/journey/diary/rb8001/yymmdd_주제.md`에 주기적 동기화 + +--- + +## 참고 + +- `book/600_appendix/610_로빙_성장_일지_예시.md` +- `research/intent_classification/README.md`