[GMSS-128] feat: 대화 종료와 감정 카드 생성 - #15
Merged
Merged
Conversation
11 tasks
요약 저장소가 들고 있던 failSafe 를 domain/common 으로 옮긴다. "온디바이스 모델 실패는 삼키되 취소는 삼키지 않는다" 는 하나의 정책이라, 복사본에서 ensureActive 를 빠뜨리면 취소가 성공처럼 보여 조용히 틀린다.
soyeonLee126
force-pushed
the
feature/chat-card
branch
from
August 6, 2026 09:27
a19d4f4 to
8daa9df
Compare
대화를 끝내고 그 대화의 감정 카드를 만든다. 종료와 카드 생성은 묶지 않는다. 종료는 되돌릴 수 없어서, 종료는 됐고 카드만 실패한 상태를 화면이 들고 있어야 한다. 감정 누적기와 종료·카드 생성을 ConversationSession 에 넣는다. 누적기도 압축본과 같이 서버에 확정된 USER 발화만 미러링해야 해서, 순서 규칙을 한 곳에 두면 화면은 세션 하나만 의존한 채로 남는다. 누적기는 압축본과 같은 append/compact 로 나눠, 전송 응답이 온디바이스 추론을 기다리지 않고 화면에 붙는다. 종료 흐름 상태는 sealed interface EndFlow 한 축으로 둔다. 불리언으로 나누면 "종료 전인데 카드가 있음" 같은 조합이 타입상 표현되고 화면이 매번 유효 조합을 다시 계산해야 한다. 재시도해도 결과가 같은 실패는 CardNotRetryableException 으로 묶어 재시도 경로를 닫는다. 영구히 같은 오류를 반복시키지 않기 위해서다. 분류가 실패한 발화는 두 번까지 다시 시도하고 그 뒤엔 건너뛴다. 무한히 붙들면 뒤 발화가 영영 누적되지 않는다. 분류 실패는 대화를 막지 않도록 격리한다. 종료 응답은 ApiResponse<Unit> 으로 받는다. 본문을 읽지 않으므로 서버 스키마가 바뀌어도 종료가 실패로 뒤집히지 않는다.
soyeonLee126
force-pushed
the
feature/chat-card
branch
from
August 6, 2026 09:42
8daa9df to
630c008
Compare
soyeonLee126
marked this pull request as ready for review
August 6, 2026 09:55
11 tasks
seunghee17
approved these changes
Aug 9, 2026
seunghee17
left a comment
Collaborator
There was a problem hiding this comment.
문제가 없어보여 merge 합니다! 고생하셨습니다!
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
작업 개요
대화를 끝내고 감정 카드를 만드는 경로입니다. 카드는 이 앱의 최종 산출물이고, 서버가 클라이언트가 보낸
emotion(캐릭터)과summary(요약)를 받아 본문(자연스러운 요약)을 만듭니다.감정은 메시지를 보낼 때마다 증분으로 누적해두고 종료 시점에는 argmax만 합니다.
감정 집계가 발화별 점수의 합이라 증분화해도 배치 분류와 결과가 완전히 같습니다(발화 수로 나누는 건 표시용 확신도라 argmax는 안 바뀝니다).
종료 시점에 발화 N개를 한꺼번에 분류하지 않아 카드 생성 대기가 짧아집니다.
종료와 카드 생성은 한 유즈케이스로 묶지 않았습니다. 종료는 되돌릴 수 없어서, 종료는 성공했고 카드만 실패한
상태를 화면이 들고 재시도해야 합니다.
base 브랜치
이 PR은
feature/chat-messaging(#14) 위에 쌓여 있습니다. #14가 머지되면 base가 develop으로 전환됩니다.카드 작업만 보이도록 따로 열었습니다.
작업 유형
변경 사항
감정 누적을 ConversationSession 에 편입
ConversationSession이 이미 "서버에 확정된 USER 발화만 파생 상태에 미러링한다"는 순서를 강제하고있어서, 감정 누적기도 같은 자리에 넣었습니다. 화면은 세션 하나만 의존한 채로 남습니다.
ConversationEmotionAccumulator: 압축본과 같은append(싼 적재) /classifyPending(모델 실행)으로 나눴습니다. 전송 응답이 온디바이스 추론을 기다리지 않고 화면에 붙습니다.
건너뜁니다.
종료 흐름 상태를 EndFlow 로 통합
isEnded/isFinishing/showEndConfirm/card/endedButCardFailed조합 32가지 중 6가지만 합법이라, 화면과 ViewModel 이 유효 조합을 매번 다시 계산해야 했습니다.when이라 단계를 추가하면 컴파일 에러로 알려줍니다.CardNotRetryableException(AlreadyExists/NoSummary/NoEmotion)으로 묶어CardFailedFinal로 보냅니다.종료·카드 API
POST /api/conversations/{id}/end,POST /api/cards연동emotion은 모델 6감정이 아니라 캐릭터 6종입니다(JOY/ANGER/ANXIETY/GRUMPY/WARM/QUIRKY).도메인
PRICKLY가 서버GRUMPY에 대응하고, 서버 문자열 매핑은EmotionTypeMapping한 곳에 모았습니다ApiResponse<Unit>으로 받습니다.ApiErrorCodes: 서버error.code로 판별합니다.CONVERSATION_ALREADY_ENDED는 멱등 성공으로접고(응답이 유실된 뒤 재시도해도 복구됩니다),
CARD_ALREADY_EXISTS는 도메인 예외로 구분합니다.온디바이스 실패 격리를 공용 헬퍼로
요약 저장소가 들고 있던
failSafe를domain/common으로 옮겼습니다.관련 이슈
관련 작업 (Notion)
스크린샷 / 동작 화면
체크리스트
feat:,fix:등)을 따른다테스트
:app:assembleDebug, 단위 테스트 90개, detekt 전부 통과입니다.ChatRoomEndFlowTest) 9개를 새로 넣었습니다.분류가_도는_동안에도_새_발화를_받는다가 타임아웃으로 깨집니다.