# Elio Story 로컬 저작

`examples/story.json`, `source.json`, `connections.json`은 실제 작품이 아닌 창작 예제입니다.
같은 renderer가 쓰는 입력 형식과 관계·시간선의 사용 예를 확인하는 출발점입니다.

## 작품과 매체에서 시작합니다

스토리게임·드라마·영화·소설·만화는 같은 사건·출처·관점의 저작 원리를 사용합니다.
작품의 이름·판본/버전·언어와 다룰 구간을 먼저 정하고, 실제 원문을 읽습니다.
`work_id`는 작품, `unit_id`는 이번에 다룰 구간의 안정된 ID이며 `unit_label`에는
실제 장·회차·장면·페이지 범위 등의 독자용 이름을 씁니다. 모든 매체에 특정 게임의
막·퀘스트·레벨·캐릭터 역할·색을 강제하지 않습니다.

| 자료 | 구간의 예 | 출처에서 확인할 위치 | 필요한 경우에만 다룰 것 |
|---|---|---|---|
| 스토리게임 | 본편 장, 퀘스트, 엔딩 경로 | 버전·장면/대사 위치, 실제 선택 기록 | 선택 조건·경로·진행 상태·실제 수치 |
| 드라마 | 시즌·회차·장면 | 배급판·에피소드·원본 타임코드 또는 자막 cue | 인물별 지식, 회상과 현재의 관계 |
| 영화 | 작품 전체 또는 장면 묶음 | 개봉/편집판·장면·원본 타임코드 | 몽타주·교차 편집·불확실한 시점 |
| 소설 | 권·부·장·절 | 판본·장·페이지 또는 확인한 전자책 위치 | 서술자·서간·삽입 이야기·회상 |
| 만화 | 권·화·장면 | 판본·화·페이지·패널, 세로형이면 확인한 구간 | 컷의 읽는 순서·말풍선·무언의 장면 |

페이지 번호와 타임코드는 판본·편집본에 따라 달라집니다. 확인한 위치만 남기고,
모르는 페이지·패널·시각을 문맥으로 추정하지 않습니다. 영상이 없는 자료에도
방송·스트리머·다시보기 시계를 만들지 않습니다.

## 현재 입력 계약에 출처를 연결합니다

`story.json`의 사건과 안내, `source.json`의 읽은 텍스트와 출처 기록,
필요한 경우의 `connections.json`을 기존 형식으로 작성합니다. 원문에서 확인한 사실,
직접 인용, 작성자의 해석과 미확인을 구분하고 원자료를 읽지 않은 요약을 원문으로 부르지 않습니다.

`events[].source_lines`는 현재 `source.content_text`의 **1부터 시작하는 정수 줄 범위**입니다.
페이지·패널·타임코드 문자열을 이 배열에 넣거나 영상 초를 줄 번호로 대신 쓰지 않습니다.
자신에게 사용 권한이 있는 발췌·전사 텍스트를 준비하고, 원매체의 위치를 함께 기록합니다.
예를 들어 위치 표시는 `[권1·3장·p.42·패널2 / 위치 기록]`처럼 인용문과 구분한 편집 주석으로
남길 수 있습니다. 인용문은 실제 원문에서 확인한 문장만 쓰며 위치 주석을 원작의 대사로 만들지 않습니다.
사건은 그 준비 텍스트의 실제 줄로 연결하고 `content_hash`·`source_hash`는 해당 내용과 일치시킵니다.
이는 원문 그대로의 사본과 구분한 저작용 자료이며 원출처·판본을 함께 보존합니다.

현재 validator가 받는 출처·위치·근거 필드만 사용합니다. 매체를 지원한다는 이유로
`page`·`panel`·`episode` 같은 새 JSON 키나 PDF/OCR/EPUB importer를 임의로 추가하지 않습니다.
출처 URL·제목·수집 시점·원본 위치를 확인하지 못했다면 날조하지 않고 부족한 근거를 남깁니다.
필수 입력이 충족되지 않으면 정확한 실패를 설명하며 다른 매체나 가짜 데이터로 검사를 통과시키지 않습니다.

## 공개 순서와 이야기 관계를 구분합니다

- **본편의 공개 순서:** 독자가 작품에서 알게 되는 순서입니다. 회상 장면을 연대에 맞춰
  앞당기거나 뒤의 반전을 앞 사건의 제목에 노출하지 않습니다.
- **작품 속 연대:** 실제로 먼저 일어난 일과 나중 일을 뜻합니다. 확인된 경우에만 별도
  `reader_guides`의 관점·`time_map`으로 설명하며 모르는 시각·동시성을 만들지 않습니다.
- **인과·의존·관계:** 앞서 나왔다는 이유만으로 원인이라고 쓰지 않습니다. 관계의 종류·방향·
  조건·근거를 기존 `story_topology` 등에 작성하며 단순한 연결과 실제 합류를 구분합니다.
- **인물·서술자의 관점:** 누가 무엇을 보고 알고 믿는지 구분합니다. 증언·전설·오인·해석은
  확정 사실로 합치지 않고 현재 계약의 근거 상태를 사용합니다.

같은 사건은 같은 ID로 참조하고 관점마다 새로운 사건으로 복제하지 않습니다.
이해를 돕는 보기 순서는 원작의 사실을 바꾸지 않습니다. 안내·해설·용어는 실제 독자가
알 수 있는 범위에 맞춰 기존 공개 위치 계약을 적용합니다.
선형 작품에 게임 분기를 만들지 않고, 게임의 실제 대안은 동시에 발생한 사건처럼 잇지 않습니다.
게임 수치·획득 조건·승패·엔딩 요구 조건은 해당 버전의 확인한 자료가 있을 때만 다룹니다.

