Webtoon Panel Render — 레퍼런스 → 베이크 렌더 → 검증 루프
웹툰 한 회차의 50+ 패널을 codex-image로 동시 5장씩 빠르게 렌더링하는 스킬. prompt-smith가 만든 패널 프롬프트 목록을 입력으로, 일관성을 지키며 PNG를 양산하고 검증한다.
이 스킬은 ~/.claude/skills/codex-image의 병렬 패턴 위에 웹툰 특화 일관성·검증·동시성 규약을 얹은 것이다. codex 호출 방식의 원본은 codex-image SKILL.md를 따른다.
핵심 4원칙(EP01 제작 피드백 반영):
- 레퍼런스 먼저(일관성). 패널을 그리기 전에 캐릭터 다각도/표정 레퍼런스 시트를 먼저 렌더해 외형 기준(SSOT)을 확정한다. 텍스트 토큰만으로는 매번 다른 얼굴이 나온다.
- 모든 텍스트 in-image 베이크(후작업 절대 금지). 말풍선 대사·효과음·화면 UI·환경 문자 등 모든 텍스트를 이미지 생성 시 작화에 함께 그린다(HTML 오버레이도, 포토샵 타이핑도, 어떤 후작업 합성도 없다). 그래서 "no text" 부정 프롬프트를 쓰지 않는다. 또한 결과가 베이크처럼 보여야 한다 — 텍스트는 작화와 같은 손그림 잉크 톤으로 녹아들어야 하고, 깨끗한 디지털 폰트를 평평하게 얹은 "붙여넣기" 느낌이면 실패(통합 레터링, EP01 P30·P33 피드백).
- 배경 씬 단위 고정. 씬별 장소 토큰(LOC_*)을 모든 패널에 주입해 배경 급변(도로→실내 등)을 막는다.
- 검증-재생성 루프. panel-validator가 패널을 6축으로 검사하고 미달분을 기준 만족까지 되돌려 재렌더한다.
사전 점검 (회차당 1회)
codex --version # 0.128+ 권장
codex login status # "Logged in using ChatGPT" 확인
codex features list | grep image_generation # stable/true 확인
미로그인이면 사용자에게 codex login 실행을 요청한다. 렌더 도중 멈추지 않도록 시작 전에 확인한다.
0단계 — 캐릭터 레퍼런스 시트 먼저 렌더 (ref-sheet-artist)
패널보다 먼저, 주요 캐릭터의 다각도/표정 레퍼런스 시트를 렌더해 시리즈 외형 기준을 확정한다. 이것이 모든 패널 일관성과 검증의 닻이다.
- 입력:
_workspace/04_visual/character-sheets.md(불변 토큰),style-bible.md(작화 스타일). - 캐릭터마다 2장 권장:
refs/{IDTAG}_turnaround.png— 정면/3-4/측면/후면 전신, 중립 단색 배경, 균일 조명, 무표정.refs/{IDTAG}_expressions.png— 핵심 표정 3~4종 클로즈업.
- 레퍼런스 프롬프트 규약:
- 글로벌 작화 스타일 토큰 + 캐릭터 불변 토큰 + "character reference sheet, multiple angles (front, 3/4, side, back), full body, neutral grey background, even flat lighting, model sheet".
- 식별 표식(점/흉터/팔찌 등)을 또렷이, 좌/우 위치 고정.
- 레퍼런스만은 텍스트 없이:
no text, no labels, no speech bubbles, no watermark(깨끗한 외형 도감이어야 기준이 된다 — 패널의 in-image 말풍선과 반대).
- 저장:
_workspace/04_visual/refs/(회차 폴더가 아니라 시리즈 자산, 다음 회차 재사용).refs/INDEX.md에 캐릭터별 경로+핵심 외형 한 줄+확정 여부 기록. - 렌더 후 0바이트/손상/md5 중복 확인, 각도 간 동일인 여부 육안 점검. 흔들리면 재렌더(최대 3회). 확정 시 prompt-smith·panel-validator에 INDEX.md 인계.
- 후속 회차: refs/가 이미 있으면 재렌더하지 않고 재사용한다(시리즈 일관성). 신규 캐릭터만 추가 렌더.
입력 — 패널 프롬프트 목록
_workspace/04_visual/ep{NN}_prompts.md를 Read한다. 각 패널은 다음 형식이다:
### panel_001
- scene_group: A
- scene_id: S2 / location: LOC_CLASSROOM
- prompt: "<글로벌 스타일 + 장소 토큰 + 캐릭터 토큰&레퍼런스 앵커 + 구도/상태색 + in-image 말풍선(한글 대사) + negative(no watermark/English/gibberish)>"
- output: _workspace/05_panels/ep{NN}/panel_001.png
렌더 전 출력 디렉토리를 만든다: mkdir -p _workspace/05_panels/ep{NN}
일관성 토큰 검증 (렌더 전 필수)
패널 간 캐릭터 외형·작화 스타일·배경이 흔들리면 웹툰이 무너진다. codex-image는 시드 고정이 어렵기 때문에 프롬프트 텍스트의 일관성 토큰 + 확정 레퍼런스 앵커가 일관성 장치다. 그래서 렌더 직전에 각 프롬프트가 다음을 포함하는지 확인한다:
- 작화 스타일 토큰 —
style-bible.md의 고정 스타일 키워드. - 등장 캐릭터의 외형 토큰 + 레퍼런스 앵커 —
character-sheets.md의 고정 키워드 세트 +refs/{IDTAG}_*.png확정 레퍼런스를 외형 기준으로 명시(식별 표식 좌/우 포함). - 씬 장소 고정 토큰(LOC_*) — 같은 scene_id의 모든 패널에 동일한 장소 배경 토큰. 배경 급변 방지의 핵심.
- 화면비/구도/상태색 지시 — 샷리스트의 앵글·구도·장면 색(평상/되감기/정산 등).
- in-image 말풍선/한글 대사 — lettering.md의 말풍선(종류·정확한 한글 원문·위치). 무대사 패널은 제외.
부정 프롬프트는 no text가 아니라 no watermark, no English text, no gibberish/garbled/misspelled text다(말풍선·한글은 그려야 하므로). 누락·모호하면 prompt-smith에 보강을 요청한다. 일관성 토큰·레퍼런스·장소 토큰 없는 패널은 렌더하지 않는다 — 다시 그리는 비용이 더 크다.
핵심 — 동시 5장 배치 렌더링
codex 전역 동시 세션은 5개를 절대 넘기지 않는다. ChatGPT 플랜의 동시 요청 한도 때문에 6개+는 큐잉으로 응답이 들쭉날쭉해지고 일부 작업이 비정상적으로 길어진다. panel-artist가 3명이어도 세 아티스트의 codex exec 동시 실행 총합이 5 이하가 되도록 오케스트레이터가 렌더 패스를 순차 디스패치한다.
방법 A (권장) — 배치 헬퍼 스크립트
codex-image의 배치 헬퍼가 임의 개수를 5장씩 자동 배치한다. 한 회차 전체(또는 한 scene 그룹)를 한 번에 넘긴다:
~/.claude/skills/codex-image/scripts/codex_imagegen_batch.sh \
_workspace/05_panels/ep{NN} \
"<panel_001 프롬프트>::panel_001.png" \
"<panel_002 프롬프트>::panel_002.png" \
... (임의 개수, 내부에서 5개씩 동시 실행)
- 한 배치(5장)가 끝나면 다음 배치를 시작하므로 동시 세션이 5를 넘지 않는다.
- 출력 PNG는 모두
_workspace/05_panels/ep{NN}/에 저장된다. - 프롬프트가 길면 셸 따옴표 이스케이프에 주의한다. 프롬프트 목록을 파일로 만들어 넘기는 것이 안전하다(아래 방법 B 참고).
방법 B — 수동 5장 병렬 (세밀 제어가 필요할 때)
한 메시지에서 정확히 5개의 Bash 도구를 run_in_background: true로 동시에 띄운다. 출력 파일명이 모두 달라야 한다(같은 경로면 마지막만 남는다):
codex exec --sandbox workspace-write --skip-git-repo-check \
--cd /Users/robin/Downloads/webtoon-new \
-o /tmp/codex-ep{NN}-001.md \
"이미지 생성 도구로 '<panel_001 프롬프트>' 이미지를 생성하고 ./_workspace/05_panels/ep{NN}/panel_001.png 로 저장. 파일 경로만 한 줄로 보고."
# 같은 패턴으로 panel_002~panel_005를 각각 run_in_background:true 로 동시에. 총 5개.
- 5장 완료 통지를 받은 뒤 다음 5장을 띄운다.
sleep폴링 금지 — 백그라운드 완료 통지가 자동으로 온다. --ask-for-approval을 붙이지 않는다(비대화형이라 즉시 에러 종료).- git 리포가 아니면
--skip-git-repo-check를 빠뜨리지 않는다.
분량·소요 시간 기대치
| 패널 수 | 배치(5장) 수 | 예상 렌더 시간 |
|---|---|---|
| 50장 | 10 웨이브 | 약 26~28분 (웨이브당 ~160초) |
| 60장 | 12 웨이브 | 약 32분 |
실측 기준 5장 동시 wall-clock ~158초. 사용자에게 렌더가 수십 분 걸림을 미리 알린다.
렌더 후 검증 (필수)
생성 직후 항상 파일을 확인한다. codex 세션이 도구 호출에 실패하면 0바이트 PNG가 나올 수 있다.
ls -la _workspace/05_panels/ep{NN}/*.png
file _workspace/05_panels/ep{NN}/*.png # 모두 "PNG image data" 인지
find _workspace/05_panels/ep{NN} -name '*.png' -size 0 # 0바이트 목록
# md5 중복 검사 (서로 다른 패널이 동일 이미지로 저장되는 사고 — EP01에서 실제 발생)
md5 -r _workspace/05_panels/ep{NN}/panel_*.png | awk '{print $1}' | sort | uniq -d # 비면 중복 없음
검증 결과 처리:
- 0바이트/손상 PNG → 그 패널만 다시 렌더한다(배치 전체 재실행 금지).
- md5 중복 PNG → 중복된 패널을 삭제하고 그 패널만 단독 재렌더한다(동시 배치에서 드물게 한 패널이 다른 패널 이미지를 받는다). 0바이트도 손상도 아니어서 크기/헤더 검사만으로는 못 잡으니 md5 검사를 반드시 한다.
- 파일이
~/.codex/generated_images/에만 있고 작업 폴더에 없음 → 프롬프트의 "./경로로 저장" 지시를 강화해 재시도. - 누락된 패널 번호 → prompts 목록과 실제 PNG 목록을 대조해 빠진 번호만 렌더한다.
- 모든 패널이 존재·유효·고유하면 1차 무결성 통과. 이어서 아래 검증-재생성 루프(panel-validator)로 내용 품질을 거른 뒤 quality-reviewer에게 넘긴다.
검증-재생성 루프 (panel-validator) — 기준 만족까지 재렌더
무결성(위)만으로는 부족하다. codex는 같은 프롬프트에도 엉뚱한 배경·다른 얼굴·깨진 한글을 낸다. 그래서 렌더 직후 패널 단위로 6축을 검사하고 미달분을 되돌려 재렌더한다(생성-검증 패턴). 통과 패널만 조립으로 간다.
6축 검사 (각 패널을 Read로 열어 육안 + 스크립트):
- C1 캐릭터 일관성 —
refs/{IDTAG}_*.png와 같은 사람인가(헤어/눈/체형/식별 표식·좌우). 의도된 변형(예: 정산 회색화)은 예외. - C2 배경/장소 연속성 — 배경이 그 패널의 scene_id/location(LOC_*)과 일치하는가. 같은 씬인데 장소 급변(도로→실내)하면 REGEN.
- C3 말풍선 & 한글 텍스트(최대 리스크) — 말풍선 종류가 맞고, **한글이 대본과 정확히 일치(오탈자·뭉개짐·영어/가짜 글자 없음)**하며 가독한가. 무대사 패널에 말풍선 있으면 REGEN. + (d) 통합 레터링: 말풍선·텍스트가 작화에 녹아든 손그림 잉크 톤인가 — 깨끗한 디지털 폰트를 평평하게 얹은 "오버레이/붙여넣기" 느낌이면 텍스트가 맞아도 REGEN(후작업 텍스트로 오해됨). 판별 신호(OVERLAY=REGEN): 기계적으로 균일한 획·완벽 균등 자간·시스템 고딕 룩·과하게 매끈한 가장자리·그림과 분리된 검정 톤. 철자와 분리해 별도 판별하며, 텍스트 보유 패널 100% 전수 + 1차 통과 후 교차 비교 스윕(한 패널만 디지털 폰트로 튀는지). 패널별 INTEGRATED/OVERLAY를 validation.md 레터링 원장에 기록 — 집계 도장(C3 강함 ✓)만으로 통과 금지. 상세 절차는
panel-validator정의의 "C3(d) 통합 레터링" 섹션. - C4 프롬프트 충실도 — 샷 사이즈/앵글/구도/감정/상태색이 의도대로인가.
- C5 대사 흐름 — 앞뒤 패널과 이어 읽어 대화가 자연스러운가.
- C6 기술 무결성 — 0바이트/손상/md5 중복 아님, 경로·번호 정확.
루프: 패널마다 ACCEPT / REGEN(사유+수정 지시). REGEN → prompt-smith가 그 패널 프롬프트만 보강(배경 급변→장소 토큰 강화, 한글 깨짐→텍스트 따옴표·굵게·짧게, 외형 이탈→레퍼런스 앵커·표식 강조, 구도 어긋남→앵글 명시) → 담당 panel-artist가 그 패널만 재렌더 → 재검사. 패널당 최대 3회. 3회 후에도 미달이면 가장 나은 버전을 ACCEPT-FLAG(통과+한계 명시)로 마감하고 ep{NN}_validation.md에 기록(무한 루프 방지). C3(한글)이 3회 실패하면 "말풍선 모양 유지 + 가장 정확한 텍스트 버전 채택"으로 마감하고 quality-reviewer에 플래그.
출력: _workspace/04_visual/ep{NN}_validation.md(패널별 판정·6축 결과·재생성 횟수·플래그 목록).
일부만 다시 그리기 (후속 작업)
quality-reviewer가 FIX/REDO로 지정한 패널만 재렌더한다. 전체를 다시 그리지 않는다.
- qa_report.md에서 REDO 패널 번호와 수정 지시를 읽는다.
- 해당 패널 프롬프트에 수정 지시를 반영(prompt-smith와 조율)한다.
- 그 패널들만 5장 이하 배치로 재렌더 → 재검증.
- 같은 패널을 2회 재렌더 후에도 실패하면 경고와 함께 통과시키고 보고서에 명시한다(무한 루프 방지).
안티패턴
- 6장 이상 한 배치 — 큐잉으로 응답 분산↑, 일부 작업 비정상 지연.
- 여러 아티스트가 동시에 각자 5장씩(총 10장+) — 전역 5 한도 초과. 반드시 순차 디스패치.
- 포그라운드 직렬 실행 — 병렬 효과 상실. 항상
run_in_background: true. sleep로 완료 대기 — 백그라운드 통지가 자동. 폴링 금지.- 동일 출력 경로 N개 동시 사용 — 마지막만 남음. 파일명 전부 달라야 함.
- md5 중복 미검사 — 동시 배치에서 한 패널이 다른 패널 이미지를 받는 사고를 놓친다(EP01 실제 발생). 크기/헤더만 보지 말 것.
- 레퍼런스/장소 토큰 누락 렌더 — 외형·배경이 흔들려 재작업 비용 폭증. 레퍼런스 시트 확정 전, 장소 토큰 주입 전에 패널을 렌더하지 않는다.
no text로 말풍선 억제 — 이 하네스는 말풍선을 in-image 베이크한다.no text를 넣으면 대사가 안 그려진다. 부정은no English/gibberish/misspelled text만.- 검증 없이 조립으로 직행 — panel-validator 6축 통과 전 패널은 조립에 넘기지 않는다.
- C3 집계 도장 — 패널별 레터링 개별 판정 없이 "C3 강함 ✓"로 일괄 통과. EP01에서 이렇게 13장의 오버레이-룩이 새어 나갔다. 텍스트 보유 패널은 전수로 INTEGRATED/OVERLAY를 원장에 남긴다.
- 레터링 교차 비교 생략 — 패널을 따로따로만 보면 "한 패널만 디지털 폰트로 튀는" 드리프트를 못 잡는다. 1차 통과 후 텍스트 패널을 모아 나란히 비교한다.
비용 주의
- 각 codex 호출은 독립 세션 → 토큰·플랜 메시지 한도를 N배 소모한다.
- 헤비 배치(50장+) 전
codex login status로 플랜 잔량을 확인한다.
출력
_workspace/05_panels/ep{NN}/panel_001.png…panel_0NN.png(50+장)- 렌더 요약(생성/재시도/실패 패널 수)을 episode-compositor와 리더에게 보고.