---
title: "작업보고 — 코치챗 불규칙 운동기록 표 파싱 지침(열린 힌트·압축표기·reps 되묻기) + 스튜디오 토큰 직접 적용 (PR#87)"
category: "workreport"
document_type: "작업보고"
source_status: "generated"
knowledge_group: "03_history"
priority: "Medium"
purpose: "코치챗(운동 코칭 AI)에 엑셀 셀·표를 붙여넣어 기록을 입력할 때, 컬럼 순서와 압축표기가 매번 달라도 모델이 값의 의미와 단위로 해석하도록 고정 시스템 프롬프트(AI 고정지침)에 표 파싱(해석) 지침을 추가한 작업(PR#87)과, 같은 PR에 함께 묶여 들어온 스튜디오 1클릭 라이브 커밋 4건(디자인 토큰 직접 조정)을 풀 깊이로 기록한다. 직전 PR#86의 붙여넣기 글자우선 처리와 짝을 이루는 후속 작업이며, 후속 코치챗 파싱 튜닝·캐시 버전 추적의 기준점이 된다."
read_when: ["코치챗","표파싱","systemPrompt","스튜디오토큰","운동기록입력","최신상태복구"]
updated: "2026-06-12"
work_timestamp: "20260612_113500"
context: "달록본레포CC (D:\\dallog\\dallog_git) — 불규칙 운동기록 표 파싱 지침(PR#87) 작업보고"
source_of_truth: "https://dallog-tools.hansbridge.co.kr/knowledge/"
---

> **이 문서가 무엇인가 (비개발자용 한 줄 설명)**
> 운동 코치 AI에게 엑셀 표를 그대로 복사해 붙여 "이거 기록해줘"라고 하면, 표의 칸 순서나 줄임말이 매번 달라도 AI가 알아서 "이 숫자는 거리, 이건 횟수, 이건 무게"라고 알아보도록 AI의 고정 지침(system prompt=AI 고정지침)을 보강한 작업이다. 더불어, 사장님이 /studio 화면에서 색·글자크기 같은 디자인 변수(토큰)를 직접 조정해 라이브에 반영한 변경 4건이 같은 PR에 함께 들어왔다.

---

## 1. 무엇을 했나 (요약)

PR **#87** (머지 커밋 `1df0f59`, 2026-06-12 12:02 KST)에 두 갈래 작업이 묶여 들어왔다.

| 갈래 | 내용 | 커밋 | 파일 |
|---|---|---|---|
| ① 코치챗 표 파싱 지침 | 불규칙 운동기록 표를 모델이 값의 의미·단위로 해석하도록 AI 고정지침 보강. 운동명을 "열린 힌트"로 전환. reps(반복횟수)를 못 만들 때만 되묻기. 캐시 버전 `rc2-19`로 갱신 | `ec330ab` (11:35) | `src/lib/coachChat/systemPrompt.ts` (+3/−1) |
| ② 스튜디오 토큰 직접 적용 | 사장님이 /studio UI로 디자인 토큰을 조정해 1클릭 라이브 커밋한 결과 4건 | `dc0d399`·`6a34ee2`·`f24a842`·`1d0c1a5` (11:56~12:00) | `src/studio-overrides.css` |

핵심은 ①이다. ②는 [[reference_studio_publish_worker]] (스튜디오 1클릭 커밋·푸시 워커)가 정상 동작한 운영 산출물로, 코드 작업이 아니라 라이브 토큰 조작의 기록이다.

---

## 2. ① 코치챗 표 파싱 지침 — 왜 했나

### 배경

달록 코치챗(운동 코칭 AI)은 사용자가 채팅으로 운동 기록을 적으면, 답변 텍스트로 옮겨 쓰지 않고 **기록 입력 도구**(`log_running`·`log_body`·`log_strength`)를 호출해 구조화한다(미리보기 확인 후 실제 저장). 이때 사용자는 흔히 엑셀 셀이나 표를 **그대로 복사해 붙여넣는다**.

문제는, 사용자가 붙여넣는 표의 모양이 **매번 다르다**는 점이다.

- 컬럼(열) 순서가 들쭉날쭉하다 — 어떤 날은 `종목 | 무게 | 횟수`, 어떤 날은 `횟수 | 종목`.
- 압축·축약 표기가 섞인다 — `풀업8`, `딥스10`, `10x10`, `16kg 케틀벨스윙 100회`.
- 사용자가 적은 형태가 곧 입력이지, AI에 맞춰 정돈해 주지 않는다.

### 직전 PR#86과의 관계 (짝 작업)

