| name | webtoon-narrative-flow |
| description | 시즌 전체 회차의 서사 흐름을 진단하고 빠진 장면·약한 인과·일관성 깨짐을 식별하여 보완 컷을 처방하는 스킬. 회차 추가·기존 회차 보완·서사 검증·연결성 점검 요청 시 반드시 사용. narrative-doctor 에이전트가 호출한다. |
Webtoon Narrative Flow — 서사 흐름 진단 + 갭 처방
왜 필요한가
회차 단위로 생성된 shot_list는 회차 안에서는 자연스럽지만, 시즌 단위로 보면 인과·감정·시각 운율의 갭이 생긴다. 이 스킬은 시즌 전체를 한 번에 보고 갭을 진단한다.
4축 진단 방법
축 1 — 시놉시스 커버리지
방법:
systemless-player/02_episodes.md의 회차별 시놉시스에서 핵심 사건 5-7개 추출
- 각 회차의
shot_list_enriched.json의 cut.purpose 필드와 매핑
- 매핑 실패한 사건 = 누락
예시:
-
시놉시스 사건: "도현이 가야 본사 로비에서 박재준과 짧게 만난다"
-
shot_list: 컷 6-7이 박재준 로비 → 명함 전달
-
매핑 성공 ✓
-
시놉시스 사건: "윤세아가 첫 번째로 시스템 글리치를 자기 손가락으로 만진다"
-
shot_list: 해당 컷 없음
-
매핑 실패 → critical gap
축 2 — 인과 연결
방법:
- 각 회차의 마지막 컷 상태(인물 위치·감정·소품)를 추출
- 다음 회차의 첫 컷 상태와 비교
- 점프가 있으면 트랜지션 필요
점프 패턴:
- 시간 점프 (수 시간 → 수일): 트랜지션 컷 필요 ("그날 밤" / "사흘 후")
- 장소 점프 (실내 → 야외): 이동 컷 또는 장소 표기 필요
- 감정 점프 (분노 → 평정): 중간 감정 컷 필요
축 3 — 캐릭터 감정 호
방법:
- 각 회차에서 캐릭터의 감정 상태 라벨링 (적대/중립/우호/신뢰)
- 회차 시퀀스로 감정 변화 추적
- 단계 건너뛰기 = 갭
예시:
- ep05 윤세아: 적대 (도현을 의심)
- ep06 윤세아: 중립 (관찰 대상으로 끌고 옴)
- ep07 윤세아: 갈등 (도현이 멱살 잡음에도 화 안 냄)
- ep10 윤세아: 우호?? — ep07에서 ep10으로 점프 → 갭
축 4 — 시각 운율 콜백
시각 약속 (03_visual.md 기반):
| 모티프 | 약속된 회차 |
|---|
| 분홍 머리핀 (윤세아 동생) | ep14 첫 등장 → ep11 책상·ep17·ep21·ep26·ep28 회수 |
| 박재준 흉터 | 매 회차 그가 등장하면 보여야 |
| 도현 환자 식별 밴드 | 매 회차 그가 등장하면 |
| 강도경 친딸 액자 글리치 | ep10·ep26·ep28에 1프레임 |
| 빚 독촉 문자 풍선 | ep01-06 반복 → ep21 거점 이동 시 재등장 |
| ERR_NULL_PLAYER 타이핑 | ep03 정착 → 회차별 자홍 글리치로 재사용 |
각 모티프의 약속 회차를 점검하여 빠진 회차 식별.
처방 유형
처방 A: 신규 컷 추가
가장 강력하지만 비용 큰 처방. 시놉시스 사건 누락에 사용.
처방 명세 형식:
{
"type": "new_cut",
"target_episode": 11,
"insertion_point": "before cut_1",
"new_cut_spec": {
"purpose": "박재준이 도현에게 첫 정보 전달",
"shot_type": "close_up",
"characters": ["park-jae-jun", "han-do-hyun"],
"scroll_length": 2,
"key_visual": "포장마차 다음 날 아침, 박재준이 USB를 도현 손에 슬쩍 놓음",
"dialogue_suggestion": [
{"speaker": "park-jae-jun", "text": "...받아라.", "position": "bottom_left"},
{"speaker": "han-do-hyun", "text": "이게 뭡니까?", "position": "bottom_right"}
]
}
}
처방 B: 기존 컷 텍스트 강화
신규 컷보다 가벼움. 감정 점프·약한 연결에 사용.
처방 명세:
{
"type": "text_enhancement",
"target_episode": 7,
"target_cut_id": 10,
"additions": {
"thought": [
{"speaker": "yoon-se-ah", "text": "왜 이 F급이 자꾸 신경 쓰이지.", "style": "thought"}
]
},
"reasoning": "ep07→ep10 사이 윤세아의 감정 변화에 다리 필요"
}
처방 C: 컷 순서 재배치
드물지만 강력. 시퀀스 흐름 개선.
처방 명세:
{
"type": "reorder",
"target_episode": 12,
"current_order": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
"proposed_order": [1, 2, 3, 5, 4, 6, 7, 8, 9, 10],
"reasoning": "컷 5의 등장이 컷 4의 충격을 한 호흡 늦춰 감정선이 더 살아남"
}
진단 워크플로우
- 수집: 30회차의
shot_list_enriched.json + 시놉시스 + 시각 운율 약속 로딩
- 매핑: 회차별 시놉시스 사건 ↔ 컷 매핑 표 작성
- 갭 식별: 4축 매트릭스로 갭 탐지
- 분류: critical / warning / info
- 처방: 갭별로 A/B/C 중 선택
- 보고:
_workspace/episodes/_narrative_audit.json 작성
처방 검증 원칙
- 최소 침습 원칙: 텍스트 강화로 해결되면 신규 컷 추가하지 않음
- 시각 운율 보존: 새 컷이 기존 시각 약속을 깨면 처방 보류
- 컨텍스트 의존: 회차별 평균 컷 수(10컷) 유지 — 한 회차에 3개 이상 추가는 분할 검토
체크리스트