| name | webtoon-consistency-qa |
| description | 생성된 웹툰 이미지·HTML 페이지를 캐릭터 시트·스타일 바이블·컷 리스트와 교차 비교하여 일관성 위반을 잡아내는 QA 스킬. 캐릭터 외형 드리프트, 시그니처 누락, 색 위반, 스크롤 호흡 깨짐, 텍스트 불일치 4축으로 검수한다. consistency-qa 에이전트가 호출한다. |
Webtoon Consistency QA — 4축 교차 비교 검수
핵심 원칙
**"존재 확인"이 아니라 "교차 비교"**가 본질. 단순히 "캐릭터가 있다"가 아니라 "캐릭터의 머리 색이 sheet.json의 #2A2624와 일치하는가"를 본다.
검수 시점 (점진적 QA)
- 시즌 시작 직후 — character-designer가 5인 시트 완성 직후 (1회)
- 각 회차 prompts 생성 직후 — image-prompt-engineer 완료 직후 (회차당 1회)
- 각 회차 이미지 생성 직후 — image-generator 완료 직후 (회차당 1회)
- 각 회차 HTML 조립 직후 — panel-assembler 완료 직후 (회차당 1회)
전체 완성 후 1회 검수보다 각 단계 직후 점진 검수가 훨씬 효율적이다. 빨리 잡고 빨리 고친다.
4축 검수 매트릭스
축 1 — 캐릭터 일관성 (Character Drift)
매 컷에 대해:
shot_list.json의 characters 필드에서 등장 캐릭터 추출
- 각 캐릭터의
_workspace/characters/{kebab}/sheet.json을 로드
_workspace/characters/{kebab}/portrait_front.png를 Read로 열어 시각 비교
- 생성된
cut_{NN}.png를 Read로 열어 다음 항목 검증:
- 머리 색이 sheet.json의 hair.color_hex와 일치하는가
- 의상이 default_outfit과 일치하는가
- signature_items가 모두 보이는가 (특히 always_visible:true인 것)
- negative_descriptors가 나타나지 않는가
- 박재준 같은 변형 캐릭터는 applies_from_episode 기준에 맞는 sheet 사용했는가
축 2 — 시각 시그니처 준수 (Signature Compliance)
매 컷에 대해:
signatures_used에 cyan_grid가 있는데 이미지에 청록 격자가 안 보이면 → blocker
cyan_grid가 없는데 도현 시점인데 청록 UI가 들어가 있으면 → blocker (도현 시점은 공허 흑이어야)
signatures_used에 memory_silhouette가 있는데 흑백 실루엣이 없으면 → blocker
glitch: true인데 자홍 픽셀 글리치가 안 보이면 → warning
- 회차 전체 시그니처 카운트:
- signature_1 (POV 비교): ≥ 1 필수
- signature_2 (흑백 실루엣, 던전 회차만): ≥ 1 필수
- 자홍 글리치 수 = magenta_glitch_quota (정확 일치)
축 3 — 스크롤 호흡 (Rhythm Validation)
- 컷 수: 8-15 사이
- scroll_length 합: ≤ 25
- 침묵 컷(scroll_length:1): 임팩트 컷(scroll_length 3-4) 직전 1컷 존재
- 마지막 컷: scroll_length ≥ 2 + 클리프행어 텍스트 또는 시각 닻
- 표정 클로즈업 컷 수: 3-5 사이
축 4 — 텍스트 정합 (Text Consistency)
- 모든 dialogue / narration_doh_yun / system_ui_text / operator_text / monster_emotion 텍스트가 shot_list 메타와 index.html 렌더링 결과가 일치
- 한글이 깨지거나 빈 문자열로 렌더된 곳이 없는가
- 이미지에 한글이 박혀 있으면 즉시 blocker (텍스트는 HTML 오버레이여야)
검수 절차
Step 1 — 입력 수집
characters/ → sheet.json 5개, portrait_*.png
style_bible/ → style_bible.json
episodes/ep{NN}/ → shot_list.json, prompts.json, images/cut_*.png, index.html
Step 2 — 캐릭터 등장 매트릭스 작성
각 컷 × 등장 캐릭터를 표로 만들고, 검수 우선순위 정렬:
- 임팩트 컷(scroll_length 3-4): 전수 검수
- 일반 컷: 30% 무작위 샘플
Step 3 — 컷별 비교 검수
각 대상 컷에 대해 4축 매트릭스 적용. 발견 시 findings에 기록.
Step 4 — qa_report.json 작성
{
"episode": 1,
"checked_at": "2026-05-17T20:05:00Z",
"verdict": "pass | pass_with_warnings | needs_revision",
"findings": [
{
"severity": "blocker | warning | info",
"axis": "character | signature | rhythm | text",
"cut_id": 4,
"issue": "도현의 머리카락이 sheet.json의 #2A2624이 아닌 #000000으로 렌더링됨",
"expected": "#2A2624 어두운 갈색, 헝클어진 짧은 컷",
"observed": "#000000 순흑",
"suggested_fix": "prompts.json cut_4의 positive에 'dark brown #2A2624 hair' 토큰 강조 → image-generator 재실행",
"owner": "image-prompt-engineer"
}
],
"stats": {
"cuts_checked": 8,
"blockers": 0,
"warnings": 1,
"info": 2,
"cuts_passed": 7
}
}
Step 5 — 결과에 따른 조치
pass: 오케스트레이터에 회차 완성 통보
pass_with_warnings: 오케스트레이터에 출시 가능 통보 + 차회차 개선 권고
needs_revision: blocker 별로 owner 에이전트에 수정 작업 TaskCreate. blocker 해결 후 재검수.
시즌 일관성 검수 (별도)
회차 N의 캐릭터 시트가 회차 N+1 작업 도중 갱신되면, 회차 N의 이미지가 옛 시트 기준이라 드리프트 발생 가능. 이런 경우 "시즌 일관성 경고"로 별도 보고 — 전체 회차에 영향 평가 후 재생성 우선순위 결정.
검수 실패 패턴 — 자주 발견되는 문제
- 도현 머리색이 회차마다 다름 — prompt_block 미사용 → image-prompt-engineer에 강조 토큰 추가
- 윤세아 한쪽 은귀걸이가 사라짐 — signature_items.always_visible:true 표시 → 프롬프트에 강조
- 도현 시점 컷에 청록 UI 들어감 — negative 강화 토큰 누락
- 흑백 실루엣이 너무 디테일하게 그려짐 — "single outline only, no detail" 강화 필요
- 이미지에 한글 텍스트 박힘 — 모델이 텍스트를 그리려 함 → "text in image"를 negative에 추가 + post overlay로만 처리
체크리스트