# 공통 리노컷 아바타 파이프라인 아바타 v3 리노컷 리그(결정문 [`avatar-expression-engine-v3.md`](../../decisions/avatar-expression-engine-v3.md) §8.2 리그 원칙)의 자산 파이프라인이다. P1~P7 등 모든 페르소나가 이 공통 스크립트를 공유하고, 페르소나별 차이는 각 페르소나 폴더(예: `../p1-linocut/`)의 `persona.json`에서만 읽는다. 결과물(레이어 픽셀, 알파, 게시된 WebP, 리그 TS)은 페르소나별 폴더 구조나 상수 위치가 바뀌었다는 이유로 달라지지 않는다 — 알고리즘은 건드리지 않았다(P1 회귀 검증: 아래 참고). ## 단계와 의존 순서 `run_pipeline.py`가 아래 순서로 각 단계를 독립 프로세스로 실행한다(괄호는 산출물): 1. `landmarks.py` — base-front.png 랜드마크 검출 (`manifest.landmarks`) 2. `brow_centerline.py` — `manifest.landmarks.eyebrowLeft/Right`를 잉크 띠 중심선으로 보정 3. `segmentation.py` — `layers/{body,head,hairFront}.png`(v1) + manifest 기준 섹션 4. `layers_v2.py` — `layers/v2/{body,head,hairFront}.png`(턱 밑 띠·잔머리 halo 보정) 5. `face_detail.py` — `layers/v2/face-detail.png` 6. `paper_grain.py` — `layers/v2/paper-grain.png`(다른 단계와 독립, 순서 유연) 7. `lip_texture.py` — `layers/v2/lip-{upper,lower,shadow}.png` 8. `jaw_pieces.py` — `layers/v2/jaw-{head,detail}.png` 9. `export_rig.py` — WebP 게시(`apps/web/public/avatar/v3//`) + `rigs/` 생성 10. `final_previews.py` — 게시된 WebP로 모션·눈/입 확대 미리보기 이 순서는 전달받은 작업 설명의 번호(주제별 묶음)와 다르다 — 특히 `final_previews`는 `export_rig`가 쓴 `export-rig-report.json`을 읽으므로 반드시 `export_rig` *다음*이어야 한다. `face_detail`·`jaw_pieces`는 `manifest.landmarks`(1~2단계가 채움)와 `layers/v2/{head,hairFront,body}.png`(3~4단계)가 먼저 있어야 한다. ## 실행 ```bash # 전체 실행 /python.exe run_pipeline.py # 한 단계만 다시 실행 /python.exe run_pipeline.py --only face_detail # 중간부터 끝까지 /python.exe run_pipeline.py --from lip_texture # 단계 이름 목록 /python.exe run_pipeline.py --list ``` 각 단계 스크립트는 `python