---
title: "작업보고 — 코치노트 AI RC2 spec03 가드레일·시스템 지시문·메모리 프로필"
category: "workreport"
document_type: "작업보고"
source_status: "generated"
knowledge_group: "03_history"
priority: "High"
purpose: "코치노트 AI(운동기록 기반 유료 AI 코치) RC2 6분할 중 3/6(guardrail_prompt) 구현 기록. AI 코치의 정체성·안전 경계·데이터 활용 규칙을 고정 system prompt(시스템 지시문)로 확정. 가드레일 4종+포괄 안전 원칙, 루틴 추천+기록 기반 단서+과잉 안전주의 억제, Phase0 수동 메모리 프로필(memory profile) 카드 포매터를 구현. spec01 캐싱 구조·spec02 주입 엔진은 무수정 재사용. 무책임한 처방봇/쓸모없는 면책봇 양극단 배제 철학 반영."
read_when: ["최신상태복구","코치노트AI","AI가드레일·시스템프롬프트"]
updated: "2026-06-06"
work_timestamp: "20260606_181022"
context: "달록본레포CC (D:\\dallog\\dallog_git)"
source_of_truth: "https://dallog-tools.hansbridge.co.kr/knowledge/"
---

# 작업보고 — 코치노트 AI RC2 spec03 가드레일·시스템 지시문·메모리 프로필

> 코치노트 AI v1.0-rc2 6분할 구현 중 **3/6 (spec_rc2_03_guardrail_prompt)** 기록이다. 단순 챗봇 프롬프트 작성이 아니라 **달록 AI 코치의 정체성·판단 기준**을 코드로 확정한 작업이다. 기준 원본은 `docs/go_work/spec_rc2_03_guardrail_prompt.md`(본레포)이며 본 문서는 그 구현 결과 보존 기록이다.

**용어 병기**
- system prompt / 시스템 지시문(AI 행동 지침)
- guardrail / 가드레일(AI 안전·역할 제한 규칙)
- memory profile / 메모리 프로필(AI 참고용 사용자 카드)
- injection / 주입(대화에 넣는 운동기록 컨텍스트)
- prompt caching / 프롬프트 캐싱
- snapshot / 운동기록 요약본(최근 14일)

