# rb8001 캘린더 조회/생성 의도 경계 FastPath 수정

**날짜**: 2025-12-09
**작성자**: Claude
**관련 파일**: `rb8001/app/services/brain/decision_engine.py:380-470`

---

## 문제 상황

- 사용자 발화가 조회·생성을 함께 암시하는 경우에도 FastPath 정규식이 한쪽 intent로 강하게 고정되면서 UX가 어색했다.
  - 예: `"로빙아 내 구글 캘린더에 내일 12시 교육 일정 추가해줘."`가 `calendar_query`로 분류되거나,  
    `"이번 주 일정 정리해서 보여주고, 안 잡힌 시간에 회의 하나 넣어줘."`가 단일 intent로만 처리됨.
- 상위 설계(3단계 의도 아키텍처, 하이브리드 의도 분석, HITL 리뷰 큐)는 존재하지만,
  캘린더 FastPath(DecisionEngine) 레벨에서 조회/생성/삭제 경계가 충분히 정제되어 있지 않았다.

---

## 해결 방안

- FastPath에서 캘린더 관련 intent(CALENDAR_DELETE, CALENDAR_QUERY, CALENDAR_EVENT)를 별도 분기 처리하도록 수정.
  - 삭제 패턴(CALENDAR_DELETE)은 항상 최우선으로 처리.
  - 조회/생성 패턴이 둘 다 매칭되는 혼합 문장은 추가 규칙으로 분기.
- 조회/생성 혼합 문장에 대한 UX 기준을 명시:
  - `"없으면"`, `"필요하면"`이 포함된 경우: **먼저 조회(intent=calendar_query)** 후 필요 시 생성하는 흐름으로 간주.
  - `"등록해줘"`, `"추가해줘"`, `"넣어줘"`, `"잡아줘"` 등 명령형 생성 표현만 있는 경우: **생성(intent=calendar_event)** 우선.
  - 그 밖의 혼합 문장은 기본적으로 조회(intent=calendar_query)로 처리.
- 캘린더 외 intent는 기존 intent_patterns 순서를 그대로 유지하되,
  캘린더 세 가지 intent는 공통 분기 후 다른 intent와 독립적으로 처리.

### 수정 위치

- 의도 판정 로직 확장: `rb8001/app/services/brain/decision_engine.py:399-470`
  - 기존 `priority_intents = [CALENDAR_DELETE, CALENDAR_QUERY]` 루프 제거.
  - `calendar_delete_match`, `calendar_query_match`, `calendar_event_match`를 별도로 계산하고,
    혼합 케이스에서 조건부/생성 키워드를 기준으로 분기.
  - 이후 일반 intent 패턴 루프에서는 캘린더 intent 세 종류를 건너뛰도록 변경.

---

## 구현 결과

- UX 시나리오 20개를 기준으로 한 TDD 테스트 추가 (로컬 전용):
  - 파일: `rb8001/tests/test_calendar_intent_overlap_tdd.py` (gitignore로 인해 리포지토리에는 포함하지 않음)
  - 검증 범위:
    - 순수 조회 문장: `calendar_query`
    - 명시적 생성 문장: `calendar_event`
    - `"없으면 잡아줘"`, `"필요하면 등록해줘"` 형태 혼합 문장: 기본 `calendar_query` (조회 우선)
    - 삭제/정리 문장: `calendar_delete`
- 위 20개 케이스는 모두 DecisionEngine FastPath에서 기대 intent로 분류됨을 확인.
- `rb8001` 리포지토리에 변경 사항 커밋/푸시 후, Gitea Actions 자동 배포를 통해 51124 서버의 rb8001 컨테이너가 재시작되었음을 `docker ps | grep rb8001`로 검증.

---

## 교훈

- 상위 설계(3단계 의도 파이프라인, 하이브리드 의도 분석, HITL 리뷰 큐)만으로는
  FastPath 정규식이 만드는 UX 문제를 막기 어렵다. 캘린더처럼 사용자 기대가 명확한 도메인에 대해서는
  FastPath 레벨에서도 조회/생성/삭제 경계를 명시적으로 설계해야 한다.
- 계획 문서에는 ActionPlanner/SkillSelector·clarify·HITL까지 포함된 전체 작업이 적혀 있었지만,
  실제 1차 배포에서는 **FastPath 캘린더 분기**만 안전하게 적용하는 식으로 단계를 나누는 것이 리스크 관리에 도움이 된다.
- TDD 방식으로 “문장 → 기대 intent”를 먼저 고정해 두면,
  이후 ActionPlanner/SkillSelector·clarify·HITL를 추가로 도입하더라도
  기존 캘린더 UX를 깨지 않고 개선 여부를 안정적으로 검증할 수 있다.

