작업 내용
종료(ENDED)됐지만 카드가 없는 대화방은 미완성 목록에도, 카드 캘린더에도 나오지 않아 사용자 눈에 사라진다.
| 조회 |
결과 |
이유 |
GET /api/conversations/incomplete |
❌ |
status = ACTIVE 만 조회 |
GET /api/cards?date= · /api/cards/monthly |
❌ |
cards 행 자체가 없다 |
GET /api/conversations?date= · /search |
✅ |
DELETED 만 제외 |
날짜별 조회·검색에는 남아 있지만, 앱이 카드 캘린더로만 과거 기록에 접근하는 구조라면 도달 경로가 없다. 목록에서 사라지면 conversationId 를 다시 얻을 수 없어 카드 생성을 재시도할 수도 없다.
작업이 필요한 이유
종료(상태 전이)와 카드 생성(LLM 호출)이 원자적이지 않은 별개 API 두 개인데, 그 사이 중간 상태를 보여주는 목록이 하나도 없다.
ConversationService.getInProgressConversations 가 "미완성 = ACTIVE" 로 정의한 근거는 "카드 생성은 ENDED 를 요구하므로 ACTIVE 방은 카드를 가질 수 없다" 이고, 이 명제 자체는 참이다. 하지만 역이 성립하지 않는다 — ENDED 인데 카드가 없는 방이 실제로 여러 경로로 생긴다.
| 경로 |
남는 상태 |
회복 |
카드 생성 LLM 실패 (CARD_GENERATION_FAILED) |
cardGenerationStatus = FAILED |
다음 새벽 배치 (하루 1회 제한) |
| 종료만 하고 카드 생성 요청이 안 옴 (앱 이탈·네트워크) |
NONE |
다음 새벽 배치 |
선점 경합 (CARD_GENERATION_IN_PROGRESS) |
PENDING 고아 |
pendingGenerationTimeout(3분) + 스캔 주기 |
새벽 배치 NO_SUMMARY |
SKIPPED |
영구 — findAutoCardTargetIds 에서 제외되어 카드가 영원히 안 생긴다 |
새벽 배치 WITHDRAWN_MEMBER |
NONE |
해당 없음(탈퇴자) |
| 일일 토큰 한도 |
NONE |
#188 에서 해소 |
CardProperties.autoCardStartDate KDoc 이 이미 이 상태를 인정하고 있다 — 요약 없는 방을 배치가 "카드는 못 만들고 종료만 시켜버린다. 사용자는 이어쓰기만 잃고 얻는 게 없다". autoCardStartDate 는 과거 방에 한해 막아둔 방벽이지, 앞으로 안 생긴다는 보장이 아니다.
할 일
기술 고려사항
/incomplete 가 지금 cards 를 조인하지 않는 것은 의도적이다(위 KDoc). 조인을 추가하면 그 판단을 뒤집는 것이므로 주석도 같이 고쳐야 한다
ConversationSearchRepository · 날짜별 조회는 이미 이 방들을 보여주므로 수정 대상이 아니다
연관
작업 내용
종료(
ENDED)됐지만 카드가 없는 대화방은 미완성 목록에도, 카드 캘린더에도 나오지 않아 사용자 눈에 사라진다.GET /api/conversations/incompletestatus = ACTIVE만 조회GET /api/cards?date=·/api/cards/monthlycards행 자체가 없다GET /api/conversations?date=·/searchDELETED만 제외날짜별 조회·검색에는 남아 있지만, 앱이 카드 캘린더로만 과거 기록에 접근하는 구조라면 도달 경로가 없다. 목록에서 사라지면
conversationId를 다시 얻을 수 없어 카드 생성을 재시도할 수도 없다.작업이 필요한 이유
종료(상태 전이)와 카드 생성(LLM 호출)이 원자적이지 않은 별개 API 두 개인데, 그 사이 중간 상태를 보여주는 목록이 하나도 없다.
ConversationService.getInProgressConversations가 "미완성 =ACTIVE" 로 정의한 근거는 "카드 생성은 ENDED 를 요구하므로 ACTIVE 방은 카드를 가질 수 없다" 이고, 이 명제 자체는 참이다. 하지만 역이 성립하지 않는다 — ENDED 인데 카드가 없는 방이 실제로 여러 경로로 생긴다.CARD_GENERATION_FAILED)cardGenerationStatus = FAILEDNONECARD_GENERATION_IN_PROGRESS)pendingGenerationTimeout(3분) + 스캔 주기NO_SUMMARYSKIPPEDfindAutoCardTargetIds에서 제외되어 카드가 영원히 안 생긴다WITHDRAWN_MEMBERNONENONECardProperties.autoCardStartDateKDoc 이 이미 이 상태를 인정하고 있다 — 요약 없는 방을 배치가 "카드는 못 만들고 종료만 시켜버린다. 사용자는 이어쓰기만 잃고 얻는 게 없다".autoCardStartDate는 과거 방에 한해 막아둔 방벽이지, 앞으로 안 생긴다는 보장이 아니다.할 일
cards조인 추가), 캘린더에서 "카드 만들기" 상태로 별도 노출할지ConversationService.getInProgressConversations의 KDoc 전제도 함께 갱신SKIPPED(요약 없음) 방 처리 결정 — 영구 제외를 유지할지, 노출 대상에 포함해 사용자가 직접 만들게 할지기술 고려사항
/incomplete가 지금cards를 조인하지 않는 것은 의도적이다(위 KDoc). 조인을 추가하면 그 판단을 뒤집는 것이므로 주석도 같이 고쳐야 한다ConversationSearchRepository· 날짜별 조회는 이미 이 방들을 보여주므로 수정 대상이 아니다연관