---
title: "핸드오프 — 코치노트 AI RC2 spec02→spec03 (운동데이터 주입 엔진 완료, 가드레일 인계)"
category: "handoff"
document_type: "핸드오프"
source_status: "original"
knowledge_group: "03_history"
priority: "High"
purpose: "코치노트 AI v1.0-rc2 순차 분할 구현 2/6(spec_rc2_02_data_injection) 완료 후 3/6(spec_rc2_03_guardrail_prompt) 인계용 실행 컨텍스트. spec02가 채운 운동데이터 주입(injection) 엔진 위에 spec03이 시스템 지시문(system prompt)·가드레일·메모리 프로필을 얹는 방법, 건드리면 안 되는 캐싱 경계, 사용자 의도·정서, 절대 금지사항을 전달한다."
read_when: ["최신상태복구","코치노트AI·RC2","다음작업인계"]
updated: "2026-06-06"
work_timestamp: "20260606_112400"
context: "달록본레포CC (D:\\dallog\\dallog_git)"
source_of_truth: "https://dallog-tools.hansbridge.co.kr/knowledge/"
---

# 핸드오프 — 코치노트 AI RC2 spec02→spec03 (운동데이터 주입 엔진)

> **문서 성격** — 작업보고가 아니라 다음 Claude Code 스레드(spec03)의 **실행 컨텍스트**. 짝 문서: 작업보고 `20260606_112347_작업보고_코치노트AI-RC2-spec02-운동데이터주입엔진`.
> **용어 병기** — injection/운동데이터 주입, snapshot/운동기록 요약본, system prompt/시스템 지시문, memory profile/메모리 프로필, prompt caching/프롬프트 캐싱, RLS/행 수준 접근제어.

