Alibi Atlas: 소설 속 연속성 검토를 위한 워크벤치
요약
Alibi Atlas는 소설 속 등장인물과 사건의 시간적, 공간적 연속성을 검토하는 워크벤치입니다. 이 도구는 특정 인물이 설정된 장소에 물리적으로 존재할 수 있는지 여부를 시각화하여 보여줍니다. 작가들이 가상의 초안을 점검하고 논리적 충돌(continuity errors)을 발견하는 데 도움을 줍니다.
핵심 포인트
- 등장인물과 사건의 시간/공간적 연속성 검토 도구
- 물리적 충돌(physical conflicts)을 시각적으로 표시
- 가상의 초안 점검에 특화되어 실제 진실성을 판단하지 않음
Sanity Challenge — Path Two에 대한 글입니다.
제가 만든 것 (What I Built)
Alibi Atlas는 소설의 연속성을 검토하는 워크벤치입니다. 이 도구는 하나의 좁은 질문을 던집니다: 등장인물이 장면이 설정한 장소에 있을 수 있는가?
시작 사례인 **사라진 등불(The missing lantern)**에는 세 명의 등장인물, 네 개의 장소, 그리고 여섯 개의 사건이 있습니다. Mira는 아카이브와 부두에서 겹치는 시간에 나타납니다. Theo는 10분간의 여정을 위해 4분의 시간이 있습니다. Jules는 부두에 갔다고 말하지만, 이 진술은 확립된 장면으로 취급되지 않습니다.
이 앱은 타임라인과 작성된 경로 다이어그램 옆에 물리적 충돌을 표시합니다. 사건을 선택하고 다른 시간이나 장소를 시도하여 어떤 충돌이 남아 있는지 확인해 보세요. 이러한 미리보기 변경 사항은 브라우저에 유지되며, 작가님의 Sanity 콘텐츠를 재작성하지는 않습니다.
이는 실제 인물의 진술의 진실성을 판단하는 도구가 아니라, 가상의 초안을 점검하기 위한 도구입니다.
데모 (Demo)
Alibi Atlas 열기 — 로그인 필요 없음.

