Skip to content

[스튜디오/플레이] 메인 엔딩 이후 세계관 프롬프트 변경 및 반영 PRD

Backlog grooming 단계의 산출물. 무엇을 만들지·왜 만들지·핵심 비즈니스 룰을 정의한다. 화면별 디테일(컴포넌트·상태·인터랙션)은 spec.md로.


Status: draft Created: 2026-05-15 Last updated: 2026-05-18 Linear Project: 스튜디오/플레이 메인 엔딩 이후 세계관 프롬프트 변경 및 반영Author: agent (prd-writer) 앱/웹/스튜디오: 스튜디오 + 앱(플레이)


1. 목표 및 배경

1.1 문제

메인 엔딩에 도달한 유저가 이어하기로 진입한 자유 플레이에서, 기존 "이야기 진행" 전제의 world prompt가 그대로 시스템 프롬프트로 들어가 자유 플레이가 길어질수록 컨텍스트가 유실되고 결국 에피소드를 처음부터 다시 플레이하는 듯한 위화감을 준다.

  • 사용자 정의 (segment):
    • (플레이어) 메인 엔딩 도달 후 자유 플레이를 이어가는 유저
    • (작가) 메인 엔딩 이후 세계 상태·관계 변화를 후속 플레이에 반영하고 싶은 스튜디오 작가
  • 상황 (when, where): 메인 엔딩 화면 → 이어하기 진입 → 정해진 이벤트 없는 자유 플레이 구간
  • 불편 / 미충족 needs:
    • 플레이어: 엔딩을 봤는데도 모델이 엔딩 이전 흐름으로 회귀, 캐릭터 관계/세계 변화가 반영되지 않음
    • 작가: 엔딩 이후 세계관을 별도로 표현할 수단이 없어 자유 플레이 품질을 통제 불가

1.2 근거

  • 도메인 구조: World Prompt는 매 턴 scene generation의 system info로 주입됨 → 자유 플레이에서 누적 컨텍스트가 길어질수록 system prompt와 실제 상태 간 괴리가 가장 큰 노이즈 원인
  • Main ending은 다시하기/이어하기가 가능하고 자유 플레이가 길어질 수 있는 구조 → ending 별 후속 컨텍스트 정의 필요성이 구조적으로 존재
  • 비슷한 과거 프로젝트: 없음 (신규 도메인 확장). main ending별 override라는 단위는 본 프로젝트에서 처음 도입.

1.3 아이디어 (해결 방향)

스튜디오 세계관 화면에 main ending별 "엔딩 프롬프트" 목록을 추가하고, 각 메인 엔딩 노드 안에서도 동일한 엔딩 프롬프트를 작성/수정할 수 있게 한다. 플레이어가 해당 main ending에서 이어하기로 자유 플레이 진입 시 이 prompt override를 system prompt로 사용한다.

  • 옵션 1: 전역 "엔딩 이후 프롬프트" 1개 — 단순하지만 메인 엔딩이 여러 개일 때 분기 표현 불가. ❌
  • 옵션 2: 메인 엔딩별 override (추천) — 엔딩별 세계 상태가 다르므로 자연스럽고, 작가가 필요한 엔딩만 override 작성 가능
  • 옵션 3: 이벤트 노드 안에서만 관리 — 엔딩 노드 내부에 prompt 필드 추가. 위치는 자연스럽지만 작가가 "어디서 관리되고 있는지" 찾기 어려움 ❌

추천: 옵션 2를 기본으로 하되, 작성 진입은 2곳을 제공한다. (1) 세계관 화면의 기본 프롬프트 옆/아래 엔딩 프롬프트 목록, (2) 메인 엔딩 노드 편집 패널 내부. 두 진입점은 같은 main ending별 override 데이터를 편집한다.

1.4 가설

  1. 메인 엔딩별 override를 제공하면, 엔딩 이후 자유 플레이에서 캐릭터·세계 상태 일관성이 유지되어 "에피소드를 처음부터 다시 하는 듯한" 위화감이 줄어든다.
  2. 작가는 메인 엔딩별로 세계 상태 변화를 명시할 수 있어, 엔딩 이후 자유 플레이의 컨트롤가능성·완성도가 높아진다.
  3. override가 없는 main ending은 기존 동작을 그대로 유지하므로 기존 작품·기존 플레이에 회귀가 없다.

