# 서연(P1) 아바타 작업 핸드오프 — 2026-06-27 > 다른 세션에서 이어서 작업하기 위한 인계. imagegen(gpt-image-2)+BiRefNet+파츠 분리 리깅 파이프라인 전체를 여기서 참조. > 상세 원칙은 `AGENTS.md` §4. > **2026-07-13 상태 변경 — PAUSED:** 사용자 피드백에 따라 서연을 포함한 생성 이미지/PSD 래스터 파츠 리그는 실제 화면에서 전부 비활성화했다. 현재 `ClientAvatar`는 모든 페르소나에서 기존 SVG 도형 기반 파라미터 리그만 렌더링한다. 래스터 렌더러·원본·파츠 자산은 재검토 가능하도록 보존하지만 앱 배선에는 연결하지 않는다. --- ## 0. 한 줄 요약 래스터 파츠 파이프라인은 보존 상태로 중단했고, 현재 제품과 dev 미리보기는 기존 SVG 도형 기반 파라미터 리그만 사용한다. --- ## 1. 재개 조건 소유자가 래스터 아바타 재도입을 명시적으로 결정하기 전에는 Image #2 재생성, 파츠 보정, 앱 재연결을 진행하지 않는다. 재개 시에도 먼저 별도 미리보기에서 시각 수용 확인을 받아야 한다. ## 2. 완료된 것 (재사용 가능) - **이미지 생성**: `~/.codex/imagegen-headless/codex_imagegen.sh`(gpt-image-2, ChatGPT 구독). 검증 완료. - **누끼**: `object-separation` 스킬(BiRefNet). 알파 정제(임계치 35/205)까지 확인. - **파이프라인 스크립트**(`docs/avatar-art/seoyeon/`): - `prompt-base.txt` — base 생성 프롬프트(Image #1 기준; Image #2 재생성 시 -i 참조로 대체 가능) - `gen-variants.sh` — 표정 변주 7종(sad/tired/anxious/warm/startled/eyes-closed/speaking) 일괄 생성. base를 `-i`로. - `cut-publish.sh` — BiRefNet 누끼 → 게시 일괄 - `publish.py` — 표준 캔버스(900×1125) 정규화 + 알파 정제. `python publish.py <컷아웃> ` - `make-parts.py` — 특징 영역(UPPERFACE/EYELID/MOUTH) 크롭+페더 파츠. **영역 상수 튜너 블럭**(상단). - **렌더러**: `apps/web/src/components/avatar/RasterBust.tsx` - 파츠 분리: `base` + `upperface-<표정>`(눈썹+눈) + `eyelid-closed`(깜빡임, 1-blink) + `mouth-<표정>` + `mouth-open`(립싱크, RMS). - 28표정→클러스터 매핑(`VARIANT_FOR_EXPRESSION`) 내장. - **현재 연결 상태**: - `persona.ts`: `AvatarPersona.rasterArtSet` 계약 제거. - `Session.tsx`·`LearnerHome.tsx`: P1/P4~P7 래스터 아트셋 배선 제거. - `ClientAvatar.tsx`: 항상 SVG 파라미터 리그 렌더, `data-render-mode="svg"` 고정. - `App.tsx`: `/dev/avatar-preview`는 SVG 파라미터 리그 점검 페이지로 유지. - **dev 미리보기**: `apps/web/src/pages/AvatarPreview.tsx`는 서연 SVG 도형 리그의 대표 표정과 모션만 표시한다. - **스크린샷 도구**: `apps/web/scripts/avatar-shot.mjs` (`BASE_URL=http://localhost: node ...`). - **보존 에셋**: `apps/web/public/avatar/seoyeon-live2d-psd-v2/parts/*.png`, `apps/web/public/avatar/seoyeon/`, `seoyeon-live2d-psb`. 소스/재현 스크립트는 `docs/avatar-art/seoyeon/live2d-psd-v2/`. 현재 제품에서는 로드하지 않는다. ## 3. 보류된 작업 (래스터 재도입 결정 전 실행 금지) 1. Image #2(2.png) 해석 사용자 확인 → ASCII 이름으로 복사: `cp "<2.png 경로>" docs/avatar-art/seoyeon/ref-image2.png`. 2. **base 재생성**(검증용 1장): `codex_imagegen.sh --out base-v2.png --size 1024x1280 --quality high -i ref-image2.png "Use the supplied reference as the exact character. Same character, head-and-shoulders bust, perfectly front-facing, symmetrical, neutral calm expression, flat solid light gray #C9CDD2 background, no gradient/shadow/scenery, semi-realistic soft anime. No text/watermark/hands. Bangs above eyes."` → 결과(base-v2.png)를 사용자에게 보여주고 Image #2 일치 확인. 3. **변주 재생성**: `gen-variants.sh` 의 `BASE` 를 `base-v2.png`로 바꾸고 실행(동일 7종). → `cut-publish.sh` → `make-parts.py`. 4. **검증**: dev 서버(5173)의 `/dev/avatar-preview` 를 `avatar-shot.mjs`로 캡처 → 사용자 확인. 파츠 정렬이 틀리면 `make-parts.py` 영역 상수(UPPERFACE/EYELID/MOUTH) 튜닝 후 재생성. 5. **검증 게이트**(AGENTS.md §2): `cd apps/web && npm run typecheck`. 레이아웃 변경 시 `e2e/session-layout.spec.ts`(8/8)+`e2e/layout-visual-gate.spec.ts`(7/7) — **web+api(+DB) 스택 필요**. ## 4. 환경 메모 - **dev 서버**: 5173 단일 인스턴스로 띄움(백그라운드). 끊기면 `cd apps/web && npm run dev -- --port 5173 --strictPort`. (5173/5174 중복 인스턴스가 "깨진 화면" 원인이었음 — 항상 5173 단일로.) - codex CLI 0.142.2, auth_mode=chatgpt(구독). object-separation venv: `~/.venvs/object-separation` (CPU-only BiRefNet). - 서연=P1은 API 시드(`apps/api/app/services/persona.py`). 웹의 P1 외형/기본 정서값은 유지하지만 래스터 아트셋은 전달하지 않는다. ## 5. 미해결/결정 필요 - Image #2 캐릭터의 **의상 색/추가 디테일** (비전 도구 불안정 → 사용자 확인 필요). - 래스터 아바타 재도입 여부와 방식은 현재 보류다. 현행 제품 기준은 SVG 도형 기반 파라미터 리그다. - 실제 Live2D Cubism(.moc3) 도입 여부는 소유자 결정(편집기 저작 필요).