## 목차
- [0. 문서 정보](#0-문서-정보)
- [1. 작업 배경](#1-작업-배경)
- [2. 적용 기준](#2-적용-기준)
- [3. 구현 범위](#3-구현-범위)
- [4. 수정 파일](#4-수정-파일)
- [5. SQL 적용 여부](#5-sql-적용-여부)
- [6. 빌드 결과](#6-빌드-결과)
- [7. 기능 검증 결과](#7-기능-검증-결과)
- [8. 명세 대비 구현 완료 여부](#8-명세-대비-구현-완료-여부)
- [9. 미구현·보류·축소 의심 항목](#9-미구현보류축소-의심-항목)
- [10. 설계 결정 기록 (5요소)](#10-설계-결정-기록-5요소)
- [11. 발견된 이슈](#11-발견된-이슈)
- [12. 후속 작업 연결](#12-후속-작업-연결)
- [13. 최종 판단](#13-최종-판단)

---

## 0. 문서 정보
- **작성일**: 2026-06-06
- **담당 작업 단위**: spec_rc2_03_guardrail_prompt (총 6분할 중 3/6)
- **관련 명세서**: `docs/go_work/spec_rc2_03_guardrail_prompt.md`, `spec_rc2_00_master_index.md`(A절 준수원칙), `decision_log_rc2.md`(#10 메모리·#11 가드레일·#15 system prompt·루틴 추천)
- **관련 스레드**: 본레포 Claude Code spec03 구현 스레드(Opus 4.8)
- **작성 목적**: 구현 내용·검증·미비점·후속 연결을 KB에서 추적 가능한 형태로 보존

---

## 1. 작업 배경

코치노트 AI는 "좋은 GPT 답변"이 아니라 **"내 운동 기록과 여정을 아는 코치"**를 상품가치로 삼는다(decision_log #15, master_index D). 따라서 이 작업의 핵심은 모델 지능이 아니라, AI가 **어떤 코치로 행동하는가** — 안전 울타리, 데이터 활용 규칙, 답변 톤 — 를 시스템 지시문(system prompt)으로 고정하는 데 있다.

**사용자 의도·정서(원본 명세 [의도·정서] 블록 보존)**
- 사용자는 본인처럼 "브레이크가 없는" 사용자에게 "쉬는 게 더 이득"이라는 조언도 중요하다고 보았다. **동시에** AI가 리스크 회피 성향으로 무조건 보수적인 답변만 하는 것도 경계했다 → 양극단(무조건 쉬어라 / 무조건 더 해라) 모두 배제.
- 가드레일에 대해 "미처 가이드하지 못한 부분에서 문제가 생기는 게 아니냐"는 완결성 불안을 표했다 → 블랙리스트 나열식이 아니라 **포괄 안전 원칙(지붕)**으로 응답.
- 메모리 프로필의 수동 카드는 **마지못한 현실적 수용**이며, 자동 메모리 갱신을 종착점이 아닌 "미룬 궁극 목표"로 봐달라고 명시적으로 경계했다.

---

## 2. 적용 기준
- **적용 명세서**: spec_rc2_03 §1(메모리 프로필)·§2(가드레일)·§3(루틴 추천·과잉 안전주의 억제)·§4(system prompt 최종 초안 전문)
- **적용 결정로그**: #10(메모리 프로필 — 수동 카드=징검다리), #11(가드레일 — 4종+포괄 원칙+다층 방어), #15(system prompt·루틴 추천 — 양극단 배제)
- **적용 사용자 지침**: 00번 A-1(명세 의도·내용 임의 축소 금지), spec01 캐싱 경계 보존, spec02 주입 엔진 무수정
- **작업 중 지킨 금지사항**: 고정 system prompt에 가변 데이터 삽입 금지(캐싱 파괴), 조립 순서·캐싱 경계 변경 금지, spec04~06 선구현 금지, SQL·마이그레이션 없음, 본레포 git add/commit/push 없음(RC2 일괄)

---

## 3. 구현 범위

| 구분 | 구현 내용 | 관련 파일 | 상태 |
|---|---|---|---|
| 시스템 지시문 전문 | 자리표시자 `FIXED_SYSTEM_PROMPT`를 spec §4 최종안 전문으로 교체(의도·내용 축소 없이) | systemPrompt.ts | 완료 |
| 주입 연결 참조 지시 | 시스템 지시문 말미에 "다음 메시지의 `[메모리 프로필]`·`[운동 기록 컨텍스트]`(`■ 최근 14일 스냅샷`/`■ 전체 여정 요약`/`■ 확장 조회:`)를 근거로, 비면 데이터 없음 분기로 답하라" 1단락 추가 | systemPrompt.ts | 완료 |
| 버전 태그 갱신 | `FIXED_SYSTEM_PROMPT_VERSION` `rc2-01-placeholder` → `rc2-03-guardrail`(캐시 무효화·로그 추적) | systemPrompt.ts | 완료 |
| 메모리 프로필 타입 | `MemoryProfile`(목표·현재 주의통증·운동 선호·코칭 선호, 모두 옵셔널) | types.ts | 완료 |
| 수동 카드 포매터 | `buildMemoryProfileCard(profile)` — 입력 필드만 `■ 사용자 프로필 카드 (수동)` 문자열로 조립, 빈 카드는 빈 문자열 반환(블록 자동 생략) | memoryProfile.ts | 완료 |

**고정 시스템 지시문에 담긴 행동 규칙**: 코치 역할·코치 스코프(러닝·근력·체성분·회복 + **달록 앱 사용·기록 방법 안내** 포함) / 루틴·프로그램 추천(러닝 5종·근력 볼륨조절·감량 시 휴식·피로관리도 전략) / 기록 기반 단서 의무 + 직접 진단 금지 / 과잉 안전주의 억제 / 데이터 근거·반복패턴 압축 해석 / 수동 프로필 카드 반영·자동 장기기억 단정 금지 / 의료 면책 / 자해·위험신호 분기 / 포괄 안전 원칙(지붕) / 답변 톤·형식 / 달록 정신("어디서 시작해 어디까지 왔는가").

---

## 4. 수정 파일

| 파일 | 변경 내용 | 비고 |
|---|---|---|
| `src/lib/coachChat/systemPrompt.ts` | `FIXED_SYSTEM_PROMPT` 전문 교체 + 참조 지시 1단락 + VERSION 갱신 | **조립 함수 `assembleCoachChat`·캐싱 경계는 무수정** |
| `src/lib/coachChat/types.ts` | `MemoryProfile` 타입 추가 | 기존 타입 무수정 |
| `src/lib/coachChat/memoryProfile.ts` | 신규 — 수동 카드 순수 포매터 | DB·UI·자동 메모리 없음(부수효과 없음) |

**조립 흐름(spec01 구조 그대로 유지)**
```
assembleCoachChat(conversation, { injectionBlock, memoryProfile })
  → system      = FIXED_SYSTEM_PROMPT             (고정·프롬프트 캐싱 대상, 선두 고정)
  → messages[0] = "[메모리 프로필]…\n\n[운동 기록 컨텍스트]…"  (가변·캐싱 제외, system 밖)
  → messages[1..] = 실제 대화 히스토리
```
메모리 카드 → `memoryProfile` 슬롯, spec02 주입 결과 → `injectionBlock` 슬롯. 가변 데이터는 시스템 지시문 내부에 넣지 않는다(캐싱 경계 보존).

---

## 5. SQL 적용 여부
**N/A** — 이번 작업 단위는 시스템 지시문·타입·포매터(라이브러리 코드)만 다룬다. 신규 테이블·마이그레이션 없음. 대화 원문 저장 테이블은 spec04 소관(★출시 전 활성화 게이트와 함께).

---

## 6. 빌드 결과
- **`npm run build`(tsc + vite build)**: 통과(PASS).
- **오류 여부**: 타입 오류 0. (청크 크기 경고는 기존 사항으로 이번 변경과 무관.)
- **해결 내용**: 해당 없음(오류 없이 통과).

---

## 7. 기능 검증 결과

| 검증 항목 | 결과 | 근거 | 비고 |
|---|---|---|---|
| 시스템 지시문 전문 교체·버전 갱신 | PASS | 샘플 조립 출력에서 VERSION=`rc2-03-guardrail`, 선두="너는 달록(PaceLog)의 코치노트 AI다.", 말미=데이터 근거 참조 단락 확인 | 임시 스크립트 1회 실행 후 삭제 |
| 조립 순서·캐싱 경계 유지 | PASS | `messages[0]`=`[메모리 프로필]`+`[운동 기록 컨텍스트]` 결합(가변부가 system 밖), `messages[1]`=사용자 발화 | spec01 구조 무손상 |
| 빈 메모리 카드 자동 생략 | PASS | `buildMemoryProfileCard({})`·`(null)` → `""` 반환 확인 | 불필요 토큰·라벨 미주입 |
| MCP 브라우징 테스트 / 실제 화면 | N/A | 채팅 UI(시각화 대상)는 spec06 소관 — 현 단계에 렌더 화면 없음 | UI 검증은 spec06 작업보고에서 |

> 스크린샷: 해당 없음(렌더 UI 미존재 단계). 기능 검증은 프롬프트 조립 샘플 실행으로 대체.

---

## 8. 명세 대비 구현 완료 여부

| 명세 요구사항 | 구현 여부 | 근거 | 비고 |
|---|---|---|---|
| §1.1 Phase0 수동 최소 카드(목표·현재 주의통증·운동 선호·코칭 선호) | PASS | `MemoryProfile` + `buildMemoryProfileCard` | — |
| §1.2 자동 메모리="미룬 목표"(배제 아님) 명문화 | PASS | 타입·모듈 헤더 주석에 Phase2 궁극 목표·징검다리 명기 | KB 보존 지시 반영 |
| §2.1 가드레일 4종(의료 면책/코치 스코프(앱사용 포함)/데이터 없음 분기/자해 위험신호) | PASS | FIXED_SYSTEM_PROMPT 해당 문단 | app_usage 코치 스코프 포함 |
| §2.2 포괄 안전 원칙(지붕) | PASS | "명시되지 않은 상황이라도 안전 최우선" 문단 | 블랙리스트 방식 배제 |
| §2.3 다층 방어(프롬프트+UI 면책고지+약관) | 부분 | 프롬프트 층만 구현 | UI 고지·약관은 spec04/출시 전 — 층위 분리(축소 아님) |
| §3.1 루틴·프로그램 추천 역할 | PASS | 러닝 5종·근력·체성분 추천 문단 | — |
| §3.2 기록 기반 단서 필수 | PASS | "현재 기록상으로는" 등 단서 문단 | 직접 진단 금지 명시 |
| §3.3 과잉 안전주의 억제(양극단 배제) | PASS | 위험 근거 없으면 의지 존중·있으면 회복 우선 문단 | — |
| §4 system prompt 전문 선두 고정 + 가변 데이터 뒤 결합 | PASS | FIXED_SYSTEM_PROMPT 전문 + assembleCoachChat 무수정(샘플 검증) | 캐싱 경계 유지 |

---

## 9. 미구현·보류·축소 의심 항목

| 항목 | 상태 | 이유 | 후속 필요 |
|---|---|---|---|
| 다층 방어의 UI 면책고지·약관 면책 | 보류(층위 분리) | spec03은 프롬프트 층 담당. UI 고지·약관은 ★출시 전 필수로 spec04/법무 소관 | spec04 + 법률 자문 |
| 메모리 프로필 영속화(저장·복원) | 보류(층위 분리) | Phase0은 입력값→문자열 포매터까지. 저장은 민감정보(건강정보) 전제로 spec04 활성화 게이트와 함께 | spec04 |
| 메모리 프로필 입력 UI | 보류(층위 분리) | 입력 화면은 spec06 프론트 UX 소관 | spec06 |
| 자동 메모리 갱신(대화 원문 기반) | 미룬 목표 | Phase2 이후 궁극 목표(decision_log #10). 배제된 기능 아님 | Phase2 |

> 위 항목은 spec03 범위의 **축소가 아니라 작업 단위 분할에 따른 층위 분리**다. 수동 카드 데이터는 향후 자동화의 추출 정답지로 축적된다.

---

## 10. 설계 결정 기록 (5요소)

**결정 A. spec §4 시스템 지시문을 거의 원문 그대로 반영**
- **선택된 안**: 명세 §4 최종 초안 문단을 원문 기준으로 반영(압축 가능하나 의도·내용 삭제 금지).
- **배제된 대안**: 작업자 판단으로 문장 통합·요약해 짧은 프롬프트로 재작성.
- **선택 이유**: 각 문장이 #11/#15의 의도·정서를 담은 설계 결정이라, 임의 압축 시 균형점(양극단 배제)이 깨질 위험.
- **사용자 의견과 정서**: 00번 A-1에서 "편의·자체 판단으로 왜곡·축소 금지"를 강하게 명시.
- **재검토 조건**: 베타에서 가드레일이 못 막은 위험·과보수로 정상 코칭 차단·답변 과일반화 시 프롬프트 강도 조정(spec §5 재검토 트리거).

**결정 B. 주입 참조 지시를 고정 프롬프트 말미에 둠**
- **선택된 안**: 라벨·블록 헤더(`[메모리 프로필]`/`[운동 기록 컨텍스트]`/`■ …`)를 근거로 삼으라는 고정 문구 1단락 추가.
- **배제된 대안**: 참조 지시 없이 데이터만 주입 / 데이터를 system 내부에 삽입.
- **선택 이유**: 데이터 기반 코치가 성립하려면 "이 블록을 근거로 답하라"는 지목이 필요. 라벨·헤더는 spec02가 고정한 문자열이라 프롬프트 캐싱을 깨지 않음.
- **사용자 의견과 정서**: "데이터는 장식이 아니다 — 반드시 활용"(작업지시 §6).
- **재검토 조건**: spec02 블록 헤더 문구 변경 시 동기화.

**결정 C. 메모리 프로필 = 순수 포매터까지만**
- **선택된 안**: 입력값→카드 문자열 변환 포매터만 구현(DB·UI·자동화 제외).
- **배제된 대안**: Phase0에 저장 계층·자동 메모리 즉시 도입.
- **선택 이유**: Phase0 수동 카드의 본질은 변환. 저장·UI는 다른 명세 층위(spec04/06), 자동화는 Phase2.
- **사용자 의견과 정서**: 수동 카드는 마지못한 수용·종착점 오해 경계(자동 메모리는 미룬 목표).
- **재검토 조건**: 수동 데이터가 충분히 쌓이거나 반복 입력 불편이 클 때(Phase2 자동화 착수).

---

## 11. 발견된 이슈
- 특이 이슈 없음. 빌드·샘플 조립 검증 모두 통과. spec01 조립 구조·spec02 주입 엔진과의 결합에서 충돌 없음.

---

## 12. 후속 작업 연결

(작업 단위 분할 구조상 다음 명세들이 이 산출물 위에 결합된다. 미완이 아니라 층위 분리다.)

- **spec_rc2_04_storage_privacy** — 대화 원문 저장·보관·삭제 + 개인정보 선후장치(★출시 전 필수). 메모리 카드 영속화·활성화 게이트(storageGate / 저장 활성화 게이트)는 이 명세에서. 통증·체성분 등 건강정보(민감정보) 전제.
- **spec_rc2_06_frontend_ux** — 채팅 UI·메모리 카드 입력 UI·확장조회 "사용자 확인" 버튼 와이어링.
- **자동 메모리 갱신(Phase2 이후)** — 대화 원문 기반 자동 기억. 미룬 궁극 목표(배제 아님). 수동 카드 데이터가 추출 정답지로 축적.
- **본레포 핸드오프**: `docs/go_work/handoff_spec03_to_spec04.md`(다음 스레드 실행 컨텍스트).

---

## 13. 최종 판단
- **이 작업 단위는 완료로 볼 수 있는가**: 예. spec03 §5 완료 정의 4항목 모두 PASS, 빌드·샘플 검증 통과. 보류 항목은 모두 타 명세 층위(축소 아님).
- **Phase0 종료에 영향을 주는가**: 예 — 가드레일·시스템 지시문·메모리 프로필은 Phase0 "채팅 켜기"의 필수 구성요소. 다만 출시(사용자 대상 활성화)는 spec04의 ★출시 전 필수 게이트(약관·개인정보·저장 활성화)가 선결 조건.
- **사용자 확인이 필요한가**: 코드 구현은 확인 불필요(명세대로 완료). KB 편입(dallog-tools push) 후 사이트 반영은 편입 단계에서 처리.