1.5 성공 지표

지표현재 baseline목표측정 방법
메인 엔딩 이후 0턴 이탈률최근 30일 35.6%25% 이하main ending 최초 도달 후 후속 completed scene이 없는 play 비율
메인 엔딩 이후 후속 turn median최근 30일 4턴 / 최근 7일 3턴 / 누적 5턴6턴 이상main ending 이후 이어하기 진입 play의 후속 completed scene/turn count median
메인 엔딩 이후 5턴 이상 지속률최근 30일 49.0%55% 이상이어하기 이후 후속 turn count 5 이상 비율
메인 엔딩 이후 10턴+ 비율최근 30일 41.4%유지이어하기 이후 후속 turn count 10 이상 비율
main ending 이후 이어하기 클릭률재산출 필요 (기존 proxy: 최근 30일 64.4% / 최근 7일 61.0% / 누적 65.6%)유지 또는 ↑main ending 최초 도달 play 대비 click_play_ending_action event의 action_type = continue 발생 play 비율
override 작성된 main ending 비율 (출간작 기준)0%— (도입 후 baseline 수집)studio publish snapshot 집계
  • 본 기능의 1차 목표는 메인 엔딩 이후 장기 플레이어를 더 늘리는 것이 아니라, 0턴 이탈을 줄이고 사용자를 3~5턴 구간까지 진입시키는 것이다.
  • 메인 지표는 평균 턴 수가 아니라 0턴 이탈률, median 턴 수, 5턴 이상 지속률로 본다. 최근 30일 평균은 47.6턴이지만 p99 684턴, 최대 4,223턴의 긴 꼬리에 끌리므로 제품 판단 기준선으로 부적합하다.
  • 10턴+ 비율은 이미 41.4%로 높은 편이므로 메인 목표가 아니라 “깊게 남는 유저 유지” 가드레일로 둔다.
  • 데이터 기준: main_ending 최초 도달 play, staff 제외. 이어하기 클릭률은 click_play_ending_action event의 action_type = continue 기준으로 재산출한다. 현재 baseline의 이어하기율은 main ending 이후 completed scene 발생으로 추정한 proxy 값이다.
  • 특정 대형 에피소드 편향은 크지 않다. 최대 에피소드 하트하우스 제외 후에도 median 4턴, 0턴 35.7%로 전체 패턴과 거의 동일하다.
  • 비교 기준 후보:
    • 기능 도입 전/후 cohort.
    • override 설정 main ending vs override 미설정 main ending.
    • override mode별(inherit / override_empty / override_value) 자유 플레이 턴 수.
  • 가드레일: override가 없는 main ending 자유 플레이 retention이 악화되지 않을 것 (회귀 없음 검증).

2. 타깃 사용자

2.1 주요 사용자

  • 스튜디오 작가: 자신이 만든 작품에 메인 엔딩이 1개 이상 있고, 엔딩 이후 자유 플레이의 질을 통제하고 싶은 작가. 세계관 화면을 자주 다듬는 사용자.
  • 앱 플레이어: 메인 엔딩에 도달한 뒤 이어하기로 자유 플레이에 진입하는 유저. 엔딩 후에도 캐릭터/세계와 상호작용을 이어가고 싶어 함.

2.2 핵심 시나리오

  1. 작가: 한 작품에 메인 엔딩이 2개 있다. 세계관 화면에서 "메인 엔딩 이후 프롬프트" 섹션을 열어 엔딩 A에는 override 작성, 엔딩 B는 기본 세계관 사용으로 둔다. 출간 후 플레이어가 엔딩 A에 도달하면 override가 적용된다.
  2. 플레이어: 메인 엔딩 A 도달 → 엔딩 화면에서 이어하기 탭 → 자유 플레이 진입. 모델이 엔딩 이후 세계 상태(예: 캐릭터 관계 변화, 도시 상태 변화)에 부합하게 응답한다.
  3. 작가 (편집): 메인 엔딩 B 이름을 바꾸거나 삭제. 세계관 화면의 row가 자동 동기화되어 stale row가 남지 않는다.

3. 핵심 기능 요구사항

3-1. 클라이언트 (스튜디오)

