---
title: "📅 2026-05-27 (수) 작업일지"
notion_id: "36d22962086881d7906bf565a268e295"
notion_url: "https://app.notion.com/p/36d22962086881d7906bf565a268e295"
category: "devlog"
parent: "개발일지 (날짜별)"
updated: "2026-05-27"
priority: "Medium"
purpose: "E-7 AI브리프 OpenAI 전환/엑셀형 외부 편집기 PoC/전역 가독성 보강/디자인 폴리싱 대작업 기록"
---

# 📅 2026-05-27 (수) 작업일지

> **운영 메모:** 오늘의 베이스 페이지. 이후 오늘 발생하는 추가 작업은 새 페이지 발행 없이 이 페이지에 append 한다.
> **컨텍스트 분리 안내:** 본 일자에는 복수의 클로드 코드 컨텍스트가 운영됨. 각 컨텍스트별 작업은 §단위로 누적.

---

## 01. E-7 AI브리프 OpenAI 라인 전환 — *별도 컨텍스트*
**환경:** 사무실 PC `D:\dallog\dallog_git` + CF Workers `dallog-brief-proxy`
**도구:** Claude Code Opus 4.7 (별도 세션)
**성격:** 인프라 전환 (AI 브리프 백엔드 Claude → OpenAI)

### 진행 내용 요약 (참조 링크 중심)
- 달록 AI 브리프 기본 백엔드를 **Claude Sonnet 4 → OpenAI gpt-5.4-mini-2026-03-17** 로 전환
- Claude Sonnet 4는 fallback 백엔드로 유지 (즉시 롤백 가능)
- CF Workers 프록시에 provider 어댑터 도입 → 응답을 Anthropic Messages 형식으로 정규화
- Codex 적대적 검수 1회 반영 (Origin 게이트·OpenAI 토큰 파라미터·빈 응답 fallback)
- 커밋: `e81fe3d feat(brief): migrate AI brief provider to OpenAI with Claude fallback`
- 후속 fix: `914f5f1 fix(brief): GPT JSON 따옴표 깨짐 + 시각화 갱신 누락 + 속도 보정` / `88b6982 feat(brief): SSE 스트리밍 도입 + 단일 ~ strikethrough 차단`

