2026-03-03 작업 로그
business-avengers: Phase 0 Q&A 재설계 + PM knowledge doc, lingua-rag: LLM-as-Judge eval 시스템 구축 + PDF hover UX + chat cancel
오늘 작업한 주제
business-avengers
Per-phase fine-tuning kick-off — Phase 0 ideation Q&A redesign + JTBD/Why Now additions, Phase 2 PM knowledge doc creation
한 일
- Phase 0 Q&A를 5개 거래형 질문 → 7개 탐색형 질문으로 재설계
- 스토리 기반 문제 발견 (“마지막으로 이 문제를 겪었을 때 어땠나요?”)
- Why Now 질문 신설 (“왜 지금이 이걸 만들기 좋은 타이밍인가?”)
- Switching Trigger 질문 신설 (“기존 솔루션 사용자를 이탈하게 만드는 건 무엇인가?”)
- CPO가 “discovery mode” 프레이밍으로 대화 시작
agents/product-manager.md에 Phase 0 전문 프레임워크 추가- Mom Test 적용 규칙 (과거시제 행동 묘사, 위양성 필터)
- JTBD 작성 기준 — 3가지 직업 유형 (Functional / Emotional / Social)
- Why Now 평가 (Technology / Behavioral / Regulatory / Cost shift 분류)
- Competitive Moat Test (구조적 차별화 vs. 모방 가능 차별화)
- Own Problem Validation 가이드
templates/idea-canvas.md에 JTBD 섹션 + Why Now 섹션 추가- JTBD: Core statement 형식 + 3가지 직업 유형 필드 + Switching Trigger 필드
- Why Now: Timing Trigger + Enablement + Opportunity Window 필드
quality/phase-rubrics.mdPhase 0 체크리스트 + 루브릭 확장- 체크리스트: JTBD 형식 검사 + Why Now 존재 검사 추가
- 루브릭: 4개 → 6개 기준으로 확장 (JTBD 품질 + Why Now 추가)
SKILL.mdStep 4 PM 태스크 지시 강화- JTBD 3-type 필수 작성 (Functional/Emotional/Social + Switching Trigger)
- Why Now 명시적 요구 (없으면 타이밍 리스크로 플래그)
- 차별화 6개월 해자 테스트
- “모든 플레이스홀더 필수 작성” 규칙 추가
knowledge/extended/prd-methods-advanced.md신규 생성- Inspired (Marty Cagan): 4가지 제품 리스크, Opportunity Assessment 10개 질문
- Shape Up (Ryan Singer): Appetite 사이징, Pitch 형식, Shaping, Hill Charts
- User Story Mapping (Jeff Patton): Backbone, Walking Skeleton, Release 슬라이스
- Continuous Discovery (Teresa Torres): Opportunity Solution Tree, Assumption Testing
- PRD 품질 기준: 아웃컴 메트릭, “Will NOT Build” 형식, RICE Confidence Gate
- JTBD 기반 페르소나 형식 (행동 > 인구통계)
SKILL.mdStep 6 PM 태스크 강화 — knowledge doc 추가 + 6 → 18 단계로 확장
주요 결정
- Phase 0 Q&A 재설계: 거래형 5문항 → 탐색적 대화형 7문항 (Mom Test 원칙 적용)
- 에이전트 아키텍처: agent def = 역할 + 프레임워크 목록 (얇게) / knowledge doc = 심층 내용 + 예시 (Option B 채택)
prd-methods-advanced.md: Shape Up + Inspired + Story Mapping을 파일 분리 없이 단일 참조 문서로 통합
다음
- Phase 0 업데이트 테스트 — 새 Q&A + JTBD/Why Now 섹션이 idea-canvas 출력에 제대로 채워지는지 검증
- Phase 1 (Market Research) 파인튜닝 — business-analyst, marketing-strategist, revenue-strategist 에이전트
- Phase 5 (Dev Guide) SKILL.md Step 9 강화 — frontend-dev + backend-dev + devops-engineer
- Phase 6 (QA) SKILL.md Step 10 강화 — qa-lead 태스크, Test Pyramid + Core Web Vitals 기준
- Phase 9 (Operations) SKILL.md Step 13 강화 — cs-manager + data-analyst 태스크
- 나머지 에이전트 Quality Standards 추가 — ui-designer, ux-researcher, coo, cto, cmo, cpo 등
lingua-rag
PDF hover/selection popup UX 개선 + 채팅 전송 취소 + LLM-as-Judge 평가 시스템 구축 (v0.3 Phase 1) + getText() fallback 개선
한 일
PDF UX & 채팅 취소 (세션 1)
- feat(pdf): hover popup 버튼 “채팅창에 붙여넣기” → “질문하기” 이름 변경, [Ask, Read] → [Sound, Ask] 순서 변경
- fix(pdf): 버튼 클릭 active 효과 표시 —
onMouseDown: e.preventDefault()/onClick: action+close분리 - fix(pdf): Sound 버튼 클릭 시 팝업 유지,
onMouseLeave에서만 닫힘 - fix(pdf): hover popup 외부 클릭 시 닫힘 + selection popup 닫힌 직후 재출현 방지 (2-layer guard)
- feat(pdf): selection popup
onMouseLeave— 자동 닫힘 + 선택 영역 해제 - fix(pdf): hover detection 강화 —
extractSentenceText결과에 Latin 문자 체크 추가 - feat(chat):
useChat—cancelMessage구현 (queue clear +AbortController.abort()) - feat(chat): 스트리밍 중 전송 버튼 → 빨간 정지(■) 버튼으로 교체, 취소 시 “응답이 취소되었습니다.” 표시
LLM-as-Judge & 프롬프트 개선 (세션 2)
- fix(frontend):
MessageList.tsx— tight list<li>아이템에LineWithActions적용 (이전:<p>만 처리) - feat(eval):
scripts/test_questions.json— 10개 고정 테스트 질문 (단원별 포맷 유혹 케이스) - feat(eval):
scripts/evaluate.py— LLM-as-judge runner 구현- 6가지 규칙: german_bold_complete, no_markdown_table, translation_inline, dialogue_structure, example_length_ok, tip_included
- Judge 모델: claude-sonnet-4-6 (Haiku → Sonnet 업그레이드)
_parse_judge_json(): markdown fence 제거 + JSON boundary fallback + retry
- fix(prompts):
ANSWER_FORMATbold 규칙 강화 — 괄호 안, 헤딩, 국가명, 형태소 예시 추가 - chore(eval): Baseline 실행 → 프롬프트 개선 후 83.3% → 90.0% 달성
- refactor(frontend):
getText()fallback 개선 — Korean strip → Latin 단어 시퀀스 추출 (/[a-zA-ZÀ-ÖØ-öø-ÿ]+/g) - docs:
docs/portfolio-story.md신규 생성 — AI Product Engineer 역량 매핑 + 면접 예상 질문
주요 결정
- LLM-as-Judge 채택: 골든 데이터셋 없이 실사용자 0명 상태에서도 품질 측정 가능. 형식 규칙은 Judge가 컨텍스트 이해 필요
- Judge Sonnet 업그레이드: Haiku가 어휘 목록 bold 여부 등에서 false positive 발생 → Sonnet 교체로 정확도 향상
<strong>= 의미적 독일어 마커: Bold는 단순 스타일이 아니라 TTS 추출 메커니즘. LLM 준수율 개선이 근본 해결책getText()Latin extraction: 이 앱 컨텍스트에서 Latin 문자 = 독일어 (고신뢰).<strong>1순위 + Latin 추출 fallback 구조 유지
Sound Settings & Notes/Memo Feature (Session 3)
- refactor(tts): simplified
useTTS— removed pitch, voice selection; single Google Deutsch voice, auto-selected byPREFERRED_VOICE_NAMESpriority - feat(sound-modal): moved sound settings from user menu popover to centered modal with draft state pattern (X discards, Save commits to localStorage)
- feat(resize): chat panel drag handle double-click resets width to 560px
- feat(notes): full backend —
notestable,NoteRepositorywith CRUD,notes.pyrouter (GET/POST/DELETE /api/notes) - feat(notes): full frontend —
lib/notes.tsAPI helpers, Next.js proxy routes, “Memo” button in InputBar, memo write modal, Summary/Memo tabs in notes overlay - feat(notes): ChatPanel overhaul — “Saved Summaries” renamed to “Notes” with combined badge (summaries + memos)
다음
- User Feedback UI — 응답 하단 👍/👎 버튼 +
message_feedbackDB 테이블 (v0.3 Phase 2) - 실사용자 확보 — 채널 선정 (Reddit r/German, Discord, Naver 카페), 목표 10~20명
- Hover popup edge positioning — viewport top 오버플로우 시 아래 표시 fallback
- Run notes table migration in Supabase SQL editor (production)
- Verify
Connection: closefix in production