세계관 화면: 엔딩 프롬프트 목록

  • 주요 동작: 작가가 작품의 main ending 각각에 대해 "엔딩 프롬프트"(메인 엔딩 이후 world prompt override)를 작성/수정/제거할 수 있다.
  • 노출 조건: 작품에 main ending이 1개 이상 존재할 때만 섹션 노출. 0개면 섹션 숨김.
  • 목록 구성: main ending별 1 row.
    • 엔딩명 (작가가 설정한 이름)
    • 상태 배지: 기본 세계관 사용 / 별도 프롬프트 사용
    • 액션 버튼: 작성하기 (override 없음) / 수정하기 (override 있음)
  • 편집 화면:
    • 기존 세계관 프롬프트 편집 UX와 동일한 textarea
    • 저장 / 취소
    • "기본 세계관으로 되돌리기" 액션 (override 자체를 제거 → 기본 세계관 사용 상태로 복귀)
  • 비즈니스 룰:
    • override 상태는 3가지: 없음 / 있음+빈값 / 있음+입력값
      • 없음: row 상태 = 기본 세계관 사용. 런타임에서 기본 world prompt 사용.
      • 있음+빈값: row 상태 = 별도 프롬프트 사용. 런타임에서 빈 문자열을 override로 적용 (= world prompt 비활성). 작가의 의도적 선택으로 간주.
      • 있음+입력값: row 상태 = 별도 프롬프트 사용. 런타임에서 입력값을 system prompt로 사용.
    • 기본 세계관으로 되돌리기 = 있음 → 없음 전이. 빈 문자열로 저장과 의미가 다름.
    • override는 main ending별 독립. 한 작품 내 다른 엔딩에 영향 주지 않음.
  • 상태별 동작:
    • main ending이 새로 추가되면 row가 자동 생성되고 기본은 기본 세계관 사용.
    • main ending이 삭제되면 해당 override도 함께 삭제 (orphan 방지).
    • main ending 이름이 변경되면 row의 엔딩명도 동기화.

메인 엔딩 노드 편집 패널: 엔딩 프롬프트 작성 진입

  • 주요 동작: 작가가 메인 엔딩 노드를 선택/편집하는 흐름 안에서도 해당 엔딩의 엔딩 프롬프트를 작성/수정할 수 있다.
  • 노출 조건: 선택한 이벤트 노드가 main ending일 때만 노출. 일반 이벤트/sub ending에는 노출하지 않는다.
  • 데이터 동기화: 노드 안에서 저장한 값은 세계관 화면의 동일 ending row 상태와 즉시 동기화된다. 세계관 화면에서 저장한 값도 노드 편집 패널에 동일하게 표시된다.
  • 표현 원칙: 노드 편집 패널은 해당 엔딩 1개의 prompt 편집 진입점이고, 전체 main ending 목록/상태 관리는 세계관 화면이 담당한다.

세계관 화면의 기존 동작

  • 기존 "기본 세계관 프롬프트" 입력 UX·저장 동작은 그대로 유지.
  • 본 기능은 그 아래(또는 인접 영역)에 엔딩 프롬프트 목록으로 추가되며 기본 prompt 작성/수정 흐름을 막지 않는다.

3-2. 클라이언트 (앱/플레이)

메인 엔딩 → 이어하기 → 자유 플레이

  • 주요 동작: 플레이어가 메인 엔딩 화면에서 이어하기를 탭하면, 해당 엔딩의 override 설정에 따라 자유 플레이의 system prompt가 결정된다.
  • 비즈니스 룰:
    • 자유 플레이 진입 시 활성 world prompt 선택 규칙:
      1. 도달한 main ending에 override가 있음+입력값 → 입력값을 system prompt로 사용
      2. override가 있음+빈값 → 빈 문자열을 system prompt로 사용 (world prompt 비활성)
      3. override가 없음 또는 도달한 엔딩이 main ending이 아닌 경우 → 기본 world prompt 사용
    • sub ending 도달 후 흐름은 변경 없음. (이어하기 불가 — 본 기능 범위 외)
    • 메인 엔딩 화면 이전 구간(엔딩 도달 전)에는 어떤 경우에도 override가 적용되지 않는다. 이어하기 진입 시점부터 적용.
    • 사용자가 이어하기로 자유 플레이에 진입한 뒤에도, 이전 scene으로 돌아가 메인 엔딩 이전 scene을 다시 생성하는 경우에는 post-main-ending override를 쓰지 않고 기본 world prompt를 적용한다.
  • 적용 단위: prompt 선택은 play 전체 고정값이 아니라 generation 대상 scene의 위치/상태 기준으로 판단한다. 메인 엔딩 이후 자유 플레이 scene 생성에는 override를 적용하고, 메인 엔딩 이전 scene 재생성에는 기본 world prompt를 적용한다. 이어하기로 재진입할 때마다 publish snapshot 기준으로 재평가.