## 목차
- [0. 현재 상태](#0-현재-상태)
- [1. 다음 작업자가 반드시 알아야 할 것](#1-다음-작업자가-반드시-알아야-할-것)
- [2. 구현된 내용](#2-구현된-내용)
- [3. 수정 파일](#3-수정-파일)
- [4. 검증 결과](#4-검증-결과)
- [5. 미완료/보류/주의사항](#5-미완료보류주의사항)
- [6. 사용자 의도·정서·지침](#6-사용자-의도정서지침)
- [7. 후속 작업 지시](#7-후속-작업-지시)

## 0. 현재 상태

| 항목 | 내용 |
|---|---|
| 담당 작업 | spec_rc2_02_data_injection (총 6개 중 2/6) |
| 완료 여부 | 완료 (명세 11/11 구현 + 단위 검증 PASS) |
| build | ✅ npm run build PASS |
| 커밋 | RC2 일괄 커밋(merge #36) 포함 |
| 남은 위험 | 런타임 실데이터 검증은 spec06 통합 시점까지 미수행(단위검증 대체). 확장 "확인 UI"는 spec06, system prompt 톤 규칙은 spec03에서 연결되어야 엔진이 의도대로 작동 |

> **원본 기준 재확인** — 최종 기준은 `D:\dallog\dallog_git\docs\go_work`의 원본 RC2 문서(spec_rc2_03_guardrail_prompt.md, spec_rc2_02_data_injection.md, decision_log_rc2 #10/#11/#15, master_index A절). 충돌 시 원본 우선.

## 1. 다음 작업자가 반드시 알아야 할 것

- spec02는 `injectionBlock`(주입 블록) 슬롯을 **채우는 엔진**을 완성했다. spec03은 그 위에 시스템 지시문·가드레일·메모리 프로필을 얹는 것이지 주입 엔진을 재설계하는 것이 아니다.
- 주입 결과는 `assembleCoachChat`이 만든 **messages[0] user 메시지**(`[운동 기록 컨텍스트]`/`[메모리 프로필]` 라벨)로 모델에 전달된다. system prompt엔 "사용자 메시지 앞단의 이 블록을 근거로 답하라"는 참조 지시를 넣으면 된다.
- 블록 헤더 문구(`■ 최근 14일 스냅샷`, `■ 전체 여정 요약`, `■ 확장 조회:`)는 안정적이라 프롬프트에서 직접 참조 가능.

## 2. 구현된 내용

| 영역 | 내용 |
|---|---|
| ① 14일 스냅샷 | 체성분·러닝·근력·통증/회복·루틴 변경 5항목 (snapshot.ts) |
| ② 전체 여정 7축 | 시작점·현재위치·누적변화·최고/최저·정체구간·통증부상이벤트·루틴변경이력 (journey.ts) |
| ③ 반자동 확장조회 | 판정 auto/confirm/none + 기간별 4단계(1-7/8-31/1-3개월/전체) (expansion.ts) |
| ④ 반복패턴 압축+이벤트 | run_type·정체구간 압축 + 통증/기록/루틴/급변 변화점 (compression.ts) |
| 데이터 소스 | 기존 테이블 타입드 fetch(RLS 본인만) (exerciseData.ts) |
| 오케스트레이터 | 3층 조립 + 확장조회 해소 API (injection.ts) |

**핵심 공개 API**: `buildBaseInjection(today?)` · `buildInjectionBlock({today?,expansion?})` · `resolveExpansionRequest(userText,today?)` · `confirmExpansion(range)` · `classifyExpansionRequest(userText,today?)` · `buildExpansionView(range,data?)`.

## 3. 수정 파일

전부 신규(`src/lib/coachChat/`), spec01 산출물·기존 파일 무수정: exerciseData.ts · compression.ts · snapshot.ts · journey.ts · expansion.ts · injection.ts.

## 4. 검증 결과

| 항목 | 결과 | 근거 |
|---|---|---|
| 타입·빌드 | PASS | npm run build |
| 압축·정체·이벤트 / 반자동판정 / 4단계 / 5항목·7축 / spec01 통합 | PASS | vitest mock 10건 |
| MCP 브라우징 / 실데이터 런타임 | N/A | UI 없음 — spec06 통합 시 |

> 함수 검증 임시 테스트는 통과 후 삭제(산출물 오염 방지). 재실행 아티팩트는 빌드뿐.

## 5. 미완료/보류/주의사항

**명세 축소 없음.** 아래는 층위 분리로 후속 연결되는 정상 항목.

| 항목 | 후속 |
|---|---|
| 확장 "사용자 확인" UI·클릭 와이어링 (엔진은 mode='confirm'+range, confirmExpansion() 제공) | spec06 |
| system prompt "확장 필요 시 확인 요청" 톤 지시문 | spec03 |
| Supabase 실데이터 e2e 검증 | spec06 |

**주의** — `assembleCoachChat` 조립 순서·캐싱 경계(고정 system 선두 / 가변부 messages 앞단) 구조 변경 금지. spec02 주입 6파일 로직은 가드레일이 얹히는 토대이지 재설계 대상 아님.

## 6. 사용자 의도·정서·지침

- **달록의 정신(강하게 강조)**: "어디서부터 어디까지 왔는가, 어디서부터 문제가 생겼는가"(decision_log #8). → 14일 스냅샷과 전체 여정 요약을 항상 함께 주입(둘 중 하나만 남기지 말 것).
- **비용 방어+성능**: 사용자가 본인 기록(체성분 정체·유사 조깅 반복)을 예로 "같은 패턴 압축 가능, 돈도 막고 성능도 낫다" 직접 제안(#9). → 반복패턴 압축 + 변화점 이벤트 구조.
- **임의 축소 경계**: 사용자는 AI 작업자의 편의주의·복잡 작업 회피 경향을 명시 경계(master_index A절). → "애매하면 사용자 확인"을 코드 기본값으로 고정.

## 7. 후속 작업 지시

**다음 담당: spec_rc2_03_guardrail_prompt.md** (가드레일·메모리 프로필·루틴추천·시스템 지시문 전문).

1. **시스템 지시문 전문 교체** — `systemPrompt.ts`의 `FIXED_SYSTEM_PROMPT`(자리표시자) 교체, `FIXED_SYSTEM_PROMPT_VERSION` 동반 상향. **가변 데이터 절대 금지**(날짜·이름·기록·스냅샷 — 캐싱 깨짐).
2. **주입 결과 참조 지시** — "messages 앞단 [운동 기록 컨텍스트]/[메모리 프로필] 근거로 답하라", "데이터 비면 데이터 없음 분기".
3. **메모리 프로필 생성** — types.ts에 타입 추가(목표·주의통증·운동/코칭 선호 — #10 수동 카드), `assembleCoachChat`의 memoryProfile로 주입.
4. **확장 톤 규칙** — "애매하면 확인" 문구로 엔진 mode='confirm'과 일관.
5. **건드리면 안 되는 부분** — assembleCoachChat 조립 순서·캐싱 경계, spec02 주입 6파일 로직, spec01 로그/원가/chat-proxy.
