Skip to content

feat: 질문 풀·피드백 생성 진행 이벤트 (AI 직접 발행 + 프론트 표시) - #205

Merged
Jaeho-Site merged 3 commits into
devfrom
feat/generation-progress-events
Aug 22, 2026
Merged

feat: 질문 풀·피드백 생성 진행 이벤트 (AI 직접 발행 + 프론트 표시)#205
Jaeho-Site merged 3 commits into
devfrom
feat/generation-progress-events

Conversation

@Jaeho-Site

Copy link
Copy Markdown
Contributor

변경 사항

작업 내용

  • AI: SessionRealtimeNotifier.emit_progress 신설 — 질문 풀·피드백 생성 단계를 realtime.session.notify 로 직접 발행 (휘발성, Core·DB 미경유, 실패는 경고만)
    • questions_consumer: QUESTION_POOL_PROGRESS — CONTEXT_BUILDING → GENERATING → FINALIZING (생성 실패 시 FINALIZING 미발행)
    • feedback_consumer: FEEDBACK_PROGRESS — 세부 평가 5개가 asyncio.gather 병렬이라 순차 phase 대신 완료 카운터(SCORING completed/total) 방식
  • Frontend: 질문 풀 대기 화면(InterviewPreparing, WS 경로)과 피드백 스켈레톤(FeedbackReportSkeleton, 세션 SSE)에 진행 문구 표시. 이벤트 미수신 시 기본 안내 문구 폴백
  • Docs: messaging.md §5.12-3·event-stream.md §3.3-3 신설, ai/·frontend/ CLAUDE.md 갱신

변경 이유 / 배경

스트리밍이 있는 꼬리질문과 달리 질문 풀 생성(Pro, 최대 30s)과 피드백 생성(≈2분 예산)은 진행 중 무통보 블로킹이라 "멈췄나?"로 읽혔다 (#203/#204 의 연장). 기존 ANALYSIS_PROGRESS(user 채널) 패턴을 세션 채널로 확장해 두 경로에도 진행 신호를 흘린다. RealTime(Go) 디스패처는 이벤트 타입 무관 패스스루고 realtime.session.* 바인딩이 기존재해 realtime/·backend/·infra/ 변경은 없다.

테스트

  • 단위 테스트 추가/수정 — ai +8건(발행 시퀀스·직렬화·예외 삼킴·user 채널 경로 불변 회귀·notifier 미주입 회귀), frontend +7건(이벤트 매핑·진행 state·비정상 페이로드 무시·문구 대체/폴백)
  • 로컬 검증 — uv run pytest 370 통과 / npm run test 166 통과 / npm run build·npm run lint 클린
  • 스크린샷 — 실발행 재현에 실 LLM 게이트웨이+브로커 필요해 생략 (컴포넌트 테스트로 문구 대체·폴백 검증)

영향 범위

  • DB 마이그레이션: 없음
  • API contract 변경: 신규 SSE/WS 이벤트 2종 추가 (QUESTION_POOL_PROGRESS, FEEDBACK_PROGRESS) — 휘발성·additive, 기존 이벤트·콜백 스키마 무변경. 기존 user 채널 ANALYSIS_PROGRESS 경로 불변(회귀 테스트 고정)
  • 환경변수 추가/변경: 없음

리뷰어 체크포인트

  • feedback_consumer_tracked 카운터 — 단일 이벤트 루프에서 증가~emit 인자 평가 사이 await 없음(유실·중복 불가). 발행 순서는 병렬이라 비보장이며 값으로 판별(문서 명시)
  • 알려진 기존 gap: feedback 은 questions 와 달리 예상 못 한 예외 시 FAILED 콜백이 없어 DLQ 행 — 본 PR 범위 밖, 후속 처리 예정

- SessionRealtimeNotifier.emit_progress 추가 — realtime.session.notify 로
  QUESTION_POOL_PROGRESS / FEEDBACK_PROGRESS 직접 발행 (휘발성, Core 미경유)
- questions_consumer: CONTEXT_BUILDING→GENERATING→FINALIZING 순차 3단계
  (생성 실패 시 FINALIZING 은 발행하지 않음 — FAILED 콜백 직전 오해 방지)
- feedback_consumer: 세부 평가 5개가 gather 병렬이라 SCORING 완료 카운터
  (completed/total) 방식, PREPARING/FINALIZING 전후 단계 포함
- runner 에서 followup 과 동일 notifier 인스턴스 재사용 주입
- 기존 AnalysisProgressNotifier(user 채널) 무변경 — 경로 불변 회귀 테스트로 고정
- 단위 테스트 8건 추가 (발행 시퀀스·직렬화·예외 삼킴·미주입 회귀)
- 질문 풀: 라이브 WS QUESTION_POOL_PROGRESS → InterviewPreparing 대기 화면
  문구 대체 (interviewEvent pool-progress 액션 + useLiveInterview state)
- 피드백: 세션 SSE FEEDBACK_PROGRESS → FeedbackReportSkeleton 캡션
  (useFeedbackLive progress state, 카운터 completed/total 포함)
- 이벤트 미수신 시 기존 기본 안내 문구 폴백 — 유실이 UX 를 깨지 않음
- 워크스페이스 useAnalysisProgress TTL 스토어(user 채널 전용)는 미사용
- 테스트 7건 추가 (이벤트 매핑·진행 state·비정상 페이로드 무시·문구 대체/폴백)
- messaging.md §5.12-3 신설 — realtime.session.notify 발행 스펙(phase·카운터)
- event-stream.md §2 이벤트 목록 + §3.3-3 신설 (payload 예시·소비처·폴백)
- ai/·frontend/ CLAUDE.md 현재 상태 갱신
@Jaeho-Site
Jaeho-Site force-pushed the feat/generation-progress-events branch from d000301 to 5c8e09c Compare August 22, 2026 13:33
@Jaeho-Site
Jaeho-Site merged commit 5542169 into dev Aug 22, 2026
4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant