---
date: 2026-03-25
subject: 신규 스킬 통합 테스트 결과
writer: 24-claude (총괄)
testers: 24-Cursor(session-logs), 24-Codex(summarize), 24-Gemini(RSS), 23-Cursor(gitea)
---

# 신규 스킬 통합 테스트 결과

## 테스트 요약

| 스킬 | 상태 | 응답 시간 | 비고 |
|------|------|----------|------|
| **session-logs** | **정상** | ~20ms | 한글 q 파라미터 URL 인코딩 필요 |
| **blogwatcher (RSS)** | **정상** | 테스트 중 | feedparser 동작 확인 |
| **summarize (text)** | **정상** | ~1.5s | LLM 호출 포함 |
| **summarize (url)** | 수정 후 정상 | - | 컨테이너→호스트 IP 문제 해결 |
| **whisper** | **설정 완료** | - | OPENAI_API_KEY compose override 문제 해결 |
| **gitea** | **인증 대기** | ~6.6ms | GITEA_TOKEN 미설정 → 400 정상 에러 반환 |

## 발견된 이슈 및 해결

### 이슈 1: 컨테이너→호스트 통신 (summarize, whisper, gitea)
- **원인**: Docker 브리지 네트워크에서 `localhost:8001` = 컨테이너 자신
- **해결**: `.env`에 `LLM_GATEWAY_URL=http://192.168.0.106:8001/api/llm/generate` 설정
- **근본 원인**: compose `environment`의 `${VAR:-default}` 패턴이 env_file보다 우선

### 이슈 2: OPENAI_API_KEY 빈 값 덮어쓰기 (whisper)
- **원인**: compose `environment: OPENAI_API_KEY=${OPENAI_API_KEY}` → 호스트에 env 없으면 빈 값
- **해결**: compose environment에서 해당 줄 제거, secrets.env에서 직접 주입

### 이슈 3: GITEA_TOKEN 미설정
- **상태**: 의도된 동작 (400 에러 정상 반환)
- **해결**: secrets.env에 GITEA_TOKEN 추가 필요

## 성능

| 스킬 | 응답 시간 | 병목 |
|------|----------|------|
| session-logs | 20ms | DB 쿼리 (빠름) |
| summarize (text) | 1.5s | LLM 호출 |
| gitea | 6.6ms | HTTP 프록시 (빠름) |

## SSOT 교훈

compose `environment`의 `${VAR:-default}` 패턴은 `env_file`보다 우선 적용되어 SSOT 원칙을 위반할 수 있음.
→ **원칙 추가 권장**: compose `environment`에 env_file과 겹치는 변수를 `${VAR:-default}` 형태로 두지 않는다.
이 원칙은 이미 `infrastructure-ssot-principle.md §7`에 있음:
> 공용 env_file을 읽는 compose는 같은 키를 environment: KEY=${KEY}로 다시 선언해 로컬 .env placeholder가 runtime.env·secrets.env를 덮어쓰게 만들지 않는다.
