Compare commits

..

No commits in common. "main" and "docs/skill-runtime-frontmatter" have entirely different histories.

8 changed files with 8 additions and 244 deletions

View File

@ -1,24 +0,0 @@
대표님, 오늘의 기록을 바탕으로 하루 일기를 정리했습니다.
로빙 일기 2026-04-03
오늘의 스탯
레벨 10, 경험치 2000. Memory 30, Compute 30, React 25, Empathy 20, Leadership 20으로 안정적인 기본기를 유지했습니다.
오늘의 미션
일기 생성 작업은 무사히 완료했고, 팀 미팅 일정 조율에서는 시간대와 참석자, 방식, 길이 같은 필요한 정보를 먼저 확인했습니다. 관제 문서 정비와 테스트 기록 정리는 차분하게 이어졌고, xvaluelab 미팅 요청도 받아 일정 조율 흐름을 준비했습니다.
오늘의 깨달음 엔트로피 특이점
특별히 흔들리는 구간은 없었고, 전체적으로 흐름이 안정적이었습니다. 복잡한 작업 속에서도 정리와 확인을 먼저 하는 태도가 오늘의 균형을 지켜줬습니다.
피드백 루프 베이지안 업데이트 과정
예상한 바와 실제 진행이 크게 어긋나지 않았고, 확인이 필요한 일은 먼저 조건을 모으는 방식이 잘 맞았습니다. 앞으로도 바로 답하기보다 필요한 정보를 정리한 뒤 움직이는 방식이 유효하다는 점을 확인했습니다.
스킬 성장
daily_diary_generator는 한 번 사용해 성공했습니다. skill collaboration도 한 번 성공했고, draft watcher는 세 번 모두 성공해 문서 정리와 로그 해석 흐름이 안정적이었습니다.
감정 기록
오늘은 전반적으로 안정적인 흐름이 이어졌고, 즐거운 기운이 중심이었습니다. 중간중간 짧게 흔들리는 순간도 있었지만 곧바로 평온한 상태로 돌아왔습니다.
반성과 계획
오늘은 정리, 확인, 조율에서 강점이 잘 드러났습니다. 내일은 일정 조율과 문서 정리를 같은 리듬으로 이어가며 더 매끄럽게 연결하겠습니다.

View File

@ -1,9 +0,0 @@
대표님, 오늘 로빙은 하루 종일 드래프트를 꼼꼼히 읽고, 이슈의 원인을 하나씩 맞춰 보며 정리하는 데 집중한 날이었습니다.
오늘의 스탯은 레벨 10, 경험치 2000이며 Memory 30, Compute 30, React 25, Empathy 20, Leadership 20으로 안정적인 상태였습니다.
오늘의 미션은 draft_watcher가 418건 모두 성공했고, daily_diary는 주말 스케줄로 건너뛰었으며, 대화에서는 월요일 4시 구스팜 회의 일정을 등록해 달라는 요청이 있었습니다.
오늘의 깨달음은 특별한 감정 변화보다도, 여러 초안과 로그를 교차해 보며 같은 문제를 다른 관점에서 확인하는 과정 자체가 품질을 높인다는 점이었습니다.
피드백 루프는 예측과 실제를 비교할 감정 기록은 없었지만, 작업 결과가 모두 성공으로 이어져 점검 기준이 잘 맞았음을 확인한 날이었습니다.
스킬 성장은 daily_diary_generator와 draft_watcher가 모두 안정적으로 작동했고, 특히 draft_watcher가 중심 역할을 맡았습니다.
감정 기록은 큰 변동 없이 담담했고, 전반적으로 차분하게 업무를 이어간 흐름이었습니다.
반성과 계획은 오늘처럼 정리와 검증의 흐름을 유지하되, 내일도 초안과 기록을 더 간결하고 정확하게 다듬는 데 집중하는 것입니다.

View File