직전 PR#86은 **붙여넣기 글자우선 처리** — 붙여넣은 텍스트(글자)를 우선으로 받도록 입력 단계를 손본 작업이었다. 이번 PR#87은 그 짝으로, **붙여넣은 글자를 모델이 잘 해석(parsing=해석)하도록** AI 고정지침에 해석 규칙을 더한다. 즉 PR#86이 "글자를 잘 받는다", PR#87이 "받은 글자를 잘 읽는다"의 관계다.

### 왜 "닫힌 명단"이 아니라 "열린 힌트"인가 (판단 근거)

종목명을 **닫힌 종목 명단**(고정 리스트)으로 처리하면, 사용자가 쓴 **돌발 종목·압축표기**를 명단에 없다는 이유로 놓치거나 억지로 끼워맞춘다. 그래서 종목 예시는 **글자가 뭉개졌을 때 알아보는 힌트로만** 쓰고, **예시에 없는 종목이라도 사용자가 적은 대로 인정**하는 "열린 힌트" 방식으로 전환했다. 유연성을 높이되, **reps(반복횟수)를 만들 수 없을 만큼 정말 모호할 때만 되묻게** 해 사용자 마찰을 줄였다(불필요한 되묻기 최소화).

---

## 3. ① 무엇이 바뀌었나 — 코드 디테일

파일 `src/lib/coachChat/systemPrompt.ts`. 고정 시스템 프롬프트(`FIXED_SYSTEM_PROMPT`) 배열에 표 파싱 지침 한 단락이 **추가**되고, 버전 태그가 갱신됐다(+3/−1).

### 추가된 지침 단락 (전문 보존)

```
표나 여러 줄로 운동 기록을 받을 때는 사용자가 컬럼 순서·형식을 너에게
맞춰 줄 것이라 기대하지 말고, 사용자가 적은 형태 그대로 네가 알아서
해석한다. 컬럼 순서는 붙여넣을 때마다 다를 수 있으니 위치가 아니라 값의
의미와 단위로 무엇인지 판단한다(거리=km, 시간=분·초, 심박=bpm,
무게=kg, 반복=회, 세트=×). 압축·축약 표기도 풀어 읽는다 — "풀업8"·
"딥스10"은 그 종목 8회·10회, "워킹런지20"은 20회(맥락상 거리·시간이
분명하면 그 단위로), "10x10"은 10세트 10회로 읽는다. "16kg 케틀벨스윙
100회"·"24kg 원암케틀벨스윙 100회"처럼 종목명에 무게가 붙어 있으면
무게는 weight_kg 로 따로 빼내고 종목명만 name 에 넣는다. 맨몸운동
(풀업·딥스·푸쉬업 등)은 weight_kg 를 비우고 중량이 명시된 종목만
채운다. 사용자가 100회처럼 한 줄로 압축해 적었으면 그대로 100회로 받고,
10세트 10회로 펼치라고 요구하지 않는다 — 사용자가 적은 형태를 존중한다.
위에서 예로 든 종목명들은 글자가 뭉개졌을 때 알아보는 힌트로만 쓰고,
예시에 없는 종목이라도 사용자가 적은 대로 인정한다(예시 목록에 억지로
끼워맞추지 않는다). 다만 어떤 값이 종목인지 숫자인지 단위인지 정말
모호해 합리적으로 추론할 수 없을 때만, 임의로 단정하지 말고 무엇이
맞는지 짧게 되묻는다. 반복수나 세트수가 전혀 없어 log_strength 에 넣을
reps 를 만들 수 없을 때는 도구를 호출하지 말고 짧게 되묻는다.
```

### 지침이 모델에 강제하는 규칙 (정리)

| 규칙 | 내용 | 예시 |
|---|---|---|
| 위치 무시·의미 우선 | 컬럼 순서가 아니라 값의 의미·단위로 판단 | 거리=km, 시간=분·초, 심박=bpm, 무게=kg, 반복=회, 세트=× |
| 압축표기 풀어읽기 | 붙은 숫자를 횟수로 해석 | `풀업8`→풀업 8회, `딥스10`→딥스 10회, `10x10`→10세트 10회 |
| 무게 분리 | 종목명에 붙은 무게는 `weight_kg`로 빼고 `name`엔 종목만 | `16kg 케틀벨스윙 100회`→ name=케틀벨스윙, weight_kg=16, reps=100 |
| 맨몸운동 무게 비움 | 중량 명시 종목만 `weight_kg` 채움 | 풀업·딥스·푸쉬업 등은 비움 |
| 사용자 형태 존중 | `100회`로 압축했으면 그대로 받음 | `10세트 10회`로 강제로 펼치지 않음 |
| 열린 힌트 | 예시 종목명은 글자 뭉갬 복구용 힌트일 뿐 | 예시에 없는 돌발 종목도 적은 대로 인정 |
| 되묻기 조건(좁게) | 정말 모호해 추론 불가할 때만 짧게 되묻기 | 종목/숫자/단위 구분 불가 시 |
| reps 부재 시 되묻기 | 반복·세트수가 전혀 없어 `reps`를 만들 수 없으면 도구 호출 말고 되묻기 | 근력(`log_strength`) 필수값 보호 |