3-3. 백엔드 / 시스템

  • Publish snapshot 확장: Studio publish 시 Episode Content snapshot에 main ending별 world prompt override가 함께 저장된다.
    • 자료 구조 (의도 수준): mainEndings: [{ endingId, name, worldPromptOverride: { mode: 'inherit' | 'override', value?: string } }]
    • mode: 'inherit' = override 없음. mode: 'override' + value: '' = 빈값 override. mode: 'override' + value: '...' = 입력값 override.
  • Generation context: scene generation context 빌드 시, play-local 도달 ending 정보 + publish snapshot의 override 매핑 + generation 대상 scene의 위치/상태를 결합해 system prompt 결정.
    • generation 대상이 메인 엔딩 이후 자유 플레이 scene이면 해당 main ending의 override 규칙을 적용한다.
    • generation 대상이 메인 엔딩 이전 scene 재생성/수정이면, 사용자가 이미 이어하기를 누른 이력이 있더라도 기본 world prompt를 적용한다.
  • 기존/진행 중 play 영향: 변경 사항은 새로 시작하는 play부터 적용. 진행 중인 자유 플레이 세션은 영향 없음 (publish snapshot은 play 시작 시 본떠진 컨텍스트를 따름).

3-4. 딥링크 / URL 구조

해당 없음. 기존 /episode-play/:episodeId 진입 경로 그대로 사용.

3-5. Scope

포함 (In scope)

  • 스튜디오 세계관 화면 내 main ending별 override 관리 섹션
  • override 3상태(없음 / 있음+빈값 / 있음+입력값) 저장·노출·런타임 적용
  • main ending 추가/삭제/이름 변경에 따른 row 동기화
  • publish snapshot에 override 매핑 포함
  • 이어하기로 자유 플레이 진입 시점부터 override 적용
  • 진행 중 play에 영향 없음 (snapshot 기반 격리)
  • override 적용 여부를 검증/분석할 수 있는 로깅

제외 (Out of scope)

  • sub ending에 대한 override (이어하기 불가)
  • 일반 자유 플레이(엔딩 미도달) 진입 시 override 적용
  • World prompt 외 다른 EpisodeDraftConfig 항목(prevent impersonation, dice, character solo, view mode, model alias)의 ending별 override
  • 자유 플레이에서 다시 본편 흐름으로 되돌아가는 모드 전환 UX
  • 작가용 override preview/테스트 플레이 도구

4. 에러 처리 및 예외 상황

상황처리 방향
publish 후 main ending이 추가된 경우(snapshot에 없는 ending)snapshot 기준으로만 판단 → 새 main ending은 다음 publish 전엔 override 없는 상태로 동작
main ending이 삭제된 작품을 이전에 플레이하던 유저가 이어하기그 play는 자기 시점의 snapshot을 따르므로 기존 동작 유지. 새 play에선 해당 ending 자체가 사라짐.
override 입력값이 매우 길어 모델 컨텍스트 한계 근접기본 world prompt와 동일 정책으로 처리 (별도 룰 없음 — 정책 일치). 한도 정책은 기존 세계관 입력 한도와 같게 둔다.
빈값 override 저장 시 작가가 의도치 않게 저장했을 위험저장 시점에 별도 confirm 없이 즉시 저장하되, row 상태 별도 프롬프트 사용 배지 + "내용 없음" 보조 텍스트로 명확히 표시
네트워크 오류로 override 저장 실패일반 폼 저장 실패와 동일 처리 (에러 토스트 + 재시도)
이어하기 이후 이전 scene으로 돌아가 엔딩 전 scene 재생성generation 대상 scene이 메인 엔딩 이전이면 기본 world prompt 사용. 이어하기 이력만으로 override를 전역 적용하지 않음.