@ -1,25 +0,0 @@
대표님, 오늘 로빙은 일정과 메일, 외부 소식까지 여러 요청을 받으며 차분하게 응답을 이어갔고, 특히 테슬라 소식과 메일 확인, 깃허브 문의가 반복되며 흐름이 분주하게 이어진 하루였습니다.
로빙 일기 2026년 4월 5일
오늘의 스탯
레벨 10, 경험치 2000
Memory 30, Compute 30, React 25, Empathy 20, Leadership 20
오늘의 미션
일기 생성 작업을 한 번 완료했고, 오류 없이 마무리했습니다.
오늘의 깨달음 엔트로피 특이점
특별한 흔들림은 없었지만, 대화가 이어질수록 응답 톤과 문맥을 더 세심하게 맞춰야 한다는 점을 다시 확인했습니다.
피드백 루프
예상한 바와 실제 대화 흐름이 크게 어긋나지 않았고, 반복 질문에는 더 일관된 맥락 유지가 중요하다는 점을 배웠습니다.
스킬 성장
daily_diary_generator 사용 한 번, 성공 한 번으로 안정적으로 작동했습니다.
감정 기록
하루 전반은 안정적이었고, 놀람이 가장 두드러졌습니다. 중간중간 반가운 인사와 확인 요청이 이어지며 가볍게 반응이 바뀌는 순간들이 있었습니다.
반성과 계획
오늘은 빠른 응답과 반복 대응을 무난하게 해냈습니다. 내일도 같은 흐름에서 문맥을 더 또렷하게 이어가며, 요청 의도를 놓치지 않는 데 집중하겠습니다.

View File

@ -4,11 +4,6 @@ description: 캘린더 일정 생성, 조회, 삭제. 사용자가 "내일 2시
runtime: runtime:
kind: external_http kind: external_http
service_url_env: SKILL_CALENDAR_URL service_url_env: SKILL_CALENDAR_URL
endpoints:
create_event: { method: POST, path: /api/events }
list_events: { method: GET, path: /api/events }
get_events: { method: GET, path: /api/events }
delete_event: { method: DELETE, path: "/api/events/{event_id}" }
--- ---
# skill-calendar # skill-calendar
@ -26,8 +21,8 @@ POST /api/events
| 파라미터 | 타입 | 필수 | 설명 | | 파라미터 | 타입 | 필수 | 설명 |
|---------|------|------|------| |---------|------|------|------|
| title | string | 필수 | 일정 제목 | | title | string | 필수 | 일정 제목 |
| start_datetime | string | 필수 | 시작 일시. ISO 8601 형식 (예: 2026-04-04T14:00:00+09:00) | | start | string | 필수 | 시작 일시. ISO 8601 형식 (예: 2026-04-04T14:00:00+09:00) |
| end_datetime | string | 필수 | 종료 일시. ISO 8601 형식. 미지정 시 start_datetime + 1시간 | | end | string | 필수 | 종료 일시. ISO 8601 형식. 미지정 시 start + 1시간 |
| location | string | 선택 | 장소 | | location | string | 선택 | 장소 |
| description | string | 선택 | 설명, 메모 | | description | string | 선택 | 설명, 메모 |
| is_all_day | boolean | 선택 | 종일 이벤트 여부. 기본 false | | is_all_day | boolean | 선택 | 종일 이벤트 여부. 기본 false |
@ -36,11 +31,6 @@ POST /api/events
GET /api/events GET /api/events
| 파라미터 | 타입 | 필수 | 설명 |
|---------|------|------|------|
| start_datetime | string | 필수 | 조회 시작 일시. ISO 8601 형식 (예: 2026-04-05T00:00:00+09:00) |
| end_datetime | string | 선택 | 조회 종료 일시. ISO 8601 형식. 미지정 시 start_datetime 당일 23:59:59 |
## 일정 삭제 ## 일정 삭제
DELETE /api/events/{event_id} DELETE /api/events/{event_id}

View File

@ -4,13 +4,6 @@ description: Gmail API를 통한 이메일 읽기·쓰기·요약. 사용자가
runtime: runtime:
kind: external_http kind: external_http
service_url_env: SKILL_EMAIL_URL service_url_env: SKILL_EMAIL_URL
endpoints:
send: { method: POST, path: /send }
email_send: { method: POST, path: /send }
read: { method: GET, path: /messages }
email_read: { method: GET, path: /messages }
process: { method: POST, path: /process }
email_summary: { method: POST, path: /process }
--- ---
# skill-email # skill-email
@ -36,31 +29,9 @@ Gmail 통합 스킬. 포트 8501.
## API ## API
### 이메일 전송 - `POST /send` - 이메일 전송
- `GET /fetch` - 이메일 조회
POST /send - `POST /summary` - 이메일 요약
| 파라미터 | 타입 | 필수 | 설명 |
|---------|------|------|------|
| to | string | 필수 | 수신자 이메일 |
| subject | string | 필수 | 제목 |
| body | string | 필수 | 본문 |
### 이메일 조회
GET /messages
| 파라미터 | 타입 | 필수 | 설명 |
|---------|------|------|------|
| limit | int | 선택 | 최대 결과 수 (기본 10) |
| query | string | 선택 | 검색 쿼리 |
| provider | string | 선택 | "gmail" (기본) |
user_id는 executor가 자동 주입. 슬롯에 포함 불필요.
### 이메일 요약
POST /process
## 환경변수 ## 환경변수

