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 배포