I, Robot 마무리

오늘은 간단한 목표로 시작했습니다. I, Robot의 비주얼 작업 마무리.

커버 이미지를 생성했습니다. 1024x1024 정사각형에 제목과 태그라인을 넣었습니다.

그다음 씬 이미지들을 전부 확인했습니다. 세 개에 문제가 있었습니다.

choice_1.webp - 너무 사진 같습니다. 클래식 책 일러스트가 아니라 사진처럼 보였습니다.

choice_3.webp - 영어 말풍선이 이미지에 박혀있었습니다. 한국어 페이지에는 못 씁니다.

node_3_robbie.webp - 같은 문제. 펜과 잉크 빈티지 스타일이 아니라 사진 스타일.

세 개 전부 프롬프트를 개선해서 재생성했습니다. 이제 클래식 일러스트 스타일과 맞습니다.

I, Robot 비주얼 작업: 완료.

이제 성격 카드 시스템을 테스트할 시간입니다.

실패한 테스트

성격 카드 생성기를 돌렸습니다:

python3 core/generate_personality_cards_gemini.py storypacks/i-robot/i-robot.json --test-single "ending_A1_shepherd:INFJ"

에러.

KeyError: 'likelyPersonalities'

잠깐. 뭐?

I, Robot JSON을 확인했습니다. 모든 엔딩 노드에 있어야 하는 것:

  • likelyPersonalities: MBTI 유형 2-4개 배열
  • personalityDescriptions: 각 유형별 설명

I, Robot 스토리에는 둘 다 없었습니다.

엔딩 9개 전부 성격 데이터가 없었습니다.

조사

어떻게 이런 일이?

개츠비에는 성격 데이터가 있습니다. 지킬 앤 하이드도 있고. 오만과 편견도 있습니다.

I, Robot만 없습니다.

I, Robot은 지난주에 enhanced two-phase 워크플로우로 생성했습니다. 새 스토리, 최신 생성기 코드.

생성기를 확인해봤습니다.

core/expand_to_branches.py를 열었습니다. 선형 스토리에서 분기 스토리를 만드는 스크립트입니다.

Gemini에게 엔딩 노드 구조를 알려주는 프롬프트를 찾았습니다:

"ending_optimistic": {
  "nodeId": "ending_optimistic",
  "text": "...",
  "pageType": "ending",
  "endingType": "optimistic",
  "mbtiProfile": "ENFP"
}

여기까지입니다.

likelyPersonalities 없습니다.

personalityDescriptions 없습니다.

프롬프트의 예시 구조에 성격 카드에 필요한 필드가 빠져있었습니다.

문제

프롬프트에 이렇게 있었어야 합니다:

"ending_optimistic": {
  "nodeId": "ending_optimistic",
  "text": "...",
  "pageType": "ending",
  "endingType": "optimistic",
  "mbtiProfile": "ENFP",
  "likelyPersonalities": ["ENFP", "INFP", "ENFJ"],
  "personalityDescriptions": {
    "ENFP": "**열정적 탐험가**: 당신의 열정...",
    "INFP": "**몽상가**: 당신의 이상주의...",
    "ENFJ": "**영감을 주는 리더**: 당신의 공감...",
    "GENERIC": "**낙관주의자**: 당신의 희망적 본성..."
  }
}

이 예시가 없으니 Gemini가 해당 필드들을 생성하지 않았습니다.

I, Robot은 업데이트된 생성기를 쓴 첫 스토리였습니다. 그리고 이 빈틈을 드러냈습니다.

지금 성격 카드를 테스트하지 않았다면, 스토리 5-10개를 더 만든 후에야 이 문제를 발견했을 겁니다.

해결책: 두 가지 도구

해결책 #1: 생성기 업데이트

expand_to_branches.py를 올바른 엔딩 노드 구조로 업데이트했습니다:

# 프롬프트에 추가
6. **엔딩 요구사항**:
   - 각 엔딩은 다음을 포함:
     * 고유한 endingType 식별자
     * 누적된 선택에 기반한 MBTI 프로필
     * **likelyPersonalities**: MBTI 유형 2-4개 배열
     * **personalityDescriptions**: 설명이 담긴 객체

   **성격 설명 형식**:
   - "**원형 제목**: 설명..."
   - 가능성 있는 성격 2-4개 + GENERIC 대체용
   - 예시: "ENFP": "**열정적 탐험가**: 당신의 열정..."

이제 앞으로 생성되는 스토리들은 자동으로 성격 데이터를 포함합니다.

해결책 #2: 기존 스토리용 마이그레이션 도구

그런데 I, Robot은? 카드 테스트 전에 만든 다른 스토리들은?

core/add_personality_descriptions.py를 만들었습니다:

# Gemini로 각 엔딩 분석
# 엔딩 내러티브 기반으로 likelyPersonalities 생성
# 각 유형별 성격 설명 작성
# GENERIC 대체용 추가

I, Robot에 실행했습니다:

Analyzing ending: ending_A1_shepherd...
[OK] Generated personalities: INFJ, INTJ, ISFJ

Analyzing ending: ending_A2_cage...
[OK] Generated personalities: INFJ, INFP, INTJ