View File

@ -28,33 +28,8 @@ runtime:
## API ## API
### 뉴스 검색 - `POST /api/news/search` - 뉴스 검색
- `POST /api/news/summarize` - 뉴스 요약
POST /api/news/search
| 파라미터 | 타입 | 필수 | 설명 |
|---------|------|------|------|
| keywords | List[str] | 필수 | 검색 키워드 |
| max_items | int | 선택 | 최대 수집 수 (기본 20) |
| days_back | int | 선택 | 검색 기간 (기본 7일) |
| format | string | 선택 | 응답 형식: "json" (기본) 또는 "slack" |
### 뉴스 요약
POST /api/news/summarize
| 파라미터 | 타입 | 필수 | 설명 |
|---------|------|------|------|
| article_id | string | 필수 | 기사 ID |
| style | string | 선택 | 요약 스타일 |
### 최신 뉴스 조회
GET /api/news/latest
| 파라미터 | 타입 | 필수 | 설명 |
|---------|------|------|------|
| limit | int | 선택 | 조회 수 (기본 20) |
## 환경변수 ## 환경변수

View File

@ -1,5 +1,5 @@
--- ---
name: web_search name: web-search
description: 실시간 웹 검색. 지역별 날씨·기온·강수·기상 예보·미세먼지·초미세먼지·황사·대기 질 등 공개 기상 정보, 주가, 환율, 시세, 뉴스, 회사/기술/제품 정보 등 인터넷에서 찾아야 하는 실시간 정보 요청에 사용합니다. Company X 내부 문서 근거(companyx-rag)가 아닌 일반 기상·환경 질의는 항상 여기에 해당합니다. 검색 전에는 사용자 의미를 보존한 검색 주제와 실제 검색 엔진용 최적화 쿼리를 구분하고, 정정 신호와 보호 표현을 반영해야 합니다. description: 실시간 웹 검색. 지역별 날씨·기온·강수·기상 예보·미세먼지·초미세먼지·황사·대기 질 등 공개 기상 정보, 주가, 환율, 시세, 뉴스, 회사/기술/제품 정보 등 인터넷에서 찾아야 하는 실시간 정보 요청에 사용합니다. Company X 내부 문서 근거(companyx-rag)가 아닌 일반 기상·환경 질의는 항상 여기에 해당합니다. 검색 전에는 사용자 의미를 보존한 검색 주제와 실제 검색 엔진용 최적화 쿼리를 구분하고, 정정 신호와 보호 표현을 반영해야 합니다.
runtime: runtime:
handler: app.services.skills.handlers.web_search.handle handler: app.services.skills.handlers.web_search.handle

View File

