Appearance
[앱/웹] 첫 콘텐츠 이탈 시 다음 콘텐츠 추천 Spec
Refinement 단계의 산출물. PRD에서 정의한 의도를 화면 단위 디테일로 명세한다. API 시그니처·DB 스키마·랭킹 알고리즘 구현은 별도 개발 설계 문서로. 본 문서는 추천 바텀시트의 노출 조건, 화면 구성, 클릭/이탈 동작, 성인 인증 게이트, 로깅·QA 기준을 정의한다.
1. Overview
- PRD:
./PRD.md - Figma / 디자인 기준:
FirstEpisodeRecommend/FirstEpisodeRecommendAdult화면 시안 - Linear: DEE-336 (Spec writing)
- 앱/웹/스튜디오: 앱 + 웹
- What: 신규 유저가 이 기능 배포 후 계정당 1회 미소진 상태에서 첫 콘텐츠를 이탈하는 순간, 에피소드 플레이 화면 위로 FirstEpisodeRecommend 바텀시트를 노출한다. 추천 1순위를 크게 강조하고, 2~8순위 에피소드는 하단 가로 스크롤 리스트로 제공한다. 추천 에피소드의 썸네일 또는 제목 영역을 누르면 에피소드 상세로 가지 않고 바로 프롤로그 플레이로 진입한다.
- 노출 기준: 씬 생성 수 조건은 두지 않는다. 신규 유저가 계정당 1회 미소진 상태에서 첫 콘텐츠를 이탈하면 추천 바텀시트를 노출한다.
- 트리거: 사용자가 에피소드/플레이어에서 나가기(leave) 탭, 뒤로가기, 홈 이동으로 이탈하려는 순간. 일정 시간 이상 백그라운드 전환, 결제/스타 충전 등 플레이 흐름 내 일시 이동, 앱 kill/강제 종료는 이탈 트리거가 아니다.
- 출시 방식: 비실험 단일 출시. feature flag는 kill switch 용도다.
- v1 surface 경계: v1 신규 surface는 이탈 시점 바텀시트 1개다. 홈 랜딩 중앙 추천 모달은 본 spec 범위에서 제외한다.
2. Ubiquitous Language
| Term | Korean | Definition | Do Not Confuse With | Primary Domain | 상태 |
|---|---|---|---|---|---|
| FirstEpisodeRecommend | 첫 콘텐츠 이탈 추천 바텀시트 | 신규 유저가 첫 콘텐츠에서 이탈하려는 순간 노출되는 다음 에피소드 추천 바텀시트 | Newbie Recommendation(웰컴 스타 직후 1회성 진입 추천) | Discovery / Play | 신규 |
| FirstEpisodeRecommendAdult | 첫 콘텐츠 이탈 추천 성인 인증 게이트 | FirstEpisodeRecommend에서 성인용 에피소드를 선택했으나 유저가 아직 성인인증을 하지 않은 경우 노출되는 인증 안내 모달 | 성인 에피소드 추천 제외 정책 | Discovery / Auth | 신규 |
| Episode | 에피소드 | 플레이 단위 콘텐츠 | Scene | Discovery / Play | 기존 |
| Prologue Play | 프롤로그 플레이 | 에피소드 상세를 거치지 않고 선택한 에피소드의 프롤로그 플레이로 바로 진입하는 목적지 | Episode Detail | Play | 기존 |
| Scene | 씬 | 플레이 진행·credit 차감의 기준 단위. 본 기능에서는 추천 이후 추가 씬 생성 성과를 측정하는 기준 | Turn, Frame | Play | 기존 |
본 spec 한정 약속어:
- 이탈 인텐트(churn intent): 에피소드/플레이어에서 나가기(leave) 탭, 뒤로가기, 홈 이동. 일정 시간 이상 백그라운드 전환, 결제/스타 충전 등 플레이 흐름 내 일시 이동, 앱 kill/강제 종료는 제외한다.
- 자격 이탈(qualifying exit): 이 기능 배포 후 신규 유저가 계정당 1회 미소진 상태에서 첫 콘텐츠를 이탈하는 경우. 씬 생성 수 5회 미만 같은 조건은 사용하지 않는다.
- 추천 1순위: 바텀시트 중앙에 큰 카드로 강조되는 대표 추천 에피소드.
- 2~8순위 추천: 추천 1순위 아래에 가로 스크롤로 나열되는 보조 추천 에피소드.
3. User Flows
3.1 전체 플로우
3.2 시나리오별 플로우
시나리오 1 — 첫 콘텐츠 이탈 → 추천 1순위 바로 프롤로그 플레이
- 신규 유저가 첫 콘텐츠 플레이 중 나가기/뒤로가기/홈 이동으로 이탈하려 한다.
- 계정당 1회 미소진이면 추천 후보를 조회한다.
- FirstEpisodeRecommend 바텀시트가 노출된다. 추천 1순위가 큰 카드로 강조되고, 2~8순위는 하단 가로 스크롤로 나열된다.
- 유저가 추천 1순위의 썸네일 또는 제목 영역을 누른다.
- 에피소드 상세 화면으로 이동하지 않고 해당 에피소드의 프롤로그 플레이로 바로 진입한다.
시나리오 2 — 2~8순위 추천 선택 → 바로 프롤로그 플레이
- 바텀시트 하단의 2~8순위 에피소드 리스트를 좌우로 스크롤한다.
- 특정 보조 추천 에피소드의 썸네일 또는 제목 영역을 누른다.
- 에피소드 상세 화면 없이 해당 에피소드의 프롤로그 플레이로 바로 진입한다.
시나리오 3 — 홈으로 이탈
- 바텀시트가 노출된 상태에서 유저가 [홈으로] 버튼을 누른다.
- 추천 플레이로 진입하지 않고 홈으로 이동한다.
- 바텀시트 view가 발생했으므로 계정당 1회 노출은 이미 소진된 상태다.
시나리오 4 — 성인용 에피소드 선택 + 성인인증 미완료
- FirstEpisodeRecommend에서 유저가 성인용 에피소드를 선택한다.
- 유저가 아직 성인인증을 하지 않았다면 FirstEpisodeRecommendAdult 인증 안내 모달을 노출한다.
- 안내 카피: “어른들만의 에피소드를 선택했어요” / “시작하려면 확인이 필요해요”.
- 유저가 **[성인 인증하기]**를 누르면 기존 성인인증 플로우로 이동한다.
- 인증 완료 후 목적지 복귀 정책은 기존 성인인증 플로우 정책을 따른다. 가능하면 선택한 에피소드의 프롤로그 플레이로 이어진다.
시나리오 5 — 후보 0건 / 조회 실패
- 노출 자격은 충족했으나 추천 후보가 0건이거나 후보 조회가 실패/타임아웃된다.
- 바텀시트를 노출하지 않고 사용자가 시작한 이탈 동작을 그대로 진행한다.
- view가 없으므로 계정당 1회 노출을 소진하지 않는다.
4. Screens
4.1 FirstEpisodeRecommend — 이탈 시점 추천 바텀시트
- Purpose: 첫 콘텐츠 이탈 순간, 다음 에피소드 후보를 제시해 유저를 곧바로 다른 프롤로그 플레이로 이어준다.
- Figma 기준 화면명:
FirstEpisodeRecommend - 노출 위치: 에피소드 플레이 화면 위 하단 부착 바텀시트. 상단 배경의 플레이 화면은 dim/blur 처리된다.
Components
- 바텀시트 컨테이너
- 화면 하단 부착
- 상단 rounded corner
- 상단 grab handle
- 배경 dim 처리
- 타이틀
- 문구: “이 에피소드도 좋아하실거에요!”
- 추천 1순위 카드
- 큰 썸네일/커버 이미지
- 중앙 play affordance 표시 가능
- 카테고리/장르 라벨 예:
SF/판타지 - 제목 예:
나의 멸망 나의 구원자 - 1순위 추천임을 시각적으로 강조한다.
- 2~8순위 추천 리스트
- 추천 1순위 아래에 가로 스크롤로 나열
- 각 카드: 썸네일 + 제목(말줄임 가능)
- 2순위부터 8순위까지 최대 7개 보조 추천을 표시
- 하단 이탈 버튼
- 문구: “홈으로”
- 아이콘이 있으면 기존 홈 아이콘 사용
States
- Default: 추천 1순위 + 2~8순위 리스트를 노출한다.
- 부분 후보: 1순위 후보는 필수다. 2~8순위는 확보된 개수만큼 표시한다. 1순위 후보도 없으면 바텀시트를 노출하지 않는다.
- 후보 조회 실패/타임아웃: 바텀시트를 노출하지 않는다.
- 이미 노출 소진 / 신규 유저 아님: 바텀시트를 노출하지 않는다.
Interactions
| 액션 | 트리거 | 결과 |
|---|---|---|
| 노출 | 첫 콘텐츠 이탈 인텐트 + 신규 유저 + 계정당 1회 미소진 + 1순위 후보 확보 | view_next_content_reco 발화, 계정당 1회 노출 소진 |
| 추천 1순위 선택 | 1순위 에피소드 썸네일 또는 제목 영역 tap | 에피소드 상세 이동 없이 바로 프롤로그 플레이. click_next_content_reco 발화(slot_index=1) |
| 2~8순위 선택 | 하단 가로 스크롤 리스트의 에피소드 썸네일 또는 제목 영역 tap | 에피소드 상세 이동 없이 바로 프롤로그 플레이. click_next_content_reco 발화(slot_index=2..8) |
| 홈으로 | [홈으로] 버튼 tap | 홈으로 이동. close_next_content_reco 또는 별도 close reason 발화(close_reason=home) |
| 닫기/뒤로가기 | 시스템 뒤로가기, 바텀시트 닫기 동작이 있는 경우 | 사용자가 시작한 이탈 동작을 그대로 진행. close_next_content_reco 발화 |
클릭 영역: 에피소드 썸네일 영역과 제목 영역은 모두 같은 선택 액션으로 처리한다. 별도 에피소드 상세 진입은 없다.
Data
- 표시 데이터
- 추천 1순위: 썸네일, 제목, 카테고리/장르, 성인 여부
- 2~8순위: 썸네일, 제목, 성인 여부
- 추천 후보 모집단
- 별도 추천 전용 풀은 두지 않는다.
- 공개 발행되어 정상 필터를 통과하고 플레이 가능한 episode 전체가 후보가 될 수 있다.
- 공통 제외
- 현재 들어와 있는/방금 이탈한 episode
- 미발행, 비공개, 삭제, 플레이 불가 episode
- 정책상 해당 유저에게 노출 자체가 불가한 episode
- 성인 episode 처리
- 성인 episode는 1순위 후보로 사용할 수 없다.
- 성인 episode는 전체 추천 슬롯 중 최대 2개까지만 포함할 수 있다.
- 성인인증 미완료는 후보 제외 사유가 아니다. 단, 기존 정책상 썸네일/제목 노출 자체가 불가한 유저에게는 후보로 내려주지 않는다.
- 성인용 에피소드가 후보로 노출되고 유저가 선택했는데 아직 성인인증을 하지 않았다면
FirstEpisodeRecommendAdult로 진입 전 게이트를 건다. - 성인인증 완료 유저가 성인용 에피소드를 선택하면 일반 에피소드와 동일하게 바로 프롤로그 플레이로 진입한다.
- 후보 우선순위
- 현재 이탈 episode의
visualStyle+category둘 다 일치 - 현재 이탈 episode의
visualStyle일치 - 현재 이탈 episode의
category일치 - 운영 설정 fallback episode 또는 공개 발행 플레이 가능 전체 fallback
- 현재 이탈 episode의
- tier 내부 정렬
- 최근 30일 누적 scene 생성수 desc
- 값이 없거나 동률이면 전체 누적 scene 생성수 desc
- 그래도 동률이면 최신 발행순
- 추천 개수
- 최대 8개까지 노출한다.
- 1순위는 대표 카드로 강조한다.
- 2~8순위는 하단 가로 스크롤 리스트로 노출한다.
- 성인 episode 슬롯 배치
- 후보 우선순위·tier 내부 정렬을 적용한 뒤, 1순위 슬롯에는 성인 episode를 배치하지 않는다.
- 2~8순위 전체에서 성인 episode는 최대 2개까지만 유지한다.
- 제한 적용 후 슬롯이 부족하면 다음 후보로 채운다.
Persistence
| 데이터 | 위치 | 정책 |
|---|---|---|
| 계정당 1회 노출 소진 플래그 | 서버(계정/profile 단위) | view 발생 시점에 소진 마킹. 추천을 클릭하지 않고 홈으로 가도 소진된다. 후보 0건/조회 실패로 view가 없으면 소진하지 않는다. |
4.2 FirstEpisodeRecommendAdult — 성인 인증 게이트
- Purpose: 추천 바텀시트에서 성인용 에피소드를 선택했지만 유저가 아직 성인인증을 하지 않은 경우, 플레이 진입 전에 인증 필요를 안내한다.
- Figma 기준 화면명:
FirstEpisodeRecommendAdult - 등장 시점
- 선택한 에피소드가 성인용 에피소드
- 유저가 아직 성인인증을 하지 않음
Components
- 배경
- 기존 FirstEpisodeRecommend 화면을 유지하되 전체 dim 처리
- 중앙 인증 모달
- 성인/프로필 인증 그래픽 아이콘
- 타이틀: “어른들만의 에피소드를 선택했어요”
- 보조 카피: “시작하려면 확인이 필요해요”
- CTA: “성인 인증하기”
Interactions
| 액션 | 트리거 | 결과 |
|---|---|---|
| 성인 인증하기 | CTA tap | 기존 성인인증 플로우로 이동. click_next_content_reco_adult_verify 또는 click_next_content_reco에 blocked_reason=adult_verification_required 기록 |
| 인증 완료 | 성인인증 성공 | 가능하면 선택한 에피소드의 프롤로그 플레이로 이어진다. 복귀 정책은 기존 성인인증 플로우를 따른다. |
| 인증 취소/실패 | 성인인증 중단 또는 실패 | 기존 정책에 따라 이전 화면 또는 홈으로 복귀. 에피소드 플레이는 시작하지 않는다. |
5. Edge Cases & Error Handling
5.1 입력 경계
- 1순위 후보 없음: 바텀시트 미노출. view가 없으므로 노출 소진하지 않는다.
- 보조 후보 부족: 2~8순위는 확보된 후보만 노출한다. 빈 슬롯을 렌더하지 않는다.
- 추천 카드 메타 누락: 썸네일/제목이 깨진 후보는 노출하지 않고 다음 후보로 대체한다.
5.2 권한 / 인증
- 비로그인: 해당 없음. 플레이는 로그인 필수이며 본 트리거는 로그인 신규 유저에만 발생한다.
- 성인인증 미완료 + 성인용 에피소드 선택:
FirstEpisodeRecommendAdult를 노출하고 바로 플레이하지 않는다. - 성인인증 완료 + 성인용 에피소드 선택: 일반 에피소드와 동일하게 바로 프롤로그 플레이로 진입한다.
- 정책상 노출 불가 성인 episode: 후보에서 제외한다. 예: 미성년자로 확정된 유저 등 기존 정책상 성인 콘텐츠 노출 자체가 불가한 경우.
- 흐름 내 일시 이동 / 백그라운드 / 강제 종료: 일정 시간 이상 백그라운드 전환, 결제/스타 충전·인앱 결제 시트·외부 인증 등 플레이 흐름 내 일시 이동과 앱 kill은 이탈로 판정하지 않는다.
5.3 네트워크 / 시스템
- 추천 후보 조회 실패: 바텀시트 미노출, 이탈 흐름 그대로 진행, 노출 미소진.
- 조회 지연: 짧은 타임아웃 내 후보 미확보 시 미노출. 이탈 흐름을 추천 조회로 지연시키지 않는다.
- 성인인증 플로우 오류: 기존 성인인증 오류 처리 정책을 따른다. 추천 에피소드 플레이는 시작하지 않는다.
5.4 데이터 상태
- 추천 episode가 선택 시점에 비공개/삭제/플레이 불가로 변경됨: 플레이 진입 전 검증 실패 시 기존 오류 안내 후 홈 또는 이전 화면으로 복귀한다.
- 노출 마킹 경합: view 직후 홈으로/추천 선택/뒤로가기가 빠르게 발생해도 소진 마킹은 view 1회 기준 멱등 처리한다.
5.5 비즈니스 룰 위반
- 계정당 1회 이미 소진: 모달 미노출.
- 신규 유저 아님: 모달 미노출.
- 씬 생성 수 5회 이상: 별도 미노출 조건이 아니다. 신규 유저 + 계정당 미소진 + 첫 이탈이면 노출 대상이다.
6. Acceptance Criteria
- [ ] 신규 유저가 첫 콘텐츠 플레이에서 나가기/뒤로가기/홈 이동으로 이탈하는 순간, 계정당 1회 미소진이고 추천 1순위 후보가 있으면
FirstEpisodeRecommend바텀시트가 노출된다. - [ ] 씬 생성 수 5회 미만 조건은 사용하지 않는다. 씬 생성 수와 무관하게 첫 이탈이면 노출 대상이다.
- [ ] 바텀시트는 추천 1순위를 큰 카드로 강조하고, 2~8순위 에피소드를 하단 가로 스크롤 리스트로 노출한다.
- [ ] 추천 1순위 및 2~8순위 카드의 썸네일/제목 영역을 누르면 에피소드 상세 이동 없이 바로 프롤로그 플레이로 진입한다.
- [ ]
[홈으로]버튼을 누르면 추천 플레이로 진입하지 않고 홈으로 이동한다. - [ ] 선택한 에피소드가 성인용이고 유저가 아직 성인인증을 하지 않았다면
FirstEpisodeRecommendAdult모달을 노출한다. - [ ] 성인 episode는 추천 1순위 슬롯에 배치하지 않고, 2~8순위 전체에서 최대 2개까지만 노출한다.
- [ ]
FirstEpisodeRecommendAdult에서[성인 인증하기]를 누르면 기존 성인인증 플로우로 이동한다. - [ ] 성인인증 완료 유저가 성인용 추천을 선택하면 일반 추천과 동일하게 바로 프롤로그 플레이로 진입한다.
- [ ] 후보 0건/조회 실패/타임아웃이면 바텀시트를 노출하지 않고, 계정당 1회 노출도 소진하지 않는다.
- [ ] 바텀시트가 실제 view되면 홈으로 가거나 닫더라도 계정당 1회 노출이 소진된다.
- [ ] 추천 후보는 방금 이탈한 episode 기준
visualStyle+category→visualStyle→category→ fallback 순으로 채우고, 각 tier 안에서 최근 30일 scene 생성수 → 전체 누적 scene 생성수 → 최신 발행순으로 정렬한다. - [ ]
view_next_content_reco,click_next_content_reco,close_next_content_reco가 surface, slot_index, reco_episode_id(s)/title(s), adult gate 여부를 구분할 수 있게 기록된다.
7. Analytics / Logging
컨벤션 + 기존 이벤트 목록: https://event-docs.frontia.dev/ (Cloudflare Access — WARP/momo 세션). 본 surface는 추천 모달 계열이므로 기존 discovery 그룹 이벤트 재사용을 우선한다. 단, event-docs 실측 대조 전까지 아래 신규 이벤트명은 초안이다.
7.1 로깅 컨벤션
episode_id를 이벤트 파라미터로 남기는 경우, 같은 이벤트에 대응하는episode_title도 함께 남긴다.- 여러 추천 후보를 배열로 남길 때는
reco_episode_ids와reco_episode_titles를 같은 순서의 배열로 남긴다. 순서는 바텀시트 노출 슬롯 순서(1~8)와 동일해야 한다. - 클릭/진입처럼 단일 추천 에피소드를 남길 때는
reco_episode_id,reco_episode_title,slot_index를 함께 남긴다. - 방금 이탈한 원본 에피소드는
abandoned_episode_id,abandoned_episode_title로 남긴다. - 이미지 URL/썸네일 URL/이미지 바이너리 값은 이벤트 파라미터로 보내지 않는다.
7.2 이벤트별 발화 조건
view_next_content_reco
- 발화 시점:
FirstEpisodeRecommend바텀시트가 실제 노출된 순간 1회. - 파라미터:
surface=first_episode_recommend,abandoned_episode_id,abandoned_episode_title,abandoned_scene_count,reco_episode_ids,reco_episode_titles,top_episode_id,top_episode_title,ranking_tiers,has_adult_episode. - 제외 조건: 후보 0건/조회 실패/자격 미달로 미노출된 경우 미발화.
- 그룹:
discovery.
click_next_content_reco
- 발화 시점: 추천 1순위 또는 2~8순위 에피소드의 썸네일/제목 영역 tap 시.
- 파라미터:
surface=first_episode_recommend,reco_episode_id,reco_episode_title,slot_index(1~8),is_adult_episode,adult_verification_status,destination(prologue_play|adult_verification). - 성인 미인증 선택: 바로 플레이하지 않고
destination=adult_verification,blocked_reason=adult_verification_required로 남긴다. - 그룹:
discovery.
close_next_content_reco
- 발화 시점:
[홈으로], 뒤로가기, 닫기 동작으로 추천 바텀시트를 벗어날 때. - 파라미터:
surface=first_episode_recommend,reco_episode_ids,reco_episode_titles,close_reason(home|back|dismiss). - 제외 조건: 추천 카드 선택은 click으로 기록한다.
- 그룹:
discovery.
성인 인증 CTA
- 기존 성인인증 이벤트가 있으면 재사용한다.
- 별도 이벤트가 필요하면
click_next_content_reco_adult_verify를 사용한다. - 파라미터:
reco_episode_id,reco_episode_title,slot_index,source=first_episode_recommend_adult.
click_play_start / 프롤로그 플레이 시작 이벤트
- 발화 시점: 추천 경유로 프롤로그 플레이가 실제 시작될 때.
- 파라미터:
episode_id,episode_title,referrer=reco,source=first_episode_recommend,slot_index. - 그룹: 기존 Play 이벤트 그룹 재사용.
자격/미노출 사유 로깅
- 목적: 자격 판정 결과와 미노출 사유를 남겨 커버리지/누락을 측정한다.
- 남길 값(예):
eligibility_result(eligible|already_consumed|not_new_user),no_show_reason(no_candidate|fetch_error|timeout),abandoned_episode_id,abandoned_episode_title,abandoned_scene_count.
8. Open Questions
확정됨(이번 사이클, OQ 아님): 노출 대상 = 신규 유저·계정당 1회 미소진·첫 이탈, 트리거 = 나가기/뒤로가기/홈 이동, 일정 시간 이상 백그라운드 전환은 트리거 제외, 씬 생성 수 5회 미만 조건 삭제, surface = FirstEpisodeRecommend 바텀시트 1개, 추천 1순위 강조 + 2~8순위 가로 스크롤, 성인 episode = 1순위 금지 + 최대 2개, 썸네일/제목 클릭 시 에피소드 상세 없이 바로 프롤로그 플레이, 성인용 에피소드 선택 + 미인증 시 FirstEpisodeRecommendAdult → 성인인증 플로우, 비실험 단일 출시.
- [ ] [엔지니어 결정] 정확한 바로 프롤로그 플레이 destination — 현재 spec은 “에피소드 상세 없이 바로 프롤로그 플레이”로 정의. 실제 route/event 명칭은 기존 Play 라우팅과 맞춘다. — 엔지니어
- [ ] [엔지니어 결정] 성인인증 완료 후 복귀 정책 — 인증 완료 뒤 선택 에피소드 프롤로그 플레이로 자동 복귀 가능한지, 불가하면 홈/이전 화면 복귀인지 확인. — 엔지니어 + PM
- [ ] [엔지니어 결정] 이탈 인텐트 in-flow 예외 목록 — 결제/스타 충전·인앱 결제 시트·외부 인증·권한 팝업·딥링크 이동 중 어디까지 “일시 이동(제외)”으로 볼지. — 엔지니어 + PM
- [ ] [엔지니어 결정] 노출 마킹 저장 단위 — 계정당 1회 노출 소진 마킹 저장 위치와 view 멱등 처리. — 엔지니어
- [ ] [엔지니어 결정] 추천 조회 타임아웃 — 이탈 흐름을 지연시키지 않는 조회 타임아웃 값. — 엔지니어
- [ ] [데이터 미정] 로깅 이벤트 재사용 실측 확정 — event-docs에서 기존 추천/성인인증/프롤로그 플레이 이벤트 재사용 여부 확인. — momo + 엔지니어
9. QA Scenarios
9.1 노출 트리거 / 자격
| # | 전제 | 액션 | 기대 결과 |
|---|---|---|---|
| T1 | 신규 유저, 계정당 1회 미소진 | 첫 콘텐츠 플레이에서 뒤로가기 | FirstEpisodeRecommend 바텀시트 노출, view 이벤트 발화, 노출 소진 |
| T2 | 신규 유저, 계정당 1회 미소진 | 첫 콘텐츠 플레이에서 나가기 tap | T1과 동일 |
| T2-1 | 신규 유저, 계정당 1회 미소진 | 첫 콘텐츠 플레이에서 홈 이동 | T1과 동일 |
| T3 | 신규 유저, 씬 생성 수 5회 이상, 계정당 1회 미소진 | 첫 콘텐츠 이탈 | 씬 수와 무관하게 바텀시트 노출 |
| T4 | 계정당 1회 이미 소진 | 첫 콘텐츠 이탈 | 미노출 |
| T5 | 신규 유저 아님 | 플레이 이탈 | 미노출 |
| T6 | 신규 유저, 미소진 | 결제/스타 충전 등 흐름 내 일시 이동 | 미노출, 복귀 시 플레이 이어감 |
| T7 | 신규 유저, 미소진 | 일정 시간 이상 백그라운드 전환 또는 앱 kill/강제 종료 | 미노출 |
9.2 추천 후보 / 화면 구성
| # | 전제 | 액션 | 기대 결과 |
|---|---|---|---|
| R1 | 후보 8개 이상 | 이탈 트리거 | 1순위 큰 카드 + 2~8순위 하단 가로 스크롤 노출 |
| R2 | 후보 3개 | 이탈 트리거 | 1순위 큰 카드 + 2~3순위만 노출, 빈 슬롯 없음 |
| R3 | 후보 1개 | 이탈 트리거 | 1순위 큰 카드만 노출 |
| R4 | 후보 0건 | 이탈 트리거 | 미노출, 노출 미소진 |
| R5 | visualStyle/category 후보 혼재 | 이탈 트리거 | visualStyle+category → visualStyle → category → fallback 순으로 1~8순위 산출 |
| R6 | tier 내 후보 다수 | 이탈 트리거 | 최근 30일 scene 생성수 → 전체 누적 → 최신 발행순 |
| R7 | 성인 episode 후보 포함 | 이탈 트리거 | 성인 episode는 1순위에 배치되지 않고, 2~8순위 전체에서 최대 2개까지만 노출 |
9.3 인터랙션 / 진입
| # | 전제 | 액션 | 기대 결과 |
|---|---|---|---|
| I1 | 바텀시트 노출 | 1순위 썸네일 tap | 에피소드 상세 없이 바로 프롤로그 플레이, click 이벤트 slot_index=1 |
| I2 | 바텀시트 노출 | 1순위 제목 tap | I1과 동일 |
| I3 | 바텀시트 노출 | 2~8순위 썸네일/제목 tap | 에피소드 상세 없이 바로 프롤로그 플레이, click 이벤트 slot_index=2..8 |
| I4 | 바텀시트 노출 | [홈으로] tap | 홈으로 이동, close 이벤트 close_reason=home, 노출 소진 유지 |
| I5 | 바텀시트 노출 | 뒤로가기/닫기 | 사용자가 시작한 이탈 동작 계속, close 이벤트 |
9.4 성인 인증
| # | 전제 | 액션 | 기대 결과 |
|---|---|---|---|
| A1 | 성인용 추천, 유저 성인인증 완료 | 추천 카드 tap | 바로 프롤로그 플레이 |
| A2 | 성인용 추천, 유저 성인인증 미완료 | 추천 카드 tap | FirstEpisodeRecommendAdult 노출, 플레이 미시작 |
| A3 | A2 상태 | [성인 인증하기] tap | 기존 성인인증 플로우로 이동 |
| A4 | 성인인증 취소/실패 | 인증 플로우 중단 | 에피소드 플레이 시작하지 않음, 기존 정책에 따라 복귀 |
| A5 | 정책상 성인 콘텐츠 노출 불가 유저 | 이탈 트리거 | 해당 유저에게 노출 불가한 성인 episode는 후보에서 제외 |
9.5 노출 한도 / 소진
| # | 전제 | 액션 | 기대 결과 |
|---|---|---|---|
| L1 | 바텀시트 view 후 홈으로 이동 | 다시 첫 콘텐츠 이탈 | 미노출(계정당 1회 소진) |
| L2 | 바텀시트 view 후 추천 진입 | 이후 이탈 | 미노출 |
| L3 | 후보 0건으로 미노출 | 이후 후보 확보된 이탈 | 재시도 가능(이전에는 view가 없어 미소진) |
| L4 | view 직후 홈/추천 클릭 경합 | — | 소진 1회만 멱등 처리 |
10. References
- PRD:
./PRD.md - Figma / 디자인 기준:
FirstEpisodeRecommend/FirstEpisodeRecommendAdult - 시각 산출물:
./spec-preview.html,./screen-design.html - 비슷한 기존 기능: Newbie Recommendation(웰컴 스타 직후 1회성 진입 추천), 기존 성인인증 플로우
- 관련 위키: Discovery 도메인, UL(Episode/Scene/Turn/Credit), 기존 성인 콘텐츠 노출 정책
- Linear: DEE-336
⚠️ Fuzzy points
- 성인인증 완료 후 선택 에피소드 프롤로그 플레이로 자동 복귀 가능한지는 기존 인증 플로우 구현 확인 필요.
바로 프롤로그 플레이의 정확한 route/event 명칭은 기존 Play 라우팅과 맞춰야 한다.- event-docs 본 환경 미접근 — 추천/성인인증/프롤로그 플레이 이벤트 재사용 여부는 momo 세션 대조로 확정.
- 이탈 인텐트 in-flow 예외 목록, 조회 타임아웃, 노출 마킹 저장 구조는 엔지니어 확정 영역.