### 캐시 버전 갱신

고정 프롬프트는 내용이 바뀌면 버전 태그를 함께 올린다(캐시 무효화·로그 추적용).

```diff
- export const FIXED_SYSTEM_PROMPT_VERSION = 'rc2-18-exercise-category'
+ export const FIXED_SYSTEM_PROMPT_VERSION = 'rc2-19-table-parse'
```

`rc2-18-exercise-category` → **`rc2-19-table-parse`**. 이 태그로 어느 시점부터 표 파싱 지침이 반영됐는지 로그에서 추적할 수 있다.

---

## 4. ② 스튜디오 토큰 직접 적용 — 운영 산출물 4건

코드 작업이 아니라, 사장님이 마스터 전용 **/studio** UI에서 디자인 토큰(색·글자크기 같은 디자인 변수)을 조정한 뒤 "직접 적용 & 커밋·푸시" 버튼을 눌러 발생한 라이브 커밋이다. [[reference_studio_publish_worker]] 워커가 `src/studio-overrides.css`만 커밋·푸시한다. 동일 PR#87에 함께 묶여 들어왔다.

> 비개발 해설 — 토큰(token)은 색·글자크기처럼 앱 전체가 공유하는 "디자인 변수"다. 한 곳에서 값을 바꾸면 그 변수를 쓰는 화면 전체가 같이 바뀐다.

### 시간순 변화 추적 (`src/studio-overrides.css`)

| 순서 | 커밋 | 시각(KST) | 변경 |
|---|---|---|---|
| 1 | `dc0d399` | 11:56:59 | 토큰 블록 신설 — `--bg2:#1f1f1f`, `--text:#94ff96`, `--text2:#ffffff`, `--text3:#cdcbcb`, `--fs-base:16px`, `--fs-sm:13px`, `--fs-xs:12px` |
| 2 | `6a34ee2` | 11:57:00 | (그래프상 동일 시점 커밋 — 산출물 변화는 누적 반영) |
| 3 | `f24a842` | 11:59:38 | 대부분 되돌리고 `--bg2:#212326` 한 줄만 남김 |
| 4 | `1d0c1a5` | 12:00:41 | `--text2:#ffffff`, `--text3:#ffffff`로 교체(최종) |

**최종 상태**(머지 시점 `src/studio-overrides.css`)는 `:root, [data-theme="dark"]` 안에 `--text2:#ffffff`, `--text3:#ffffff` 두 토큰이다. 즉 사장님이 스튜디오에서 색을 여러 번 시도·되돌리며 다듬은 끝에, **보조 텍스트 색(`--text2`·`--text3`)을 흰색으로 통일**한 것이 라이브에 남았다.

> 이 커밋들은 손으로 편집하지 않는다(파일 상단 주석이 명시). 토큰 조정은 /studio UI를 통한다. 본 작업보고는 결과를 기록할 뿐 코드 개입이 아니다.

---

## 5. 결과

- 코치챗 고정 시스템 프롬프트가 불규칙 표·압축표기·돌발 종목을 더 유연하게 해석하게 됐다. 캐시 버전 `rc2-19-table-parse`로 추적 가능.
- 스튜디오 토큰 4건이 라이브 반영(보조 텍스트 흰색 통일).
- PR#87 머지 완료(`1df0f59`, 2026-06-12 12:02 KST).

---

## 6. 미해결 / 후속

- **실측 검증** — 지침은 프롬프트(자연어 지침)이므로, 실제 다양한 표 입력에 대한 모델 응답 품질은 라이브 사용 로그로 후속 확인이 필요하다. 되묻기 빈도(너무 자주 되묻는지, 반대로 모호한데 단정해 버리는지)를 모니터링해 다음 버전(`rc2-20+`)에서 튜닝 여지가 있다.
- **단위 추론 경계** — `워킹런지20`을 횟수로 읽되 "맥락상 거리·시간이 분명하면 그 단위"로 두는 등 일부 판단은 모델 추론에 위임돼 있다. 오해석 사례가 모이면 규칙을 더 명시화할 수 있다.
- **스튜디오 토큰** — 흰색 통일이 다크/라이트 양쪽에서 가독성 문제(예: 라이트 모드 흰 배경 위 흰 텍스트)를 일으키지 않는지 라이브 확인 권장. 현재 셀렉터가 `:root, [data-theme="dark"]`라 라이트에도 적용되는 점 유의.

---
