---
title: "📅 2026-06-08 (월) 작업일지 — 코치 채팅 유니버설 에이전트(tool-calling) 전면 구축 + 워커 버그 마라톤"
category: "devlog"
document_type: "개발일지"
source_status: "generated"
knowledge_group: "03_history"
priority: "High"
purpose: "2026-06-08 개발일지(갭 복원). Gemini thinking OFF 빈응답 버그 수정, 브리프/admin CORS·리다이렉트 수정, 루트 wrangler.toml 리버전 지뢰 제거, 그리고 코치 채팅을 자연어·표·첨부(이미지/CSV/XLSX)로 기록 입력하고 테마·프로필·피드·브리프까지 조작하는 유니버설 에이전트(tool-calling)로 전면 확장한 대형 작업일을 시간 흐름으로 기록."
read_when: ["개발일지","갭복원","최신상태복구","2026-06","코치노트AI","tool-calling","워커"]
updated: "2026-06-08"
work_timestamp: "20260608_223500"
context: "달록본레포CC (D:\\dallog\\dallog_git) — 작업일지 갭 복원. 근거: git log·KB 작업보고·핸드오프."
source_of_truth: "https://dallog-tools.hansbridge.co.kr/knowledge/"
---

# 📅 2026-06-08 (월) 작업일지 — 코치 채팅 유니버설 에이전트 전면 구축 + 워커 버그 마라톤

> **이 문서가 무엇인가 (비개발자용 한 줄 설명)**
> 이 날은 두 덩어리의 하루다. 오전에는 AI 워커(서버에서 도는 작은 프로그램)들이 빈 응답을 내거나 엉뚱하게 배포되던 고질 버그들을 잡았고, 오후·저녁에는 코치 채팅을 단순 "묻고 답하기"에서 **말로 시키면 실제로 동작하는 비서(유니버설 에이전트)** 로 크게 확장했다. 이제 채팅창에 "오늘 10km 뛰었어"라고 쓰거나 사진·엑셀을 붙이면 AI가 기록 카드를 만들어 주고, 테마를 바꾸거나 피드에 글을 올리거나 브리프를 만드는 것까지 말로 시킬 수 있게 됐다. 모든 동작은 **확인 카드(미리보기)** 를 거쳐 사용자가 OK 한 뒤에만 적용된다.

용어 메모
- **tool-calling** = AI가 정해진 도구(함수)를 호출해 실제 동작을 수행하는 방식 (그냥 글만 쓰는 게 아니라 "기록 저장", "테마 변경" 같은 실제 행동을 한다)
- **SSE** = 서버가 응답을 한 번에 안 주고 조금씩 흘려 보내는 스트리밍 방식 (Server-Sent Events)
- **CORS** = 다른 출처(도메인)에서 온 요청을 허용하는 웹 보안 설정 (교차출처 허용)
- **thinkingBudget** = Gemini가 답하기 전 "속으로 생각하는 데" 쓰는 토큰 예산 (사고 토큰 예산)

---

## 0. 하루 요약