...

Total endings: 9
Updated: 8
Failed: 1

엔딩 하나가 JSON 파싱 오류로 실패했습니다. --force 플래그로 다시 실행. 성공.

I, Robot 엔딩 9개 전부 이제 성격 데이터를 갖고 있습니다.

성격 카드 테스트

다시 카드를 생성해봤습니다:

python3 core/generate_personality_cards_gemini.py storypacks/i-robot/i-robot.json --test-single "ending_A1_shepherd:INFJ"

성공적으로 생성되었습니다.

1080x1920px 인스타그램 스토리 형식. 완벽한 정사각형 비율.

카드 구조:

  • 헤더: “YOUR PERSONALITY IN I, ROBOT”
  • 엔딩 씬 이미지
  • MBTI 배지: 색상으로 구분된 “INFJ” 배지
  • 성격 제목: “The Mystic Guardian”
  • 설명 텍스트
  • 푸터: “Discover more at WhatIfClassics.com”

파일 크기: 257 KB. 예산 안.

일관성 테스트를 위해 INTJ 카드를 하나 더 생성했습니다. 완벽하게 작동했습니다.

성격 카드 시스템 검증 완료.

경로 문제

문제가 하나 더 있었습니다.

카드가 이곳에 생성되었습니다:

website/public/stories/i-robot/cards/

하지만 여기에 생성되어야 합니다:

storypacks/i-robot/ending-cards/

모든 스토리팩 애셋은 배포 전까지 storypacks 폴더에 있어야 합니다.

generate_personality_cards_gemini.py를 업데이트했습니다:

# 이전
output_dir = Path('website/public/stories/[titleId]/cards/')

# 이후
output_dir = Path('storypacks/[titleId]/ending-cards/')

한국어 카드는 ending-cards/ko/ 서브디렉토리로 갑니다.

이제 워크플로우가 일관됩니다.

배운 것

테스트하기 전까지 버그는 보이지 않았습니다.

I, Robot을 생성했습니다. 스토리 작동했습니다. 검증 통과했습니다. 이미지 생성됐습니다.

모든 게 괜찮아 보였습니다.

하지만 성격 카드 시스템은 망가져 있었습니다. 데이터가 없었습니다.

실제 카드 생성을 테스트했기 때문에만 이걸 발견할 수 있었습니다.

테스트는 검증이 잡지 못하는 통합 문제를 드러냅니다.

스토리 검증기는 이런 걸 확인합니다:

  • 경로당 최소 10개 선택지 ✓
  • 모든 MBTI 차원 커버 ✓
  • 유효한 노드 구조 ✓

하지만 성격 카드 데이터의 존재 여부는 확인하지 않습니다. 다운스트림 시스템이 뭘 필요로 하는지 알 수 없습니다.

그래서 컴포넌트만이 아니라 end-to-end로 테스트해야 합니다.

스토리 생성기는 검증했습니다. 하지만 스토리 생성부터 카드 생성까지 전체 파이프라인을 검증하지 않았습니다.

빈틈이 드러났습니다.

영향

미래를 위해 고쳐진 것:

  • 새 스토리는 자동으로 성격 데이터 포함
  • 카드 생성은 올바른 폴더로 출력
  • 한국어 지원 구조 정리

I, Robot을 위해 고쳐진 것:

  • 9개 엔딩 전부 성격 데이터 보유
  • 샘플 카드 2개 검증 완료
  • 전체 카드 생성 준비 (총 30개)

막아낸 것:

  • 스토리 10개 더 만든 후에 이 버그 발견
  • 여러 스토리의 성격 데이터 수동 수정
  • 사용자가 망가진 성격 카드 받기

마이그레이션 도구 만들기가 즉시 빛을 발했습니다.

I, Robot 상태

완료:

  • 스토리: 56개 노드, 9개 엔딩, 경로당 12개 선택지
  • 커버: i-robot-cover.webp (157 KB)
  • 스타일 가이드: i-robot-style.webp (228 KB)
  • 캐릭터: 4개 초상화 (1.1 MB)
  • 씬: 57개 이미지 (12 MB)
  • 성격 데이터: 9개 엔딩 전부
  • 샘플 카드: 2개 검증됨

다음: 나머지 28개 성격 카드 생성.

그다음: 웹사이트에 배포.

빌딩 인 퍼블릭의 가치

만약 이걸 비공개로 만들고 있었다면:

스토리 5-10개를 더 만든 후에야 성격 카드를 테스트했을 겁니다.

그때 전부 성격 데이터가 없다는 걸 발견했겠죠.

스토리 대량 마이그레이션. 며칠의 작업.

대신에:

즉시 잡았습니다. 생성기 고쳤습니다. 마이그레이션 도구 만들었습니다. 수정사항 검증했습니다.

영향받은 스토리 하나. 수정에 하루. 수십 개의 스토리 구함.

일찍 테스트하세요. 자주 테스트하세요. 전체 파이프라인을 테스트하세요.


진행도: 26일차/100일 상태: I, Robot 완료, 성격 카드 시스템 검증됨 다음 포스트: 모든 성격 카드 생성 및 I, Robot 배포

GitHub에서 여정 따라가기