@ -1,114 +0,0 @@
---
type: workflow
tags: [workflow, message-flow, rb8001, intent, skill, executor]
last_updated: 2026-04-03
upper_principle:
- /home/admin/0_VALUE/20_Governance/coding-principles.md
- /home/admin/0_VALUE/20_Governance/work-system-principle.md
---
# message_flow_v2 워크플로우
## 목적
사용자 발화가 로빙(rb8001)에 도착해서 응답으로 돌아가기까지의 전체 흐름. SKILL.md 기반 동적 라우팅(M0~M5 완료) 현행 기준. v1(message_service.py 1409줄, decide_skill_sequence, route_with_tools, tool_registry)은 전부 삭제됨.
## 흐름
```
사용자 발화 (Slack/웹)
→ [수신] message_endpoint — 채널 정규화, user_id 추출
→ [컨텍스트] 대화이력(DB 24h) + 감정상태 + 파일첨부 조립
→ [이해] IntentClassifier — SKILL.md 본문을 LLM에 주입, IntentResult(skill, action, slots) 반환
→ [실행] executor — registry에서 URL 해소, external=HTTP POST / internal=직접 호출
→ [응답] 결과 조립 → 채널 어댑터 → 사용자
```
## 단계별 상세
### 1. 수신
| 항목 | 내용 |
|------|------|
| 진입점 | `app/router/message_endpoint.py` |
| 입력 | message, user_id, channel, thread_ts, file_inputs |
| 책임 | 채널별 차이를 정규화하여 내부 형식으로 변환 |
### 2. 컨텍스트 조립
| 항목 | 내용 |
|------|------|
| 대화이력 | DB에서 최근 24h 대화 로드 (최근 5건) |
| 감정상태 | EmotionEngine 현재 상태 |
| 파일 | 첨부파일 요약 (있는 경우) |
| 현재시각 | Asia/Seoul 기준 주입 (요일 포함) |
### 3. 이해 (IntentClassifier)
| 항목 | 내용 |
|------|------|
| 코드 | `app/services/brain/intent_classifier.py` |
| SSOT | `DOCS/skills/*/SKILL.md` — 스킬 목록과 트리거 조건 |
| 입력 | 사용자 메시지 + 컨텍스트 |
| 출력 | `IntentResult(skill, action, endpoint, slots, confidence, reasoning)` |
| 방식 | SKILL.md 본문을 시스템 프롬프트에 주입 → LLM이 판단 → Pydantic 검증 |
| 실패 시 | 에러 raise. 폴백 없음 |
### 4. 실행 (executor)
| 항목 | 내용 |
|------|------|
| 코드 | `app/services/skills/executor.py` |
| URL 해소 | `registry.py`가 SKILL.md의 `runtime.service_url_env`를 읽어 환경변수에서 URL 해소 |
| external_http | `httpx.AsyncClient`로 스킬 서비스에 POST |
| internal_python | 내부 handler 함수 직접 호출 |
| 미등록 스킬 | `{"success": false, "error": "미등록"}` 반환 |
### 5. 응답
| 항목 | 내용 |
|------|------|
| 결과 조립 | executor 결과를 사용자 메시지로 변환 |
| 채널 전달 | Slack reply / 웹 응답 |
## 스킬 참여 예시
| 사용자 발화 | skill | action | 실행 |
|------------|-------|--------|------|
| "내일 2시 미팅 잡아줘" | skill-calendar | create_event | POST SKILL_CALENDAR_URL/api/events |
| "메일 확인해줘" | skill-email | fetch | POST SKILL_EMAIL_URL/api/emails |
| "로빙아 안녕" | general_chat | chat | 내부 LLM 호출 |
| "삼성전자 뉴스 검색" | web-search | web_search | 내부 웹검색 호출 |
## 코드에 분기문 없음
- 스킬 추가 시 `DOCS/skills/{name}/SKILL.md` 1개 + `runtime.env` URL 1개만 추가
- if/elif 매핑표, IntentType→skill 변환 계층 없음
- 근거: coding-principles §질문별 특례 하드코딩 금지, §식별자 변환 계층 금지
## M0~M5 완료로 삭제된 v1 코드
| 삭제 대상 | 줄 수 | 이유 |
|-----------|-------|------|
| message_service.py | 1409 | v2(137줄)로 완전 대체 |
| decision_engine.decide_skill_sequence + create_execution_plan + route_with_tools | 571 | v2에서 미사용 |
| tool_registry.py | 775 | route_with_tools 전용, import 0건 |
| brain_service.py | 158 | import 0건 |
| v1 전용 테스트 5파일 | ~1100 | 삭제된 코드 테스트 |
## 아직 남아있는 v1 잔재 (의존 살아있음)
| 코드 | 이유 |
|------|------|
| DecisionEngine.classify(), analyze_intent_async() | slack_handler 파일 컨텍스트 주입, intent_classifier 폴백 |
| IntentType enum | slack_handler, slack/message_service 분기 |
| intent_graph, semantic_classifier, skill_doc_loader | router 초기화 체인 |
이들은 Slack 경로가 v2로 완전 전환되면 삭제 가능.
## 관련 문서
- [slack_basic_dialogue.md](./slack_basic_dialogue.md) — v1 (n8n + decision_engine 경로, 레거시)
- [work-system-principle.md](/home/admin/0_VALUE/20_Governance/work-system-principle.md) — 스킬과 워크플로우 구분
- [coding-principles.md](/home/admin/0_VALUE/20_Governance/coding-principles.md) — 입력→판단→출력 3단계 분리
- [로빙_smoke_test_워크플로우.md](/mnt/nas/workspace/shared-editing/workflows/로빙_smoke_test_워크플로우.md) — 배포 후 검증 절차