### 관련 페이지
- 작업보고: [🔁 260527-수요일_E7-AI브리프 OpenAI 라인 전환](#/doc/workreport-65)
- 기획서: [260527_ai_brief_claude_to_gpt_plan](https://www.notion.so/36d22962086880dc9790e0ecc2f31b0d)

---

## 02. 엑셀형 외부 편집기 — Phase 1 (PoC + 기획서 + 목업)
**환경:** 사무실 PC `D:\dallog\dallog_git`
**도구:** Claude Code Opus 4.7 (1M context, 본 컨텍스트)
**성격:** 신규 기능 정찰 — 셀 모드 점진 보강의 한계를 극복하기 위한 별도 트랙 PoC
**Phase 정의 (사용자 확정):** 본 작업(기획서+목업+체성분 PoC)을 **Phase 1**로 정의. 다음 업무에서 **Phase 2** 진행.

### 진행 내용 요약
1. **사용자 제안 수렴 → 기획보고서 작성**
	- 사용자 메시지: "셀 모드 점진 보강은 발산. 엑셀형 편집기를 별도 레이아웃에 띄우는 게 낫겠다. PowerPoint 차트 데이터 편집 패턴처럼."
	- 산출: `docs/260527_excel_editor_external_layout_plan.md`
	- 권장안: react-data-grid (MIT, ~150KB) · 별도 라우트 `/history/excel` · 체성분 단일 테이블 PoC 우선
	- 의도적으로 안 한 결정 5건 사용자 검토 요청 항목으로 명시 (라이브러리·통합 패턴·진입 시점·근력 우선순위·수식 지원)
	- 커밋: `f3215f0 docs(cellmode): 엑셀형 외부 편집기 기획보고서 (사용자 제안)`
2. **UI/UX 목업 HTML 발행**
	- 사용자 추가 요청: 기획서 권장안을 다크 톤 시각화로 검증
	- 충돌 위험 측정 사전 수행 (KST 16:33 기준): 단일 worktree, 단일 브랜치, 다른 에이전트 작업 흔적 0 → 충돌 위험 없음
	- 산출: `docs/260527_excel_editor_external_layout_mockup.html`
	- 9개 섹션: 진입 버튼, 풀스크린 에디터, 셀 상태 범례 6종, 단축키 12종, 저장 컨펌 모달, Phase 0~5 매트릭스, 데이터 흐름, 제외 항목, 검토 요청
	- 커밋: `0b0e29a docs(history/excel): 엑셀형 외부 편집기 UI/UX 목업`
3. **Phase 1 PoC 코드 구현 — 논스톱 작업/커밋/푸쉬 위임 받음**
	- 사용자 명시: 퇴근으로 중간 컨펌 불가 → 본 지시 한정 커밋·푸쉬 제약 완화 → 논스톱 진행
	- **신규 파일**: `src/pages/HistoryExcel.tsx` (약 600줄, 자체 그리드 구현)
	- **수정 파일**: `src/App.tsx` (라우트 등록), `src/pages/History.tsx` (셀모드 영역 진입 버튼)
	- 라우트: `/history/excel?tab=body|running|strength`
	- 체성분 탭: 풀 기능 (fetch · 셀 클릭 편집 · 키보드 네비 ↑↓←→/Enter/Tab/F2/Esc · Space 선택 · Del 삭제 · `+` 행 추가 · Ctrl+S 저장)
	- diff 추적: 신규/수정/삭제 카운터 + 더티 배지
	- 자동계산 컬럼: 체지방률·BMR (CellModeBody 식 그대로 재활용)
	- 저장: `upsert` (onConflict: `recorded_at`) + `delete in (ids)` Promise.all 일괄
	- 컨펌 모달 2종 (저장 / 이탈)
	- 모바일 가드 배너 (768px 미만, 닫기 가능)
	- 러닝/근력 탭: Phase 2/3 안내 placeholder + 셀 모드로 돌아가기 버튼
	- **의존성 추가 없음** — react-data-grid 도입은 사용자가 PoC 사용 후 결정하도록 보존 (기획서 §10 결정 요청 항목 보존)
	- 빌드 통과 (`npm run build` — 421 modules transformed, gzip 347KB)
	- 커밋: `7d34c2e feat(history/excel): Phase 0 PoC — 체성분 엑셀형 외부 편집기 (별도 라우트)`

### 산출물
- **신규 파일 3건**: 기획서(MD), 목업(HTML), PoC 페이지(TSX)
- **수정 파일 2건**: App.tsx (라우트 등록), History.tsx (진입 버튼)
- **커밋 3건**: `f3215f0` 기획서 / `0b0e29a` 목업 / `7d34c2e` PoC 코드
- **푸쉬**: origin/main 완료 (3 커밋 + 별도 컨텍스트 SSE 커밋 동반 푸쉬)
- **코드 변경량**: +1772 / -0 (신규 위주)

### 의도적으로 안 한 결정 (Phase 2 결정 항목으로 이관)
- **react-data-grid 의존성 미추가** — 라이브러리 도입은 PoC 사용 후 (a) 직접 더 구현 / (b) 라이브러리 도입 둘 중 결정
- **다중 셀 복붙, 컬럼 헤더 정렬, 컬럼 너비 드래그, undo/redo** — Phase 2 범위
- **러닝·근력 데이터 구현** — Phase 2(러닝) / Phase 3(근력) 단계로 분리. 본 PoC는 placeholder만
- **수식·셀 병합·차트·다중 시트** — Phase 5 luckysheet 전환 시 재검토
- **셀 모드 ↔ 엑셀 편집기 양방향 실시간 동기화** — 데이터 무결성 위험. 진입 시 fetch / 저장 시 적용으로 통일 유지

### 다음 작업 (Phase 2)
1. **사용자 검증** (퇴근 후 또는 익일):
	- `/history/excel?tab=body` 진입 → 데이터 로드 정상 여부
	- 셀 편집·저장 (Ctrl+S 포함) 흐름
	- 행 추가/삭제 후 저장 → DB 반영
	- 러닝/근력 탭 placeholder 동작
	- 모바일 가드 배너 (768px 미만)
	- 셀모드 ↔ 엑셀편집기 양방향 이동
2. **Phase 2 결정 항목** (기획서 §10 응답):
	- 라이브러리: react-data-grid (권장) / luckysheet (풀 엑셀) / 자체 유지
	- 통합 패턴: 별도 라우트(현재) / 모달 / 새 창
	- 사용 빈도 예상: 일주 1회 미만 / 일주 수회 / 매일
3. **Phase 2 진입 시점** — v0.9 출시 후 권장 (기획서 §8). 데드라인 6/1 D-5 압박 회피.
4. **Phase 2 작업 범위** (사용자 결정 후): 체성분 풀 기능(복붙·정렬·undo/redo·CSV) → 러닝 → 근력

### 관련 페이지
- 기획보고서(MD): `docs/260527_excel_editor_external_layout_plan.md`
- UI/UX 목업(HTML): `docs/260527_excel_editor_external_layout_mockup.html`
- 작업보고: `260527-수요일_엑셀형 외부 편집기 Phase 1 (PoC + 기획서 + 목업)` — *본 일지와 동일 컨텍스트 발행*
- 핸드오프: [📋 26-05-26_1-달록_핸드오프](#/doc/handoff-13) §15 (본 컨텍스트 갱신)

---

## 03. 컨텍스트 종합
본 컨텍스트(엑셀형 외부 편집기 Phase 1):
- 시작: 2026-05-27 16:33 KST
- 작업 단계: 기획서 작성 → 충돌 위험 측정 → 목업 발행 → PoC 코드 구현 → 빌드 검증 → 커밋·푸쉬 → 노션 보고
- 한 컨텍스트에서 **정찰병 + 본대 일부**까지 완수 (PoC 수준)
- 사용자가 "Phase 1로 정의" 확정 → Phase 2는 다음 업무로 이관

---

## 04. E-7 AI 브리프 후속 fix + 전역 UI 가독성 보강 — *별도 컨텍스트*
**환경:** 사무실 PC `D:\dallog\dallog_git` + CF Workers `dallog-brief-proxy`
**도구:** Claude Code Opus 4.7 (E-7 트랙 연속 세션)
**성격:** §01 E-7 후속 디버깅·UX 보강 + 대시보드·차트 가독성 전면 개선

### 진행 내용 요약 (4 파트, 6 커밋)

#### Part A — E-7 후속 fix (4 커밋)
사용자 브라우저 시각 검증에서 발견된 잔존 이슈를 순차 해소.

| # | 이슈 | 진단·처치 | 커밋 |
|---|---|---|---|
| 1 | 코치노트 새 브리프가 최상단에 안 옴 | `noted_at`(date) 단일 정렬 → 동일 날짜 implementation-defined. `created_at` 보조 정렬키 추가 | `cbad793` |
| 2 | 스트리밍 작동 안 함 (글자수 progress 미증가) | 워커 직접 진단 → `primary_status: 429` (OpenAI rate limit). 사용자 $5 충전으로 tier 1 승격 → 429 해소, 그러나 400 발생 | (사용자 결제) |
| 3 | OpenAI 400 일관 | 진단 결과 `reasoning_effort` 를 비-reasoning 모델에 전송 → 400. helper `isReasoningModel(model)` 도입, `gpt-5`/`o1`/`o3` prefix 한정. 동시에 SSE meta 에 `primary_message` 필드 추가 (향후 진단 가속) | `93a3a3c` |
| 4 | gpt-5.4-mini 도 400 | meta 의 primary_message 풀텍스트: *"Unsupported value: 'reasoning_effort' does not support 'minimal'. Supported: 'none', 'low', 'medium', 'high', 'xhigh'"*. `'minimal'` → `'none'` 1단어 fix | `a73ad31` |

→ 사용자 최종 검증: 좌측 시각화 카드 정상 갱신 / 본문 prose 의 `~` 범위 표기 strikethrough 해소 / 스트리밍 progress 동작 / 25초 응답 시간.

#### Part B — 코치 브리프 텍스트 가독성 (1 커밋)
사용자 피드백: 브리프 본문/시각화 카드 텍스트가 어둠.
- 브리프 전용 색상 토큰 4개 신설 (`--brief-text` `#d8d8d8` / `--brief-muted` `#a0a0a0` / `--brief-h2` `#5fd9e6` 시안 / `--brief-h3` `#c8f135` 라임).
- `MarkdownBriefRenderer` h2/h3/p/ul/ol/em 색상 → 새 토큰. **h2 시안 / h3 라임** 으로 위계 명확화.
- `VisualBriefCards` 4개 카드 + 헤더의 `var(--text2/3)` → 새 토큰.
- 영향 범위 한정: 토큰명 prefix(`--brief-*`) 분리 → 다른 페이지 무관.
- 커밋: `ae89808 style(brief): 텍스트 가독성 보강 — 본문/라벨 밝기 상향 + 소제목 시안/라임 강조`

#### Part C — 전역 보조 텍스트 가독성 + 대시보드 탭 (1 커밋)
사용자 요청: GPT 와 협의한 텍스트군 정의 (저대비 보조·소형 정보 라벨·상단 섹션 탭). 러닝탭만 X, **전역 일괄**.
- **전역 토큰 자체 값 조정** (다른 페이지도 한 번에 개선):
	- 다크: `--text2` #888 → **#b8b8b8** / `--text3` #555 → **#8f8f8f**
	- 라이트: `--text2` #555 → **#4a4a4a** / `--text3` #8a8a8a → **#6f6f6f**
- 의미 기반 동의어 토큰 신설: `--text-primary` `--text-secondary` `--text-tertiary` `--text-muted` `--text-disabled` (점진 마이그레이션용).
- 대시보드 BODY/RUNNING/STRENGTH 탭 폰트 **13px → 14px**, letter-spacing 0.08em → 0.06em (뭉개짐 완화), 비활성 색상 `--text3` → `--text2` 한 단계 ↑.
- 커밋: `013aad0 style(global): 전역 보조 텍스트 가독성 보강 — --text2/3 밝게 + 대시보드 탭 14px`

#### Part D — 그래프 가독성 회복 (1 커밋)
사용자 결정 4가지: 마커 완전 제거 + hover 시만 / 높이 2배 / 라이트 한정 차분 팔레트 / 라이트 accent 진한 티일.
- `src/lib/chartTheme.ts` 신설 — `chartColor(1|2|3)` `chartBg()` `lineMarker` 헬퍼. CSS 변수(`--chart-1/2/3`)를 런타임에 읽어 Chart.js inline 옵션에 주입.
- 다크 팔레트 유지 / 라이트 한정 팔레트: 티일 `#0a8e9e` / 진한 블루 `#2563eb` / 진한 코랄 `#b54a28`.
- 라이트 모드 `--accent` 자체를 진한 티일로 교체 → active 탭·버튼·사이드바·코치노트 강조 모두 자극 완화. `--btn-primary-fg` 토큰화 (다크 검정 / 라이트 흰색) 로 가독성 유지.
- 차트 컨테이너 height **2배** (90~110px → 180~220px): 변화 폭이 일직선처럼 보이던 문제 해결. 대상: BODY 체중 추이 / 골격근·체지방 추이 / RUNNING 월별 마일리지 / RUNNING 심박·케이던스·페이스 추이 / STRENGTH 혼합 차트.
- 모든 선 그래프 `pointRadius: 0` + `pointHoverRadius: 4` (lineMarker spread).
- 커밋: `3425967 style(dashboard/charts): 그래프 가독성 회복 — 높이 2배 + 마커 hover only + 라이트 한정 차분 팔레트`

### 산출물
- **신규 파일 2건**: `src/lib/chartTheme.ts` / 메모리 `feedback-push-autonomy`
- **수정 파일 7건**: `workers/brief-proxy/index.js` · `src/pages/CoachNotes.tsx` · `src/components/MarkdownBriefRenderer.tsx` · `src/index.css` · `src/pages/Dashboard.tsx` · `src/components/dashboard/{Body,Running,Strength}Section.tsx`
- **커밋 6건**: `cbad793` 정렬 / `93a3a3c` reasoning_effort 조건부 / `a73ad31` 'minimal'→'none' / `ae89808` 브리프 색 / `013aad0` 전역 가독성 / `3425967` 차트
- **push**: `origin/main` 동기화 완료 (모두 자동 진행, 사용자 명시 위임)

### 사용자 결정 (컨텍스트 내 확정)
- 직전 작업 패턴이 반복되어 **단순 UI/스타일 변경은 커밋·push 자동 진행 위임** → memory `feedback-push-autonomy` 저장
- 라이트 모드 accent: **진한 티일 #0a8e9e** (어두운 라임 `#5a7c00` 권장 거절, 시안 계열 선택)
- 그래프 마커: **완전 제거 + hover 시만 표시**
- 그래프 높이: **2배** (사용자 "2~2.5배 이상" 중 보수적 선택)
- 라이트 모드 그래프: **차분한 팔레트로 교체** (라임/형광 라이트에서 자극·가시성 ↓)
- 로고 BI: **그림자/획 테두리 권장** (이번 작업에는 미포함, 별도 결정 대기)

### 의도적으로 안 한 작업
- **로고 그림자 적용** — BI 영역, 사용자 별도 결정 대기
- **차트 옵션 안 텍스트 색상 hex (#888/#555/#666)** 의 토큰화 — Chart.js inline JS 라 CSS var 직접 못 받음. 다음 단계로 보류
- **체크리스트 페이지 E-7 누적 코멘트** — 사용자 명시 지시 시 진행

### 관련 페이지
- 핸드오프: [📋 26-05-26_1-달록_핸드오프](#/doc/handoff-13) §16 (본 컨텍스트 갱신)
- 작업보고(E-7 발행분): [🔁 260527-수요일_E7-AI브리프 OpenAI 라인 전환](#/doc/workreport-65)
- 체크리스트: [✅ 작업 체크리스트_260526-2200](#/doc/checklist-01) (E-7 등재됨, fix 누적은 보류)

### 컨텍스트 종합
- 시작: 2026-05-27 16:00 KST
- 완료: 2026-05-27 20:30 KST (보고 시점)
- 작업 시간: 약 4시간 30분
- 단일 컨텍스트에서 인프라 후속 fix(Part A) + UX 보강 3건(Part B/C/D) 일괄 처리
- 사용자 퇴근 상태에서 명시 위임 받아 논스톱 진행

---

## 05. 디자인 폴리싱 대작업 — NanumSquare Neo + colorTheme + design system + 목업 catalog 방식
§04 (E-7 후속 fix + 가독성) 이후 동일 컨텍스트(2026-05-27 저녁 → 28 새벽)에서 사용자 추가 지시로 시작. 처음엔 신발/런타입명 outline·shadow 정도 소량 fix였으나, 5단계 시도 끝에 본질이 색 대비 알고리즘 + 폰트 + 전역 디자인 시스템 부재라는 결론. 한 자리에서 UI 전역 폴리싱 대작업으로 확장.

### Part A — NanumSquare Neo 본문 전역 폰트
- npm 패키지 `@noonnu/nanum-square-neo-variable@0.1.0` (MIT, OFL 1.1, 가변 woff2 단일 ~1.7MB)
- `src/main.tsx` 에서 패키지 css import, `--font-body` 토큰을 NanumSquare Neo + system fallback chain 으로 교체
- 디스플레이용 Bebas Neue 는 로고에 한정 유지
- `THIRD_PARTY_LICENSES.md` 신설

### Part B — adjustColorForTheme 자동 보색 매핑 (colorTheme.ts)
사용자 의도: "신규 사용자가 어떤 색을 등록해도 자동으로 라이트/다크 대비색 적용. 디테일 색 규정 하드코딩 X."
알고리즘 5단계 시도 끝에 확정:
```javascript
원본 hex → HSL → Hue +180° (보색) → theme 별 lightness clamp
라이트: L ≤ 0.35 / 다크: L ≥ 0.68
무채색(S<0.12) → 안전 톤(#3a3a3a / #d8d8d8)
```
`useTheme()` hook (MutationObserver 로 `data-theme` 변경 자동 감지·리렌더) 함께 제공. Settings + History 4고 자동 적용.

### Part C — 디자인 토큰 + 공통 컴포넌트 클래스 (design polish)
사용자 명시 = "목업 catalog 먼저 만들고 토큰 확정 후 코드 반영" → 이 방식이 페이지별 직접 수정보다 사용자 대기 시간 30분 미만 (vs 1.5~2h) 으로 검증됨.
산출물 2종:
- `docs/260528_design_polish_mockup.html` (라이트 base)
- `docs/260528_design_polish_mockup_dark.html` (다크 default + 캡션 11.5px 통일)
확정된 토큰 + 컴포넌트 클래스를 `src/index.css` 에 이식:
- 전역 토큰 갱신 (`--bg`/`--bg2`/`--bg3`/`--bg4`/`--border`/`--text`/`--danger`/`--shadow-card`/`--radius` 등) — 기존 이름 유지 + 값만 갱신 → 다른 페이지 자동 반영
- 신규 클래스: `.row` + 자식 / `.btn-outline` / `.btn-destructive` / `.btn--sm` / `.btn--icon` / `.badge`
- `Settings.tsx` row 인라인 스타일 수십 줄 → className 1줄로 축소

### Part D — 차트·코치브리프·로고·사이드바 부수 보강
- 대시보드 차트 height 2배 + 마커 hover only + 라이트 한정 차분 팔레트 (`src/lib/chartTheme.ts`)
- 코치 브리프 텍스트 가독성 (`--brief-*` 토큰)
- 라이트 모드 `--accent` 라임 → 진한 티일 #0a8e9e
- 로고 SVG filter 토큰화 + 컴팩트 사이즈 (52px)
- 사이드바 weight 비활성 700 / 활성 800

### 학습 데이터 (메모리 신설)
- **`feedback-mockup-first`** — 시각 요소 보정·디자인 시스템 우선 변경 시에는 목업 catalog 먼저 만들고 토큰 확정 후 코드 반영. 페이지별 직접 수정 사이클은 사용자 대기 시간·체감 피로도 모두 크고 톤 일관성 위험.

### 산출물 합계
- **신규 파일 4건**: `src/lib/colorTheme.ts` / `src/lib/chartTheme.ts` / `THIRD_PARTY_LICENSES.md` / `docs/260528_design_polish_mockup{,_dark}.html`
- **수정 파일 8건**: `src/index.css` / `src/main.tsx` / `src/pages/{Settings,History,CoachNotes}.tsx` / `src/components/{Layout,SummaryBrief,MarkdownBriefRenderer}.tsx` + 대시보드 차트 3종
- **커밋 16+ 건** — 시도·복원·확정 누적

### 관련 페이지
- 작업보고: [🎨 260527-수요일_디자인 폴리싱 시스템 + NanumSquare Neo + 목업 방식](#/doc/workreport-67)
- 핸드오프: [📋 26-05-26_1-달록_핸드오프](#/doc/handoff-13) §17

### 컨텍스트 종합
- 시작: 2026-05-27 22:00 KST (단순 가독성 fix 요청)
- 완료: 2026-05-28 02:00 KST (디자인 시스템 이식 commit `4f80930`)
- 약 4시간, 16+ commit (시도·재시도·복원·확정 모두 포함)
- 사용자 의도 정확히 잡기까지 5단계 시도 끝에 본질(색 알고리즘 + 폰트 + 시스템 부재)에 도달. 향후 같은 작업은 메모리 정책으로 1단계 단축 가능.