| 시간대 | 성격 | 핵심 |
|---|---|---|
| 오전 (10:39 ~ 14:43) | 워커·인프라 버그 마라톤 | Gemini 빈 응답·스트리밍 파서·CORS·리다이렉트·루트 wrangler.toml 리버전 지뢰 제거 (PR#42~#45) |
| 오후~저녁 (15:14 ~ 22:34) | 코치 유니버설 에이전트 슬라이스 구축 | 기록 입력 → 첨부 입력 → 액션 도구 7종 → 테스트 갭 보강 → 기록 수정 (PR#46~#60) |

이 날의 큰 전환은 **코치 채팅 = 유니버설 에이전트**다. 단순 Q&A 챗봇을 "자연어·표·첨부로 기록을 만들고, 테마·프로필·피드·브리프까지 조작하는 행동형 AI"로 끌어올린 날이다. 관련 의사결정·백엔드 구성은 [[project_beta_packaging_decision]](코치=chat-proxy/gemini, 브리프=brief-proxy/openai 2종 라이브) 와 [[project_coachnote_chat_design]](멀티턴 대화 설계) 를 참조한다.

---

## 1. 오전 — 워커/인프라 버그 마라톤

배경 — 도메인이 dallog.kr 로 이전([[project_domain_dallog_kr]])된 직후라, 워커들이 새 출처에서 막히거나(CORS) 빈 응답을 내는 문제가 겹쳐 터졌다. 또 chat 워커가 brief 코드를 서빙하는 배포 엉킴까지 얽혀 있어, 오전 내내 "왜 응답이 비어 나오나 / 왜 튕기나 / 왜 엉뚱한 코드가 배포됐나"를 차례로 잡았다.

### 1-1. Gemini 빈 응답 — thinking 토큰이 본문 예산을 먹던 버그

| 항목 | 내용 |
|---|---|
| 커밋 | 10:39 `aae8edf` fix(chat-proxy) |
| 무엇 | Gemini 2.5의 thinking(사고) 기능을 OFF — `thinkingBudget=0` 설정 |
| 왜 | Gemini가 답하기 전 "속으로 생각하는" 데 토큰을 너무 써서, 정작 사용자에게 보여줄 **본문 토큰 예산이 소진되어 빈 응답**이 나오던 버그 |
| 결과 | 사고 토큰 예산을 0으로 막아 본문이 정상 출력 |

### 1-2. 오너 계정 마스터/어드민 권한 부여 (PR#42)

| 항목 | 내용 |
|---|---|
| 커밋 | 10:39 `a2e16e9` feat(auth) |
| 무엇 | 오너 계정(ccy8215@gmail.com)도 마스터/어드민 권한을 갖도록 admin `OWNER_EMAILS` 일치 처리 |
| 왜 | 오너가 OAuth로 로그인해도 /admin 에 진입 권한이 없던 상태를 정리 |

### 1-3. 브리프 워커 CORS 403 해소 (브리프 wrangler.toml 신설)

| 항목 | 내용 |
|---|---|
| 커밋 | 11:01 `93db8fb` fix(brief-proxy) |
| 무엇 | `ALLOWED_ORIGINS` 에 dallog.kr 추가 + brief-proxy 워커에 wrangler.toml 신설 |
| 왜 | 도메인 이전 후 새 출처(dallog.kr)에서 온 요청이 **CORS(교차출처 허용)** 에 걸려 403 으로 막히던 문제 |
| 결과 | 브리프 워커가 새 도메인 요청을 정상 수락 |

### 1-4. 오너 OAuth /admin 튕김 해소 (PR#43)

| 항목 | 내용 |
|---|---|
| 커밋 | 11:01 `2b4a8d6` fix(admin) |
| 무엇 | 세션 로드 전 리다이렉트를 막는 loading 가드 추가 |
| 왜 | 세션이 아직 안 읽힌 찰나에 권한 없음으로 판단해 /admin 에서 **튕기던(redirect)** 문제. 오너 OAuth 계정에서 재현 |
| 결과 | 세션 로딩 완료 후에만 권한 판정 → 진입 정상화 |

### 1-5. Gemini 스트리밍 SSE 파서 — 짧은 응답 빈 본문 해소 (PR#44)

| 항목 | 내용 |
|---|---|
| 커밋 | 11:28 `4a0c89a` fix(chat-proxy) |
| 무엇 | **SSE(서버 스트리밍)** 파서를 CRLF 정규화 + 스트림 종료 시 마지막 버퍼 flush 하도록 수정 |
| 왜 | 응답이 짧을 때 마지막 버퍼가 비워지지(flush) 않아 본문이 통째로 빠지던 문제. 1-1과 함께 "빈 응답" 증상의 또 다른 원인 |
| 결과 | 짧은 응답도 끝까지 흘러나옴 |

### 1-6. ★ 루트 wrangler.toml 리버전 지뢰 제거 (PR#45)

| 항목 | 내용 |
|---|---|
| 커밋 | 14:43 `5443e45` fix(deploy) |
| 무엇 | 레포 **루트의 wrangler.toml(브리프 설정)** 을 제거. 브리프 설정은 `workers/brief-proxy/` 로 일원화 |
| 왜 | 루트에 브리프용 wrangler.toml 이 남아 있어, 루트에서 빌드가 돌면 **brief 코드를 엉뚱한 워커(chat 워커 등)에 배포**하는 "리버전 지뢰"가 됐다. 이전부터 chat 워커가 brief 코드를 서빙하는 엉킴([[project_beta_packaging_decision]])의 뿌리 |
| 결과 | 배포 경로 일원화로 워커 서빙 엉킴 재발 차단 |

> 오전 정리 — 빈 응답(1-1·1-5), 권한/리다이렉트(1-2·1-4), CORS(1-3), 배포 엉킴(1-6)까지 워커·인프라의 묵은 지뢰를 한 차례에 걷어냈다. 이 토대 정리가 있어야 오후의 에이전트 슬라이스가 안정적으로 올라간다.

---

## 2. 오후~저녁 — 코치 유니버설 에이전트 슬라이스 구축

큰 그림 — 코치 채팅을 "묻고 답하는 챗봇"에서 "말로 시키면 실제 동작하는 비서"로 확장한다. 작은 슬라이스(PR)를 연달아 쌓아 올렸고, **모든 도구는 확인 카드(미리보기) → 사용자 OK → 적용** 구조를 공통으로 따른다. 관련 야간 작업명세는 PR#53·#56 으로 문서화했다.

### 2-1. 컨텍스트 보강 — 원시 기록 상시 주입 (PR#46)

| 항목 | 내용 |
|---|---|
| 커밋 | 15:14 `66c1333` feat(coach) |
| 무엇 | 최근 개별 기록을 상시 주입 + 여정의 극값 심박 추가 |
| 왜 | 기존의 "브리틀(깨지기 쉬운) 분류" 방식 대신, 원시 기록 행을 압축해 그대로 AI에 제공 — 분류 로직이 틀려도 사실 데이터는 누락 안 되게 |

### 2-2. 자연어·표 기록 입력 (tool-calling 도입) (PR#47)

| 항목 | 내용 |
|---|---|
| 커밋 | 18:20 `88c9e13` feat(coach) |
| 무엇 | 코치 채팅에서 **자연어·표로 기록을 입력**하는 tool-calling 도입. 미리보기 확인 후 저장 |
| 왜 | 이 날 에이전트화의 첫 핵심 슬라이스. "오늘 10km 뛰었어" 같은 말이나 표를 그대로 기록으로 변환 |
| 메모 | tool-calling = AI가 도구를 호출해 실제 "기록 저장"을 수행하는 구조. 여기서 확인카드 패턴이 시작됨 |

### 2-3. 기록 미리보기 카드 자동계산 (PR#48)

| 항목 | 내용 |
|---|---|
| 커밋 | 18:52 `6423baa` fix(coach) |
| 무엇 | 미리보기 카드에서 체지방량↔체지방률 연동, 러닝 페이스·속도 자동 계산 |
| 왜 | 사용자가 한쪽만 입력해도 나머지를 채워 미리보기를 완성 → 저장 정확도·편의 향상 |

### 2-4. 첨부 입력 — 이미지·CSV·XLSX → 기록 카드 (PR#49)

| 항목 | 내용 |
|---|---|
| 커밋 | 19:01 `bb370ec` feat(coach) |
| 무엇 | 채팅에 **이미지·CSV·XLSX 첨부**를 올리면 기록 카드로 변환 |
| 왜 | 손으로 적기 어려운 데이터(워치 캡처, 엑셀 표)를 첨부만으로 기록화 |

### 2-5. 액션 도구 프레임워크 + 테마 전환 (PR#50)

| 항목 | 내용 |
|---|---|
| 커밋 | 19:12 `08babc5` feat(coach) |
| 무엇 | **액션 도구 프레임워크** 신설 + 첫 액션으로 화면 테마 전환 `set_theme` |
| 왜 | 기록 입력을 넘어 "앱 자체를 조작하는 도구"의 공통 골격을 깔고, 가장 단순한 테마 전환부터 검증 |

### 2-6. 프로필 수정 도구 (PR#51)

| 항목 | 내용 |
|---|---|
| 커밋 | 19:22 `5f80aad` feat(coach) |
| 무엇 | `update_memory_profile` — 채팅으로 프로필(메모리) 수정 |

### 2-7. 피드 글 작성 도구 (PR#52)

| 항목 | 내용 |
|---|---|
| 커밋 | 19:31 `ece2648` feat(coach) |
| 무엇 | `create_feed_post` — 채팅으로 피드 글 작성 |

### 2-8. 야간 작업명세 문서화 (PR#53)

| 항목 | 내용 |
|---|---|
| 커밋 | 19:34 `e628189` docs(go_work) |
| 무엇 | 코치 채팅 유니버설 에이전트 야간 작업명세 작성 (docs/go_work) |

### 2-9. 기록-첨부 피드 공개 도구 (PR#54)

| 항목 | 내용 |
|---|---|
| 커밋 | 19:52 `76e964b` feat(coach) |
| 무엇 | `publish_record_to_feed` — 기록과 첨부를 피드에 공개 |

### 2-10. 브리프 생성 도구 (PR#55)

| 항목 | 내용 |
|---|---|
| 커밋 | 19:59 `9209b26` feat(coach) |
| 무엇 | `generate_brief` — 채팅으로 브리프 생성 (오전에 고친 brief-proxy 워커와 연결) |

### 2-11. 에이전트 명세 완료 갱신 (PR#56)

| 항목 | 내용 |
|---|---|
| 커밋 | 20:01 `a076155` docs |
| 무엇 | 코치 에이전트 명세 완료 갱신 — 도구 7종 슬라이스 1차 완성 시점 정리 |

> **도구 7종 정리** — set_theme(테마), update_memory_profile(프로필), create_feed_post(피드 글), publish_record_to_feed(기록 공개), generate_brief(브리프), 그리고 기록 입력/수정 계열. 모두 확인 카드를 거쳐 적용된다.

---

## 3. 야간 — 테스트 발견 갭 보강 + 첨부 확장 + 기록 수정

19~20시에 1차 슬라이스를 완성한 뒤, 실제로 써 보며(테스트) 드러난 갭을 야간에 메웠다.

### 3-1. 테스트 발견 갭 보강 (PR#57)

| 항목 | 내용 |
|---|---|
| 커밋 | 22:05 `a861cd2` fix(coach) |
| 무엇 | 신발·운동시각 기록 추가, 저장 에러를 사용자에게 노출, 피드 글 편집 기능 |
| 왜 | 직접 테스트하며 발견된 누락·침묵 실패를 보강 (저장 에러가 조용히 묻히던 문제 포함) |

### 3-2. 첨부 입력 확장 — 복수 파일·드래그앤드롭·붙여넣기 (PR#58)

| 항목 | 내용 |
|---|---|
| 커밋 | 22:12 `14b2a48` feat(coach) |
| 무엇 | 첨부 입력을 복수 파일·드래그앤드롭·이미지 붙여넣기까지 확장 |
| 왜 | 2-4의 단일 첨부를 실사용 편의에 맞게 확장 |

### 3-3. SQL 등록대장 동기화 + 폴더 정리

| 항목 | 내용 |
|---|---|
| 커밋 | 22:31 `4af17fa` chore(sql) |
| 무엇 | SQL 에디터 27개 전수를 등록대장에 동기화 + 폴더 정리 |
| 메모 | 골든셋·SQL 관리 규칙([[feedback_goldenset_sync]]·[[feedback_sql_query_management]]) 흐름의 정비 |

### 3-4. 기존 기록 수정 도구 (PR#60)

| 항목 | 내용 |
|---|---|
| 커밋 | 22:34 `488c020` feat(coach) |
| 무엇 | `update_running` / `update_body` / `update_strength` — 기존 기록을 채팅으로 수정 |
| 왜 | 입력(2-2)에 이어 수정까지 채팅으로 닫아, "기록 생성·수정 전 주기"를 에이전트로 커버 |

---

## 4. 의미 — 왜 이 날이 큰 전환인가

- 코치 채팅이 단순 Q&A에서 **유니버설 에이전트(말로 시키면 실제 동작)** 로 질적으로 바뀐 날이다.
- 입력(자연어·표·첨부) → 미리보기 확인 → 저장/수정/공개/조작까지, **확인 카드 게이트**를 공통 안전장치로 두고 도구를 쌓았다.
- 오전의 워커·인프라 정리(빈 응답·CORS·배포 엉킴)가 없었다면 저녁 슬라이스가 불안정했을 것 — 하루가 인과로 묶인 구조다.
- AI 백엔드 2종 라이브 구도([[project_beta_packaging_decision]])가 이 날 확정적으로 정리됐다 (코치=chat-proxy/gemini, 브리프=brief-proxy/openai, 서빙 엉킴은 PR#45로 해소).

---

## 관련 페이지

- [[project_beta_packaging_decision]] — AI 백엔드 2종 라이브·워커 서빙 엉킴 해소 맥락
- [[project_coachnote_chat_design]] — 코치노트 멀티턴 대화 설계
- [[project_domain_dallog_kr]] — dallog.kr 도메인 이전 (오전 CORS/리다이렉트 버그의 배경)
- [[feedback_goldenset_sync]] · [[feedback_sql_query_management]] — SQL 등록대장 정비 맥락
- 핸드오프 #30 (코치브리프어드민복구-기록로딩보강) · #31 (코치AI유니버설에이전트-야간작업)
- 갭복원 시리즈 인접: 19=2026-06-06 / 21=2026-06-09

---

## 작업 리드타임

| 항목 | 값 |
|---|---|
| 작업 시작 | 2026-06-08 10:39 (첫 커밋 aae8edf) |
| 작업 완료 | 2026-06-08 22:34 (마지막 커밋 488c020) |
| 경과 | 약 11시간 55분 (오전 워커 마라톤 + 오후·저녁 에이전트 슬라이스) |
| 커밋 수 | 19건 (PR#42~#60 다수 포함) |

---
