| name | webtoon-panel-render |
| description | 웹툰 패널 이미지를 codex-image(codex exec image_generation)로 동시 5장씩 병렬 렌더링하는 스킬. 패널 렌더 전 캐릭터 다각도 레퍼런스 시트를 먼저 렌더해 일관성 기준을 만들고, 패널 프롬프트 목록(ep{NN}_prompts.md)에 일관성 토큰·레퍼런스 앵커·씬 장소 토큰·in-image 말풍선(한글 대사 포함)을 주입해 배치 생성하며, panel-validator의 생성-검증 루프로 기준 만족까지 재렌더한다. codex 전역 동시 세션 5개 한도를 지키고 0바이트·손상·md5 중복 PNG를 재시도한다. '패널 렌더링', '웹툰 이미지 생성', '레퍼런스 시트', '패널 이미지 배치 생성', '50장 그리기', 'codex로 패널 그려', 그리고 후속 작업 '패널 다시 그려/재렌더/수정/일부만 다시'에도 반드시 이 스킬을 사용. 단일 단발 이미지나 정밀 마스킹 편집은 codex-image/gpt-image2가 더 적합. |
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
codex login status
codex features list | grep image_generation
미로그인이면 사용자에게 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 로 저장. 파일 경로만 한 줄로 보고."
- 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
find _workspace/05_panels/ep{NN} -name '*.png' -size 0
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와 리더에게 보고.