5. 데이터 분석

5.1 핵심 지표

  1. 0턴 이탈률: main ending 최초 도달 후 후속 completed scene이 없는 play 비율. 최근 30일 baseline 35.6% → 목표 25% 이하.
  2. 후속 turn median: main ending 이후 이어하기로 자유 플레이에 진입한 play의 후속 completed scene/turn count median. 최근 30일 baseline 4턴 → 목표 6턴 이상.
  3. 5턴 이상 지속률: 이어하기 이후 후속 turn count 5 이상 비율. 최근 30일 baseline 49.0% → 목표 55% 이상.
  4. 10턴+ 비율: 최근 30일 baseline 41.4%. 이미 높은 편이므로 “깊게 남는 유저 유지” 가드레일로 추적.
  5. override 작성률: 출간작의 main ending 중 override가 작성된 비율.
  6. override 적용률: 자유 플레이 진입 중 override가 실제 적용된 세션 비율.

데이터 베이스라인

기준: main_ending 최초 도달 play, staff 제외. 이어하기 클릭률은 click_play_ending_action event의 action_type = continue 기준으로 산출한다. 아래 이어하기율은 main ending 이후 completed scene 발생으로 추정한 기존 proxy 값이므로, 클릭 이벤트 기준으로 재산출 필요.

기간main 도달 play/user이어하기 proxy play/user이어하기 proxy율avg / median / p75 / p90
최근 30일1,383 / 1,013890 / 73164.4%47.6 / 4 / 26 / 83
최근 7일249 / 201152 / 13461.0%40.1 / 3 / 23 / 72
전체 누적4,478 / 3,1572,939 / 2,30265.6%52.0 / 5 / 27 / 88

최근 30일 후속 turn 분포:

후속 turnplay비중
0턴49335.6%
1~2턴1309.4%
3~4턴836.0%
5~9턴1057.6%
10턴+57241.4%

판단:

  • 초반 이탈은 크다. 최근 30일 기준 main ending 도달 후 35.6%가 0턴이다.
  • 하지만 남는 유저는 깊게 간다. 10턴 이상 41.4%, p90은 83턴이다.
  • 평균은 긴 꼬리에 끌린다. 최근 30일 p99 684턴, 최대 4,223턴이므로 median 4턴이 더 현실적인 기준선이다.
  • 최대 에피소드 하트하우스 제외 후에도 median 4턴, 0턴 35.7%로 거의 같아 특정 대형 에피소드 하나가 전체 패턴을 만든 것은 아니다.

5.2 로깅 이벤트

컨벤션: snake_case, 동사_명사. 기존 episode-player / studio 그룹 우선 재사용.

타입이름용도파라미터그룹상태
Eventapply_post_main_ending_world_prompt자유 플레이 진입 시 어떤 모드의 world prompt가 적용됐는지 기록episode_id, play_id, main_ending_id, override_mode(inherit/override_empty/override_value)episode-player🆕 신규
Eventsave_post_main_ending_world_prompt작가가 override를 저장/수정/제거할 때episode_id(draft), main_ending_id, override_mode 전이(from/to)studio🆕 신규
Eventview_post_main_ending_world_prompt_section세계관 화면에서 섹션이 노출됐을 때 (작가가 접근했는지 측정)episode_id(draft), main_ending_countstudio🆕 신규

6. Ubiquitous Language

TermKoreanDefinitionDo Not Confuse WithPrimary Domain상태
Post-main-ending World Prompt Override메인 엔딩 이후 세계관 프롬프트특정 main ending에 도달한 후 자유 플레이에서 system prompt로 사용되는 main-ending별 world prompt 대체값. 3상태(inherit / override+empty / override+value)를 가짐.기본 World Prompt(전역) / Sub ending prompt(범위 외)Studio + Play신규

기존 UL의 World Prompt, Main Ending, Episode Content snapshot, EpisodeDraftConfig는 재사용. 변경 없음.