다음은 모두 **작성 원리를 설명하는 작은 창작 예시**입니다. 기존 특정 작품의 설정을 옮긴 예제가 아닙니다.

| 예시 | 본편에서 유지할 것 | 별도 관계로 설명할 것 |
|---|---|---|
| 게임에서 문을 여는 두 선택 | 선택 장면과 확인한 각 경로 | 두 경로는 대안이며 합류가 확인되지 않으면 잇지 않음 |
| 드라마 2회에서 처음 공개된 옛 편지 | 2회에서 편지를 발견하는 공개 위치 | 편지가 쓰인 과거와 발견한 현재를 구분 |
| 영화에서 교차 편집된 두 장소 | 영화가 두 장면을 보여 준 순서 | 편집만으로 같은 시각이라고 단정하지 않음 |
| 소설의 서술자와 일기가 다른 기억을 전함 | 독자가 각각의 기록을 읽는 순서 | 상충하는 진술과 확인한 사실을 구분 |
| 만화의 무언 패널 뒤에 말풍선이 등장함 | 실제 패널의 읽는 순서 | 그림에서 관찰한 행동과 나중 대사의 해석을 구분 |

이 형식이나 예시의 사건 수·이름·시간 구조를 새 작품의 필수 틀로 복제하지 않습니다.
해당 작품을 읽는 데 필요한 사건·관계·근거와 표현만 선택합니다.

## 이미지와 다시보기는 확인한 범위에서 연결합니다

이미지는 사용 권리를 확인한 자료에 대체 텍스트·출처를 작성합니다. 창작 도식·상징 그림을
실제 작품의 화면이나 방송 장면이라고 표시하지 않습니다. raster 검증에는 Pillow가 필요합니다.
동봉 adapter는 예제 이미지·로고·폰트의 상대 경로를 조정하며 사용자 자산을 자동 취득하거나
모든 경로를 독립 HTML 안에 넣지는 않습니다. 다른 사이트 경로는 해당 사용자 서버에서 제공해야 합니다.

다시보기는 **선택 사항**입니다. 실제로 연결할 영상이 없다면 `--connections`를 생략합니다.
영상이 있는 경우에만 같은 장면과 원본 시각을 확인해 연결하며 작품 속 연대·회차 번호와
방송 시계를 섞지 않습니다. 실제 영상 후보의 미확인은 기존 pending 계약을 사용하되,
없는 영상·스트리머·시계를 pending 항목으로도 만들어 넣지 않습니다.

## 로컬 출력과 Board

```text
python scripts/render_story.py --input STORY.json --source SOURCE.json --output NEW.html
```

검증한 다시보기 연결이 있으면 `--connections CONNECTIONS.json`을 더합니다.
출력은 새 파일명으로 만듭니다. 실제 브라우저에서 본편·관점·장면·원문·복귀를 확인하고,
같은 입력으로 다시 렌더할 수 있게 JSON을 보관합니다.
고정 예제 재생성용 `scripts/demo.py`로 편집 입력을 덮어쓰지 않습니다.

상단 길 안내의 `Elio 홈`은 출력 위치를 기준으로 저장소의 `index.html`을 가리킵니다.
작품명은 링크 없는 현재 맥락으로 표시하고, 현재 구간은 `aria-current="page"`로 구분합니다.
출력 파일을 다른 폴더로 옮길 때는 새 위치를 `--output`으로 지정해 다시 렌더합니다.

`board/index.html`은 자체 Board 앱입니다. 명시한 이야기·도감 JSON으로 별도 Board를 만들 수 있습니다.

```text
python -m tools.elio_board build --input examples/board.catalog.json --output new-board
```

실제 지원되는 `elio.board.v1`, `elio.catalog.v1` 또는 기존 `{story, source}` 입력을 사용합니다.
Story JSON에 없는 관계나 매체 해석을 Board가 자동으로 조사·보완한다고 가정하지 않습니다.
Board의 문구 편집·JSON·독립 HTML 출력과 Story renderer의 저작 입력은 서로 다른 경로이며
기존 adapter가 받는 범위에서만 연결합니다.

자동 원문 수집·번역·이미지 관리 서버·웹 공개는 제공하지 않습니다.
로컬 렌더·저장과 웹 공개는 별개이며 원자료의 권리와 정확한 공개 결과물을 확인해야 합니다.
완전한 입력 계약의 검사는 `tools/elio_preview/`에 동봉한 실제 Python validator가 수행합니다.
HTML·스킬의 존재만으로 실제 내용의 정확성·완성도·게시 승인을 주장하지 않습니다.


## 원본 템플릿 전체와 공개용 연출

[전체 원본 목록](ELIO_TEMPLATE_COVERAGE.md)과 `examples/templates/index.html`에서
사진 흐름·시간 지도·여섯 해설·분기·원문·탐색 등 기존 source와 대응 입력을 찾습니다.
기억 테이프는 명조3장5막, 달의 기억은 명조3장 엣지 드림의 기존 완성본을 그대로 동봉한다. 본문·영상·3D·카메라·다시보기·복귀를 새 창작물로 대체하지 않는다. 공용 스킬의 매체 범용성과 특정 작품 예제의 보존은 별개다. 예제 파일은 ORIGINAL_EXAMPLES.json의 exact hash로 묶고 제3자 미디어 권리는 별도 고지한다. 실제 운영 공개·stable/module 채택은 수행하지 않는다.
[기존 작품 예제](ORIGINAL_EXAMPLES.md)의 실제 경로와 고지를 참조합니다.