이 짧은 워크스루를 시도해 보세요:
- **출발하는 배 확인(Checks the departing boat)**을 선택합니다. 시간을 18:34–18:44로 변경한 후, **미리보기에 적용(Apply to preview)**을 선택합니다. Mira의 시간 겹침이 해결되었고, 여정에는 충분한 시간이 확보되었습니다.
- **관리인에게 전달(Delivers to the keeper)**을 선택하고 18:30–18:38를 시도해 보세요. 두 번째 물리적 충돌이 사라집니다.
- **Jules의 진술은 결정이 필요함(Jules's account needs a decision)**을 선택합니다. 이를 **이야기 속에서 발생함(This happens in the story)**으로 변경합니다. 새로운 시간 겹침이 나타납니다: 관리인이 이제 탑과 부두에 같은 시간에 확립되었습니다.
- **미리보기 초기화(Reset preview)**는 로드된 이야기를 복원합니다. **검사 보고서 JSON(Inspect report JSON)**은 검토나 수동 복사를 위해 사례, 변경 사항, 발견 내용 및 소스 메타데이터를 보여줍니다.

코드
GitHub 저장소 — MIT 라이선스, 로컬 설정, 스튜디오 지침 및 테스트 포함.
공개 뷰어는 GitHub Pages의 Next.js 정적 내보내기(static export)로 구현되었습니다. 이는 @sanity/client를 통해 실제 공개 Sanity 데이터셋을 읽습니다. 스튜디오는 인증된 작성자를 위해 별도로 실행됩니다. 뷰어에는 쓰기 토큰(write token)이 번들링되지 않으며, 런타임 AI 호출도 없습니다.
나의 빌드 프로세스
Codex가 구현, 가상 사례, 문서 및 이 기사를 생성하고 수정했습니다. 이는 제가 코드를 직접 작성했거나 문자 그대로의 프롬프트 기록이라는 주장이 아니라, 자율적인 AI 빌드의 기록입니다.
개요와 스키마
재구성된 작업 개요는 실제 Sanity 콘텐츠를 기반으로 하는 소설 연속성 편집기(fiction-continuity editor)를 구축하는 것이었습니다. 등장인물, 장소, 여정 및 장면은 각각의 문서를 가져야 했습니다. 등장인물의 진술은 작가가 설정한 사건과 분리되어 유지되어야 했습니다. 독자들은 출판된 이야기를 변경하지 않고도 수정을 테스트할 수 있어야 했습니다.
이러한 구분은 단순히 장면의 문구에서 추론되는 것이 아니라, 명시적인 certainty 필드가 되었습니다. 또한 각 사건에는 작성자의 장면 또는 대화 메모가 인스펙터(inspector)에 표시됩니다.
| 문서 | 개수 | 기록 내용 |
|---|---|---|
| 캐릭터 | 3 | 이름 및 역할 |
| ... |
최초의 초기값 해결사(initial-value resolver)는 context.documentId를 사용하려고 했습니다. TypeScript가 해당 API를 거부했습니다. 대체된 방식은 고정된 시작 ID와 명시적인 초기값 템플릿을 사용합니다. 이 시작 도구는 인증된 Studio 클라이언트를 통해 18개의 연결된 문서를 생성하고, 기존 문서를 덮어쓰지 않으면서 이를 다시 읽어옵니다.
첫 번째 아키텍처에서는 Next.js 앱 내부에 Studio를 배치했습니다. 공용 리더가 정적 내보내기(static export)일 수 있도록 분리되었고, 작성자는 인증된 세션을 유지할 수 있었습니다. 이 빌드는 App SDK나 Sanity Workflows가 아닌 Sanity 클라이언트와 Studio를 사용합니다.
첫 번째 '모든 것이 괜찮음(all-clear)' 문구는 경로가 누락될 수 있을 때 너무 강했습니다. 이제는 작성된 제약 조건 하에서 물리적 충돌이 감지되지 않았다고만 명시합니다. 알 수 없는 여정은 여전히 검토가 필요합니다.
브라우저 확인 과정에서는 리셋 후 오래된 유효성 메시지도 포착되었습니다. 리셋 기능은 이제 모든 입력 변경 시 다시 마운트(remounting)하지 않고 새로운 인스펙터(inspector)를 시작합니다. 시간 입력 자동화는 네이티브 키 입력을 사용할 때까지 표시되는 값을 업데이트하지 않았는데, 최종 수정 확인 과정에서는 키보드 입력을 사용했습니다.
<h3 id="what-was-checked">확인된 내용</h3>중첩 오버랩(nested overlaps), 경로 선택(route choice), 보고된 계정(reported accounts), 누락된 경로(missing routes), 그리고 유효하지 않은 참조 또는 간격(invalid references or intervals)을 포함하여 모든 12개 도메인 테스트가 통과했습니다. 공용 Pages 워크플로우는 테스트, 타입 검사, 정적 빌드 및 배포를 통과했습니다. 페이지 크기가 390px일 때 수평 오버플로우가 없었으며, 타임라인은 자체 컨테이너 내에서 스크롤됩니다.
출판된 설명 변경은 라이브 업데이트 알림을 생성하고 진행 중인 미리보기를 유지했습니다. 실제 Studio 이벤트 편집은 미리보기 편집 없이 공개 뷰어의 물리적 충돌 건수를 두 건에서 한 건으로 줄였습니다. 그 테스트 편집은 나중에 복원되었습니다. 완전한 케이스 리드백은 테스트 전 스냅샷과 일치했으며, 데이터셋에는 원래의 18개 문서가 다시 포함되었습니다.
보이는 보고서는 두 개의 미리보기 편집, 물리적 충돌 건수 0건, 그리고 신고된 계정 검토 1건으로 읽어왔습니다. 브라우저 자동화는 완료된 파일 다운로드나 클립보드 내용을 확인하지 못했으므로, 버튼만으로는 어느 것도 주장되지 않습니다. 검사 가능한 JSON과 연결된 예시는 페이로드를 직접 사용할 수 있게 합니다. 컨트롤러는 또한 더티(dirty)-미리보기 새로고침 확인에서 멈췄습니다. 별도의 리더가 새로운 출판 콘텐츠를 확인했고, 클린-미리보기 새로고침은 작동했습니다.
프로토타입은 하나의 케이스와 하나의 시간 창을 처리합니다. 이동 시간을 추론하거나, 어떤 진술이 참인지 증명하거나, 모든 종류의 플롯 홀(plot hole)을 검토하지는 않습니다. 목표는 저자가 검사할 수 있는 모순점을 노출하는 것이며, 이때 근본적인 이벤트와 출처 노트가 여전히 보이도록 합니다.
Sanity 프로젝트 상세 정보
- 프로젝트 ID:
0k0a3q37 - 데이터셋:
production— 공개적이며, 원래의 가상 시연 콘텐츠만 포함합니다. - 출판된 문서: 위 다섯 가지 스키마 유형에 걸쳐 18개.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기