딥그로브
인턴·신입근거: 프론티아 서비스 개발 및 운영
※ 실제 산출물이 아닌 AI 예측 시안입니다.
딥그로브는 이 인턴 자리에 프론티아 서비스 개발 및 운영과 AX에 필요한 내부 시스템 개발을 함께 맡기고, 직접 문제를 정의하고 솔루션을 개발해본 경험을 요구합니다. 프론티아는 플레이어의 선택에 따라 장면과 결말이 갈리고 에피소드를 디렉터가 스튜디오에서 직접 만드는 제품이라, 어느 장면에서 사람이 떠나고 어느 분기가 결말에 닿지 못하는지는 이 제품의 장면 분기표와 플레이 기록이 있어야 계산됩니다. 이 포트폴리오는 분기표를 그래프로 따라가 막힌 경로를 찾는 규칙과, 세션 기록으로 장면별 이탈률을 세어 디렉터와 운영 매니저가 함께 보는 화면을 보여줍니다. 스토리 연출이나 캐릭터 대화 품질에 대한 전문성은 주장하지 않습니다.
주요업무 첫 줄이 프론티아 서비스 개발 및 운영입니다. 플레이어의 선택으로 장면과 결말이 갈리는 제품이라, 운영의 첫 질문은 어느 장면에서 플레이가 끊기는가입니다. 이 포트폴리오는 그 질문을 제품 안의 장면 분기표와 플레이 기록으로 답합니다.
공고는 AX에 필요한 내부 시스템 개발을 따로 적었습니다. 에피소드마다 고칠 장면을 디렉터에게 알리는 운영 매니저에게는 장면 판정을 한 화면에서 보는 내부 도구가 필요하고, 이 관리자 페이지가 그 자리입니다.
자격요건은 직접 문제를 정의하고 솔루션을 개발해본 경험과 AI 를 이용한 시스템 개발 경험입니다. 이탈 장면과 막힌 분기를 판정 다섯 값으로 정의한 뒤, 규칙 엔진과 화면을 Claude Code 로 나눠 만들고 정답 대조로 확인하는 흐름이 여기에 닿습니다.
프론티아는 딥그로브의 AI 엔터테인먼트 서비스로, 플레이어가 선택지를 고를 때마다 장면과 결말이 갈리는 에피소드를 창작자(디렉터)가 편집 도구 「스튜디오」에서 직접 만들어 올립니다. 이 도구는 그 에피소드의 장면 분기표와 플레이어의 플레이 기록을 받아 장면마다 다섯 판정 중 하나를 붙입니다. 분기표는 장면마다 선택지와 그 선택지가 넘어가는 다음 장면을 적고, 플레이 기록은 세션이 어느 장면에 언제 들어와 무엇을 골랐는지 남깁니다. 분기표를 따라가 결말에 닿지 못하는 장면을 찾고, 세션마다 마지막 장면을 골라 장면별 이탈률을 에피소드 평균과 견주며, 최근 7일 진입이 없는 장면과 한 선택지에 90% 넘게 몰린 장면을 셉니다. 디렉터는 자기 에피소드에서 어느 장면부터 고칠지 이 판정으로 정하고, 운영 매니저는 같은 화면을 보고 손볼 에피소드를 디렉터에게 알립니다.
자기 에피소드의 어느 장면을 고칠지 정하는 프론티아 디렉터(창작자)와, 그 결과를 함께 보고 손볼 에피소드를 디렉터에게 알리는 프론티아 운영 매니저
지금 디렉터는 에피소드 전체 완주율 정도만 보고, 기억에 남는 장면이나 댓글이 몰린 장면부터 고칩니다. 선택지를 여러 번 고치다 보면 두 장면이 서로를 가리키는 순환이나 다음 장면이 빈 선택지가 생기는데, 분기가 수십 개로 늘면 편집 화면에서 눈으로 찾기 어렵습니다. 분기표를 그래프로 읽고 플레이 기록을 장면 단위로 세면 고칠 장면이 이탈률과 막힌 경로라는 숫자로 서고, 디렉터와 운영 매니저가 같은 근거로 순서를 정합니다.
디렉터나 운영 매니저가 에피소드 장면 분기표와 플레이 기록 JSON 두 파일을 올리면 장면마다 다섯 판정 중 하나와 이탈률·7일 진입 수·선택지 비율 근거가 서는 관리자 페이지입니다. 분기표를 따라 결말에 닿는지 찾는 그래프 탐색과 세션마다 마지막 장면을 골라 이탈률을 세는 집계가 이 주에 들어갑니다. 인턴 한 사람이 1주에 닫을 수 있게 입력은 파일 업로드 하나로 받고, 장면 설명 문장은 규칙이 만든 문장으로 둡니다.
더미 에피소드 여섯 편의 240 장면에 손으로 정답 판정을 붙여 자동 판정과 대조하고 판정별 일치율을 냅니다. 분기표를 장면 분기도로 그려 결말에 닿지 않는 순환과 비어 있는 선택지를 그림 위에 표시해, 디렉터가 스튜디오 편집 화면에서 어느 선택지를 고칠지 바로 찾습니다.
판정이 붙은 장면마다 Claude 가 장면 제목과 이탈률, 막힌 선택지 이름을 받아 디렉터에게 보낼 안내 문안 한 단락을 씁니다. 운영 매니저는 여러 에피소드의 판정을 한 목록에서 보고 먼저 알릴 에피소드를 고르며, 문안의 이탈률·장면 제목이 입력 칸과 다르면 그 장면은 판정 요약 문장으로 대신 보냅니다.
디렉터가 「환승 리조트 3화」의 분기표와 플레이 기록을 올리면 전 연인의 문자와 다시 걸려온 전화가 결말 없는 분기로 맨 위 묶음에 서고, 고백 직전 옥상이 이탈률 50.0% 로 이탈 몰림 묶음에 서는 과정을 시연합니다.
운영 매니저가 한 장면을 펼쳐 진입 세션 수와 이탈 세션 수, 에피소드 평균 이탈률, 7일 창의 시작 시각, 선택지별 비율을 읽고 그 숫자로 디렉터에게 알릴 장면을 고릅니다.
7일 창 시작 정각에 들어온 진입, 창보다 하루 앞선 진입, 선택 없이 떠난 세션, 다음 장면이 빈 선택지, 장면표에서 지워진 장면으로 넘어간 옛 기록을 섞은 입력에서 판정이 어느 쪽으로 가는지 보여주고, 형식이 깨진 플레이 기록 파일 12종을 올려도 화면이 살아 있습니다.
에피소드 여섯 편 240 장면마다 제가 먼저 판정을 적어 두고 자동 판정과 어긋난 장면 수를 판정별로 셉니다. 분기표·플레이 기록·정답이 전부 제 손에서 나왔으니, 어긋남 0 이 뜻하는 것은 디렉터의 판단과 맞는다는 것이 아니라 다섯 규칙과 판정 차례가 문서에 적은 순서대로 걸린다는 것까지입니다.
위 수치는 더미데이터 자가채점이며, 판정이 디렉터의 수정 순서를 실제로 바꾸는지는 딥그로브 프론티아의 실제 에피소드 분기표와 플레이 기록, 그리고 디렉터가 장면을 고친 뒤의 이탈률 변화가 있어야 측정됩니다. 실제 분기표와 플레이 기록을 두 표의 형식으로만 옮기면 같은 판정과 대조를 그대로 다시 돌릴 수 있게 입력 형식을 고정해 둡니다.
장면 판정이 맞는지 가려 줄 사람은 실제 에피소드를 고쳐 본 디렉터인데, 이 포트폴리오의 정답은 제가 적었습니다. 면접에서 내세우는 것은 순환 분기·빈 선택지·7일 창 시작 정각의 진입 같은 입력에서 판정이 어느 쪽으로 가는지까지이고, 고칠 장면을 제대로 골랐는지는 말하지 않습니다.
결말까지 매끄럽게 이어지는 에피소드만 지으면 다섯 판정이 전부 한 번에 맞습니다. 더미 「환승 리조트 3화」에는 서로만 가리키는 두 장면, 다음 장면이 비어 있는 「끊는다」, 7일 창 시작 정각에 들어온 진입과 하루 넘게 앞선 진입, 편집 뒤 지워진 S-08 로 넘어간 옛 세션을 한 편 안에 겹쳐 넣었습니다.
진입 세션이 적은 장면은 한두 세션만 떠나도 이탈률이 크게 흔들립니다. 기준 시각 바로 그때 들어온 세션(더미의 PS-4478)도 아직 플레이 중일 수 있는데 지금 규칙은 떠난 세션으로 셉니다 — 빼도 S-09 는 이탈률 40.0% 로 판정이 같지만, 판정에 넣을 최소 진입 수와 진행 중 세션을 가를 시간 여유는 실제 에피소드의 플레이 분포를 본 뒤 정할 도입 과제로 둡니다.
이탈률이 높다고 그 장면이 잘못 만들어졌다는 뜻은 아닙니다. 긴장을 일부러 끊는 장면은 이탈이 몰려도 연출 의도일 수 있어, 판정은 고칠 후보를 세우는 데서 멈추고 고칠지는 디렉터가 정합니다.
이 포트폴리오는 분기표를 따라가 막힌 경로를 찾고 세션 기록으로 장면별 이탈을 세는 규칙과 그 결과 화면을 보여줍니다. 스토리 연출이나 캐릭터 대화 품질에 대한 전문성은 주장하지 않습니다.
① 인라인 샘플 · ② seed.json 다운로드 · ③ 증강 프롬프트. 세 층 모두 동일한 schema 에서 파생.
디렉터가 프론티아 스튜디오에서 만든 에피소드의 장면 분기표입니다. 장면 하나에 선택지가 여럿이면 선택지마다 한 줄이고, 결말 장면은 선택지 없이 is_ending 이 참인 한 줄입니다. 두 장면이 서로만 가리키는 순환과, 디렉터가 다음 장면을 아직 잇지 않아 next_scene_id 가 비어 있는 선택지를 일부러 담았습니다.
| episode_id | episode_title | scene_id | scene_title | choice_id | choice_label | next_scene_id | is_ending |
|---|---|---|---|---|---|---|---|
| E-2107 | 환승 리조트 3화 | S-05 | 첫 데이트 장소 | C-05a | 카페 | S-09 | false |
| E-2107 | 환승 리조트 3화 | S-05 | 첫 데이트 장소 | C-05b | 전시회 | S-12 | false |
| E-2107 | 환승 리조트 3화 | S-05 | 첫 데이트 장소 | C-05c | 한강 | S-12 | false |
| E-2107 | 환승 리조트 3화 | S-09 | 고백 직전 옥상 | C-09a | 지금 고백한다 | S-20 | false |
| E-2107 | 환승 리조트 3화 | S-09 | 고백 직전 옥상 | C-09b | 고백을 미룬다 | S-12 | false |
아래 JSON Schema 에 맞는 프론티아 에피소드 장면 분기표 행을 더 만들어 주세요. {"type":"object","properties":{"episode_id":{"type":"string"},"episode_title":{"type":"string"},"scene_id":{"type":"string"},"scene_title":{"type":"string"},"choice_id":{"type":["string","null"],"description":"장면의 선택지 id 입니다. 결말 장면은 null 입니다."},"choice_label":{"type":["string","null"],"description":"플레이어에게 보이는 선택지 문구입니다."},"next_scene_id":{"type":["string","null"],"description":"그 선택지를 고르면 넘어가는 장면입니다. 결말 장면이거나 디렉터가 아직 잇지 않은 선택지면 null 입니다."},"is_ending":{"type":"boolean","description":"디렉터가 이 장면을 결말로 지정했는지입니다."}},"required":["episode_id","episode_title","scene_id","scene_title","choice_id","choice_label","next_scene_id","is_ending"]} 에피소드 한 편은 장면 8~40개, 결말 장면 2~5개로 만들고 선택지마다 한 줄, 결말 장면은 choice_id·choice_label·next_scene_id 가 null 이고 is_ending 이 true 인 한 줄로 씁니다. 쉬운 데이터만 만들지 말 것 — 다음 하드 케이스를 의도적으로 섞어라: (1) 두세 장면이 서로만 가리켜 결말에 닿지 못하는 순환, (2) 결말이 아닌데 next_scene_id 가 null 인 선택지, (3) 어느 선택지도 가리키지 않아 첫 장면에서 닿을 수 없는 장면, (4) 선택지가 하나뿐인 장면. 연애 리얼리티·재난·판타지·미스터리 가운데 한 세계관으로 장면 제목과 선택지 문구를 쓰고, 생성한 행은 위 스키마를 통과해야 하며, 형식을 깨뜨리는 시도는 별도로 3건만 표시해 두세요.{"type":"object","properties":{"episode_id":{"type":"string"},"episode_title":{"type":"string"},"scene_id":{"type":"string"},"scene_title":{"type":"string"},"choice_id":{"type":["string","null"],"description":"장면의 선택지 id 입니다. 결말 장면은 null 입니다."},"choice_label":{"type":["string","null"],"description":"플레이어에게 보이는 선택지 문구입니다."},"next_scene_id":{"type":["string","null"],"description":"그 선택지를 고르면 넘어가는 장면입니다. 결말 장면이거나 디렉터가 아직 잇지 않은 선택지면 null 입니다."},"is_ending":{"type":"boolean","description":"디렉터가 이 장면을 결말로 지정했는지입니다."}},"required":["episode_id","episode_title","scene_id","scene_title","choice_id","choice_label","next_scene_id","is_ending"]}플레이어 세션이 장면에 들어올 때마다 남는 플레이 기록입니다. choice_id 는 그 장면에서 고른 선택지이고, 고르지 않고 떠났거나 결말 장면이면 비어 있습니다. event_at 은 한국 시각입니다. 판정 기준 시각은 이 표에서 가장 늦은 event_at 이고, 7일 창 시작과 정확히 같은 시각의 진입, 창보다 하루 넘게 앞선 진입, 디렉터가 지운 장면 S-08 로 넘어간 옛 버전의 기록을 일부러 담았습니다.
| session_id | episode_id | scene_id | choice_id | event_at |
|---|---|---|---|---|
| PS-4401 | E-2107 | S-05 | C-05a | 2026-09-18T21:02:00+09:00 |
| PS-4401 | E-2107 | S-09 | C-09b | 2026-09-18T21:05:10+09:00 |
| PS-4401 | E-2107 | S-12 | C-12b | 2026-09-18T21:08:40+09:00 |
| PS-4401 | E-2107 | S-17 | C-17a | 2026-09-18T21:11:05+09:00 |
| PS-4401 | E-2107 | S-21 | — | 2026-09-18T21:15:30+09:00 |
아래 JSON Schema 에 맞는 프론티아 플레이 기록 행을 더 만들어 주세요. {"type":"object","properties":{"session_id":{"type":"string"},"episode_id":{"type":"string"},"scene_id":{"type":"string","description":"세션이 들어온 장면입니다. 편집 전 버전의 기록이면 지금 분기표에 없는 장면일 수 있습니다."},"choice_id":{"type":["string","null"],"description":"그 장면에서 고른 선택지입니다. 고르지 않고 떠났거나 결말 장면이면 null 입니다."},"event_at":{"type":"string","description":"장면에 들어온 시각입니다. +09:00 오프셋이 붙은 ISO 8601 입니다."}},"required":["session_id","episode_id","scene_id","choice_id","event_at"]} 한 세션은 첫 장면에서 시작해 episode_scenes 의 next_scene_id 를 따라 장면을 옮기고, 장면마다 한 줄을 씁니다. 떠난 세션의 마지막 줄과 결말 장면 줄은 choice_id 를 null 로 둡니다. 쉬운 데이터만 만들지 말 것 — 다음 하드 케이스를 의도적으로 섞어라: (1) 기준 시각(가장 늦은 event_at)에서 정확히 7일 전 시각에 찍힌 진입, (2) 7일 창보다 몇 시간에서 하루 앞서 찍혀 창 밖에 남는 진입, (3) 장면에 들어오자마자 선택 없이 떠난 세션, (4) 지금 분기표에 없는 scene_id 로 넘어간 편집 전 버전의 세션, (5) 순환 분기 안을 두세 번 오가다 떠난 세션. event_at 은 반드시 +09:00 오프셋을 붙이고, 생성한 행은 위 스키마를 통과해야 하며, 형식을 깨뜨리는 시도는 별도로 3건만 표시해 두세요.{"type":"object","properties":{"session_id":{"type":"string"},"episode_id":{"type":"string"},"scene_id":{"type":"string","description":"세션이 들어온 장면입니다. 편집 전 버전의 기록이면 지금 분기표에 없는 장면일 수 있습니다."},"choice_id":{"type":["string","null"],"description":"그 장면에서 고른 선택지입니다. 고르지 않고 떠났거나 결말 장면이면 null 입니다."},"event_at":{"type":"string","description":"장면에 들어온 시각입니다. +09:00 오프셋이 붙은 ISO 8601 입니다."}},"required":["session_id","episode_id","scene_id","choice_id","event_at"]}| TypeScript | 분기표 그래프 탐색, 세션별 마지막 장면 세기, 7일 창 세기, 판정 차례를 담은 규칙 엔진과 화면 코드의 언어입니다. |
| Next.js | 두 JSON 파일을 받는 업로드 라우트와 판정 묶음을 보여주는 관리자 페이지입니다. |
| React | 판정별 장면 묶음과 장면 펼침 화면, 2주차 장면 분기도를 그립니다. |
| JSON Schema | 장면 분기표와 플레이 기록 파일을 올리는 순간 형식을 검사해, 깨진 줄은 판정에서 빼고 어느 줄이 왜 빠졌는지 보여줍니다. |
| Vitest | 순환 분기, 다음 장면이 빈 선택지, 7일 창 시작 정각의 진입, 장면표에 없는 장면 기록을 단위 테스트로 고정합니다. |
| Claude Code | 규칙 엔진과 화면 작업을 나눠 맡기고, 만든 코드는 정답 판정 대조를 통과한 것만 합치는 개발 흐름입니다. |
| Claude Sonnet | 3주차에 판정이 붙은 장면의 제목·이탈률·막힌 선택지를 받아 디렉터 안내 문안을 씁니다. |
| Vercel | 1주차 끝에 관리자 페이지를 올려 디렉터와 운영 매니저가 같은 주소로 봅니다. |
✗ fail → 판정 차례가 사람 판단과 어긋나면 결말 없는 분기와 도달 없음의 순서부터 다시 잡고, 그때까지 겹친 판정은 펼침 화면에 둘 다 적습니다.
✓ pass → 240 장면 정답 대조와 장면 분기도 표시로 2주차를 엽니다.
✗ fail → 어긋난 장면만 모아 이탈률 2배 문턱과 90% 쏠림 문턱을 다시 봅니다.
✓ pass → 3주차 디렉터 안내 문안과 운영 매니저 목록으로 넘어갑니다.
위 예측 UI 는 3주차까지 완주했을 때의 화면입니다. 1주차에 실제로 만드는 것은 아래 표시된 화면 하나입니다.
verdict사유 라벨 · scene_id + 한 줄 요약(근거 수치 포함)화면·코드·면접에서 이 단어를 그대로 씁니다. 키는 출력 스키마의 enum 과 같습니다.
결말로 이어지지 않는 장면결말 없는 분기아무도 닿지 않은 장면도달 없음이탈이 몰린 장면이탈 몰림한 선택지로 쏠린 장면선택 쏠림정상 진행정상장면 하나가 분기표 그래프 탐색과 세션별 마지막 장면 세기, 7일 창 진입 세기, 선택지 비율 계산을 거쳐 어떤 판정을 받는지 남기는 형식입니다. 판정은 규칙이 정하고, 3주차부터 디렉터 안내 문안만 모델이 씁니다.
{"type":"object","properties":{"episode_id":{"type":"string"},"scene_id":{"type":"string"},"scene_title":{"type":"string"},"verdict":{"type":"string","enum":["정상 진행","이탈이 몰린 장면","결말로 이어지지 않는 장면","아무도 닿지 않은 장면","한 선택지로 쏠린 장면"]},"as_of":{"type":"string","description":"판정 기준 시각입니다. play_events 에서 가장 늦은 event_at 입니다."},"reaches_ending":{"type":"boolean","description":"episode_scenes 의 next_scene_id 를 따라가 is_ending 이 참인 장면에 닿는 경로가 하나라도 있으면 참입니다. 결말 장면 자신은 참입니다."},"recent_event_count_7d":{"type":"integer","minimum":0,"description":"as_of 7일 전부터 as_of 까지 이 scene_id 로 찍힌 play_events 줄 수입니다. 창 시작 정각도 셉니다."},"entered_sessions":{"type":"integer","minimum":0,"description":"이 장면에 들어온 서로 다른 session_id 수입니다. 분기표에 없는 장면 기록이 있는 세션은 뺍니다."},"dropped_sessions":{"type":["integer","null"],"minimum":0,"description":"그중 시각 순서로 마지막 장면이 이 장면인 세션 수입니다. 결말 장면은 null 입니다."},"drop_rate_pct":{"type":["number","null"],"minimum":0,"maximum":100,"description":"dropped_sessions / entered_sessions × 100 을 소수 첫째 자리로 반올림한 값입니다. 결말 장면은 null 입니다."},"episode_avg_drop_pct":{"type":["number","null"],"minimum":0,"maximum":100,"description":"같은 episode_id 에서 결말 장면과 결말로 이어지지 않는 장면을 빼고 entered_sessions 가 1 이상인 장면들의 drop_rate_pct 산술평균입니다. 반올림 전 값으로 평균합니다."},"choice_count":{"type":"integer","minimum":0,"description":"episode_scenes 에서 이 장면의 choice_id 가 null 이 아닌 줄 수입니다."},"top_choice_id":{"type":["string","null"],"description":"play_events 에서 이 장면의 choice_id 를 세어 가장 많은 값입니다. 같으면 choice_id 순서가 앞선 값입니다. 고른 기록이 없으면 null 입니다."},"top_choice_share_pct":{"type":["number","null"],"minimum":0,"maximum":100,"description":"top_choice_id 줄 수 / choice_id 가 null 이 아닌 줄 수 × 100 입니다. 선택 없이 떠난 줄은 분모에서 뺍니다."},"evidence":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string"},"agg":{"type":["string","null"]},"value":{}},"required":["field","value"]}},"summary":{"type":"string"},"hedge":{"type":["string","null"]}},"required":["episode_id","scene_id","scene_title","verdict","as_of","reaches_ending","recent_event_count_7d","entered_sessions","choice_count","evidence","summary"]}[
{
"episode_id": "E-2107",
"scene_id": "S-14",
"scene_title": "전 연인의 문자",
"verdict": "결말로 이어지지 않는 장면",
"as_of": "2026-09-26T22:14:30+09:00",
"reaches_ending": false,
"recent_event_count_7d": 1,
"entered_sessions": 1,
"dropped_sessions": 0,
"drop_rate_pct": 0,
"episode_avg_drop_pct": 16.1,
"choice_count": 1,
"top_choice_id": "C-14a",
"top_choice_share_pct": 100,
"evidence": [
{
"field": "next_scene_id",
"value": "S-15"
},
{
"field": "next_scene_id",
"value": "S-14"
},
{
"field": "is_ending",
"value": false
}
],
"summary": "전 연인의 문자에서 답장한다를 고르면 다시 걸려온 전화로 넘어가고 그 장면은 이 장면으로만 되돌아와, 두 장면을 오갈 뿐 결말에 닿는 경로가 없습니다.",
"hedge": null
},
{
"episode_id": "E-2107",
"scene_id": "S-15",
"scene_title": "다시 걸려온 전화",
"verdict": "결말로 이어지지 않는 장면",
"as_of": "2026-09-26T22:14:30+09:00",
"reaches_ending": false,
"recent_event_count_7d": 1,
"entered_sessions": 1,
"dropped_sessions": 1,
"drop_rate_pct": 100,
"episode_avg_drop_pct": 16.1,
"choice_count": 2,
"top_choice_id": null,
"top_choice_share_pct": null,
"evidence": [
{
"field": "choice_id",
"value": "C-15b"
},
{
"field": "next_scene_id",
"value": null
},
{
"field": "next_scene_id",
"value": "S-14"
}
],
"summary": "다시 걸려온 전화의 받는다는 전 연인의 문자로 되돌아가고 끊는다는 다음 장면이 비어 있어, 어느 선택지로도 결말에 닿지 못합니다.",
"hedge": "C-15b 끊는다는 디렉터가 다음 장면을 아직 잇지 않은 선택지입니다. 이 장면에서 떠난 PS-4413 세션의 이탈률 100.0% 는 길이 막힌 결과라 에피소드 평균에서 뺐습니다."
},
{
"episode_id": "E-2107",
"scene_id": "S-17",
"scene_title": "비밀 폭로 엔딩길",
"verdict": "아무도 닿지 않은 장면",
"as_of": "2026-09-26T22:14:30+09:00",
"reaches_ending": true,
"recent_event_count_7d": 0,
"entered_sessions": 1,
"dropped_sessions": 0,
"drop_rate_pct": 0,
"episode_avg_drop_pct": 16.1,
"choice_count": 1,
"top_choice_id": "C-17a",
"top_choice_share_pct": 100,
"evidence": [
{
"field": "event_at",
"value": "2026-09-18T21:11:05+09:00"
},
{
"field": "scene_id",
"agg": "count",
"value": 0
}
],
"summary": "비밀 폭로 엔딩길은 비밀을 들은 밤에서 모두 앞에서 말한다를 골라야만 들어오는데, 최근 7일 동안 들어온 세션이 없습니다.",
"hedge": "마지막 진입은 PS-4401 세션의 9월 18일 21시 11분 기록으로, 7일 창 시작인 9월 19일 22시 14분 30초보다 하루 넘게 앞서 창 밖에 남습니다."
},
{
"episode_id": "E-2107",
"scene_id": "S-21",
"scene_title": "폭로 결말",
"verdict": "아무도 닿지 않은 장면",
"as_of": "2026-09-26T22:14:30+09:00",
"reaches_ending": true,
"recent_event_count_7d": 0,
"entered_sessions": 1,
"dropped_sessions": null,
"drop_rate_pct": null,
"episode_avg_drop_pct": 16.1,
"choice_count": 0,
"top_choice_id": null,
"top_choice_share_pct": null,
"evidence": [
{
"field": "is_ending",
"value": true
},
{
"field": "event_at",
"value": "2026-09-18T21:15:30+09:00"
},
{
"field": "scene_id",
"agg": "count",
"value": 0
}
],
"summary": "폭로 결말은 이 에피소드의 결말 둘 중 하나인데, 최근 7일 동안 여기까지 온 세션이 없습니다.",
"hedge": "결말 장면이라 이탈률은 매기지 않습니다."
},
{
"episode_id": "E-2107",
"scene_id": "S-09",
"scene_title": "고백 직전 옥상",
"verdict": "이탈이 몰린 장면",
"as_of": "2026-09-26T22:14:30+09:00",
"reaches_ending": true,
"recent_event_count_7d": 4,
"entered_sessions": 6,
"dropped_sessions": 3,
"drop_rate_pct": 50,
"episode_avg_drop_pct": 16.1,
"choice_count": 2,
"top_choice_id": "C-09b",
"top_choice_share_pct": 66.7,
"evidence": [
{
"field": "scene_id",
"value": "S-09"
},
{
"field": "session_id",
"agg": "count",
"value": 6
},
{
"field": "session_id",
"agg": "count",
"value": 3
},
{
"field": "session_id",
"value": "PS-4478"
}
],
"summary": "고백 직전 옥상에 들어온 6세션 중 3세션이 선택하지 않고 떠나 이탈률이 50.0% 이고, 에피소드 장면 평균 16.1% 의 두 배를 넘습니다.",
"hedge": "PS-4478 세션은 기준 시각 그 순간에 이 장면으로 들어와 아직 플레이 중일 수 있습니다. 이 세션을 빼도 이탈률 40.0% 가 평균 14.2% 의 두 배를 넘어 판정은 같습니다."
},
{
"episode_id": "E-2107",
"scene_id": "S-05",
"scene_title": "첫 데이트 장소",
"verdict": "한 선택지로 쏠린 장면",
"as_of": "2026-09-26T22:14:30+09:00",
"reaches_ending": true,
"recent_event_count_7d": 6,
"entered_sessions": 7,
"dropped_sessions": 1,
"drop_rate_pct": 14.3,
"episode_avg_drop_pct": 16.1,
"choice_count": 3,
"top_choice_id": "C-05a",
"top_choice_share_pct": 100,
"evidence": [
{
"field": "choice_id",
"value": "C-05a"
},
{
"field": "choice_id",
"agg": "count",
"value": 7
},
{
"field": "choice_id",
"agg": "count",
"value": 3
}
],
"summary": "첫 데이트 장소의 선택지 세 개 가운데 고른 기록 7건이 모두 카페라, 전시회와 한강 쪽 장면은 이 입구로 아무도 들어가지 않습니다.",
"hedge": "PS-4470 세션은 고르지 않고 떠나 선택지 집계에서 뺐습니다. PS-4440 세션은 분기표에 없는 S-08 로 넘어간 편집 전 기록이 있어 이탈 계산에서만 빼고, 이 장면의 C-05a 선택은 그대로 셌습니다."
},
{
"episode_id": "E-2107",
"scene_id": "S-12",
"scene_title": "비밀을 들은 밤",
"verdict": "정상 진행",
"as_of": "2026-09-26T22:14:30+09:00",
"reaches_ending": true,
"recent_event_count_7d": 1,
"entered_sessions": 2,
"dropped_sessions": 0,
"drop_rate_pct": 0,
"episode_avg_drop_pct": 16.1,
"choice_count": 2,
"top_choice_id": "C-12a",
"top_choice_share_pct": 50,
"evidence": [
{
"field": "event_at",
"value": "2026-09-19T22:14:30+09:00"
},
{
"field": "choice_id",
"value": "C-12a"
},
{
"field": "choice_id",
"value": "C-12b"
}
],
"summary": "비밀을 들은 밤은 들어온 두 세션이 모두 다음 장면으로 넘어갔고 두 선택지가 한 번씩 골렸습니다.",
"hedge": "PS-4413 세션의 진입 시각이 7일 창 시작과 정확히 같아 창 안으로 셌습니다. 이 한 건이 창 밖이면 아무도 닿지 않은 장면이 됩니다."
},
{
"episode_id": "E-2107",
"scene_id": "S-20",
"scene_title": "옥상 고백 결말",
"verdict": "정상 진행",
"as_of": "2026-09-26T22:14:30+09:00",
"reaches_ending": true,
"recent_event_count_7d": 1,
"entered_sessions": 1,
"dropped_sessions": null,
"drop_rate_pct": null,
"episode_avg_drop_pct": 16.1,
"choice_count": 0,
"top_choice_id": null,
"top_choice_share_pct": null,
"evidence": [
{
"field": "is_ending",
"value": true
},
{
"field": "session_id",
"value": "PS-4432"
}
],
"summary": "옥상 고백 결말에는 9월 24일 PS-4432 세션이 닿았습니다.",
"hedge": "결말 장면이라 이탈률은 매기지 않습니다."
}
][자동 검증 · 코드가 판정합니다] 1. verdict 가 정상 진행·이탈이 몰린 장면·결말로 이어지지 않는 장면·아무도 닿지 않은 장면·한 선택지로 쏠린 장면 다섯 값 중 하나인지 확인합니다. 2. episode_id·scene_id·scene_title·verdict·as_of·reaches_ending·recent_event_count_7d·entered_sessions·choice_count·evidence·summary 필드가 빠짐없이 존재하는지 확인합니다. 3. drop_rate_pct·episode_avg_drop_pct·top_choice_share_pct 가 0 이상 100 이하이고 dropped_sessions 가 entered_sessions 이하인지 확인합니다. 4. drop_rate_pct 를 dropped_sessions / entered_sessions × 100 으로, episode_avg_drop_pct 를 결말 장면과 reaches_ending 이 false 인 장면을 뺀 장면들의 이탈률 평균으로, top_choice_share_pct 를 top_choice_id 줄 수 / choice_id 가 null 이 아닌 줄 수 × 100 으로 다시 계산합니다. 5. reaches_ending 이 false 이면 verdict 는 결말로 이어지지 않는 장면입니다. reaches_ending 은 episode_scenes 의 next_scene_id 를 따라가 is_ending 이 참인 장면에 닿는지로 다시 탐색합니다. 6. reaches_ending 이 true 이고 recent_event_count_7d 가 0 이면 verdict 는 아무도 닿지 않은 장면입니다. 7. 앞 두 조건에 걸리지 않고 drop_rate_pct 가 episode_avg_drop_pct 의 2배를 넘으면 verdict 는 이탈이 몰린 장면입니다. 8. 앞 세 조건에 걸리지 않고 choice_count 가 2 이상이며 top_choice_share_pct 가 90 을 넘으면 verdict 는 한 선택지로 쏠린 장면입니다. 어느 조건에도 걸리지 않으면 verdict 는 정상 진행입니다. 9. evidence 의 field 이름이 episode_scenes 또는 play_events 에 있는 컬럼인지 대조합니다. 10. evidence 의 value 가 수록된 행의 원문 값과 같은지 확인합니다. 여러 줄을 세어 얻은 수는 agg 를 적습니다. 11. summary 가 존댓말로 끝나는지 확인합니다. [판정 차례 · 위 규칙이 둘 이상 동시에 걸릴 때] 장면 하나에는 판정을 하나만 남깁니다. ① 결말로 이어지지 않는 장면 → ② 아무도 닿지 않은 장면 → ③ 이탈이 몰린 장면 → ④ 한 선택지로 쏠린 장면 → ⑤ 정상 진행. 길이 막힌 장면은 이탈률이 높을 수밖에 없으므로, 그 장면의 이탈률은 에피소드 평균을 잡을 때 뺍니다. 더미에서 평균은 S-05 14.3%·S-09 50.0%·S-12 0.0%·S-17 0.0% 네 장면으로 잡아 16.1% 이고, 문턱은 그 두 배입니다. [하드 케이스 · 판정이 갈리는 이유] S-14 와 S-15 는 서로만 가리키는 순환이고, S-15 의 C-15b 는 next_scene_id 가 비어 있는 결측이라 둘 다 결말로 이어지지 않는 장면입니다. S-12 는 PS-4413 세션이 7일 창 시작 정각에 들어온 경계 사례라 창 안으로 세어 정상 진행입니다. S-17 과 S-21 은 PS-4401 세션의 9월 18일 진입만 있어 창 밖에 남고 아무도 닿지 않은 장면입니다. PS-4440 세션은 분기표에 없는 S-08 로 넘어간 편집 전 기록이라 이탈 계산에서 빼고 「분기표에 없는 장면 기록」 목록에 따로 세웁니다. S-08 은 판정할 장면이 아니므로 이 형식에 들어오지 않고, 같은 세션의 S-05 선택은 분기표에 있는 장면이라 선택지 집계에 그대로 셉니다. S-05 의 PS-4470 처럼 choice_id 가 비어 있는 줄은 고르지 않고 떠난 세션이라 선택지 비율의 분모에서 뺍니다. [평가 러너 · 2주차] 에피소드 여섯 편 240 장면에 손으로 매긴 정답 판정과 자동 판정을 대조해 판정별 일치율을 내고, 어긋난 장면은 따로 모아 이탈률 2배·90% 쏠림 문턱과 판정 차례를 다시 봅니다. [수동 검증 · 사람이 봅니다] 1. 이탈 몰림으로 올라온 장면을 디렉터가 열어 연출 의도로 끊은 장면인지 판단합니다. 2. 결말 없는 분기로 나온 선택지를 어느 장면으로 이을지는 디렉터가 스튜디오에서 정합니다.
근거: 프론티아 서비스 개발 및 운영