7. Open Questions

  • [ ] 있음+빈값 override를 UI에서 별도 시각화할지 — 현재는 별도 프롬프트 사용 배지 + 보조 텍스트로 표현. 작가에게 충분히 명확한지 spec 단계에서 디자이너 확인. (디자이너)
  • [ ] 세계관 입력 길이 제한과의 정합성 — override 입력값에 기본 world prompt와 같은 글자 수 제한을 두는지, 또는 각각 별도 한도인지. (엔지니어)
  • [ ] 스튜디오 미리보기/테스트 플레이에서 override 동작 여부 — 본 프로젝트 범위는 publish snapshot 기반 자유 플레이 적용. 스튜디오 내 테스트 플레이에도 적용할지 별도 결정 필요. (PM)

부록: 메타 정보

Required artifacts

  • [x] Spec (needs-spec) — 세계관 화면 섹션 UI/상태/인터랙션 + 자유 플레이 진입 시점 적용 규칙 명세
  • [x] Design (needs-design) — 세계관 화면 메인 엔딩 이후 프롬프트 섹션 시안 (row, 상태 배지, 편집 화면)
  • [ ] QA scenarios — Sprint planning 단계에서 작성
  • [ ] Migration plan — publish snapshot 스키마 확장이지만 기존 publish 데이터는 inherit-only로 자연 호환 → 별도 migration 불필요
  • [x] Tracking events (needs-tracking) — §5.2 신규 3개 이벤트 정의

진행 패턴

  • [x] Pattern 1: Spec → Design (스튜디오 화면 변경은 spec 먼저, 시각 탐색은 그 다음)

Size & Risks

T-shirt Size

  • Size: S
  • Confidence: medium
  • 추정 근거: 스튜디오 세계관 화면에 섹션 1개 추가 + publish snapshot에 매핑 추가 + 자유 플레이 system prompt 선택 분기 1개. 영향 모듈 분명함. 기존 generation context 빌드 로직에 분기 추가가 가장 큰 변수.

주요 위험 요소

위험영향대응
자유 플레이 generation context 빌드 시 override 미적용 회귀엔딩별 override가 적용되지 않거나, 반대로 override 없는 엔딩에 잘못 주입로깅 apply_post_main_ending_world_prompt로 매 세션 적용 모드 추적, QA 시나리오에서 3상태 × 도달 ending 매트릭스 검증
publish snapshot 확장에 따른 기존 작품 호환성기존 publish 데이터에 override 필드 없음결측 = inherit로 해석. migration 불필요.
빈값 override의 의도성 모호작가가 실수로 비워 저장하면 자유 플레이 system prompt가 비어버림UI 상태 배지 + 보조 텍스트, 추후 데이터 보고 confirm UX 추가 검토

의존성

  • 다른 작업: 없음
  • 다른 팀: BE (publish snapshot 스키마 확장), FE-스튜디오 (세계관 화면), FE-앱 (자유 플레이 진입 context 선택)
  • 외부 요인: 없음

References


🔍 검토 필요

🚨 결정 필요 (큰 결정)

  • (없음 — 방향성·범위는 Linear 이슈 본문에서 모모가 confirmed decisions로 픽스함)

⚠️ 추정 (정보 부족하지만 진행)

  • 성공 지표 baseline 수치는 데이터 agent 호출 전이라 비워둠 (§1.5)
  • override 입력값 글자 수 제한은 기본 world prompt와 동일하다고 가정 (§4, §7)
  • 신규 로깅 이벤트의 group 할당(episode-player / studio)은 기존 컨벤션 기반 추정. event-docs에 등록할 때 최종 확정.

❓ 외부 agent 호출 필요

  • 데이터 agent: 현재 메인 엔딩 도달 유저의 자유 플레이 평균 턴 수, 3턴 이내 이탈률 baseline 측정 (§1.5)
  • 코드 agent: EpisodeDraftConfig 및 publish snapshot 직렬화 위치 확인 — main ending override 필드를 자연스럽게 끼울 수 있는 지점 (§3-3)
  • 코드 agent: 자유 플레이 generation context 빌드 진입점 확인 — 도달 ending 정보가 이미 play-local에 있는지, 없다면 어디서 가져오는지 (§3-3)
  • 디자이너 / Figma: 세계관 화면 메인 엔딩 이후 프롬프트 섹션 시안 (Spec 단계에서)