기획 문서 원문
진행현황.md
※ 이 문서는 사후에 정리한 산출물이 아니라, Claude Code와 PM이 TASK를 완료할 때마다 실시간으로 갱신해 온 원문입니다.
이 문서는 TFT_Hideout_WBS.xlsx의 98개 TASK를 기준으로 실제 개발 진행 상태를 추적하는 살아있는 문서다.
클로드 코드와 PM은 새 기능을 개발할 때 WBS 원본이 아니라 이 문서를 기준으로 다음 작업을 정하고, 완료 여부를 갱신한다.
갱신 규칙 (CLAUDE.md 3장과 동일): 클로드 코드가 TASK를 구현 → 단위 테스트 작성·통과 → 자체 검증 → PM에게 확인 요청 → PM이 승인한 뒤에만 아래 표의 상태를
완료로 변경하고 PM확인/커밋 컬럼을 채운다. PM 확인 전에는 상태를진행중으로 유지하고, git 커밋·push도 하지 않는다.테스트 요구사항 컬럼: 각 TASK별 구체적인 단위/통합 테스트 항목은
TFT_Hideout_WBS.xlsx의테스트 요구사항컬럼(K열)을 참고한다. 여기서는 상태 추적에 집중하기 위해 생략했다.
진행률 요약
-
전체 TASK 수: 109개(SET-16·DATA-16·FE-13·FE-14·CHAT-11·FE-15·DATA-17·DATA-18·CHAT-12·CHAT-13·DATA-19·CHAT-14·DATA-20·CHAT-15 신설, SET-05·SET-11·SET-12 취소 3개 포함, 활성 106개)
-
완료: 68개 / 진행중: 1개(SET-16, Riot API 키 재발급 대기) / PM확인대기: 0개 / 보류: 1개(KPI-03, 이력 저장·알림 채널 설계 미확정) / 대기: 36개 / 취소: 3개(SET-05, v1.7 Redis 제거로 폐기 / SET-11, Metabase 무료 플랜 512MB OOM으로 자체 구현 전환 / SET-12, Figma MCP 미사용 결정으로 폐기) (자동 갱신 아님 — TASK 상태 변경 시 이 요약도 함께 수기 갱신할 것)
대그룹별 TASK 수
| 대그룹 | 하위영역 | TASK 수 |
|---|---|---|
| 시스템설정 | - | 16 |
| 코딩 | 데이터파이프라인 | 19 |
| 코딩 | 백엔드API | 14 |
| 코딩 | 챗봇RAG | 14 |
| 코딩 | 사후패인분석 | 10 |
| 코딩 | 프론트엔드 | 15 |
| 코딩 | KPI모니터링 | 3 |
| 테스트 | - | 11 |
| 배포릴리즈 | - | 5 |
| 합계 | 107 |
* 시스템설정 16개 중 SET-05(Upstash Redis 생성)는 2026-07-31 PM 결정, SET-11(Metabase 배포)은 2026-08-03 PM 결정, SET-12(Figma 연동)는 2026-08-04 PM 결정으로 각각 취소됨(활성 TASK는 98개). 코드는 결번으로 유지하며 위 집계에는 포함. SET-16(Riot Personal Key)은 2026-08-04 SET-10에서 분리 신설(아래 이력 참고). 프론트엔드 15개는 FE-12(KPI 대시보드 페이지, SET-11 취소에 따른 대체)·FE-13(티어리스트 카드 챔피언 이미지 표시, 2026-08-05 PM 요청으로 신설)·FE-14(조합 상세 헥스 배치도 실좌표 반영, 2026-08-06 PM 요청으로 신설)·FE-15(조합 상세 헥스 배치도 성급(★) 표시, 2026-08-06 PM 요청으로 신설) 신설분 포함. 데이터파이프라인 18개는 DATA-16(증강체 설명 템플릿 플레이스홀더 정리, FE-06 실데이터 검증 중 발견해 2026-08-05 PM 결정으로 신설)·DATA-17(메타 조합 소프트 삭제 로직 구현, FE-14 실좌표 백필 중 발견해 2026-08-06 PM 결정으로 신설)·DATA-18(패치 미변경 시 comps 주기 재수집 로직 구현, DATA-17 운영 반영 중 발견해 2026-08-06 PM 결정으로 신설, 착수는 내일 예정) 포함. 챗봇RAG 15개는 CHAT-11(후속질문 동적 생성·LLM 기반, FE-09 검증 중 논의해 2026-08-06 PM 결정으로 신설)·CHAT-12(답변 마크다운 서식 렌더링, PM이 챗봇 UI 스크린샷을 보고 가독성 개선을 요청해 2026-08-08 신설)·CHAT-13(아이템 이름 근거검증 인식 개선, CHAT-12 PM 실사용 검증 중 발견한 구조적 오탐을 별도 TASK로 분리해 2026-08-08 신설)·CHAT-14(아이템 효과 설명 RAG 연동·이름 줄임말 인식, PM이 아이템 설명 부족 개선을 요청해 2026-08-08 신설)·CHAT-15(검색 결과 최소 유사도 신뢰도 임계값 도입, CHAT-14 PM 검증 중 발견한 오검색 확신 오답 문제를 별도 TASK로 분리해 2026-08-09 신설) 포함. 데이터파이프라인 20개는 DATA-19(아이템 효과 설명 데이터 확보·정제, CHAT-14와 함께 2026-08-08 PM 요청으로 신설)·DATA-20(아이템 핵심 수치 스탯 RAG 노출, CHAT-14 PM 검증 중 발견해 2026-08-09 PM 결정으로 신설) 포함.
범례
-
상태: 대기 / 진행중 / PM확인대기 / 완료 / 취소(범위 변경으로 폐기, 코드는 결번 유지)
-
PM확인: 승인한 PM 확인 결과(승인일자 또는
-) -
커밋/Push: 완료 후 실제 커밋된 커밋 해시 또는 PR 번호(
-는 미진행) -
우선순위: 필수 = 1.0 범위에 반드시 포함 / 권장 = 품질을 높이나 지연 가능
A. 시스템 설정 (SET)
| WBS코드 | IA/화면 매칭 | TASK명 | 우선순위 | 선행TASK | 상태 | PM확인 | 커밋/Push |
|---|---|---|---|---|---|---|---|
| SET-01 | - | GitHub 저장소 생성 및 브랜치 전략 수립 | 필수 | - | 완료 | 2026-07-31 | 686b279 · docs/verification/SET-01-작업결과.md |
| SET-02 | - | 로컬 개발 환경 및 필수 프로그램 설치 | 필수 | SET-01 | 완료 | 2026-07-31 | 4b16b38 · docs/verification/SET-02-작업결과.md |
| SET-03 | - | 리포지토리 초기 구조 스캐폴딩 | 필수 | SET-01 | 완료 | 2026-07-31 | 0bccf96 · docs/verification/SET-03-작업결과.md |
| SET-04 | - | Supabase 프로젝트 생성(Postgres+pgvector) | 필수 | - | 완료 | 2026-07-31 | b1d3995 · docs/verification/SET-04-작업결과.md |
| SET-05 | - | (취소) Upstash Redis 생성 — v1.7 Redis 제거 결정으로 폐기 | 취소 | - | 취소 | 2026-07-31 | - |
| SET-06 | - | Render 백엔드 배포 파이프라인 구성 | 필수 | SET-01,SET-03 | 완료 | 2026-07-31 | a58ff61(PR #1) · docs/verification/SET-06-작업결과.md |
| SET-07 | - | Cloudflare Pages 프론트엔드 배포 파이프라인 구성 | 필수 | SET-01,SET-03 | 완료 | 2026-07-31 | 3fa9773(PR #3) · docs/verification/SET-07-작업결과.md |
| SET-08 | - | GitHub Actions 워크플로우 스캐폴딩 | 필수 | SET-01 | 완료 | 2026-07-31 | 051e7a0(PR #4) · docs/verification/SET-08-작업결과.md |
| SET-09 | - | 환경변수·시크릿 관리 체계 구성 | 필수 | SET-04,SET-06,SET-07,SET-08 | 완료 | 2026-07-31 | 2f36f93(PR #5) · docs/verification/SET-09-작업결과.md |
| SET-10 | - | 외부 API 키 발급 및 검증(Groq·HF만, Riot은 SET-16으로 분리) | 필수 | - | 완료 | 2026-08-04 | 560982b(task/FE-01, PR #10, main 머지 완료) · docs/verification/SET-10-작업결과.md |
| SET-16 | - | Riot Personal Key 발급 및 검증 | 필수 | - | 진행중(Riot API 키 재발급 대기, 기존 Development Key 401 만료) | - | - |
| SET-11 | - | (취소) Metabase 배포(Render 2번째 서비스) — 무료 플랜 512MB OOM으로 자체 구현(KPI-01·FE-12) 전환 | 취소 | - | 취소 | 2026-08-03 | - |
| SET-12 | - | (취소) Figma 연동 및 프론트엔드 디자인 스킬 활성화 | 취소 | - | 취소 | 2026-08-04 | - |
| SET-13 | - | 커밋/PR/배포 승인 프로세스 정의 | 필수 | SET-01 | 완료 | 2026-08-03 | bf390c3 · docs/verification/SET-13-작업결과.md |
| SET-14 | - | CI 자동 테스트 게이트 구성 | 필수 | SET-01,SET-08 | 완료 | 2026-08-03 | 4b7560b(PR #8) · docs/verification/SET-14-작업결과.md |
| SET-15 | - | 근거 문서 경량 참조본 생성(/docs/reference/*.md) | 필수 | SET-03 | 완료 | 2026-08-03(소급, 파일은 2026-07-30 최초 커밋에 포함) | 686b279 · docs/verification/SET-15-작업결과.md |
B-1. 코딩 > 데이터 파이프라인 (DATA)
| WBS코드 | IA/화면 매칭 | TASK명 | 우선순위 | 선행TASK | 상태 | PM확인 | 커밋/Push |
|---|---|---|---|---|---|---|---|
| DATA-01 | 공통(전 화면) | DB 스키마 설계-정적 테이블 | 필수 | SET-04 | 완료 | 2026-08-03 | d05001b(task/DATA-01, PR #9(2026-08-04) main 머지 완료) · docs/verification/DATA-01-작업결과.md |
| DATA-02 | 티어리스트·조합상세·아이템빌드 | DB 스키마 설계-메타조합 테이블 | 필수 | DATA-01 | 완료 | 2026-08-03 | 36f3f8a(task/DATA-02, PR #9(2026-08-04) main 머지 완료) · docs/verification/DATA-02-작업결과.md |
| DATA-03 | 사후패인분석·분석리포트 | DB 스키마 설계-분석/로그 테이블 | 필수 | DATA-01 | 완료 | 2026-08-03 | e5fe331(task/DATA-03, PR #9(2026-08-04) main 머지 완료) · docs/verification/DATA-03-작업결과.md |
| DATA-04 | 챗봇위젯 | 벡터DB 스키마 및 인덱스 구성 | 필수 | DATA-01,SET-04 | 완료 | 2026-08-03 | 62a6b82(task/DATA-04, PR #9(2026-08-04) main 머지 완료) · docs/verification/DATA-04-작업결과.md |
| DATA-05 | 공통 | op.gg MCP 응답 스키마 확인 스파이크 | 필수 | - | 완료 | 2026-08-04 | 2f50348(task/FE-01, PR #10, main 머지 완료) · docs/spike/opgg-schema.md, docs/verification/DATA-05-작업결과.md |
| DATA-06 | 공통 | TFT DDragon 신규 구조 확인 스파이크 | 필수 | - | 완료 | 2026-08-04 | 728ae6e(task/FE-01, PR #10, main 머지 완료) · docs/spike/tft-ddragon.md, docs/verification/DATA-06-작업결과.md |
| DATA-07 | 증강체정보 | is_legend_related 판별 방법 확인 스파이크 | 필수 | DATA-05 | 완료 | 2026-08-04 | 280dc12(task/FE-01, PR #10, main 머지 완료) · docs/spike/legend-augment.md, docs/verification/DATA-07-작업결과.md |
| DATA-08 | 공통 | op.gg MCP 배치 수집 워커 구현 | 필수 | DATA-05 | 완료 | 2026-08-04 | 895b20e(task/FE-01, PR #10, main 머지 완료) · docs/verification/DATA-08-작업결과.md |
| DATA-09 | 공통 | ID-이름 매핑 갱신 로직 구현 | 필수 | DATA-06,DATA-08 | 완료 | 2026-08-04 | 7e5ac25(task/FE-01, PR #10, main 머지 완료) · docs/verification/DATA-09-작업결과.md |
| DATA-10 | 공통 | 데이터 정규화 및 patch_version 태깅 구현 | 필수 | DATA-02,DATA-08 | 완료 | 2026-08-04 | 6bb00bf(task/FE-01, PR #10, main 머지 완료) · docs/verification/DATA-10-작업결과.md |
| DATA-11 | 공통 | 임베딩 생성 파이프라인 구현 | 필수 | DATA-04,DATA-10,SET-10 | 완료 | 2026-08-04 | 755128b(task/FE-01, PR #10, main 머지 완료) · docs/verification/DATA-11-작업결과.md |
| DATA-12 | 공통 | 자동 패치 감지 트리거 구현 | 필수 | DATA-08,SET-08 | 완료 | 2026-08-04 | 8821fdd(task/FE-01, PR #10, main 머지 완료) · docs/verification/DATA-12-작업결과.md |
| DATA-13 | 공통 | 원자적 패치 전환 트랜잭션 구현 | 필수 | DATA-10,DATA-11 | 완료 | 2026-08-04 | 454ad6c(task/FE-01, PR #10, main 머지 완료) · docs/verification/DATA-13-작업결과.md |
| DATA-14 | 공통 | 배치 동시 실행 방지 구현 | 필수 | DATA-12 | 완료 | 2026-08-04 | ba55f23(feat) · f5f9b49·ed3f1e3·227178c(검증 중 발견한 배포 버그 3건 수정) · schedule 활성화 커밋(1일 1회 03:00 KST) · docs/verification/DATA-14-작업결과.md |
| DATA-15 | 공통 | 캐시 정리 배치 구현(Postgres, v1.7) | 필수 | DATA-13,DATA-03 | 완료 | 2026-08-04 | 06a11d2(feat) · docs/verification/DATA-15-작업결과.md |
| DATA-16 | 증강체정보 | 증강체 설명 템플릿 플레이스홀더 정리 | 권장 | DATA-08 | 완료 | 2026-08-05 | 36fba5b(feat) · docs/verification/DATA-16-작업결과.md |
| DATA-17 | 티어리스트·조합상세 | 메타 조합 소프트 삭제(비활성화) 로직 구현 | 권장 | DATA-08 | 완료 | 2026-08-06 | 1958465(feat) · docs/verification/DATA-17-작업결과.md |
| DATA-18 | 티어리스트·조합상세 | 패치 미변경 시에도 조합(comps) 데이터 주기 재수집 로직 구현 | 권장 | DATA-17 | 완료 | 2026-08-07 | d7c6882(feat) · docs/verification/DATA-18-작업결과.md |
| DATA-19 | 아이템빌드 | 아이템 효과 설명 데이터 확보·정제 | 권장 | DATA-08 | 완료 | 2026-08-08 | 78cae55(feat) · docs/verification/DATA-19-작업결과.md |
| DATA-20 | 아이템빌드 | 아이템 핵심 수치 스탯 RAG 노출 | 권장 | DATA-19 | 완료 | 2026-08-09 | 9705bf0(feat) · docs/verification/DATA-20-작업결과.md |
* ⚠ DATA-09 착수 전 확인: ID-이름 매핑은 PM 결정(2026-08-04)에 따라 Community Dragon(raw.communitydragon.org) 기준으로 설계한다(공식 "TFT DDragon" 분리 엔드포인트 미확인, docs/spike/tft-ddragon.md 참고). Set 18 런칭(2026-08-12) 이후에는 공식 TFT DDragon 엔드포인트가 그 사이 공개됐는지 재확인한 뒤 DATA-06 결론을 그대로 쓸지 다시 판단할 것(PM 결정, 재확인 전까지는 별도 액션 불필요).
B-2. 코딩 > 백엔드 API (API)
| WBS코드 | IA/화면 매칭 | TASK명 | 우선순위 | 선행TASK | 상태 | PM확인 | 커밋/Push |
|---|---|---|---|---|---|---|---|
| API-01 | 공통 | FastAPI 프로젝트 스캐폴딩 | 필수 | SET-02,SET-03 | 완료 | 2026-08-03 | 6790037(task/API-01, PR #9(2026-08-04) main 머지 완료) · docs/verification/API-01-작업결과.md |
| API-02 | 티어리스트 | GET /catalog/tierlist 구현 | 필수 | DATA-02,API-01 | 완료 | 2026-08-03(2026-08-05 랭크 필터 롤백) | f8c2ad5(task/API-02, PR #9(2026-08-04) main 머지 완료) · 723eb37(fix, 랭크 필터 제거) · docs/verification/API-02-작업결과.md, docs/verification/API-02-rollback-작업결과.md |
| API-03 | 조합상세 | GET /catalog/comps/{comp_id} 구현 | 필수 | DATA-02,API-01 | 완료 | 2026-08-03 | 2769e4f(task/API-03, PR #9(2026-08-04) main 머지 완료) · docs/verification/API-03-작업결과.md |
| API-04 | 아이템빌드 | GET /catalog/items/builds 구현 | 필수 | DATA-02,API-01 | 완료 | 2026-08-03 | de02b0d(task/API-04, PR #9(2026-08-04) main 머지 완료) · docs/verification/API-04-작업결과.md |
| API-05 | 증강체정보 | GET /catalog/augments 구현 | 필수 | DATA-07,API-01 | 완료 | 2026-08-04 | 0813e79(feat) · docs/verification/API-05-작업결과.md |
| API-06 | 공통(GNB) | GET /catalog/patches/current 구현 | 필수 | DATA-01,API-01 | 완료 | 2026-08-03 | 3c3a134(task/API-06, PR #9(2026-08-04) main 머지 완료) · docs/verification/API-06-작업결과.md |
| API-07 | 공통 | Rate Limiting 미들웨어 구현 | 필수 | API-01 | 완료 | 2026-08-03 | 25e7935(task/API-07, PR #9(2026-08-04) main 머지 완료) · docs/verification/API-07-작업결과.md |
| API-08 | 챗봇위젯 | session_id 발급/조회 로직 구현 | 필수 | API-01 | 완료 | 2026-08-03 | 4663568(task/API-08, PR #9(2026-08-04) main 머지 완료) · docs/verification/API-08-작업결과.md |
| API-09 | 챗봇위젯 | POST /chat/message 뼈대 구현(SSE) | 필수 | API-08 | 완료 | 2026-08-03 | 37a3803(task/API-09, PR #9(2026-08-04) main 머지 완료) · docs/verification/API-09-작업결과.md |
| API-10 | 챗봇위젯 | GET /chat/session/{id}/history 구현 | 필수 | DATA-03,API-09 | 완료 | 2026-08-03 | b9c95bc(task/API-10, PR #9(2026-08-04) main 머지 완료) · docs/verification/API-10-작업결과.md |
| API-11 | 사후패인분석 | POST /analysis/link 구현 | 필수 | SET-16,API-01 | 대기 | - | - |
| API-12 | 사후패인분석 | POST /analysis/recent 뼈대 구현 | 필수 | API-11,DATA-03 | 대기 | - | - |
| API-13 | 분석리포트 | GET /analysis/{match_id}/report 구현 | 필수 | DATA-03,API-12 | 대기 | - | - |
| API-14 | 공통 | KPI 계측 이벤트 API 구현 | 필수 | DATA-03,API-01 | 완료 | 2026-08-03 | cb96535(task/API-14, PR #9(2026-08-04) main 머지 완료) · docs/verification/API-14-작업결과.md |
B-3. 코딩 > 챗봇 RAG 파이프라인 (CHAT)
| WBS코드 | IA/화면 매칭 | TASK명 | 우선순위 | 선행TASK | 상태 | PM확인 | 커밋/Push |
|---|---|---|---|---|---|---|---|
| CHAT-01 | 챗봇위젯 | 의도 분류 로직 구현 | 필수 | API-09 | 완료 | 2026-08-03 | b236a82(task/CHAT-01, PR #9(2026-08-04) main 머지 완료) · docs/verification/CHAT-01-작업결과.md |
| CHAT-02 | 챗봇위젯 | 하이브리드 검색 구현 | 필수 | DATA-11,CHAT-01 | 완료 | 2026-08-04 | bda63b2(feat) · docs/verification/CHAT-02-작업결과.md |
| CHAT-03 | 챗봇위젯 | 프롬프트 조립 로직 구현 | 필수 | CHAT-02,API-10 | 완료 | 2026-08-04 | 9556651(feat) · docs/verification/CHAT-03-작업결과.md |
| CHAT-04 | 챗봇위젯 | 입력 전처리 구현 | 필수 | CHAT-01 | 완료 | 2026-08-04 | 848ee1c(task/CHAT-04, PR #9(2026-08-04) main 머지 완료) · docs/verification/CHAT-04-작업결과.md |
| CHAT-05 | 챗봇위젯 | sLLM 답변 생성 및 SSE 스트리밍 연동 | 필수 | CHAT-03,API-09,SET-10 | 완료 | 2026-08-04 | 3f598e4(feat) · docs/verification/CHAT-05-작업결과.md |
| CHAT-06 | 챗봇위젯 | 출력 후처리 구현 | 필수 | CHAT-05 | 완료 | 2026-08-04 | 37af656(feat) · docs/verification/CHAT-06-작업결과.md |
| CHAT-07 | 챗봇위젯 | 웹사이트 링크 자동 삽입 구현 | 필수 | CHAT-06 | 완료 | 2026-08-04 | c6dc992(feat) · docs/verification/CHAT-07-작업결과.md |
| CHAT-08 | 챗봇위젯 | 응답 캐싱 로직 구현 | 필수 | CHAT-05,DATA-15 | 완료 | 2026-08-04 | 8f13b84(feat) · docs/verification/CHAT-08-작업결과.md |
| CHAT-09 | 챗봇위젯 | Q&A 로깅 구현 | 필수 | DATA-03,CHAT-05 | 완료 | 2026-08-04 | e0eb7ad(feat) · docs/verification/CHAT-09-작업결과.md |
| CHAT-10 | 챗봇위젯 | 사후분석 트리거 연동 | 필수 | CHAT-06,API-12 | 대기 | - | - |
| CHAT-11 | 챗봇위젯 | 후속질문 동적 생성(LLM 기반) 구현 | 권장 | CHAT-05,FE-09 | 완료 | 2026-08-06 | 8be5057(feat) · docs/verification/CHAT-11-작업결과.md |
| CHAT-12 | 챗봇위젯 | 답변 마크다운 서식(목록/강조) 렌더링 구현 | 권장 | CHAT-03,FE-09 | 완료 | 2026-08-08 | 7292e13(feat) · docs/verification/CHAT-12-작업결과.md |
| CHAT-13 | 챗봇위젯 | 아이템 이름 근거검증 인식 개선 | 권장 | CHAT-06,CHAT-07,DATA-11 | 완료 | 2026-08-08 | a1ddfe0(feat) · docs/verification/CHAT-13-작업결과.md |
| CHAT-14 | 챗봇위젯 | 아이템 효과 설명 RAG 연동 및 이름 줄임말 인식 | 권장 | DATA-19,CHAT-02,CHAT-04 | 완료 | 2026-08-09 | d45ec9b(feat) · docs/verification/CHAT-14-작업결과.md |
| CHAT-15 | 챗봇위젯 | 검색 결과 최소 유사도 신뢰도 임계값 도입 | 권장 | CHAT-02,CHAT-14 | 완료 | 2026-08-09 | d45ec9b(feat) · docs/verification/CHAT-15-작업결과.md |
B-4. 코딩 > 사후 패인 분석 (PGA)
| WBS코드 | IA/화면 매칭 | TASK명 | 우선순위 | 선행TASK | 상태 | PM확인 | 커밋/Push |
|---|---|---|---|---|---|---|---|
| PGA-01 | 사후패인분석 | Riot ID 계정 연동 로직 구현 | 필수 | API-11 | 대기 | - | - |
| PGA-02 | 사후패인분석 | 최신 매치 조회 로직 구현 | 필수 | PGA-01 | 대기 | - | - |
| PGA-03 | 사후패인분석·분석리포트 | 분석 결과 캐시 재사용 로직 구현 | 필수 | DATA-03,PGA-02 | 대기 | - | - |
| PGA-04 | 분석리포트 | 조합 이탈도 계산 로직 구현 | 필수 | PGA-02,DATA-02 | 대기 | - | - |
| PGA-05 | 분석리포트 | 아이템 집중도 계산 로직 구현 | 필수 | PGA-04 | 대기 | - | - |
| PGA-06 | 분석리포트 | 증강체 시너지 계산 로직 구현 | 필수 | PGA-04 | 대기 | - | - |
| PGA-07 | 분석리포트 | 코칭 문장 생성 로직 구현 | 필수 | PGA-04,PGA-05,PGA-06,SET-10 | 대기 | - | - |
| PGA-08 | 분석리포트 | 다음 게임 제안 근거 조회 로직 구현 | 필수 | PGA-04,DATA-02 | 대기 | - | - |
| PGA-09 | 분석리포트 | 프라이버시 마스킹 로직 구현 | 필수 | PGA-07 | 대기 | - | - |
| PGA-10 | 사후패인분석·분석리포트 | 상세 리포트 데이터 조립 로직 구현 | 필수 | PGA-07,PGA-08,PGA-09,API-13 | 대기 | - | - |
B-5. 코딩 > 프론트엔드 (FE)
| WBS코드 | IA/화면 매칭 | TASK명 | 우선순위 | 선행TASK | 상태 | PM확인 | 커밋/Push |
|---|---|---|---|---|---|---|---|
| FE-01 | 공통 | Next.js 프로젝트 스캐폴딩 및 Tailwind 설정 | 필수 | SET-07 | 완료 | 2026-08-04 | 25570b9(task/FE-01, PR #10, main 머지 완료) · docs/verification/FE-01-작업결과.md |
| FE-02 | 공통(GNB) | GNB 컴포넌트 구현 | 필수 | FE-01 | 완료 | 2026-08-04 | ad42fca(PR #10, main 머지 완료) · docs/verification/FE-02-작업결과.md |
| FE-03 | 티어리스트 | 티어리스트(홈) 페이지 구현 | 필수 | FE-02,API-02,API-06 | 완료 | 2026-08-04(2026-08-05 랭크 필터 롤백) | d9acb04(feat) · b2e27dd(fix, CORS) · d521f3b(fix, 랭크 필터 UI 제거) · docs/verification/FE-03-작업결과.md, docs/verification/API-02-rollback-작업결과.md |
| FE-04 | 조합상세 | 조합 상세 페이지 구현 | 필수 | FE-02,API-03 | 완료 | 2026-08-04 | 18a0115(feat) · 562c478(fix, API-03) · docs/verification/FE-04-작업결과.md |
| FE-05 | 아이템빌드 | 아이템 빌드 페이지 구현 | 필수 | FE-02,API-04 | 완료 | 2026-08-05 | ee2f95b(feat) · 62e1815(fix, API-04) · c146706(fix, batch) · docs/verification/FE-05-작업결과.md |
| FE-06 | 증강체정보 | 증강체 정보 페이지 구현 | 필수 | FE-02,API-05 | 완료 | 2026-08-05 | 8b008ac(feat) · ee67464(fix, API-05) · docs/verification/FE-06-작업결과.md |
| FE-07 | 사후패인분석 | 사후 패인 분석 페이지 구현 | 필수 | FE-02,API-11,API-12 | 대기 | - | - |
| FE-08 | 분석리포트 | 분석 리포트 상세 페이지 구현 | 필수 | API-13,FE-02 | 대기 | - | - |
| FE-09 | 챗봇위젯 | 챗봇 위젯 전역 컴포넌트 구현 | 필수 | FE-01,API-09,CHAT-05 | 완료 | 2026-08-06 | 4423c48(feat) · docs/verification/FE-09-작업결과.md |
| FE-10 | 공통 | 이미지 최적화 및 반응형 sizes 적용 | 권장 | FE-03,FE-04,FE-05,FE-06,FE-07,FE-08 | 대기 | - | - |
| FE-11 | 공통 | 필터 UI 반응형 공용 컴포넌트 구현 | 필수 | FE-01 | 완료 | 2026-08-05 | 0f955ee(feat) · docs/verification/FE-11-작업결과.md |
| FE-12 | KPI 대시보드(비공개) | KPI 대시보드 페이지 구현(비공개) | 필수 | KPI-01 | 대기 | - | - |
| FE-13 | 티어리스트 | 티어리스트 카드 챔피언 이미지 표시 | 권장 | FE-03 | 완료 | 2026-08-05 | feb8a66(feat, batch) · 1b6ad6b(feat, api) · f18a321(feat, FE-13) · docs/verification/FE-13-작업결과.md |
| FE-14 | 조합상세 | 조합 상세 헥스 배치도 실좌표 반영 | 권장 | FE-04 | 완료 | 2026-08-06 | 9bbae24(feat, api/batch) · 51448ea(feat, comp-detail) · docs/verification/FE-14-작업결과.md |
| FE-15 | 조합상세 | 조합 상세 헥스 배치도 성급(★) 표시 | 권장 | FE-14 | 완료 | 2026-08-06 | 99e6669(feat) · docs/verification/FE-15-작업결과.md |
B-6. 코딩 > KPI/모니터링 (KPI)
| WBS코드 | IA/화면 매칭 | TASK명 | 우선순위 | 선행TASK | 상태 | PM확인 | 커밋/Push |
|---|---|---|---|---|---|---|---|
| KPI-01 | 공통 | KPI 대시보드 백엔드 API 구현(자체, Metabase 대체) | 필수 | DATA-03 | 완료 | 2026-08-03 | 675db32(task/KPI-01, PR #9(2026-08-04) main 머지 완료) · docs/verification/KPI-01-작업결과.md |
| KPI-02 | 공통 | RAGAS 주간 배치 평가 파이프라인 구현 | 필수 | CHAT-09,SET-08 | 대기 | - | - |
| KPI-03 | 공통 | 목표 미달 알림 로직 구현 | 권장 | KPI-01 | 보류(이력 저장 테이블·알림 채널 설계 미확정, PM이 추후 재개) | - | - |
C. 테스트 (TEST)
| WBS코드 | IA/화면 매칭 | TASK명 | 우선순위 | 선행TASK | 상태 | PM확인 | 커밋/Push |
|---|---|---|---|---|---|---|---|
| TEST-00 | 공통(정책·로직 크리티컬 TASK) | 핵심 정책/로직 테스트 시나리오 사전 정의 | 필수 | SET-01 | 완료 | 2026-08-03 | docs/test-scenarios.md, docs/verification/TEST-00-작업결과.md |
| TEST-01 | 공통 | DB 스키마/마이그레이션 검증 | 필수 | DATA-01,DATA-02,DATA-03,DATA-04 | 대기 | - | - |
| TEST-02 | 티어리스트~증강체정보 | catalog API 단위/통합 테스트 | 필수 | API-02,API-03,API-04,API-05,API-06 | 대기 | - | - |
| TEST-03 | 챗봇위젯 | chat API 및 RAG 파이프라인 테스트 | 필수 | CHAT-01,CHAT-02,CHAT-03,CHAT-04,CHAT-05,CHAT-06,CHAT-07,CHAT-08,CHAT-09 | 대기 | - | - |
| TEST-04 | 사후패인분석·분석리포트 | analysis API 및 스코어링 로직 테스트 | 필수 | PGA-01,PGA-02,PGA-03,PGA-04,PGA-05,PGA-06,PGA-07,PGA-08,PGA-09,PGA-10 | 대기 | - | - |
| TEST-05 | 공통 | 배치 파이프라인 통합 테스트 | 필수 | DATA-05,DATA-08,DATA-09,DATA-10,DATA-11,DATA-12,DATA-13,DATA-14,DATA-15 | 대기 | - | - |
| TEST-06 | 챗봇위젯 | 챗봇 정책 준수 테스트 | 필수 | CHAT-04,CHAT-06 | 대기 | - | - |
| TEST-07 | 사후패인분석·분석리포트 | 프라이버시 마스킹 테스트 | 필수 | PGA-09 | 대기 | - | - |
| TEST-08 | 전체 7화면 | 프론트엔드 E2E 테스트(Playwright) | 필수 | FE-03,FE-04,FE-05,FE-06,FE-07,FE-08,FE-09 | 대기 | - | - |
| TEST-09 | 전체 7화면 | 반응형 크로스브라우저 테스트 | 필수 | FE-03,FE-04,FE-05,FE-06,FE-07,FE-08,FE-09 | 대기 | - | - |
| TEST-10 | 공통 | Rate Limiting/보안 테스트 | 권장 | API-07 | 대기 | - | - |
D. 배포/릴리즈 (REL)
| WBS코드 | IA/화면 매칭 | TASK명 | 우선순위 | 선행TASK | 상태 | PM확인 | 커밋/Push |
|---|---|---|---|---|---|---|---|
| REL-01 | 전체 | 스테이징 통합 배포 및 QA | 필수 | TEST-01,TEST-02,TEST-03,TEST-04,TEST-05,TEST-06,TEST-07,TEST-08,TEST-09 | 대기 | - | - |
| REL-02 | 전체 | 프로덕션 배포 | 필수 | REL-01 | 대기 | - | - |
| REL-03 | 공통 | 배포 후 모니터링 점검 | 필수 | REL-02,KPI-01 | 대기 | - | - |
| REL-04 | 공통 | 1.0 출시 회고 및 KPI 재보정 계획 수립 | 권장 | REL-03 | 대기 | - | - |
| REL-05 | 전체 | 포트폴리오 공개 전환 준비 체크리스트 | 권장 | REL-04 | 대기 | - | - |
스파이크 결과 기록란 (DATA-05, DATA-06, DATA-07)
각 스파이크 완료 시 아래에 결과를 간단히 기록한다(상세 리포트는 /docs/spike/ 참고).
-
DATA-05 (op.gg MCP 응답 스키마):
https://mcp-api.op.gg/mcp(별도 인증 불필요) 실호출로 6개 도구 전부 확인(2026-08-04).patch_version상당 필드는 도구마다 달라tft_list_item_combinations에만version(예 "17.8") 존재, 나머지 5개는 없음 → 패치 감지는 이 필드 기준으로 Riot 없이 가능.tft_list_augments엔is_legend_related라벨 없음(DATA-07은 수동 목록 필요).tft_get_play_style은 PUUID 필수라 배치용이 아님(PM 확인 필요). 상세:docs/spike/opgg-schema.md -
DATA-06 (TFT DDragon 신규 구조): 공식 "TFT DDragon" 분리 엔드포인트는 2026-08-04 기준 미확인(추정 도메인 2종 연결 실패, Set 18 런칭 2026-08-12 이후 재확인 필요). 기존 League DDragon
versions.json은 TFT 패치와 무관한 클라이언트 버전이라 사용 불가(PRD 우려 확인됨). 대안으로 Community Dragon(raw.communitydragon.org)이 이미 TFT 전체 데이터 제공 중임을 확인, op.gg와 세트 식별자(TFTSet17) 일치. 상세:docs/spike/tft-ddragon.md -
DATA-07 (is_legend_related 판별 방법): op.gg 응답에 라벨 없음 재확인. Community Dragon 전체 세트 검색 결과 "Legend" 계열 증강체는 전부 과거 Set 9 소속이며, Set 17 활성 목록·특성 어디에도 없음 → Set 17에는 Legends 메커니즘 자체가 없음. 마스킹 로직 자체는 구현하되(API-05/CHAT-06/FE-06), 목록 관리 인프라는 지금 만들지 않고
is_legend_related는 무조건false(PM 결정, YAGNI). 이 정책은comps.win_rate(조합 단위 승률, "S티어 덱"/"리롤 덱" 등 챗봇 질의)와는 무관함을policies.md1번에 명시 — 상세:docs/spike/legend-augment.md
테스트 시나리오 사전 정의 현황 (TEST-00)
TEST-00 완료 시 아래 TASK들의 테스트 시나리오 문서(/docs/test-scenarios.md) 링크·요약을 기록한다. 이 TASK들은 TEST-00에서 정의한 시나리오를 기준으로 단위 테스트를 먼저 작성한 뒤 구현을 진행한다.
PM 승인 완료(2026-08-03) — 상세 결과: /docs/verification/TEST-00-작업결과.md
| 대상 TASK | 시나리오 정의 여부 |
|---|---|
| API-05 | 정의됨 |
| CHAT-04 | 정의됨 |
| CHAT-06 | 정의됨 |
| PGA-04 | 정의됨 |
| PGA-05 | 정의됨 |
| PGA-06 | 정의됨 |
| PGA-07 | 정의됨 |
| PGA-09 | 정의됨 |
| DATA-13 | 정의됨 |
변경 이력
| 일자 | 내용 |
|---|---|
| 2026-07-30 | WBS(90개 TASK) 기준 진행현황.md 최초 작성, 전체 TASK 상태 대기로 초기화 |
| 2026-07-30 | WBS에 테스트 요구사항 컬럼 추가, SET-14(CI 테스트 게이트)·TEST-00(핵심 시나리오 사전정의) 신규 TASK 반영 — 전체 92개 TASK로 갱신 |
| 2026-07-30 | SET-15(근거 문서 경량 참조본 생성) 신규 반영, /docs/reference/*.md 5종 초안 작성 — 전체 93개 TASK로 갱신 |
| 2026-07-30 | REL-05(포트폴리오 공개 전환 준비 체크리스트) 신규 반영(배포릴리즈 그룹 마지막 TASK) — 전체 94개 TASK로 갱신 |
| 2026-07-31 | SET-01 완료(PM 승인) — private 저장소(git@github.com:tigrelli/tft_hideout.git) 생성, main/develop 브랜치 push, .gitignore 구성 |
| 2026-07-31 | SET-02 완료(PM 승인) — Node v20.20.2/pnpm/Python 3.14.4 확인, uv·pre-commit 설치 및 .pre-commit-config.yaml 구성 |
| 2026-07-31 | SET-03 완료(PM 승인) — /frontend, /backend, /batch 디렉터리 및 각 README, 루트 README.md 생성 |
| 2026-07-31 | SET-04 완료(PM 승인) — Supabase 프로젝트 생성, pgvector 확장 활성화, Session Pooler 연결문자열로 SELECT 1/vector 확장 스모크 테스트 통과, .env/.env.example 구성. 자동화 테스트는 이 DB 대신 로컬 Docker(docker-compose.test.yml, pgvector/pgvector:pg16)를 쓰기로 결정, docs/reference/policies.md 12번 항목 반영 |
| 2026-07-31 | PM 결정 — Redis(Upstash) 제거, 캐싱을 PostgreSQL 테이블(chat_answer_cache, puuid_cache) 기반으로 전환. 개발설계서 v1.7 반영(구 v1.6은 /docs/archive/로 이동). SET-05(Upstash Redis 생성) 취소(코드 결번 유지), SET-09 선행TASK에서 SET-05 제거, DATA-03에 캐시 테이블 2종 추가, DATA-15를 "캐시 정리 배치 구현(Postgres)"로 재정의(선행TASK를 DATA-13,DATA-03으로 변경), CHAT-08·API-11 TASK 설명을 Postgres 기반으로 갱신(WBS.xlsx 동시 반영). 전체 TASK 수 94개 유지(활성 93개, 취소 1개) |
| 2026-07-31 | SET-06 완료(PM 승인) — Render 웹서비스(tft-hideout-backend, Singapore) 생성, render.yaml Blueprint로 배포 설정. /health 엔드포인트만 있는 더미 FastAPI 앱으로 배포 검증(pytest·ruff 통과), develop→main PR #1 머지 시 자동 재배포 확인, 배포된 Render URL /health 200 확인 |
| 2026-07-31 | SET-07 완료(PM 승인) — Cloudflare Workers(정적 assets) tft-hideout 생성, Git 연동 자동배포 구성. 최초 wrangler.toml을 pages_build_output_dir로 설정했으나 프로젝트가 신형 "Workers Builds"로 생성되어 무시됨을 확인, [assets] directory 방식으로 수정해 해결. develop→main PR #2/#3 머지 시 자동 재배포 확인, workers.dev 라우트 활성화 후 배포 URL / 200 확인 |
| 2026-07-31 | SET-08 완료(PM 승인) — .github/workflows/manual-smoke.yml 추가(workflow_dispatch + concurrency 그룹 패턴). main에서 수동 트리거 실행 Success 확인(10초, Node.js 20 지원종료 경고는 무관). 추후 DATA-12·KPI-02는 동일 워크플로우에 schedule(cron, UTC 기준) 트리거를 함께 추가하는 패턴을 따르기로 함(스케줄 트리거는 main 워크플로우 파일만 인식, 60일 미활동 시 자동 비활성화 유의) |
| 2026-07-31 | SET-09 완료(PM 승인) — DATABASE_URL을 GitHub Actions 시크릿·Render 환경변수로 등록, 값 노출 없이 참조 확인(/env-check, 워크플로우 로그). Cloudflare는 정적 assets 전용 Worker라 환경변수 미지원 확인 → FE-01로 이관. SET-* 인프라 검증 상세 기록을 /docs/verification/smoke-tests.md로 분리(CLAUDE.md v1.6 반영) |
| 2026-08-03 | SET-10 보류 처리 — Riot API 키 발급 진행 중이라 발급 완료 시까지 홀딩, 상태를 진행중(Riot API 키 발급 대기)로 표시하고 WBS 순서상 다음 착수 가능 TASK인 SET-11로 이동 |
| 2026-08-03 | SET-11 시도 실패 — Metabase를 Render 무료 플랜(512MB)에 배포 시도했으나 OOM으로 실패(JAVA_OPTS=-Xmx400m 적용해도 실패). 상세는 /docs/verification/smoke-tests.md 참고 |
| 2026-08-03 | PM 결정 — Metabase를 제외하고 KPI 대시보드를 자체 구현 페이지(/kpi, 비밀번호 게이트, GNB 미노출)로 전환. SET-11(Metabase 배포) 취소, KPI-01을 "KPI 대시보드 백엔드 API 구현(자체)"으로 재정의(선행TASK에서 SET-11 제거), 신규 FE-12(KPI 대시보드 페이지 구현) 추가 — WBS.xlsx 동시 반영, 전체 95개 TASK로 갱신(취소 2개: SET-05, SET-11). IA를 v1.1→v1.2로 갱신(3.1 페이지 인벤토리·4.7 신규 절·6.1 GNB·7장 URL 구조·8장 화면-데이터 매핑에 /kpi 반영, 구버전은 /docs/archive/로 이동). CLAUDE.md 3장 기술스택 표도 Metabase 항목을 자체 구현으로 갱신 예정 |
| 2026-08-03 | SET-12 보류 처리 — Figma "TFT_Hideout" 와이어프레임 파일이 아직 없어 Figma MCP 연동 스모크 테스트(get_design_context 호출) 자체가 불가능함을 확인. PM이 Figma에 와이어프레임을 작성한 뒤 재개하기로 함(설정 파일(.mcp.json) 준비도 보류). WBS 순서상 다음 착수 가능 TASK인 SET-13으로 이동 |
| 2026-08-03 | SET-13 완료(PM 승인) — CLAUDE.md 4장에 PM 승인 후 커밋/push 규칙이 이미 명문화되어 있음을 확인(추가 변경 불필요), .github/PULL_REQUEST_TEMPLATE.md 신규 작성(WBS 코드·테스트 체크리스트·PM 확인 체크리스트) |
| 2026-08-03 | SET-14 완료(PM 승인) — .github/workflows/ci.yml 신설(backend pytest+ruff, frontend Vitest는 FE-01 전까지 조건부 스킵). 더미 실패 테스트로 PR 체크 실패(빨간 X)까지는 확인했으나, GitHub 무료 플랜(Private 저장소)은 브랜치 보호 규칙이 "설정은 되나 강제되지 않음"을 확인(smoke-tests.md 기록) — PM 결정으로 유료 전환 없이 소프트 게이트(CI 표시 + 기존 PM 승인 절차)로 운영하기로 하고 WBS DoD 문구 갱신. 더미 테스트 제거 후 PR #8 전체 체크 통과 확인 및 main 머지 완료 |
| 2026-08-03 | SET-15 소급 완료 처리(PM 승인) — /docs/reference/*.md 5개 파일이 이미 2026-07-30 최초 커밋(686b279)에 포함되어 실제로 사용 중이었으나 진행현황.md 갱신이 누락되어 있던 것을 확인, 대조 확인된 것으로 보고 완료 처리 |
| 2026-08-03 | PM 결정 — DATA-*(B-1 데이터 파이프라인) 계열 TASK는 로컬 pytest로 자체 검증되고 main에 실제로 반영된 상태를 봐야 확인되는 DoD가 아니므로, 매 TASK마다 즉시 main 머지하지 않고 여러 TASK를 모아 배치로 머지하기로 함(SET-06~08처럼 배포 확인이 필요한 TASK는 기존대로 즉시 머지) |
| 2026-08-03 | DATA-01 완료(PM 승인) — SQLAlchemy 모델(db/models.py) + Alembic 마이그레이션으로 patches/champions/traits/champion_traits/items/augments 6개 정적 테이블 생성, pytest 8종(테이블·컬럼·JSONB 타입·FK/UNIQUE 제약)으로 검증. CI(backend-tests)에 Postgres 서비스 컨테이너 추가 |
| 2026-08-03 | DATA-02 완료(PM 승인) — comps/comp_champions/comp_augments/champion_item_builds 4개 메타조합 테이블 마이그레이션(DATA-01 위에 체이닝), comp_champions/comp_augments FK 위반 시 IntegrityError 발생 확인하는 pytest 포함 |
| 2026-08-03 | DATA-03 완료(PM 승인) — match_analyses/chat_logs/link_click_events/account_link_events/patch_detection_runs/ragas_eval_results/chat_answer_cache/puuid_cache 8개 테이블 마이그레이션. chat_answer_cache/puuid_cache는 개발설계서 v1.7 4.6절에 컬럼 단위 명세가 없어 캐시 전략(키·TTL) 설명 기반으로 이번에 직접 확정하고 schema.md에 반영 |
| 2026-08-03 | DATA-04 완료(PM 승인) — meta_document_embeddings 테이블(embedding vector(1024)) + HNSW(vector_cosine_ops, m=16/ef_construction=64) 인덱스 + (patch_version,doc_type) btree 복합 인덱스 마이그레이션. 더미 벡터 코사인 검색 순서 확인 + enable_seqscan=off 상태 EXPLAIN으로 HNSW 인덱스 사용 확인 |
| 2026-08-03 | PM 결정 — SET-10(Riot API 키) 발급 대기 중이라, 이에 의존하는 DATA-05~09/11~13·API-05/11~13은 건너뛰고 Riot 키와 무관한 API-*(API-01/02/03/04/06/07/08/09/10/14)부터 진행하기로 함 |
| 2026-08-03 | API-01 완료(PM 승인) — catalog/chat/analysis/kpi 4개 APIRouter 스캐폴딩(kpi는 SET-11 취소로 자체 KPI 대시보드 백엔드용 추가, WBS 원문 3개→4개로 갱신). pytest로 4개 라우터 마운트 확인 |
| 2026-08-03 | API-02 완료(PM 승인) — GET /api/v1/catalog/tierlist 구현(patch/rank 필터, patch 미지정 시 현재 패치 기본값). API-01의 라우터 prefix가 api-spec.md 기준(/api/v1/...)과 달라 이번에 수정. comps에 rank_tier 컬럼 추가(기본값 "all", 실제 랭크 구간 값은 DATA-05 스파이크 후 확정 필요). 공통 에러 응답 포맷 핸들러({"error":{"code","message"}}) main.py에 추가 — 이후 API-* TASK 공용 |
| 2026-08-03 | API-03 완료(PM 승인) — GET /api/v1/catalog/comps/{comp_id} 구현(챔피언 구성 캐리 우선 정렬 + 추천 증강체 priority 순 정렬), 존재하지 않는 comp_id는 404 |
| 2026-08-03 | API-04 완료(PM 승인) — GET /api/v1/catalog/items/builds 구현(champion_id 필터, play_rate 내림차순 정렬). patch 기본값 해석 로직을 _resolve_patch()로 공용화 |
| 2026-08-03 | API-06 완료(PM 승인) — GET /api/v1/catalog/patches/current 구현(is_current=true 1건 조회, 미설정 시 404). catalog 그룹(API-02~04,06) Riot 키 무관 TASK 완료 |
| 2026-08-03 | API-07 완료(PM 승인) — Rate Limiting 미들웨어 구현(IP 기준 catalog 분당60/chat 분당10, 프로세스 메모리 고정윈도, 별도 인프라 없음). 테스트 간 상태 격리를 위해 conftest.py에 autouse 리셋 픽스처 추가 |
| 2026-08-03 | API-08 완료(PM 승인) — session_id UUID 검증 + session별 chat_logs 조회 로직(services/chat_session.py), API-09/10이 재사용할 기반 |
| 2026-08-03 | PM이 .env에 RIOT_API_KEY 등록 → Groq/HF 키와 함께 실호출 테스트 결과 Groq·HF는 200 정상, Riot는 401 "Unknown apikey"(Development API Key 24시간 만료 추정) — PM이 키 재발급 확인 예정, SET-10은 계속 보류 |
| 2026-08-03 | API-14 완료(PM 승인) — KPI 계측 이벤트 API 구현. link_click_events는 POST /api/v1/chat/events/link-click 공개 엔드포인트로, account_link_events는 훅 함수만 구현(API-11/12가 추후 호출) |
| 2026-08-03 | API-09 완료(PM 승인) — POST /api/v1/chat/message SSE 스트리밍 뼈대 구현(services/chat_stream.py). RAG 로직(의도분류·검색·프롬프트조립) 없이 배관만 우선 구축, mock_llm_stream은 CHAT-05가 Groq 실연동으로 교체할 자리표시자. session_id 검증은 API-08 로직 재사용 |
| 2026-08-03 | API-10 완료(PM 승인) — GET /api/v1/chat/session/{id}/history 구현(드릴다운용 최근 3턴만 반환). get_session_history에 limit 파라미터 추가(RECENT_TURNS_LIMIT=3), 기존 API-08 전체조회 동작은 하위호환 유지 |
| 2026-08-03 | CHAT-01 완료(PM 승인) — 의도 4분류 로직 구현(1차 키워드/정규식, 애매할 때만 2차 Groq LLM). services/groq_client.py는 프로젝트 최초의 실제 Groq API 연동 코드(requirements.txt에 groq SDK 추가), LLM 실패/무효응답은 general_strategy로 폴백. classify_intent_for_query는 아직 미배선 — 엔드포인트 연동은 CHAT-03~05에서 이어짐 |
| 2026-08-03 | KPI-01 완료(PM 승인) — GET /api/v1/kpi/summary(5개 지표: 데이터최신성/근거율/전환율/이용률/응답지연) + POST /api/v1/kpi/auth(비밀번호→서명토큰, TTL 12시간) 구현. PM 결정: 전환율 모수는 CHAT-07 미구현 상태라 answer 텍스트 내부경로 패턴 탐지로 임시 산정(CHAT-07 구현 후 재검토 필요). KPI_DASHBOARD_PASSWORD .env 등록 완료(PM) |
| 2026-08-03 | PM 결정 — KPI-03(목표 미달 알림 로직, 권장)은 이력 저장 테이블·알림 채널 설계가 미확정이라 보류, 추후 PM이 설계 확정 후 재개 |
| 2026-08-03 | TEST-00 완료(PM 승인) — /docs/test-scenarios.md에 API-05/CHAT-04/CHAT-06/PGA-04~07·09/DATA-13 9개 TASK 입력값·기대출력·경계값 표 작성. 상세 결과·설계 중 확정한 경계조건 5건은 /docs/verification/TEST-00-작업결과.md 참고 |
| 2026-08-03 | PM 요청 반영 — 완료 TASK 결과를 docs/verification/{코드}-작업결과.md로 기록하는 컨벤션 도입(CLAUDE.md v1.8). 기존 완료 TASK 27건(SET-01~04·06~09·13~15, DATA-01~04, API-01~04·06~10·14, CHAT-01, KPI-01)에 소급 적용해 결과 파일 생성 및 진행현황.md 커밋/Push 컬럼에 링크 추가 |
| 2026-08-04 | CHAT-04 완료(PM 승인) — 입력 전처리 구현(정규화·은어치환·인젝션 구조적 분리·길이제한·범위밖질문/명확화 플래그·대화이력 3턴 제한). TEST-00 시나리오 7개 케이스 그대로 pytest 13건으로 옮김. is_off_topic/needs_clarification 플래그는 값 계산까지만 담당하며 실제 응답 분기 배선은 CHAT-05 이후로 이어짐. PM 결정: main 머지는 B-5(프론트엔드 착수) 직전에 그동안의 task 브랜치들과 함께 일괄 진행 |
| 2026-08-04 | PM 결정 — SET-12(Figma 연동) 취소. 이 세션(Claude Code) 환경에 Figma MCP 커넥터가 연결되어 있지 않아(get_design_context 등 도구 자체가 없음) DoD(Figma MCP 호출 테스트 성공)를 검증할 수 없는 상태였고, PM이 Figma MCP를 사용하지 않기로 결정. FE-01 선행TASK에서 SET-12 제거(SET-07만 남음). 이후 FE-* 작업은 CLAUDE.md 6장 순서대로 /docs/reference/design-tokens.md와 화면설계서(/docs/source/TFT_sLLM_화면설계서_v1.2.docx)만을 디자인 참조 소스로 삼는다(Figma는 참조하지 않음). WBS.xlsx SET-12 행도 취소 사유로 갱신 |
| 2026-08-04 | PM 요청 반영 — CLAUDE.md v1.10: TASK별 브랜치 생성 방식 폐기, 다음 배치 머지 시점까지 작업 브랜치 1개를 이어가는 방식으로 전환(4장 브랜치 규칙 갱신, develop 브랜치 미사용 명시). main 직접 push는 문서 전용/PM 승인 완료 커밋 예외로 한정 |
| 2026-08-04 | FE-01 완료(PM 승인) — Next.js 16(App Router)+TypeScript strict+Tailwind v4 스캐폴딩. Cloudflare가 정적 assets 전용이라 output: "export"로 빌드, wrangler.toml 배포 대상을 frontend/out으로 변경(PM이 Cloudflare 대시보드 Build command·NODE_VERSION 설정 완료). design-tokens.md 컬러/타이포/반경을 Tailwind @theme로 이식, 브레이크포인트는 Tailwind 기본값 그대로. 임시 헤더 셸(header-shell.tsx, 실제 GNB는 FE-02) + Vitest/RTL 14개 테스트(브레이크포인트 클래스, 토큰 색상값 매칭). CI(SET-14) frontend job을 pnpm→npm 전환하고 lint/format/test/build로 보강(그동안 스킵되던 게 활성화됨). PM이 로컬 npm run dev로 직접 화면 확인 후 승인 |
| 2026-08-04 | FE-02 완료(PM 승인) — GNB 컴포넌트 구현(4개 진입점: 티어리스트/아이템 빌드/증강체 정보/전적 분석). 데스크톱·태블릿은 가로 메뉴(현재 페이지 Bold 강조), 모바일은 햄버거→전체화면 드로어. GNB 로고 텍스트는 디자인가이드의 "TFT Meta" 대신 프로젝트명 "TFT Hideout" 유지로 확정(design-tokens.md에 기록). 우측 "현재 패치 배지"(디자인가이드 6.1)는 백엔드 연동이 필요해 이번 TASK 범위에서 제외 — 추가 시점 PM 확인 필요. Vitest+RTL 19개 + Playwright e2e 스모크 1개(신규 frontend/e2e/, playwright.config.ts) 통과. FE-03 착수 전 정리 필요 사항 발견: FE-01의 정적 export(output: "export") 결정과 WBS FE-03의 "ISR 렌더링" 설명이 서로 모순 — PM 확인 필요 |
| 2026-08-04 | PM 결정 — 사후 패인 분석(PGA)만 Riot API 키가 필요하고 티어리스트/아이템빌드/증강체정보 등 카탈로그 데이터는 op.gg MCP만으로 충분하다는 판단에 따라 SET-10을 분리: SET-10은 Groq·HF 키 검증만으로 재정의(2026-08-03에 이미 200 확인됨, PM확인대기로 표시), Riot Personal Key는 신규 SET-16으로 분리(진행중, 기존 Development Key 401 만료로 재발급 대기). DATA-05(op.gg 스키마 확인)·DATA-06(TFT DDragon 확인)은 op.gg/DDragon 모두 키 불요로 선행TASK 제거해 즉시 착수 가능 상태로 전환, API-11(Riot ID→PUUID)만 SET-16 의존으로 변경. DATA-11·CHAT-05·PGA-07은 Groq/HF가 필요해 SET-10 의존 유지. WBS.xlsx 동시 반영(SET-16 신규, 전체 96개 TASK) |
| 2026-08-04 | SET-10 완료(PM 승인) — Groq·HF 키 검증(2026-08-03 200 확인 결과를 근거로 분리 후 확정 승인) |
| 2026-08-04 | PR #10(task/FE-01 → main) 머지 완료 — FE-01·FE-02·SET-10(분리)·DATA-05~13 총 15개 TASK 일괄 반영. 머지 전 CI에서 batch-tests가 두 차례 실패해 원인 조사·수정: (1) batch가 실제 DB(migrated_engine)를 쓰게 된 DATA-10부터 CI의 batch-tests job에 postgres 서비스 컨테이너가 빠져있던 걸 발견해 추가, (2) .pre-commit-config.yaml은 ruff v0.14.0 고정인데 backend/batch requirements-dev.txt는 버전 미고정이라 pip install 시 최신(0.16.1)이 깔려 E402/PLR0402 판정이 달라지는 걸 발견해 양쪽 다 ruff==0.14.0으로 고정. PM이 gh CLI용 Personal Access Token 발급 → 직접 Actions 로그 조회·재실행까지 확인해 CI 전체 통과 후 머지. 진행현황.md 정리 중 FE-02가 승인까지 됐는데 상태 표만 "대기"로 안 바뀌어 있던 걸 발견해 함께 수정(작업결과 문서·이력 로그엔 이미 완료로 기록돼 있었음 — 표만 누락) |
| 2026-08-04 | DATA-14 자체검증 완료(PM확인대기) — 착수 전 PM 확인: 실제 운영 DB에 매시간 쓰는 첫 자동화라 워크플로우는 만들되 schedule은 아직 켜지 않고 workflow_dispatch만 활성화하기로 결정. batch/run_patch_batch.py로 DATA-12~13을 실제로 배선(DATA-08/09 수집→DATA-10 정규화→DATA-11 임베딩→DATA-13 원자적 전환), 로컬 테스트 DB로 실제 실행 성공 확인. .github/workflows/patch-detection.yml 신규(concurrency: cancel-in-progress: false로 취소 대신 대기열 방식). concurrency 자체는 GitHub 서버 기능이라 로컬 검증 불가 — main 머지 후 PM이 workflow_dispatch 2연속 트리거로 직접 확인 필요. HUGGINGFACE_API_KEY GitHub 시크릿 등록 여부도 미확인(PM 확인 필요) |
| 2026-08-04 | DATA-13 완료(PM 승인) — TEST-00 DATA-13 사전 시나리오 5개를 그대로 pytest로 옮김. batch/patch_transition.py의 promote_patch_to_current()(단일 트랜잭션 승격) + run_batch_with_atomic_promotion()(단계 실패 시 승격 자체를 건너뛰어 이전 패치 유지, 예외는 삼키고 patch_detection_runs에 success/failed 기록). pytest 66/66(트랜잭션 격리 수준까지 검증: 커밋 전/후 다른 커넥션이 보는 값 차이 확인). 추가로 DATA-08~13을 실제로 전부 연결해 op.gg+Community Dragon 실호출→정규화→임베딩→원자적 승격까지 9.9초 만에 성공 확인 — 전체 배치 파이프라인이 처음으로 하나로 이어져 동작함이 증명됨 |
| 2026-08-04 | DATA-12 완료(PM 승인) — batch/patch_detection.py로 tft_list_item_combinations().version(DATA-05 결정) 기준 패치 감지 구현. run_patch_detection()이 DB is_current 버전과 op.gg 최신 버전을 비교해 다르면 주입받은 on_trigger 콜백 호출, patch_detection_runs에 실행 로그 기록. 실제 전체 배치 재수집 오케스트레이션 연결은 DATA-13 이후로 미룸(콜백 자리만 마련). pytest 60/60 + 실제 op.gg로 가짜 옛날 버전→트리거 발동, 최신 버전 승격 후 재검사→트리거 미발동 2단계 시뮬레이션 확인 |
| 2026-08-04 | DATA-11 완료(PM 승인) — 착수 전 발견 2가지: (1) HF Inference API 레거시 엔드포인트(api-inference.huggingface.co)가 DNS부터 안 떠서 신규 라우터 엔드포인트(router.huggingface.co/hf-inference/models/BAAI/bge-m3/pipeline/feature-extraction)로 실호출 확인, (2) meta_document_embeddings도 DATA-10과 동일하게 upsert용 UNIQUE 제약이 없어 마이그레이션 추가(기존 DATA-04 테스트 fixture 충돌 수정). batch/embeddings.py로 comp/playstyle/augment/item_build 4종 chunk 생성 + BGE-M3 임베딩 + upsert 구현. pytest 51/51 + backend 회귀 100/100 + 실제 HF API로 30개 chunk 임베딩(1024차원)·upsert·재수집 중복없음 확인 + 실제 pgvector 코사인 유사도 검색으로 자기 자신이 1위로 나오는 것까지 확인 |
| 2026-08-04 | DATA-10 완료(PM 승인) — 착수 전 스키마 문제 발견: upsert에 필요한 (patch_version, 원본ID) UNIQUE 제약이 champions/items/augments엔 없고 traits/comps는 원본ID 컬럼 자체가 없어 마이그레이션 추가(PM 승인). comps 정규화 3가지 결정(PM 승인): tier_rank는 op.gg 값 그대로, playstyle_text는 badge+캐리챔피언으로 자동생성(LLM 미사용), comp_augments는 데이터 소스 없어 이번엔 제외. batch/normalize.py로 champions/traits/items/augments/comps/comp_champions/champion_item_builds upsert 구현. pytest 38/38(순수 변환 + 실제 마이그레이션 DB로 upsert 검증) + backend 회귀 100/100 + 실제 op.gg·Community Dragon 데이터로 2회 연속 적재해 재수집 시 행 개수 동일함(중복 없음) 확인 |
| 2026-08-04 | DATA-09 완료(PM 승인) — batch/id_name_mapping.py 신규(Community Dragon raw.communitydragon.org 기준, DATA-06 결론). CommunityDragonClient.fetch_tft_data() + build_name_maps()로 세트별 챔피언·특성 apiName→이름 매핑, 매핑 누락 시 세트 접두어 제거 폴백(예외 없음). pytest 20/20(기존 10+신규 10) + 실제 Community Dragon 1회 접속해 Set 17 챔피언 83개·특성 44개 매핑 확인(ko/en 둘 다) — pytest 스위트엔 미포함 |
| 2026-08-04 | DATA-08 완료(PM 승인) — batch/opgg_client.py 신규(OpggMcpClient, 5개 TFT 도구 순차 호출, MCP 세션 핸드셰이크·재시도·에러 처리). pytest 10/10(DATA-05 스파이크 기반 합성 fixture, 실 API 미호출) + 완성된 클라이언트로 실제 op.gg MCP 1회 실호출해 5개 도구 전부 성공 확인(WBS DoD 별도 검증, pytest 스위트엔 미포함). batch 첫 코드 TASK라 CI에 batch-tests job 신규 추가 |
| 2026-08-04 | DATA-07 완료(PM 승인) — op.gg 라벨 없음 재확인 + Community Dragon 전체 세트 검색 결과 "Legend" 계열 증강체 5개 전부 과거 Set 9 소속이고 Set 17 활성 목록·특성엔 없음을 확인 → Set 17에 Legends 메커니즘 자체가 없다고 판단. PM 피드백으로 결론 단순화: 목록 관리 인프라는 지금 만들지 않고 is_legend_related는 무조건 false(YAGNI), 마스킹 로직 자체는 구현. Riot 정책의 실제 금지 대상(Legend 자체/전용증강 승률)과 comps.win_rate(조합 단위, "S티어 덱" 등 챗봇 질의)는 무관함을 policies.md 1번에 명시 — 조합 승률은 기존 의도 4분류(조합 추천)로 이미 커버되며 별도 정책 불필요. 상세: docs/spike/legend-augment.md |
| 2026-08-04 | DATA-06 완료(PM 승인) — Community Dragon 기준으로 DATA-09 설계 진행 확정, Set 18 런칭(2026-08-12) 이후 공식 TFT DDragon 등장 여부는 그때 재확인하기로 함(DATA-01~15 표 하단에 메모 남김) — 공식 "TFT DDragon" 분리 엔드포인트는 추정 도메인 2종 모두 연결 실패로 아직 미확인(Set 18 런칭 2026-08-12 이후 재확인 필요). 기존 League DDragon versions.json은 TFT 패치와 무관한 클라이언트 버전(예 "16.15.1")이라 사용 불가 — PRD 우려 그대로 확인됨(단, DATA-05에서 이미 op.gg 기준으로 패치 감지를 확정해 실질 영향 없음). 대안으로 Community Dragon(raw.communitydragon.org)이 TFT 전체 데이터를 이미 제공 중임을 확인, setData[].mutator("TFTSet17")가 op.gg teamCode 접미사와 일치 + op.gg 응답 자체가 type: "cdragon-item"이라 같은 소스 사용을 시사 → DATA-09 ID-이름 매핑에 Community Dragon 사용 제안. 상세: docs/spike/tft-ddragon.md |
| 2026-08-04 | DATA-05 완료(PM 승인) — https://mcp-api.op.gg/mcp로 실접속(별도 인증 불필요), 6개 TFT 도구 전부 실호출해 응답 스키마 확인. PM 결정 3가지: (1) 패치 감지(DATA-12)는 tft_list_item_combinations.version 필드 기준으로 확정(Riot 키 없이 가능, 나중에 리더보드 샘플링을 보조 신호로 추가 가능), (2) is_legend_related 라벨은 op.gg에 없음 확정 → DATA-07은 수동 목록 방식(용도: Riot TFT 정책상 Legend 계열 증강체 승률 표시 금지를 지키기 위한 마스킹 대상 플래그), (3) tft_get_play_style(PUUID 필수, 개인 데이터 도구)은 DATA-08에서 제외하고 PGA-07로 이동 — WBS.xlsx DATA-08("5개 도구")·PGA-07 TASK 설명 갱신, glossary.md·api-spec.md의 "개인 전적 조회 기능 없음" 문구도 수정. 상세: docs/spike/opgg-schema.md |
| 2026-08-04 | PR #10 머지 후 GitHub Actions 배치 첫 실제 실행에서 프로덕션 버그 2건 발견해 main에 직접 push로 긴급 수정(WBS 코드 없음, 이전 세션에서 누락됐던 기록 소급 반영): f5f9b49 DATABASE_URL 드라이버 미지정(postgresql://) 시 psycopg2로 잘못 해석돼 ModuleNotFoundError 발생 → backend/db/session.py·batch/db_session.py에 postgresql+psycopg:// 자동 보정 추가(pytest 검증 포함). ed3f1e3 운영 Supabase DB에 relation "patches" does not exist 발견(SET-06 이후 스키마가 한 번도 생성된 적 없었음) → render.yaml buildCommand에 alembic upgrade head 추가 시도 |
| 2026-08-04 | DATA-14 트리거 검증 실시(PM 요청) — (1) HUGGINGFACE_API_KEY GitHub Secrets 등록 재확인 완료. (2) workflow_dispatch 2연속 트리거로 동시 실행 방지(대기열) 정상 동작 확인(cancel-in-progress: false대로 두 번째가 취소 없이 첫 번째 뒤에 순차 실행). (3) 그 과정에서 위 ed3f1e3 수정이 실제로는 배포에 반영되지 않았음을 발견 — 원인은 Render 서비스 Root Directory(backend) 밖의 render.yaml 변경이 auto-deploy 트리거 대상이 아니었던 것 + Blueprint 서비스는 render.yaml 변경이 있어도 Build Command가 자동 동기화 안 되는 것 2가지 중첩. PM이 Render 대시보드에서 Build Command를 직접 pip install -r requirements.txt && alembic upgrade head로 수정해 재배포 트리거. 이어서 alembic/env.py가 f5f9b49의 드라이버 보정을 안 타서 또 ModuleNotFoundError: psycopg2로 빌드 실패하는 것 추가 발견 → get_database_url() 재사용하도록 수정(커밋 227178c, pytest 104/104 통과) 후 main push. 재배포 후 GET /api/v1/catalog/patches/current 500→404(스키마 생성 확인)로 바뀌었고, 이어서 workflow_dispatch 재트리거한 배치가 처음으로 전체 성공(패치 17.8 승격), 같은 엔드포인트가 200으로 실데이터 응답까지 확인 — 운영 Supabase DB에 스키마·데이터가 이번에 처음 실제 생성됨. 상세: docs/verification/DATA-14-작업결과.md, docs/verification/SET-06-작업결과.md(Render Blueprint 주의사항 추가) |
| 2026-08-04 | DATA-14 완료(PM 승인) — schedule 트리거 활성화(매일 03:00 KST = cron: "0 18 * * *"). PRD 9-1 원안(매시간)이 아니라 1일 1회로 결정: TFT 패치는 월 1~2회뿐이라 매시간 감지는 GitHub Actions 무료 분(2,000분/월, CI와 공유)의 약 36%(720분/월)를 소모하는 반면 1일 1회는 약 1.5%(30분/월)만 소모, 개인/지인 10명 규모 MVP에서 최대 1시간 지연의 이점이 예산 절감보다 크지 않다고 판단. 패치 발생 후 최대 24시간 지연은 workflow_dispatch 수동 트리거로 즉시 만회 가능(이미 동작 확인됨) |
| 2026-08-04 | Riot API 키(SET-16) 제외하고 진행 가능한 백엔드 TASK 재검토 — API-05·CHAT-02~09(일부)·DATA-15·KPI-02가 아직 대기 상태로 남아있었음을 확인(2026-08-03 "Riot 키 무관 API부터" 결정 당시엔 DATA-07 미완료로 API-05가 막혀 있었으나 08-04에 DATA-07이 끝나면서 지금은 막힘 없음). WBS 순서(그룹→하위영역→번호)상 데이터파이프라인 그룹의 DATA-15가 백엔드API 그룹보다 먼저이므로 DATA-15부터 재개하기로 함 |
| 2026-08-04 | DATA-15 완료(PM 승인) — batch/cache_cleanup.py로 delete_stale_chat_answer_cache() 구현(chat_answer_cache에서 현재 patch_version과 다른 행 DELETE). puuid_cache는 자체 expires_at TTL이라 WBS 완료기준·db/models.py 독스트링 모두 이 TASK 범위에서 제외함을 확인하고 그대로 반영. run_patch_batch.py의 on_trigger()에서 배치 승격이 성공했을 때만 정리를 실행하도록 배선(실패 시 이전 유효 버전 캐시가 잘못 삭제되지 않게). pytest 4건 신규(batch 74/74 통과, WBS 테스트요구사항 "배치 완료 이벤트 발생 시 삭제 확인" 그대로 옮김) |
| 2026-08-04 | API-05 완료(PM 승인) — 착수 전 발견: TEST-00 시나리오가 전제한 "증강체 win_rate"가 실제로는 없었음(augments 테이블에 컬럼 자체가 없었고, op.gg tft_list_augments도 win_rate를 안 줌(DATA-05 스파이크), Riot 공식 API도 확인해보니 매치 원본 데이터만 제공하고 집계 통계는 없어 대체 불가). PM 승인(DATA-07과 동일 패턴): augments.win_rate(nullable) 컬럼만 추가하고 배치는 채우지 않음(항상 NULL), 마스킹 로직은 TEST-00대로 구현. GET /api/v1/catalog/augments?patch=&tier= 구현, is_legend_related=true면 DB 값과 무관하게 응답 win_rate를 무조건 null로 강제. pytest 7건 신규(TEST-00 시나리오 4건 포함), backend 111/111·batch 74/74 통과 |
| 2026-08-04 | CHAT-02 완료(PM 승인) — services/hybrid_search.py로 glossary.md 챗봇 의도 4종(조합/아이템/증강체 추천, 일반 전략)별 doc_type SQL 필터 + pgvector cosine_distance() top-k 정렬 구현. services/embedding_client.py 신규(실시간 질문 임베딩용 HF 클라이언트) — Render backend는 rootDir: backend라 batch/embeddings.py를 임포트할 수 없어 필요한 부분만 복제. CHAT-01 의도 분류 결과를 입력으로 받는 구조만 마련, 엔드포인트 배선은 CHAT-03/05에서 진행(API-09와 동일한 "뼈대 우선" 패턴). pytest 10건 신규(backend 121/121 통과), 외부 HF API 미호출(mock) |
| 2026-08-04 | CHAT-03 완료(PM 승인) — 착수 전 설계서 4.4.1 원본(.docx) 직접 대조(경량 참조본엔 이 절 요약 없음): 시스템 프롬프트 7규칙·의도별 추가지시 표·few-shot 권장사항 확인해 그대로 반영. services/prompt_assembly.py로 시스템프롬프트(+의도별 지시) → few-shot(합성 예시) → [검색된 문서](기준 패치 명시) → [이전 대화](있을 때만) → CHAT-04 wrap_user_message() 결과 순서로 조립. WBS 요구사항인 전체 조합 스냅샷 테스트 포함 pytest 7건 신규(backend 128/128 통과) |
| 2026-08-04 | CHAT-05 완료(PM 승인) — services/groq_client.py에 stream_groq_chat() 추가(Groq stream=True, 델타 토큰 순서대로 yield). services/prompt_assembly.py의 assemble_prompt()를 assemble_system_turn()/assemble_user_turn()으로 분해(Groq system/user 역할 분리 호출 지원, 기존 스냅샷 테스트는 변경 없이 통과 확인). services/chat_stream.py 전면 재작성: stream_llm_answer()가 토큰 없이 실패 시 1회 재시도, 그래도/도중 실패 시 예외 전파 없이 고정 폴백 메시지로 대체. generate_answer_stream()이 CHAT-04가 미뤄뒀던 is_off_topic/needs_clarification 분기를 실제 연결하고, 정상 질문은 현재패치조회(신규 current_patch.py)→CHAT-01 의도분류→CHAT-02 임베딩+검색→CHAT-03 프롬프트조립→스트리밍 순으로 배선(외부 API 호출부는 명시적 인자 주입). routers/chat.py가 API-09 mock 배관을 실제 파이프라인으로 완전 대체, API-09 테스트에서 mock 특정 동작 의존 테스트 4건 정리. pytest 10건 신규(backend 135/135 통과), 외부 API 미호출(fake 주입) |
| 2026-08-04 | CHAT-06 완료(PM 승인) — 착수 전 PM과 근거검증 메커니즘 논의: 자유문장 NER은 정규식만으로 불가능하다는 점 확인 후, 시스템 프롬프트에 8번 규칙 신설("조합/챔피언/아이템/증강체는 작은따옴표로 인용")로 해결 — LLM 자연어 이해는 여전히 프롬프트가 전담, 후처리는 결정론적 안전망(설계서 4.4.3 "문자열 매칭" 원문 그대로, LLM 재검증 호출 없음). services/chat_postprocessing.py 신규: verify_grounding()(인용된 이름을 검색문서 doc_metadata name/champion 키와 대조), mask_augment_win_rate_leak()(승률 이중방어 2차선), mask_opponent_nicknames()(재사용 유틸, PGA-09/CHAT-10 예정). 재시도/폴백은 CHAT-05에서 이미 구현돼 중복 구현 안 함. 근거검증·승률마스킹이 완성 문장 단위로만 신뢰 가능해 generate_answer_stream()을 "실시간 토큰 그대로 전달"에서 "전체 버퍼링→후처리→공백 재분할 전송"으로 변경(PM 승인, 체감 지연 생기면 추후 개선). pytest 14건 신규(backend 149/149 통과) |
| 2026-08-04 | CHAT-07 완료(PM 승인) — services/chat_links.py로 CHAT-06의 인용 규칙(작은따옴표)을 재사용해 검색 문서에 실재하는 이름만 마크다운 링크로 치환. URL은 IA v1.2 그대로(조합 /comps/{comp_id} 개별 상세페이지, 아이템 빌드·증강체는 개별 상세페이지가 없어 목록 페이지 /items/builds·/augments). 검색 문서에 없는 이름(CHAT-06이 이미 경고 처리)은 링크를 만들 id 자체가 없어 원문 유지 — WBS "존재하지 않는 id 오탐 케이스"를 검증된 이름만 링크 대상으로 삼는 설계로 원천 차단. chat_stream.py에 CHAT-06 다음 단계로 배선. pytest 8건 신규(backend 157/157 통과) |
| 2026-08-04 | CHAT-09 완료(PM 승인) — 착수 전 콜드스타트 판별 임계값을 이번에 직접 확정(문서에 기준 없었음): 10,000ms 이상이면 콜드스타트로 간주(Render 실측 50초+와 웜 목표 p50 3초 사이 안전 지점, PRD 3-3). services/chat_logging.py로 record_chat_log() 구현(질의/의도/근거문서id/patch/답변/지연시간/콜드스타트 전체 필드 적재). chat_stream.py에서 Groq 스트리밍 시작~CHAT-07 링크삽입 완료까지 지연시간 측정 후 정상 답변 생성 흐름에서만 로깅(명확화/범위밖/패치없음 조기반환은 intent·patch_version이 없어 제외). pytest 6건 신규(backend 163/163 통과) |
| 2026-08-04 | CHAT-08 완료(PM 승인) — services/chat_cache.py로 cache_key=sha256(정규화질문+patch_version) 기반 Postgres 캐시(chat_answer_cache, upsert) 구현. chat_stream.py에서 대화이력 조회 시점을 의도분류보다 앞으로 옮겨 첫 턴 질문만 캐시 조회(hit 시 의도분류~Groq 호출 전부 스킵), 후속 턴은 캐시 아예 미조회. 패치 갱신은 cache_key 자체가 달라져 자연 무효화(이전 patch_version 행 물리 삭제는 DATA-15 담당). 캐시 hit 경로는 intent가 없어 chat_logs 미기록(이미 로깅된 답변 재사용 논리, CHAT-09 원칙과 일관). pytest 9건 신규(backend 172/172 통과) — CHAT 그룹(01~09) 전체 완료 |
| 2026-08-04 | PM 결정 — FE-03(티어리스트 홈) TASK 설명의 "ISR 렌더링"이 FE-01의 정적 export(output: "export") 결정과 모순됨을 재확인 후 해소: ISR은 요청마다 재생성 여부를 판단하는 서버가 필요해 정적 export와 원천적으로 양립 불가(Next.js가 빌드 에러로 막음), Cloudflare를 정적 assets 전용 Worker로 쓰는 SET-07 결정도 이미 확정돼 있어 ISR을 쓰려면 배포 아키텍처 자체를 재구성해야 함. 티어리스트 데이터는 어차피 배치가 하루 1회(DATA-14) 갱신하는 거라 ISR이든 빌드 시점 고정이든 "진짜 최신"을 보장 못 하므로, 정적 export로 페이지 셸만 빌드하고 브라우저에서 API를 직접 호출하는 클라이언트 사이드 fetch(CSR) 방식으로 확정. TFT_Hideout_WBS.xlsx FE-03 TASK 설명(F69)을 "ISR 렌더링"→"정적 export(FE-01 결정) + 클라이언트 사이드 fetch(CSR)"로 갱신(그 외 변경 없음, diff 1셀만 확인). WBS 순서(그룹→하위영역→번호)상 다음은 프론트엔드 그룹이며, KPI모니터링보다 먼저 진행하기로 함 |
| 2026-08-04 | FE-03 완료(PM 승인) — 화면설계서 2.1 원문(컴포넌트/인터랙션/데이터바인딩/반응형 표) 직접 대조해 구현: PatchBadge/TierBadge/CompCard/CompGrid/FilterBar(데스크톱 드롭다운·모바일 바텀시트)/ChatWidgetToggle(전역 슬롯, 실제 UI는 FE-09). lib/api-client.ts·api-config.ts 신규(CLAUDE.md 10.1 공용 fetch 유틸, 정적 export라 API_BASE_URL은 빌드시점 상수). 착수 중 프로덕션 버그 2건 발견·수정: (1) 백엔드에 CORS 설정이 전혀 없어 배포된 프론트엔드가 실제로는 데이터를 하나도 못 받아오던 문제(pytest/curl은 브라우저 CORS를 안 걸러서 못 봤음) — CORSMiddleware 추가 후 별도 커밋(b2e27dd)으로 즉시 배포. (2) 디자인 토큰에 없던 "OP" 티어를 op.gg 실 데이터로 발견해 레드 계열 임시 색상 추가, design-tokens.md에 기록(최종 확정 필요). Vitest+RTL 14건 신규(frontend 33/33 통과), Playwright로 배포된 프로덕션 백엔드 실데이터 기준 데스크톱/태블릿/모바일 3개 브레이크포인트 시각 검증 완료(콘솔 에러 0건) |
| 2026-08-04 | FE-04 완료(PM 승인) — 착수 중 API-03 프로덕션 버그 발견·수정(recommended_items 응답 스키마가 dict로 잘못 선언, 실제 배치는 list를 만들어 실 데이터로는 항상 500 에러였음 — list[str]로 수정). 챔피언/아이템/증강체를 이름 없이 ID로만 내려주던 설계 공백도 발견 — Riot API는 정적 데이터를 REST로 안 주고 Data Dragon 전용임을 확인하는 과정에서 DATA-06이 "연결 실패"로 결론냈던 공식 TFT Data Dragon이 실제로는 연결됨을 재확인(docs/spike/tft-ddragon.md 정정, 데이터 소스는 기존 Community Dragon 유지). 실 데이터로 JOIN 정합성 사전 검증(챔피언 86/86, 아이템 29/29 매칭) 후 API-03에 name_kr/name_en/recommended_item_names 추가. 조합 상세 URL을 IA v1.2 원문(/comps/{comp_id})에서 쿼리스트링(/comps?id=)으로 전환(PM 승인) — 정적 export는 빌드 시점 comp_id만 정적 페이지화 가능한데 comps가 패치마다 새 행으로 쌓여 매 패치마다 조합상세 링크가 깨지는 문제 발견, Cloudflare 배포 훅 자동 재빌드 대안도 검토했으나 FE-03이 거부한 ISR형 빌드시점 고정을 재도입하는 셈이라 판단해 쿼리스트링 채택. glossary.md·FE-03 CompCard·CHAT-07 chat_links.py 링크 동시 수정. 화면설계서 2.2 그대로 BackButton/CompOverview/ChampionList(캐리 accent-carry 2px 보더)/AugmentList/ItemBuildsCta(모바일 full-width) 구현. backend pytest 4건, frontend Vitest 15건 신규(backend 176/176·frontend 42/42 통과), 실제 배포 데이터로 브라우저 시각 검증 완료(콘솔 에러 0건) |
| 2026-08-05 | FE-05 완료(PM 승인) — 착수 중 이번 세션 최대 발견: DATA-08/DATA-10이 완료 처리됐지만 챔피언별 아이템 빌드 수집·저장 함수(champion_item_build_rows/replace_champion_item_builds, 개별 pytest는 통과 상태)가 실제 배치 오케스트레이션(run_patch_batch.py)에 한 번도 배선되지 않아 운영 champion_item_builds가 계속 비어있었음(실 API 호출로 발견) — step_collect/step_normalize에 배선 추가, 로컬 테스트 DB에 실제 op.gg 데이터로 배치를 돌려 54,289행·83명 중 63명 챔피언 확인. API-04도 FE-04의 API-03과 동일 패턴 버그(item_combination 응답이 dict로 잘못 선언, 실제는 list[str]) 발견·수정하며 champion_name_kr/en·item_combination_names 추가. 추가로 실데이터에서 챔피언 1명당 조합이 최대 1,735개까지 나오는 것을 확인해 SQL 윈도우 함수로 챔피언별 상위 10개(TOP_BUILDS_PER_CHAMPION)만 반환하도록 제한(PM 승인). 화면설계서 2.3 그대로 /items/builds 구현: ChampionSelect(Dropdown)/ItemComboList/BuildPriorityDetail(데스크톱 좌우분할·태블릿 상하스택·모바일 하단시트), 챔피언 필터 선택 시 URL 쿼리(champion_id,patch) 동기화. backend pytest 7건(전체 180/180)·frontend Vitest 3건(전체 45/45)·batch 기존 74/74 그대로 통과, tsc/eslint/prettier/next build 전부 통과. Playwright로 로컬 백엔드(실제 op.gg 데이터) 데스크톱/모바일 시각 검증(콘솔 에러 0건) — PM이 동일 로컬 DB에 연결한 dev 서버로 직접 브라우저 확인 후 승인. 운영 DB의 champion_item_builds는 아직 비어있어 배포 후 GitHub Actions 배치 수동 트리거(workflow_dispatch) 필요(다음 세션 확인). 상세: docs/verification/FE-05-작업결과.md |
| 2026-08-05 | FE-05 운영 데이터 백필 완료 — PM이 patch-detection.yml을 workflow_dispatch로 수동 트리거했으나 21초 만에 성공 처리되고 champion_item_builds는 그대로 비어있었음. 원인: 이 워크플로우는 "패치 버전이 바뀌었을 때만" 전체 수집을 실행하는 구조(run_patch_detection)라, 운영 DB 현재 패치(17.8)와 op.gg 최신 패치(17.8)가 같아 triggered=False로 스킵됨 — 이번처럼 "기존에 없던 데이터를 오늘 처음 채우는" 스키마 변경 백필은 패치 감지 로직과 안 맞고, 다음 실제 패치 전까지는 재트리거해도 안 채워지는 구조적 공백을 발견(추후 유사 케이스 재발 가능성 있어 기록). 패치 감지·승격 로직은 건드리지 않고 이미 검증된 champion_item_build_rows()/replace_champion_item_builds()를 재사용하는 1회성 백필 스크립트(레포 미커밋, 실행 후 삭제)를 PM 승인 하에 운영 DB에 직접 실행 — champions(읽기)·champion_item_builds(쓰기)만 사용, 다른 테이블 영향 없음. filled=63/empty=20/failed=0(로컬 검증과 동일 비율). GET /catalog/items/builds 630행 정상 확인, /items/builds 배포 페이지 200 — FE-05 전체 종료. 상세: docs/verification/FE-05-작업결과.md |
| 2026-08-05 | FE-06 완료(PM 승인) — 화면설계서 2.4 그대로 /augments 구현: TierFilterBar(FE-03 FilterBar와 동일 드롭다운/바텀시트 패턴)/AugmentGrid(CompGrid와 동일 반응형 그리드)/AugmentCard(이름/등급배지/설명/승률/관련조합링크). WBS 필수·정책 DoD(Legend 승률 미노출)를 백엔드 마스킹 + 프론트 is_legend_related 플래그 기반 이중 방어로 구현, Vitest 정책 테스트로 검증. 착수 중 API-05에 related_comp_ids(comp_augments 조인) 추가 발견·보완(comp_augments가 DATA-10 결정으로 아직 비어있어 FE-04 AugmentList와 동일하게 지금은 링크 항상 숨김). 증강체 등급(gold/silver/prism) 배지 색상은 design-tokens.md 미확정 항목이라 신규 채택(FE-03 OP 티어 색상과 동일 패턴). 착수 중 실데이터(357개) 모바일 검증으로 치명적 버그 발견·수정: 일부 증강체 설명에 공백 없는 긴 원본 op.gg 텍스트(미해석 템플릿)가 그대로 있어 모바일 레이아웃 뷰포트가 옆으로 팽창(window.innerWidth 412→983px)하며 position:fixed 바텀시트가 화면 밖으로 밀려나던 문제 — wrap-break-word 추가로 수정, 재검증 확인(FE-03/FE-05는 페이지가 짧아 우연히 안 드러났을 가능성, TEST-09에서 재확인 권장). backend pytest 2건(전체 182/182)·frontend Vitest 9건(전체 54/54) 신규 통과, tsc/eslint/prettier/next build 전부 통과, Playwright로 로컬 백엔드(실제 op.gg 데이터) 데스크톱/모바일 시각 검증(콘솔 에러 0건). 상세: docs/verification/FE-06-작업결과.md. PM 결정 — 증강체 설명에 남아있는 <br> 리터럴·미해석 @TFTUnitProperty...@ 템플릿 정리를 별도 TASK로 분리: DATA-16(증강체 설명 템플릿 플레이스홀더 정리, 권장, 선행TASK DATA-08) 신설 — TFT_Hideout_WBS.xlsx·본 문서 동시 반영, 전체 97개 TASK로 갱신(활성 94개) |
| 2026-08-05 | PM 결정 — FE-10(이미지 최적화)은 선행 TASK인 FE-07·FE-08이 SET-16(Riot API 키 재발급) 대기로 아직 안 끝났고, 최적화할 실제 이미지 자산도 없어(전부 placeholder) 착수 보류. WBS 순서상 FE-10보다 먼저이고 선행TASK(FE-01)만 충족하는 FE-11로 순서를 바꿔 진행하기로 함 |
| 2026-08-05 | FE-11 완료(PM 승인) — FE-03 FilterBar·FE-05 ChampionSelect·FE-06 TierFilterBar가 각자 구현하던 거의 동일한 Dropdown/BottomSheet 마크업을 공용 컴포넌트 2개(FilterDropdown, ResponsiveFilter)로 통합. FE-05 ChampionSelect는 ResponsiveFilter(바텀시트 포함)가 아니라 FilterDropdown만 재사용 — 화면설계서 2.3이 이 필터를 브레이크포인트 무관 항상 드롭다운으로 유지하도록 명시하고 이미 PM 승인된 FE-05 동작이라 바텀시트를 새로 추가하지 않음(의도적 설계 결정), "3개 화면 재사용" DoD는 FilterDropdown으로 충족. 리팩터 전후 렌더링 DOM을 완전히 동일하게 유지해 기존 FE-03/FE-05/FE-06 테스트 파일을 무수정으로 통과시켜 무회귀 확인. WBS 요구사항(Dropdown/BottomSheet 상태 동기화 테스트) responsive-filter.test.tsx 4건 신규, frontend 전체 58/58 통과. tsc/eslint/prettier/next build 전부 통과. Playwright로 배포된 프로덕션 데이터 기준 데스크톱/모바일 시각 검증(콘솔 에러 0건, 리팩터 전과 시각적으로 동일함을 확인). 상세: docs/verification/FE-11-작업결과.md |
| 2026-08-05 | DATA-16 완료(PM 승인) — batch/normalize.py에 clean_augment_description() 신규: <br> 리터럴 태그를 실제 개행(\n)으로, @TFTUnitProperty...@ 미해석 수치 템플릿을 "(수치 정보 없음)"으로(op.gg가 실제 수치를 안 줘서 값 치환은 불가, DATA-05 스파이크 범위 확인), <rules> 등 나머지 HTML 유사 태그는 제거하도록 구현, augment_rows()에 적용. AugmentCard에 whitespace-pre-line 추가해 정리된 개행을 실제로 표시(FE-06 wrap-break-word와 함께 사용). pytest 6건(batch 전체 80/80)·Vitest 1건(frontend 전체 59/59) 신규 통과. 실제 op.gg 데이터 357개 전체로 검증 — 정리 전 <·@ 잔여 패턴 99건(28%) → 정리 후 0건. 운영 DB 백필: 다음 배치부터는 자동 적용되지만 기존 저장분은 그대로라, augments 테이블만 읽고 쓰는 1회성 백필 스크립트(레포 미커밋, op.gg 재호출 없음)를 PM 승인 하에 운영 DB에 직접 실행 — 357행 중 105행 변경, 운영 API로 재확인해 전체 잔여 패턴 0건 확인. 상세: docs/verification/DATA-16-작업결과.md |
| 2026-08-05 | API-02/FE-03 랭크 필터 롤백(PM 승인) — PM이 로컬 화면에서 티어리스트 "랭크"를 챌린저/마스터로 바꾸면 항상 빈 결과만 나오는 것을 발견해 문의. tools/list로 op.gg MCP tft_list_meta_decks의 inputSchema를 직접 재조회한 결과 파라미터가 전혀 없음({"type":"object","properties":{},"required":[]})을 확인 — 랭크 구간별 데이터를 얻을 방법 자체가 op.gg에 없음이 확정됨(docs/spike/opgg-schema.md 7번 신설). API-02 구현 당시(2026-08-03) "DATA-05 스파이크 완료 후 확정 필요"로 남겨뒀던 미확정 상태가 실제로는 데이터 소스의 근본적 한계였다고 정정. PM 결정: 랭크 필터 기능 전체 제거(향후 재추가 여지 없음) — GET /catalog/tierlist의 rank 쿼리·ALLOWED_RANKS·응답 rank 필드, comps.rank_tier 컬럼(마이그레이션 2fdcd6f417ba), 프론트 FilterBar 컴포넌트·RANK_OPTIONS/RankValue 타입을 전부 삭제. 티어리스트 페이지는 패치 배지만 표시하도록 단순화. backend pytest 180/180(rank 전용 2건 제거)·batch 80/80(영향 없음)·frontend Vitest 54/54(5건 제거) 전부 통과, tsc/eslint/prettier/next build 통과. FE-11(공용 필터 컴포넌트)의 "3개 화면 재사용" DoD는 이제 2개 화면(FE-05·FE-06)으로 줄었으나 공용 컴포넌트 자체의 결함은 아님(FE-03이 기능을 잃은 결과). 상세: docs/verification/API-02-rollback-작업결과.md |
| 2026-08-05 | FE-13 완료(PM 승인) — PM이 티어리스트 카드의 캐리 챔피언 점(●) placeholder를 실제 챔피언 이미지로 바꿀 수 있는지 문의. Community Dragon squareIcon 필드(.tex 게임 엔진 경로)를 raw.communitydragon.org CDN 규칙(전체 소문자+.png)으로 변환하면 실제 이미지를 받을 수 있음을 실호출로 확인(아칼리 등으로 200 응답 확인) — WBS FE-10(FE-07/08 완료 선행) 전체를 기다리지 않고 이 좁은 범위만 신규 TASK FE-13(권장, 선행TASK FE-03)으로 분리해 바로 진행(PM 승인). champions.square_icon_url 컬럼 추가, batch/normalize.py에 cdragon_asset_url() 신규(챔피언 아이콘 URL 변환), GET /catalog/tierlist의 CompSummary.carry_champion_ids(단순 id 배열)를 carry_champions(champion_id/name_kr/square_icon_url)로 확장, CompCard가 next/image로 실제 원형 아이콘(캐리 강조 보더 유지)을 렌더링하고 이미지 없으면 기존 placeholder 폴백. batch pytest 3건(전체 82/82)·backend pytest 2건(전체 182/182)·frontend Vitest 2건(전체 56/56) 신규 통과, tsc/eslint/prettier/next build 전부 통과. Playwright로 로컬 백엔드(실제 Community Dragon 데이터, 83명 중 78명 아이콘) 시각 검증(콘솔 에러 0건). 운영 데이터 백필 완료(2026-08-05): 배포 확인(Render carry_champions 필드·Cloudflare 200) 후 Community Dragon 1회 호출로 champions 테이블만 UPDATE하는 1회성 스크립트 실행 — 83명 중 78명 업데이트(5명은 Community Dragon에 아이콘 자체 없어 매칭 없음, 기존 placeholder 유지). 배포된 사이트에서 Playwright로 원형 챔피언 아이콘 정상 렌더링 확인(콘솔 에러 0건). 상세: docs/verification/FE-13-작업결과.md |
| 2026-08-06 | FE-14 신규 등록·착수 — PM이 조합 상세 헥스 배치도(현재 is_carry 기반 휴리스틱)의 실제 좌표 반영 가능 여부를 문의. op.gg tft_list_meta_decks 응답을 직접 재조회한 결과 units[].cell.{x,y}(x:1~7, y:1~4, 4행×7열)에 실제 배치 좌표가 있음을 확인 — 이전 스파이크 요약(docs/spike/opgg-schema.md)에는 stat 필드 샘플만 남아있어 이 필드를 놓쳤던 것으로 확인, "op.gg·Riot 공식 API 어디에도 보드 좌표가 없다"던 이전 판단을 정정. PM이 신규 TASK로 분리해 진행을 요청해 FE-14(권장, 선행TASK FE-04)로 WBS.xlsx·본 문서에 등록하고 착수(상태: 진행중). |
| 2026-08-06 | FE-14 완료(PM 승인) — comp_champions에 cell_x/cell_y 컬럼 추가, batch/normalize.py의 comp_champion_rows()가 op.gg 응답 unit.cell에서 좌표를 추출(없으면 None), GET /catalog/comps/{id} 응답에 포함. HexBoard가 조합의 모든 챔피언에 좌표가 있으면 CSS Grid(7열×4행, 짝수 행 반 칸 오프셋)로 실좌표 배치도를 그리고, 하나라도 없으면(구 데이터) 기존 is_carry 휴리스틱으로 전체 폴백 — 이후 PM 요청으로 빈 칸도 옅은 회색 헥스 테두리로 그려 몇 번째 줄·칸인지 배경 격자선을 추가. 좌표 y/오프셋 방향은 op.gg 응답에 방향 메타데이터가 없어 임의로 정함(상대적 배치는 실데이터 그대로, 좌우·상하 반전 가능성 있음, PM에 고지). backend pytest 185/185(신규 2건)·batch pytest 83/83(신규 1건)·frontend Vitest 73/73(신규 4건) 전부 통과, tsc/eslint/prettier 통과. 운영 데이터 백필: 마이그레이션을 실제 Supabase 개발 DB에 적용 후 op.gg tft_list_meta_decks 1회 재호출로 comp_champions.cell_x/cell_y만 UPDATE하는 1회성 스크립트 실행(레포 미커밋, 다른 테이블 미변경) — 10개 조합 중 8개(69명) 실좌표 반영, 2개는 op.gg 응답에서 해당 조합을 못 찾아 휴리스틱 폴백 유지(메타 변동 추정). 같은 세션에서 챔피언/아이템 아이콘(items.square_icon_url)·증강체 대표 이미지(augments.image_url)·완성 아이템 재료 팝오버(신규 GET /catalog/items)·아이템 빌드 챔피언 자동완성·증강체 티어 필터 제거 등 다수의 PM 요청 UI 개선을 함께 반영(각각 WBS 미등록 범위, 상세는 각 기능 커밋 메시지 참고). 상세: docs/verification/FE-14-작업결과.md |
| 2026-08-06 | FE-09 완료(PM 승인) — 화면설계서 2.7 챗봇 위젯(전역 컴포넌트) 구현. ChatWidget이 layout.tsx에 전역 삽입되어 전 페이지 노출, 데스크톱/태블릿은 우하단 플로팅 패널(360×505, radius 10), 모바일은 하단 고정 바 → 탭 시 전체화면 바텀시트로 전환(FE-01 placeholder는 모바일에서도 작은 플로팅이던 버그를 함께 수정). chat-stream.ts가 API-09/CHAT-05의 SSE(data: <token> 반복 + event: done)를 파싱해 토큰 단위로 렌더링, CHAT-07이 만든 [이름](url) 링크를 클릭 가능한 상세 페이지 링크로 렌더링하고 클릭 시 link_click_events(KPI 전환율 계측)에 로깅. 후속질문칩은 백엔드에 맥락별 생성 로직이 없어 의도 4분류 대표 고정 질문 4개를 빈 대화 상태에서만 노출하는 가정으로 구현(PM 확인 필요 항목으로 별도 보고, 아래 CHAT-11 참고). Vitest+RTL 4건(WBS 요구사항: collapsed/expanded 전환·모바일 바텀시트 전환·mock SSE 렌더링·링크 렌더링) 신규, frontend 전체 77/77 통과, eslint/prettier/tsc/next build 전부 통과. Playwright로 데스크톱/모바일 스크린샷 확인 및 배포된 실제 백엔드로 end-to-end 메시지 전송(Groq 실답변 스트리밍·패치 버전 명시·링크 렌더링 확인, 콘솔 에러 0건). 상세: docs/verification/FE-09-작업결과.md |
| 2026-08-06 | CHAT-11 신규 등록 — FE-09 PM 확인 과정에서 후속질문칩을 맥락 기반으로 동적 생성할 수 있는지 PM이 문의. 현재 CHAT-01~09 파이프라인 어디에도 후속 질문 생성 로직이 없어 규칙 기반(intent+검색문서 템플릿) vs LLM 기반(Groq 추가 호출) 두 방식과 트레이드오프(비용/지연 vs 자연스러움)를 보고, PM이 LLM 기반 채택을 결정. CHAT-11(권장, 선행TASK CHAT-05·FE-09)로 WBS.xlsx·본 문서에 신규 등록(상태: 대기) — 프롬프트 설계, SSE event: followups 신규 이벤트 추가, 무료 티어 레이트리밋/지연 영향 검토를 DoD에 포함. |
| 2026-08-06 | CHAT-11 완료(PM 승인) — chat_followups.generate_followup_questions()가 답변 직후 Groq에 최대 3개 후속 질문을 요청(재시도 없음, max_tokens=200). generate_answer_stream에 선택적 result 사이드채널을 추가해 기존 반환 타입(Generator[str,...])과 CHAT-05/08/09의 기존 테스트를 전혀 건드리지 않고 배선(무회귀). 캐시 히트(CHAT-08)·조기반환(명확화/범위밖/패치없음)·Groq 완전 실패(FALLBACK_MESSAGE) 턴은 레이트리밋 절감을 위해 후속질문 생성 자체를 건너뜀. SSE에 event: followups\ndata: <JSON string[]>\n\n를 done 직전에 추가(없으면 이벤트 자체 생략, 하위호환). 프론트는 FE-09의 "빈 상태 고정 4개 칩" 가정을 화면설계서 2.7 와이어프레임 재확인 후 "직전 봇 답변에 종속된 동적 칩"으로 정정(칩은 항상 답변 뒤에만 등장). backend pytest 14건 신규(전체 199/199, 기존 CHAT-05/08/09 테스트 무수정 통과)·frontend Vitest 2건 신규(전체 79/79) 통과, ruff/eslint/prettier/tsc/next build 전부 통과. 레이트리밋 검토: 캐시미스·비폴백 턴에 Groq 호출이 최대 2배(스트리밍 답변+후속질문)로 늘지만 재시도 없음·저비용 캡·실패해도 본 답변 무영향으로 설계, 배포 후 KPI-01로 모니터링 권장(코드 변경 없이). 한계: Render가 main에서만 자동배포되고 로컬 Groq 키가 없어 실제 Groq 응답 기준 브라우저 end-to-end는 이번 PM 확인 전에는 검증 못 함 — 머지·배포 후 스모크 체크 필요(PM 확인 요청 항목). 상세: docs/verification/CHAT-11-작업결과.md |
| 2026-08-06 | FE-09/CHAT-11 main 머지(PR #12)·Render/Cloudflare 자동배포 후 스모크 체크 중 CHAT-11과 무관한 운영 인시던트 3건 발견·해결 — ① Render tft-hideout-backend에서 HUGGINGFACE_API_KEY·GROQ_API_KEY가 빠져 있어 챗봇이 매번 실패(원인 불명, PM이 재등록·재배포로 해결) ② 그 과정에서 stream_llm_answer의 logging.warning() 진단 로그가 Render 환경에서 아예 출력 안 되는 것을 확인해 print(stderr)로 교체(PR #13·#14) ③ 위 실패로 나온 폴백 메시지가 CHAT-08 캐시(session_id 아닌 질문 문장+패치 버전이 키)에 그대로 저장돼 그 문장을 묻는 모든 세션이 계속 폴백만 받던 캐시 오염 버그를 발견 — raw_answer != FALLBACK_MESSAGE일 때만 캐시하도록 수정(fix/chat08-cache-poisoning, PR #15, pytest 신규 1건·전체 200/200), 이미 오염된 캐시 1행은 1회성 스크립트(레포 미커밋)로 내용 확인 후 삭제. 세 PR 모두 PM 승인·머지·배포 완료. 최종적으로 여러 신규 질문으로 실제 Groq 스트리밍 답변·패치 버전 명시·CHAT-07 링크·CHAT-11 동적 후속질문까지 전부 정상 동작 확인(캐시 히트 시 후속질문 미생성도 설계대로 확인). 상세: docs/verification/CHAT-11-작업결과.md(배포 후 스모크 체크 결과 절), docs/verification/smoke-tests.md(운영 인시던트 절) |
| 2026-08-06 | FE-14 후속 버그 수정(PM 확인완료) — PM이 배포된 조합 상세 헥스 배치도 스크린샷과 op.gg 원본 화면을 비교해 전열/후열이 상하로 뒤집혀 보인다고 확인. FE-14 완료 당시 "y/오프셋 방향은 op.gg 응답에 방향 메타데이터가 없어 임의로 정함 — 상하 반전 가능성 있음"이라 고지했던 리스크가 실제로 발생한 것. hex-board.tsx의 cellPlacementStyle이 cell.y를 그대로 gridRowStart로 써서 y=1(전열)이 화면 맨 위, y=4(후열)이 맨 아래로 그려지고 있었음 — GRID_ROWS + 1 - y로 행을 반전하고, 벌집 오프셋 판정도 반전된 화면상 행 기준으로 재계산하도록 수정. frontend Vitest 79/79 통과(기존 hex-board 테스트 2건 갱신), tsc/eslint 클린. 브라우저 직접 재확인은 못 해 스크린샷 좌표를 수동 추적해 검증. fix/fe14-hexboard-row-order 브랜치에 커밋·push까지 완료, PR 생성은 gh 미인증으로 보류(수동 생성 또는 인증 후 재요청 필요). 상세: docs/verification/FE-14-작업결과.md "수정 이력" 절 |
| 2026-08-06 | FE-15 신규 등록·착수 — PM이 조합 상세 헥스 배치도에 챔피언 성급(2성/3성) 별 표시를 추가할 수 있는지 문의. op.gg tft_list_meta_decks 응답을 재조회한 결과 units[].tier(정수, 관측값 2·3 — FE-14 cell.x/y와 같은 unit 객체 필드지만 그동안 추출하지 않고 있었음)에 성급 데이터가 있음을 확인(docs/spike/opgg-schema.md 8번 항목 신설). PM이 신규 TASK로 등록해 진행을 요청, 별 색상은 op.gg 원본 색상 체계(초록/파랑/핑크/회색 등)를 재현할 근거 데이터가 없어 3성=레드/2성=골드 2단계 고정 색상으로 PM이 직접 결정. FE-15(권장, 선행TASK FE-14)로 TFT_Hideout_WBS.xlsx·본 문서에 등록하고 착수(상태: 진행중). |
| 2026-08-06 | FE-15 로컬 브라우저 실검증 중 렌더링 버그 발견·수정 — PM이 "로컬에서 확인할 수 있나요?"라고 요청해 기존에 돌던 로컬 dev 백엔드(8000)·프론트(3000)로 실제 확인. 마이그레이션을 개발 Supabase DB에 적용하고 FE-14와 동일 패턴으로 op.gg 1회 재호출 백필(10개 조합 중 8개, 69명 반영) 후 실제 화면을 캡처해보니 8명 중 6명의 별이 안 보이는 버그 발견 — DOM/computed style은 전부 정상인데, 크로미움이 clip-path 형제 요소(HexIcon 육각형)와 스태킹 컨텍스트를 공유하는 인라인 텍스트를 페인트하지 않는 렌더링 버그로 확인. StarRating에 transform-gpu(컴포지팅 레이어 강제) 추가로 8명 전원 정상 렌더링 확인, 참고 화면(op.gg)과 배치·색상 동일함을 브라우저로 최종 확인. 상세: docs/verification/FE-15-작업결과.md |
| 2026-08-06 | DATA-17 신규 등록·착수 — PM이 헥스 배치도 좌표 누락 원인을 op.gg부터 재검토해달라고 요청. OpggMcpClient.list_meta_decks()를 직접 재호출해 운영 DB(comps, 2026-08-04 적재)와 대조한 결과 두 조합(N.O.V.A. 벡스·운명술사 트위스티드 페이트) 모두 챔피언 전원 cell_x/cell_y가 null인 이유는 컬럼·추출 코드 자체가 2026-08-06에야 추가돼 구 데이터가 애초에 좌표를 가질 수 없었던 것으로 확인(파싱 버그 아님). 그 중 N.O.V.A. 벡스는 현재도 op.gg 상위 10위에 있어 재배치 시 정상 백필 가능하지만, 운명술사 트위스티드 페이트는 op.gg 상위 10위 목록에서 이미 빠져(메타 회전, tft_list_meta_decks는 페이지네이션 없이 항상 정확히 10개만 반환 — opgg-schema.md 8번) 더 이상 데이터를 가져올 방법이 없음을 확인. 조사 중 normalize.py의 upsert_comps/upsert_comp_champions가 순수 upsert라 상위 10위에서 빠진 조합을 지우는 로직이 전혀 없어 이런 조합이 좌표 null 상태로 영구 고착된다는 구조적 공백을 추가 발견해 PM에게 보고, 신규 TASK 등록·착수 여부를 문의. PM 결정: (1) 하드 삭제 대신 comps.is_active 플래그로 소프트 삭제(comp_champions/comp_augments FK, match_analyses.matched_comp_id FK, meta_document_embeddings.source_id 참조가 끊기지 않도록 — 티어리스트 API는 is_active=true만 노출하되 조합 상세·PGA 매칭·챗봇 인용은 비활성 조합도 계속 조회 가능하게 유지), (2) 지금 바로 신규 TASK로 등록해 진행. DATA-17(권장, 선행TASK DATA-08)로 TFT_Hideout_WBS.xlsx·본 문서에 등록하고 착수(상태: 진행중). |
| 2026-08-06 | DATA-17 구현 중 로컬 8000번 백엔드(개발 Supabase DB 연결, --reload) 장애 발견·수정 — catalog.py에 comps.is_active 참조를 추가하자 hot-reload로 즉시 반영됐는데, 이 마이그레이션은 그때까지 Docker 테스트 DB(5433)에만 적용돼 있어 개발 Supabase DB에는 컬럼이 없어 /catalog/tierlist 요청마다 UndefinedColumn으로 500이 나며 PM 화면에 "티어리스트를 불러오지 못했습니다"로 노출됨. 같은 마이그레이션을 개발 Supabase DB에도 적용(alembic upgrade head, FE-14/FE-15와 동일 패턴의 컬럼 추가만 하는 안전한 변경)해 즉시 해결, GET /catalog/tierlist 재호출로 10개 조합 정상 응답 확인. |
| 2026-08-06 | FE-15·DATA-17 완료(PM 승인) — 로컬에서 백엔드 202/202·batch 87/87·frontend 83/83 pytest/Vitest 전부 통과, ruff/eslint/tsc 클린 확인 후 커밋 2건 생성(FE-15: 99e6669, DATA-17: 1958465, fix/fe14-hexboard-row-order 브랜치). PM이 "커밋 하고 운영에도 배포, 배치도 호출함"으로 배치 병합·프로덕션 배포·배치 실행까지 함께 승인 — 이어서 브랜치 push → PR → main 병합 → 배포 확인 → GitHub Actions 배치 트리거 순서로 진행 예정(각 단계 결과는 아래에 이어서 기록). |
| 2026-08-06 | PR #16(fix/fe14-hexboard-row-order → main) PM이 GitHub 웹에서 직접 생성·머지(gh CLI 미인증으로 위임, 4f2d617). Render/Cloudflare 자동 배포 후 PM이 patch-detection.yml을 workflow_dispatch로 수동 트리거(Run #9, 28초, Success) — 그런데 운영 API로 재확인하니 티어리스트·N.O.V.A. 벡스 좌표 모두 갱신 안 됨을 발견. 원인은 FE-05 때 이미 겪은 것과 동일한 구조적 공백: run_patch_detection()이 현재 DB 패치버전 != op.gg 최신 버전일 때만 실제 수집을 실행하는데, 지금 둘 다 17.8로 같아 triggered=False로 수집 단계 자체가 스킵됨(성공 표시는 뜨지만 아무 것도 안 바뀜). 패치 감지·승격 로직은 건드리지 않고 이미 검증된 upsert_comps/mark_stale_comps_inactive/upsert_comp_champions만 재사용하는 1회성 스크립트(레포 미커밋, 실행 후 삭제)를 PM 승인 하에 운영 DB에 직접 실행 — op.gg 10개 조합 upsert, 1건 비활성화(운명술사 트위스티드 페이트). 운영 API 재확인 결과: 티어리스트에서 운명술사 트위스티드 페이트 제외 확인(직접 상세 조회는 200으로 계속 가능), N.O.V.A. 벡스 9명 전원 실좌표(cell_x/cell_y)·성급(star_level) 정상 반영, 신규 메타 조합(N.O.V.A. 미스 포츈 등)도 함께 반영됨. DATA-17 전체 종료. patch-detection.yml의 이 구조적 공백(같은 patch_version 내 데이터 갱신이 필요할 때마다 매번 수동 백필 필요)은 재발 가능성이 있어 향후 정식 TASK화 여부 PM 판단 필요. |
| 2026-08-06 | DATA-18 신규 등록 — 위 구조적 공백(FE-05·DATA-17 두 차례 재현된 patch-detection.yml의 "패치 미변경 시 comps 갱신 스킵" 문제) 재발 방지를 PM이 정식 TASK화하기로 결정. DATA-18(권장, 선행TASK DATA-17)로 TFT_Hideout_WBS.xlsx·본 문서에 등록(상태: 대기) — 착수는 2026-08-07(내일)로 예정, 이번 세션에서는 구현하지 않음. |
| 2026-08-07 | DATA-18 완료(PM 승인) — 패치 감지·원자적 전환 로직은 그대로 두고, TASK 설명이 제시한 "같은 크론에 무조건 실행되는 단계 추가" 방식으로 구현. batch/comps_refresh.py 신규(refresh_comps(), op.gg tft_list_meta_decks 1회 호출로 comps/comp_champions만 갱신, 챔피언 매핑은 DB 재사용해 Community Dragon 재호출 없음), run_patch_batch.py는 run_patch_detection 결과가 triggered=False일 때만 이를 호출하도록 배선. 별도 워크플로우·스케줄 신설 없이 기존 1일 1회 크론에 얹음. pytest 신규 4건 포함 batch 91/91 통과, ruff 클린 확인 후 커밋 2건(d7c6882 feat, 7cb5aa2 docs) — PR 없이 main에 직접 push(PM 확인 승인). 상세: docs/verification/DATA-18-작업결과.md. |
| 2026-08-08 | CHAT-12 신규 등록·착수 — PM이 챗봇 위젯 스크린샷(아이템 빌드 답변이 줄바꿈 없이 쉼표로 죽 이어진 산문체)을 보고 마크다운 서식(줄바꿈·글머리)으로 가독성을 개선할 수 있는지 문의. 현재 상태 확인 결과: chat_message_list.tsx의 renderAnswerText()는 CHAT-07이 심는 [이름](url) 링크 문법만 정규식으로 파싱하고 나머지는 원문 그대로 표시(주석에 "프롬프트가 다른 마크다운 문법을 지시하지 않아 전체 파서는 불필요"라고 명시돼 있었음), whitespace-pre-wrap은 봇 버블에 이미 적용돼 있어 \n은 줄바꿈되지만 INTENT_ITEM_RECOMMENDATION 프롬프트 지시('- 챔피언명: 아이템1, 아이템2, 아이템3' 형식)를 시스템 프롬프트 공통 규칙·few-shot이 아닌 의도별 추가지시에만 넣어둬 실제로는 일관되게 지켜지지 않고 있었음. 프론트만 고치면 LLM이 애초에 줄바꿈 없이 답할 때 효과가 없고, 백엔드만 고치면 프론트가 -를 리스트로 그려주지 않아 하이픈만 텍스트에 붙는 문제를 PM에게 설명 — 백엔드(CHAT-03 시스템 프롬프트에 공통 목록/강조 서식 규칙 추가) + 프론트(FE-09 renderAnswerText()를 목록/볼드까지 파싱하도록 확장) 두 쪽을 함께 고치기로 PM과 합의. CHAT-12(권장, 선행TASK CHAT-03·FE-09)로 TFT_Hideout_WBS.xlsx·본 문서에 신규 등록하고 바로 착수(상태: 진행중). react-markdown 등 외부 라이브러리 도입은 기존 CHAT-07/FE-09가 이미 채택한 "가벼운 정규식 파서" 패턴을 유지하는 쪽으로 결정(프롬프트가 지시하는 서식이 목록·볼드·링크뿐이라 전체 마크다운 파서는 여전히 과함). |
| 2026-08-08 | CHAT-12 구현 완료, PM 확인 요청 — prompt_assembly.py의 SYSTEM_PROMPT_BASE에 목록/강조 서식 9번 규칙을 추가하고 few-shot 예시 2를 실제 목록·강조 형식으로 갱신, chat_message_list.tsx의 renderAnswerText()가 링크뿐 아니라 - 목록·**강조**까지 파싱하도록 확장. 구현 중 프론트 렌더링 테스트를 실제 SSE 와이어 포맷으로 재현하다가 CHAT-12와 무관한 기존 버그를 발견: build_sse_stream()이 data: <토큰>\n\n로 보낼 때 토큰 자체에 개행이 섞여 있으면(모델이 줄바꿈을 넣을 때마다 발생 가능, CHAT-12로 목록 지시가 늘면서 빈도 증가) 그 원본 개행이 SSE 이벤트 구분자 \n\n과 뒤섞여 프론트 chat-stream.ts가 data: 첫 줄만 읽고 그 이후 내용을 통째로 잃어버리는 문제(스크린샷에서 "-" 기호 자체가 안 보이던 정황과 일치) — build_sse_stream()에서 토큰 내부 개행만 \n으로 이스케이프해 전송하고 chat-stream.ts가 수신 시 원래 개행으로 복원하도록 최소 침습 수정(토큰 분할·재조합 로직은 미변경). backend pytest 신규 5건 포함 전체 237/237 통과, frontend Vitest 신규 4건 포함 전체 95/95 통과(둘 다 실제 SSE 와이어 바이트를 재현하는 테스트로 개행 이스케이프 왕복 검증), ruff/eslint/prettier/tsc/next build 전부 통과. 로컬 실제 Groq 검증: 저장소 루트 .env에 이미 GROQ_API_KEY/HUGGINGFACE_API_KEY가 있어(CHAT-11 때와 달리 이번엔 가능) 로컬 백엔드(8000)·프론트(3000)를 띄워 실제 질문으로 검증 — curl로 SSE 원본 바이트에서 개행이 실제로 \n으로 이스케이프되어 전송됨을 확인, Playwright로 브라우저를 조작해 <ul><li> 목록이 실제로 렌더링되고 챔피언 링크도 함께 살아있는 것을 스크린샷으로 확인(콘솔 에러 없음). 상세: docs/verification/CHAT-12-작업결과.md. |
| 2026-08-08 | CHAT-12 PM 실사용 중 회귀 2건 제보·1건 수정 — PM이 로컬 서버에서 직접 챗봇을 써보고 (1) 목록 안 챔피언 링크가 안 눌린다, (2) "(주의: 위 답변 중 일부 명칭은 검색된 문서에서 확인되지 않았습니다.)"가 무슨 뜻이고 왜 뜨는지 문의. (1) 링크 회귀: 9번 규칙에 "핵심 명칭은 **강조**"를 함께 넣었더니 모델이 목록 항목에서 8번 규칙(작은따옴표 인용)을 생략하고 별표만 쓰는 경우가 늘어, CHAT-07 insert_links()(작은따옴표 인용만 링크로 치환)가 그 이름들을 링크로 못 바꾸는 회귀를 확인(Playwright로 <li><strong>블리츠크랭크</strong> 형태, 링크 0개 재현). 강조 지시를 완전히 제거하고 8번 규칙에 "목록 항목에서도 예외 없이 작은따옴표, 별표로 대체 금지"를 명시, 프론트 강조(**) 파싱도 함께 제거(YAGNI). 재검증: 캐시 우회 질문으로 다시 요청 → 실제 <a> 링크 생성·클릭 시 정상 이동 확인. backend 238/238·frontend 96/96 통과(무회귀). (2) 근거검증 경고 설명: CHAT-06 verify_grounding()이 인용된 이름을 검색 문서 메타데이터와 대조하는 안전장치로, 이번 경우 실제로 근거 없는 이름('베이', 아마 '베이가' 오기)을 정상적으로 잡아낸 것과 별개로, 아이템 빌드 문서 메타데이터에 아이템 이름 자체가 저장되지 않아(챔피언명만 저장) 아이템을 인용하는 답변은 내용이 맞아도 구조적으로 항상 이 경고가 뜨는 한계를 확인·PM에게 설명. 이번 세션에서는 수정하지 않고 별도 TASK 등록 여부를 PM 판단에 맡김. 상세: docs/verification/CHAT-12-작업결과.md. |
| 2026-08-08 | CHAT-13 신규 등록·구현(PM 확인 요청 중) — CHAT-12 근거검증 경고 설명 후 PM이 신규 TASK 등록을 요청. batch/embeddings.py의 item_build 청크가 이미 갖고 있던 item_names 변수를 doc_metadata["items"]에 추가로 실어(추가 조회 없음), chat_postprocessing.py의 _known_names()와 chat_links.py의 _name_to_url() 양쪽에 "목록형 메타데이터 키" 처리를 추가해 아이템 이름도 근거검증 통과·링크 대상으로 인식하게 함(개별 상세 페이지가 없어 챔피언과 동일하게 /items/builds 목록 페이지로 연결). 진짜 할루시네이션(문서에 없는 이름)은 여전히 경고 유지되도록 테스트로 확인. batch pytest 신규 1건 포함 106/106, backend pytest 신규 5건 포함 243/243 통과(둘 다 무회귀), ruff 통과. 한계: doc_metadata만 바뀌는 변경이라 임베딩 재호출은 불필요하지만, 개발 DB에 이미 적재된 기존 item_build 임베딩 행에는 아직 반영 안 됨 — 다음 정기 배치 또는 1회성 백필(DATA-16/FE-13/FE-14와 동일 패턴, 외부 API 호출 없음)로 반영 가능, PM 확인 시 백필 필요 여부 함께 결정 예정. 상세: docs/verification/CHAT-13-작업결과.md. |
| 2026-08-08 | CHAT-13 개발 DB 백필 완료(PM 요청) — champion_item_builds→items 조인만으로 기존 meta_document_embeddings(item_build) 630행의 doc_metadata에 items 목록을 채우는 1회성 스크립트를 개발 Supabase DB에 실행(레포 미커밋, 외부 API 호출 없음). 630/630 반영 확인, 로컬 서버로 재검증해 목록 안 아이템 이름이 더 이상 근거검증 경고를 유발하지 않고(실제 문서에 없는 이름은 여전히 경고, 정상 동작) 챔피언명은 계속 링크로 렌더링됨을 확인. 상세: docs/verification/CHAT-13-작업결과.md. |
| 2026-08-08 | CHAT-12·CHAT-13 PM 실사용 재검증 중 버그 2건 제보·수정 — "무한의 대검 사용하는 챔피언은?" 질문에서 PM이 (1) 답변 맨 앞 아이템 이름("무한의 대검")이 링크로 걸려 있는데 눌러도 챔피언 선택이 안 됨, (2) 목록 안 챔피언 이름을 클릭해도 URL이 아예 안 바뀜을 제보. 원인 분석: (1)은 CHAT-13 1차 수정에서 근거검증용 "알려진 이름" 목록과 링크 대상 목록을 같은 것으로 취급해 아이템 이름까지 링크해버린 설계 실수, (2)는 item_build 문서의 챔피언 링크가 애초에 champion_id 없이 항상 필터 없는 /items/builds로만 갔던 기존 버그(CHAT-07 때부터)에 더해 목록 항목에서 모델이 챔피언명을 작은따옴표로 인용하지 않는 경우가 섞여 링크 자체가 안 생긴 경우도 있었음. 수정: chat_links.py의 _name_to_url()에서 아이템 이름 매핑을 완전히 제거(근거검증에서만 계속 인식), item_build 문서 metadata에 champion_id 추가(batch/embeddings.py, 이미 있는 build.champion_id 재사용)해 챔피언 링크가 /items/builds?champion_id={id} 필터 URL을 쓰도록 분기, 모델의 인용 누락에도 대응하도록 목록 항목 맨 앞(콜론 앞)의 챔피언명을 인용 여부와 무관하게 인식하는 2차 정규식 패스를 insert_links()에 추가(부수 효과로 CHAT-05 후속턴 구조화 조회용 extract_champion_ids_from_answer()도 더 정확해짐). backend pytest 251/251(신규 4건 포함)·batch pytest 106/106 통과(무회귀). 개발 DB에 champion_id 백필(630행, 외부 API 호출 없음) 재실행 후 실제 서버로 재검증 — "무한의 대검 사용하는 챔피언은?" 답변에서 아이템 이름은 링크 없이 텍스트로만, 챔피언 15명 전원이 champion_id 필터 링크로 렌더링되고 클릭 시 실제로 그 챔피언이 선택된 아이템 빌드 화면으로 이동하는 것을 스크린샷으로 확인. 상세: docs/verification/CHAT-13-작업결과.md. |
| 2026-08-08 | DATA-19·CHAT-14 신규 등록 — PM이 아이템 설명이 부족하다며(예: "보석 건틀릿은 스킬에 치명타 판정을 부여하고..." 같은 설명이 가능한지) 신규 TASK 등록을 요청, 아이템 줄임말(예: 보건→보석 건틀릿, 무대→무한의 대검) 인식도 함께 요청. 착수 전 op.gg tft_list_item_combinations를 실호출해 데이터 가용성부터 확인: 아이템 객체에 desc 필드가 이미 있고(Community Dragon 원본), 완성 아이템 71개 중 68개(96%)는 <br> 등 태그만 정리하면 바로 쓸 수 있는 완전한 설명이었음(DATA-16의 증강체 설명 정리 로직 재사용 가능). 전체 838개 아이템 중 84개(10%)는 {{TFT_Keyword_Precision}}류 미해석 참조가 섞여 있는데, distinct 토큰을 세어보니 재사용 키워드(글로서리형)는 정밀/화상/냉각/상처 4종뿐이고 나머지는 DATA-16이 이미 다뤄본 @TFTUnitProperty...@ 수치 플레이스홀더 패턴이었음(docs/spike/opgg-schema.md에 소급 기록 예정). cdragon/tft 전체 덤프도 재확인했으나 top-level 키가 items/setData/sets뿐이라 별도 키워드 글로서리는 없음(4종은 DATA-07처럼 수동 유지 사전 필요). DATA-19(권장, 선행TASK DATA-08, "아이템 효과 설명 데이터 확보·정제")·CHAT-14(권장, 선행TASK DATA-19·CHAT-02·CHAT-04, "아이템 효과 설명 RAG 연동 및 이름 줄임말 인식")로 TFT_Hideout_WBS.xlsx·본 문서에 신규 등록(상태: 대기, 착수는 다음 세션). |
| 2026-08-08 | FE-09 후속 조정(WBS 미등록) — 로컬 챗봇 위젯을 확인하던 PM이 웹/태블릿 패널이 조금 더 높으면 좋겠다고 요청. design-tokens.md의 초기 480~505px 범위 중 이미 최대값(505px)을 쓰고 있어 범위를 벗어나는 조정이라 PM에게 목표 값을 확인(360×600px로 결정). chat-widget.tsx의 md:h-[505px]를 캔버스 정확 배수인 md:h-150(=600px)으로 변경(데스크톱·태블릿 모두 같은 md: 브레이크포인트를 공유해 함께 적용됨), design-tokens.md의 챗봇 위젯 스펙 2곳을 360×600px로 갱신. frontend Vitest 95/95 그대로 통과(무회귀), tsc/eslint/prettier 통과. Playwright로 데스크톱(1280px)·태블릿(900px) 뷰포트 모두 패널이 정확히 600px 높이로 렌더링되고 하단 여백(bottom-24=96px) 안에서 화면을 벗어나지 않는 것을 확인. |
| 2026-08-08 | CHAT-12·CHAT-13 PM 승인, 후속질문 칩 좌측 정렬 수정, 커밋·push 완료 — PM이 CHAT-12(답변 마크다운 서식)·CHAT-13(아이템 이름 근거검증·링크 개선, 2차 수정 포함)을 순서대로 확인 후 승인, 진행현황을 완료로 갱신. 같은 요청에서 PM이 후속질문 칩 텍스트가 두 줄일 때 가운데 정렬되는 문제도 제보 — <button> 기본값(text-align: center)이 원인, text-left 클래스 추가로 수정(Vitest 96/96 통과, mock SSE로 좌측 정렬 시각 확인). 커밋 4건 생성: 7292e13(feat, CHAT-12) · a1ddfe0(feat, CHAT-13) · ec454c4(fix, 패널 높이+칩 정렬) · 진행현황/WBS 갱신 커밋(docs) — main에 직접 push(PM 확인 승인, 최근 세션들과 동일한 패턴). |
| 2026-08-07 | DATA-18 스모크 테스트 완료 — PM이 patch-detection.yml을 workflow_dispatch로 수동 트리거(Run #13, 커밋 7cb5aa2, 27초, Success). 운영 로그에서 패치 감지: triggered=False 17.8 -> 17.8 직후 comps 주기 재수집(DATA-18): comp_count=10 deactivated=0 확인 — patch_version 불변 상태에서도 comps 재수집 경로가 실제로 호출됨을 운영 환경에서 검증(WBS 테스트 요구사항 2번 충족). 운영 API(GET /api/v1/catalog/patches/current)로 patch_version이 17.8 그대로임도 재확인. DATA-18 전체 종료. |
| 2026-08-08 | 중요 정정 — "개발 Supabase DB"는 존재하지 않음(PM 확인): CHAT-12/CHAT-13 검증 중 "운영 DB에도 백필해달라"는 PM 요청에 답하려다, 로컬 세션이 그동안 접속해온 저장소 루트 .env의 DATABASE_URL이 실제로는 운영 Render 백엔드와 동일한 Supabase 프로젝트임을 발견. production API(https://tft-hideout-backend.onrender.com/api/v1/catalog/items/builds?champion_id=10)와 로컬 DB 쿼리 결과를 직접 대조해 play_rate: 0.103093987157034까지 완전히 일치함을 확인 — 별도 "개발 DB"는 애초에 없었다(docs/reference/policies.md 12번에 "SET-04 Supabase 프로젝트는 개발·운영 겸용 실 DB"라고 이미 명시돼 있었는데, 여러 세션에 걸쳐 로컬 접속을 "개발 Supabase DB"로 잘못 지칭해온 것). 실질적 영향: (1) 이번 세션 CHAT-13 백필 2회(items/champion_id, 각 630행)는 이미 운영에 반영 완료 — 별도 운영 백필 불필요. (2) 이번 세션 중 로컬 검증 목적으로 보낸 실제 Groq 호출 다수가 운영 chat_logs/chat_answer_cache에 그대로 적재됐고, 운영 Groq 일일 토큰 쿼터(TPD 100,000)를 거의 소진(약 98,000+ 사용, 이후 요청은 폴백 메시지로 응답)해 실제 사용자 챗봇 이용에 일시적 영향이 있을 수 있음 — PM에게 투명 공개, 쿼터는 시간 경과로 자연 회복. (3) docs/verification/CHAT-12-·CHAT-13-작업결과.md의 "개발 Supabase DB"/"개발 DB" 표현에 정정 각주 추가. 다음 세션을 위한 메모: 앞으로 로컬 .env로 접속하는 모든 DB 작업(쓰기·백필 포함)은 운영 DB에 직접 반영된다고 가정하고 진행할 것 — "개발 DB에서 먼저 검증 후 운영 백필"이라는 2단계 절차 자체가 존재하지 않는다. |
| 2026-08-08 | DATA-19 구현·실데이터 반영 완료(PM 확인 요청 중) — WBS 순서상 다음 대기 TASK로 착수(선행 DATA-08 완료 확인). items 테이블에 description 컬럼 추가(마이그레이션 202608080808_data19, autogenerate가 잘못 잡아낸 meta_document_embeddings 인덱스 2개 DROP은 오탐으로 판단해 제외 — 하이브리드 검색에 필수라 실수로 지우지 않도록 확인), batch/normalize.py에 clean_item_description() 신규(재사용 키워드 {{TFT_Keyword_*}} 4종을 수동 글로서리로 해석 후 DATA-16 clean_augment_description() 재사용 — 문구는 PM 검수 필요한 초안, DATA-07과 동일 성격). batch pytest 신규 6건 포함 112/112, backend pytest(스키마 스냅샷 갱신) 247/247 통과(무회귀). policies.md 12번대로 로컬 DB=운영 DB임을 활용해 마이그레이션을 그 자리에서 바로 적용하고, 실제 op.gg·Community Dragon 데이터로 전체 838개 아이템 설명을 채움(837개 성공, 1개는 원본 자체가 빈 desc) — '보석 건틀릿' 설명이 PM 예시와 동일한 완전한 문장으로 저장됨을 재조회로 확인. API 노출·챗봇 RAG 연동은 CHAT-14 범위로 남겨둠. 상세: docs/verification/DATA-19-작업결과.md. |
| 2026-08-08 | DATA-19 PM 승인, 커밋(78cae55) — 키워드 글로서리 초안 문구 포함 별도 수정 요청 없이 승인. 진행현황 완료 갱신 후 CHAT-14 착수. |
| 2026-08-08 | CHAT-14 구현·실데이터 반영 완료(PM 확인 요청 중) — DATA-19 완료 직후 이어서 착수. champion doc_type(2026-08-07)과 동일 패턴으로 신규 item doc_type을 임베딩(batch/embeddings.py), hybrid_search.py의 item_recommendation·general_strategy 검색에 반영(아이템 키워드 없이 "효과가 뭐야"로 묻는 질문은 general_strategy로도 분류될 수 있어 양쪽 다 추가). chat_links.py에서 item doc_type을 명시적으로 링크 제외 처리해 CHAT-13에서 확정한 "아이템 이름은 링크 안 함" 결정이 새 문서 타입으로 조용히 되돌아가지 않게 방어. chat_preprocessing.py SLANG_DICTIONARY에 아이템 줄임말 10종 추가(보건/무대/구인수/최속/거학/거결/정손/쇼진/라바돈/얼심, DATA-19 키워드 글로서리와 같은 성격의 PM 검토 필요한 초안) — 구현 중 "라바돈"처럼 줄임말이 정식 명칭 앞부분과 겹쳐 이미 정식 명칭이 입력된 경우 이중 확장(예: "라바돈의 죽음모자의 죽음모자")되는 버그를 발견해 normalize_query()에 방어 가드 추가 후 반영. batch pytest 신규 3건 포함 114/114, backend pytest 신규 8건 포함 254/254 통과(무회귀). policies.md 12번대로 로컬=운영 DB 활용해 DATA-19가 채운 838개 설명 중 837개를 실제로 HuggingFace BGE-M3로 임베딩해 운영 meta_document_embeddings에 반영, Groq 쿼터 소진 상태라 Groq 없이 실제 임베딩+hybrid_search()만으로 "보석 건틀릿 효과가 뭐야?" 검색 결과에 관련 아이템 설명 문서가 실제로 상위에 나오는 것까지 확인. 한계: 실제 챗봇 최종 답변(LLM 생성)까지는 Groq 쿼터 소진으로 이번 세션에 확인 못함 — 쿼터 회복 후 스모크 체크 권장. 상세: docs/verification/CHAT-14-작업결과.md. |
| 2026-08-09 | CHAT-14 PM 실사용 검증 중 버그 2건 발견, DATA-20 신규 등록·즉시 착수 — PM이 로컬 서버로 "보석 건틀릿을 장착하면 어떤 챔피언의 치명타 확률과 치명타 피해량이 가장 많이 증가할까?" 질문 후 (1) 데이터 부족으로 답이 안 되는 게 맞는지, (2) 답 못 하는 정보를 더 정확히 알려달라는 무의미한 후속질문 칩이 뜨는 문제를 검토 요청. 확인 결과 (1)은 items.stats에 실제 수치(보석 건틀릿 CritChance=35)가 있지만 item_chunk_text(CHAT-14)가 description 텍스트만 임베딩하고 숫자는 포함하지 않아 정책상(문서에 없는 내용 추측 금지) 정상적인 "확인 안 됨" 응답이었음 — items.stats가 op.gg/Community Dragon 원본 툴팁 변수 그대로라 distinct 키 500개 이상(일부 {해시} 미해석)이라 전체 그대로 노출은 부담, PM이 지금 세션에서 핵심 스탯 화이트리스트 방식으로 바로 착수하기로 결정 — DATA-20(권장, 선행TASK DATA-19, "아이템 핵심 수치 스탯 RAG 노출")로 TFT_Hideout_WBS.xlsx·본 문서에 신규 등록(상태: 진행중, 즉시 구현). (2)는 후속질문 억제 로직(2026-08-07 도입)이 retrieved_docs가 비어있을 때만 작동해, 문서는 검색됐지만 그 안에 세부 수치가 없어 "확인 안 됨"으로 답한 이번 케이스는 걸러지지 않는 CHAT-11/CHAT-14 버그로 확인 — PM이 프롬프트 지시 강화(chat_followups.py) + 결정론적 백스톱(chat_stream.py) 병행 방식으로 CHAT-14 범위 내에서 함께 수정하기로 결정. |
| 2026-08-09 | DATA-20 구현·실데이터 반영 완료(PM 확인 요청 중), CHAT-14 후속질문 버그 수정도 완료(PM 확인 요청 중) — 등록 직후 바로 착수. batch/normalize.py에 format_item_stats() 신규(핵심 스탯 화이트리스트, DATA-07/DATA-19와 동일 성격의 수동 유지 목록), item_chunk_text()가 이를 덧붙임. 구현 중 실측으로 발견한 사실: 화이트리스트 후보 중 AttackSpeed·Omnivamp는 같은 키인데도 아이템마다 저장 단위가 다름(예: AttackSpeed가 0.3(=30%)인 아이템도, 60(그 자체로 60%)인 아이템도 있음)을 전수 조회로 확인해 두 키는 화이트리스트에서 제외(잘못된 수치 노출 방지). AD는 항상 0~1 소수(퍼센트 환산 필요, op.gg float32 유래 부동소수점 오차 반올림 처리 추가)로 일관, 나머지(AP/Armor/MagicResist/Health/ManaRegen/CritChance/LifeSteal)는 단위 일관 확인 후 채택. batch pytest 신규 7건 포함 121/121 통과, backend 회귀 확인 257/257 통과, ruff 클린. policies.md 12번대로 로컬=운영 DB 활용해 CHAT-14가 만든 기존 item 문서 837행을 1회성 스크립트(레포 미커밋)로 재임베딩(232개에 스탯 실제로 붙음 확인). CHAT-14 후속질문 버그: retrieved_docs가 있어도(문서는 검색됐지만) 답변이 "확인 안 됨"류면 후속질문을 건너뛰도록 chat_stream.py에 _looks_like_no_info_answer()(어간 매칭 백스톱) 추가 + chat_followups.py 프롬프트에 동일 취지 규칙 추가(PM 결정: 프롬프트+백스톱 병행), 캐시 여부는 그대로 둠(근거 문서 자체는 있으므로). backend pytest 신규 1건. 실제 서버로 두 수정 함께 검증: "보석 건틀릿을 장착하면 어떤 챔피언의 치명타 확률이 가장 많이 증가해?" 재질문 → "'찬란한 보석 건틀릿'을 장착하면 치명타 확률이 +75% 증가하여 가장 많이 증가합니다."로 실제 수치 답변 확인(DATA-20 효과), 이 경우는 정보가 있으므로 정상적으로 의미 있는 후속질문이 함께 나옴 확인. 반대로 근거 문서는 있지만 답할 수 없는 질문("이번 패치 조합들의 지난주 대비 승률 변화 추이를 정확한 수치로 알려줘")은 "...확인되지 않았습니다."로 끝나고 event: followups 자체가 전송되지 않음을 SSE 원본으로 확인(CHAT-14 버그 수정 확인). 한계: "어떤 챔피언이 가장 많이 증가하나" 질문은 원래 아이템 스탯이 챔피언마다 다르지 않아(누구나 동일 고정값) 챔피언 간 차이가 없다는 게 정답인데, 모델이 정확한 수치는 답하면서도 "가장 많이 증가합니다"처럼 챔피언 비교 프레이밍은 그대로 유지하는 걸 확인(수치 정확도는 개선됐으나 이 프레이밍 자체를 고칠지는 PM 판단 필요, DATA-20 작업결과 "한계" 절 참고). 상세: docs/verification/DATA-20-작업결과.md, docs/verification/CHAT-14-작업결과.md(2026-08-09 절). |
| 2026-08-09 | CHAT-14 3차 수정(PM 확인 요청 중) — PM이 후속질문 칩을 클릭해 "블리츠크랭크와 바드가 높은 승률을 보인 이유는?"을 물었더니 그 답도 "확인되지 않았다"였다고 제보(2차 수정과 다른 버그: 이번엔 그 질문을 제안한 직전 답변 자체는 정상 정보 답변이었는데, 후속질문 생성기가 애초에 답할 수 없는 "왜/이유" 유형 질문을 제안한 게 원인). 챗봇 문서 corpus 중 "왜 강한지" 서술이 있는 건 comp/playstyle doc_type(조합 플레이 스타일 설명)뿐이고 champion/item_build/item/augment는 수치·목록뿐이라 그 문서 기반 답변 뒤에 원인 분석형 후속질문을 만들면 항상 "확인 안 됨"으로 귀결됨을 확인 — 전면 금지 대신 직전 답변이 근거로 삼은 doc_type에 따라 조건부로 금지하도록 수정. chat_stream.py의 generate_answer_stream이 result["retrieved_doc_types"](정상 흐름·캐시 히트 둘 다)를 함께 채우고, chat_followups.py의 generate_followup_questions()가 이를 받아 comp/playstyle이 없을 때만 "원인·이유 분석형 후속 질문 금지" 규칙을 프롬프트에 덧붙이도록 확장(routers/chat.py 배선). backend pytest 신규 5건 포함 261/261 통과, ruff 클린. 로컬 서버로 실제 재현 — item_build 기반 답변 뒤 후속질문은 사실형 질문("승률 정보는 어떻게 되나요?")으로만 나오고, comp 기반 답변 뒤 후속질문은 기존대로 자연스럽게 생성됨(회귀 없음) 확인. 한계: 여전히 프롬프트 지시 기반이라(문서 종류라는 신뢰할 수 있는 신호는 있지만) LLM이 100% 순응한다는 결정론적 보장은 없음, 상세는 docs/verification/CHAT-14-작업결과.md 2026-08-09 3차 수정 절. |
| 2026-08-09 | CHAT-14 4차 수정(PM 확인 요청 중, 심각도 높음) — PM이 "17.8 패치에서 어떤 챔피언이나 아이템이 변경되었는지 알려줄 수 있나요?"에 "'재조합기'의 사용 가능 횟수가 8회에서 7회로 변경되었습니다."라는 완전히 지어낸 답변을 제보. 이전 3건과 달리 이번엔 문서에 없는 내용을 사실처럼 답한 정책 위반 자체라 우선순위를 가장 높게 봄. 원인(DB 실측): op.gg 원본이 재조합기·자석 제거기·그웬의 가위 같은 소모품을 "남은 사용 횟수"별 별도 아이템 행 9~10개씩 제공(name_kr에 <rules>(N회 사용 가능!)</rules> 미해석 태그 포함, 전체 838개 중 22개)하는데, 이 22개가 CHAT-14의 "item" doc_type에 그대로 임베딩돼 있어 "패치에서 뭐가 바뀌었나" 질문에 여러 변형이 함께 검색되면서 LLM이 같은 패치 안에 공존하는 변형들을 시간 순서(패치 전/후)로 착각해 지어낸 것으로 확인(이 서비스는 애초에 패치 간 변경이력 데이터 자체가 없음). batch/embeddings.py에 is_charge_variant_item() 신규(is_real_champion()과 동일 패턴)로 collect_chunks()의 item 루프에서 제외. batch pytest 신규 3건 포함 124/124 통과, ruff 클린. policies.md 12번대로 로컬=운영 DB의 기존 임베딩 22행을 1회성 스크립트(레포 미커밋)로 직접 삭제(837→815). 로컬 서버로 재현 — 동일 질문에 "정보가 제공되지 않았습니다"로 정상 응답, 후속질문도 안 뜸(2차 수정과 자연스럽게 연계) 확인. 한계: (1) 이번엔 <rules> 태그라는 뚜렷한 신호로 걸렀지만 op.gg 원본에 유사한 다른 "같은 아이템 여러 변형 공존" 패턴이 더 있을 가능성 배제 못함, (2) 패치 간 변경이력 자체를 추적하지 않는 건 근본적 스코프 한계라 "정보 없음"으로만 계속 답함(실제 변경이력 기능은 별도 TASK 논의 필요, 이번엔 착수 안 함), (3) items 테이블의 name_kr에는 <rules> 태그 22개가 그대로 남아있어(RAG만 제외, 카탈로그 등 다른 노출 경로는 미확인) 필요시 후속 정제 고려. 상세: docs/verification/CHAT-14-작업결과.md 4차 수정 절. |
| 2026-08-09 | CHAT-14 5차 수정(PM 확인 요청 중) — PM이 "죽무 효과는?"에 전혀 다른 아이템 '절멸자'의 효과가 답변된 것을 제보. "죽무"(죽음의 무도)가 CHAT-14 SLANG_DICTIONARY(초안 10종)에 없던 줄임말이라 정규화 안 된 채 그대로 임베딩·검색됐고, 압축된 2음절 단어라 의미 검색이 실제 아이템(DB 확인: '죽음의 저항')이 아닌 '절멸자' 문서를 잘못 최상위로 골라온 것으로 확인(LLM은 검색된 문서를 근거로 정직하게 답해 근거검증은 정상 통과 — "엉뚱한 문서가 검색됐다"는 게 문제). chat_preprocessing.py SLANG_DICTIONARY에 "죽무": "죽음의 저항" 추가, 테스트 1건. backend 262/262 통과, ruff 클린. 로컬 서버 재현 — 정확한 아이템·효과로 정상 응답 확인. 한계: 이 부류 버그는 화이트리스트 특성상 사전에 없는 새 줄임말·오타가 나올 때마다 재발할 수 있는 구조적 문제(두더지잡기 방식) — 재발 빈도가 높으면 검색 신뢰도 임계값 도입 등 더 구조적인 대응을 별도 TASK로 검토할 필요, 이번엔 착수 안 함(PM 판단 필요). 상세: docs/verification/CHAT-14-작업결과.md 5차 수정 절. |
| 2026-08-09 | CHAT-15 신규 등록·착수 — CHAT-14 5차 수정("죽무" 오검색) 확인 후 PM이 더 근본적인 대응이 가능한지 문의. hybrid_search()가 pgvector 코사인 거리를 순위 정렬에만 쓰고 값 자체는 버리는 구조라, 사전에 없는 줄임말·오타처럼 애매한 질의도 top-k 안에 들면 무조건 근거로 채택돼 확신에 찬 오답을 만들 수 있음을 실측으로 확인·설명. 착수 전 doc_type별 실측 보정: item(정상 매칭 0.38~0.46, "죽무"→'절멸자' 오매칭 0.59, 정답 문서 0.65/52위)·augment(정상 매칭 0.38~0.42, 애매한 질의 0.51~0.53)는 임계값으로 확실히 분리됨을 확인했으나, champion(정상적인 특정 챔피언 이름 질의도 거리 0.507로 item의 "나쁜 매칭" 수준과 겹침)·comp(특정 조합명이 아닌 일반 "메타 추천" 질의가 정상인데도 거리 0.48~0.49)는 임계값 적용 시 정상 케이스가 깨질 위험을 실측으로 확인해 이번 범위에서 제외하기로 결정. CHAT-15(권장, 선행TASK CHAT-02·CHAT-14)로 TFT_Hideout_WBS.xlsx·본 문서에 등록(상태: 진행중, 즉시 구현). |
| 2026-08-09 | CHAT-15 구현 완료(PM 확인 요청 중) — 1차 방어로 hybrid_search.py에 doc_type별 거리 임계값(item·augment만 0.5, champion·comp는 실측상 정상 케이스도 거리가 멀어 제외) 추가. 배포 후 재검증 중 "광폭검 효과는?"(존재하지 않는 아이템)이 '포악한 절단검'과 거리 0.49로 임계값을 통과해 여전히 오답이 재현되는 것을 발견 — 정상/비정상 매칭 거리가 겹치는 회색지대(0.45~0.55)가 실제로 있음을 PM에게 설명, "다른 신호를 추가로 결합" 결정에 따라 2차 방어로 이름 문자 겹침 비율(filter_by_name_overlap, 후보 문서 이름 글자의 50% 이상이 질의 문자열에 있어야 통과)을 chat_stream.py의 generate_answer_stream에 배선(hybrid_search의 공개 시그니처는 안 건드려 기존 mock 테스트 무영향). backend pytest 신규 14건 포함 274/274 통과, ruff 클린. 로컬 서버로 "광폭검"·"강철몽둥이"(신규 지어낸 이름) 모두 정상적으로 "정보 없음" 응답, "죽무"·"무한의 대검"·"보석 건틀릿" 등 정상 질의는 회귀 없이 정확한 응답 확인(1차 검증 때 "광폭검"이 여전히 오답으로 보인 원인은 코드가 아니라 CHAT-08 캐시 오염이었음 — 캐시 삭제 후 재확인해 정상 동작 확인, 디버깅 메모로 남김). 한계: 결정론적 2단 방어라 실측된 두 사례(죽무/광폭검)는 해결했지만 완전한 일반해는 아님(진짜 아이템명과 우연히 글자가 절반 이상 겹치는 지어낸 이름은 이론상 여전히 뚫릴 수 있음), champion/comp/item_build doc_type은 실측상 임계값 적용이 위험해 여전히 무방비(발생 빈도는 낮을 것으로 추정하나 확인된 사례는 없음). 상세: docs/verification/CHAT-15-작업결과.md. |