# 작업 지시서 — omp 세션의 GPT 움직이는 이모티콘 제작 인수인계

작성 기준: 2026-10-29. 대상: 옆 Claude 세션에서 같은 작업을 이어받는 제작 담당자.

작업 루트: `/Users/lilysnc/orca/workspaces/bueop/이모티콘`

**이번 지시는 문서 작성만이다. 그림 생성·영상 생성·배포·OGQ 업로드를 재개하지 않는다. 이 문서를 읽었다는 이유로 아래 실행 명령을 자동 실행하지 말 것. 후속 제작·등록은 사장님의 다음 지시 범위에서 한다.**

이 문서는 `out/지침서-GPT프레임.md`, `out/지침서-IDE용.md`와 실제 완성품 `sets/neulbong-gpt`의 스크립트·프롬프트·검증·등록 기록을 통합한 최신 인계본이다. 기존 두 문서는 역사 기록으로 남겼으며 직접 덮어쓰지 않았다. 서로 충돌하는 사항은 아래 최신 기준을 적용한다. 가격·외부 서비스 규격은 기록 시점의 사실과 현재 확인 필요 사항을 구별했다. 문서 작성 중 생성·업로드 명령은 실행하지 않았다.

## 1. 먼저 알아야 할 결론과 기존 지침의 정정

| 항목 | 오래된 설명 | 이번 인계의 기준 |
|---|---|---|
| GPT 연속 프레임 | 8프레임 실험, 이후 16프레임 4×4 권장 | **늘봉이 완성본은 24프레임 6×4, 1536×1024 시트**. 새 GPT 움직이는 세트의 재사용 기준은 이 구현. 8프레임은 시안, 16프레임은 구형 대안 |
| 한 칸 해상도 | 300px 안팎 | 1536÷6=256, 1024÷4=256. 24칸의 실제 한 칸은 **256×256**. 1024² 4×4도 256²이며, 프레임 수를 늘렸다고 한 칸 해상도가 좋아지지는 않음 |
| 프레임과 시간 | 16장에 첫 장 추가, 약 0.19초씩 | 현재 구현은 **24번째를 1번째로 교체**, 총 24장·23개 고유 프레임·정확히 3000ms. 120/130ms 교대. 24fps가 아니라 평균 8fps |
| 움직임 | 잔잔한 컷은 코드를 써도 된다는 옛 README | **정지 그림을 코드로 흔들고 확대·축소해 동작인 척하는 방식 금지.** GPT가 직접 그린 연속 포즈 또는 별도 승인된 영상 AI를 사용 |
| 위치 고정 | 칸 좌표만 보존하면 충분 | 칸 좌표 보존 + **접지 기준선 보정**, 실제 점프 구간은 별도 표시해 보존. 프레임별 중앙 정렬·개별 확대는 금지 |
| 여백·대사 | 전체 4% 여백, 아래 24%를 고정 예약 | 구형 공용 포장은 유지 가능. 최신 늘봉이는 실제 글자 잉크 경계로 배치: **좌우 각 15px, 상하 각 13px, 그림과 글자 간격 8px**. 글자 높이 상한만 640×0.24. 빈 글자 칸을 불필요하게 크게 남기지 않음 |
| GPT 비용 | “0원”, “다시 뽑아도 비용 없음” | **영상 AI 크레딧을 쓰지 않았다는 뜻만 확정.** 구독 사용량·이미지 백엔드 과금·재생성 비용까지 0원이라고 보장하지 않음 |
| 검수 | 첫·중간·끝 또는 큰 동작만 확인 | 원본과 최종 GIF **모든 프레임**의 팔다리·연결·가림·색·누끼를 확인. 24종×24프레임이면 최종 576프레임 |
| 첫 장=끝 장 | 같으면 루프 합격 | 파일 조건일 뿐. **23→24(=1) 연결까지 자연스러워야** 실제 동작 합격 |
| 마켓 | 옛 README의 카카오 규격도 포함 | 이 작업은 **OGQ 중심**. LINE은 보류, 카카오는 기존 운영 방침상 생성형 AI 제출 대상에서 제외. 다른 마켓은 별도 지시 및 당시 정책 확인 후 진행 |

## 2. 사장님 지시·운영 규칙 모음

### 2.1 기획과 그림

1. 새로운 세트는 콘셉트와 **2×2 캐릭터 시안**을 먼저 보여 주고 선택을 받는다. 이미 승인받은 세트의 반복 제작에는 승인 단계를 다시 끼워 넣지 않는다.
2. 캐릭터 생김새·비율·선 굵기·색은 세트 안에서 고정한다. 모든 컷에 같은 승인 참조를 첨부한다. 화풍은 세트마다 다르게 해도 된다.
3. **한 컷 안에 하나의 완결된 동작**을 만든다. 서로 관계없는 표정 24개를 늘어놓은 시트는 애니메이션이 아니다.
4. **크고 다양하고 뜻이 읽히는 온몸 동작.** 뻔한 손 흔들기·끄덕이기·눈 깜박이기·숨쉬기·제자리 바운스만 바꿔 24종을 채우지 않는다. 사고/과장/반전/수습이 보이게 한다.
5. **캐릭터 높낮이가 의미 없이 오르내리지 않게 한다.** 고정 카메라·기준 크기·접지점·기준선이 있어야 한다. 실제 웅크리기·찌그러짐·기울기·계획한 점프는 허용하지만 프레임 등록 오류는 허용하지 않는다.
6. 소품을 다양하게 쓰고, 대사는 그림 생성 후 코드로 얹는다. 기본은 짧은 한국어 8자 이내, 진갈색 글자와 흰 외곽선. 말풍선·두 줄 대사처럼 사장님이 별도로 지정한 세트 구성은 그 지시가 우선이다.
7. **화면을 넘치지 않게 꽉 채운다.** 몸통만 키우지 말고 소품·효과·전 동작의 합집합을 맞춘다. 얼굴·손발·상자 모서리 등은 한 프레임도 잘리면 안 된다.
8. 원본과 최종 파일 모두 팔다리 개수·연결·정상적인 가림을 전수 검사한다. 프롬프트에 개수를 쓴 것은 검수 완료가 아니다.
9. 소품의 작은 색도 보존한다. 잎·물방울이 감색 뒤 살색 덩어리로 합쳐져 여분의 손발처럼 보이면 실패다.
10. 확인 페이지에는 실제 투명본을 올린다. 체크·어두운 배경·자홍 배경으로 볼 수 있게 한다. 흰 배경을 합성한 GIF를 투명본이라고 보여 주지 않는다.
11. 1번은 세트의 얼굴. 인사·감사·축하·공감 등 자주 쓰는 컷을 앞에 놓고 비슷한 동작·소품은 떨어뜨린다.

### 2.2 비용·브라우저·보고

- 유료 생성은 **한 건 생성→검수→나머지 묶음**. 이미 만든 원본과 결과부터 찾아 재활용한다.
- 같은 생성 실행기를 중복 실행하지 않는다. 중복 제출은 크레딧 낭비다. 비싼 해상도를 관성으로 선택하지 말고 현재 버튼의 실제 가격을 확인한다.
- 막히면 원인 한 줄, 확보한 결과, 우회안을 말한다. 실패를 숨긴 채 같은 요청을 반복하지 않는다.
- 사용자 브라우저를 앞으로 끌지 않는다. `Page.bringToFront` 금지. 자동화 전용 탭 한 개를 재사용한다. 서로 다른 세션은 각자 전용 탭을 소유하며 남의 탭을 가로채지 않는다.
- 보고는 한국어로 짧게. 등록 성공과 심사 통과/판매 개시는 구별한다. 제목·확인 주소·실제 크레딧·다시 만든 컷과 이유를 남긴다.
- **제작자명을 새로 넣지 않는다.** 폐기된 제작자명 “몽상아뜰리에 / Mongsang Atelier”를 화면·README·스토어 저작권 칸에 새로 쓰지 않는다. 필수 칸이면 사장님께 묻는다. 이미 출시된 앱의 개인정보처리방침에 있는 처리자 표기는 임의 삭제하지 않는다.
- 글꼴은 실제 폰트 파일의 상업 이용 허용 근거를 확인한다. OFL 글꼴의 래스터 PNG/GIF 사용과 폰트 파일 자체 배포는 다른 문제다. 폰트를 합성 굵게 처리하지 않는다. 가독성용 흰 외곽선은 글꼴을 굵게 가공하는 것과 구별한다.
- 승인되지 않은 마켓 확장·추가 생성·업로드를 임의로 하지 않는다. 특히 현재 10/29 지시는 이 작업 지시서 저장뿐이다.

## 3. 실제 기준 작품과 파일 위치

### 3.1 GPT 프레임 완성 사례: 늘봉이

세트 루트: `sets/neulbong-gpt/`

- 작품: **움직이는 바쁜 척 늘보 늘봉이**.
- 공급자 기록: `GPT via openai-codex image provider`. 영상 AI 미사용.
- 24종, 각 24프레임, 3초, 740×640 투명 GIF.
- 승인 참조: `art/concept/reference.png`.
- 공통 프롬프트 원문: `prompt-base.txt`.
- 24컷 대사·소품·동작: `poses.json`.
- 컷별 실제 요청 원문: `art/prompts/01.txt` 등. 수정본은 `07-anatomy-fix.txt` 같은 별도 파일.
- 원본 시트: `art/sheets/01.png`~`24.png`.
- 거절/수정 전 원본: `art/archive/`.
- 빌더: `tools/build.py`.
- 제출물: `out/submit/ogq-anim/01.gif`~`24.gif`, `main.png`, `tab.png`.
- 첫 프레임 정지본: `out/stills/`.
- 변환 전 감색되지 않은 합성 프레임 시트와 수치: `out/review/NN.jpg`, `NN.json`.
- **최종 GIF를 디코딩한 전 프레임 해부학 시트**: `out/anatomy-review/NN.jpg`.
- 규격 결과: `out/verification.json`.
- 해부학 결과: `out/anatomy-verification.json`, 수정 전 `out/anatomy-before-fix.json`.
- 웹 묶기: `tools/site.py`; 결과 `out/site/`.
- 배포 검사 기록: `out/deploy-verification.json`, `out/browser-check/result.json`.
- 비용 근거: `out/cost-comparison.json`.
- 제작 요약: `production.json`.
- OGQ 접수 기록: `out/ogq-submission.json`, 스크린샷 `out/ogq-submission.png`.
- 확인 페이지 기록: https://neulbong-gpt.pages.dev/
- OGQ 심사 접수 기록: https://creators.ogq.me/digital-assets/review/1793024202810485
- 접수 JSON의 상태는 `REVIEW`, `animated: true`, `isFree: false`, `creationSourceType: AI`. **이 문서 작성 시 웹에서 최신 심사 결과를 다시 확인한 것은 아니다. 중복 등록 금지.**

### 3.2 공용 및 구형 도구

| 파일 | 실제 역할 / 재사용 주의 |
|---|---|
| `tools/gpt-web.js` | 로그인된 ChatGPT 웹에 프롬프트 파일과 참조 파일을 전달하고 답을 저장. `art/.gpt-tab`에 탭 ID 유지. 다른 세션과 같은 탭을 동시에 조작하지 말 것 |
| `tools/gpt-read.js` | 웹 답변 읽기 보조. 생성 프레임 검수나 규격 검사기를 대체하지 않음 |
| `tools/omp-draw.sh` | `omp`를 통해 `xd://generate_image`로 한 장 생성하는 초기 래퍼. **1024×1024가 하드코딩**되어 있어 현재 1536×1024 6×4 시트에 그대로 쓰면 안 됨. 모델명·CLI·timeout 유무도 환경 확인 필요 |
| `sets/kling-test/gpt2gif.py` | 초기 4×2/8프레임 실험. `frames_from_sheet(..., cols, rows)`, `build(..., cols, rows, delay, tag)`가 있으나 CLI 기본은 8프레임. 현재 24프레임 빌더와 혼용 금지 |
| `sets/neulbong-gpt/tools/build.py` | 현재 재사용할 GPT 6×4 분리·접지·합집합·대사·GIF 빌더 |
| `tools/anim.py` 및 세트별 `tools/anim.py` | 영상에서 프레임 추출·크로마키·GIF/APNG 포장하는 별도 계열. GPT 시트를 영상으로 착각해 넣지 않음 |
| `tools/apng.py` | 공유 팔레트·전체 캔버스 APNG 인코더. 함수 호출형 도구이며 단독 실행은 `/tmp/apng-test.png` 데모를 생성함 |
| `tools/check-ogq.py` | 공용 규격 검사기. CLI는 루트의 고정된 제출 폴더 세 곳을 검사. 다른 세트 경로를 CLI 인자로 주면 검사 대상이 바뀌는 구조가 아님 |
| `tools/ogq-upload.js` | OGQ 정지/움직이는 등록 자동화. 실제 업로드를 수행하는 도구. 생성·등록 승인 없이는 실행 금지 |
| `tools/deploy.sh` | **짹구 프로젝트 `jjaeggu`로 배포하도록 고정**된 옛 스크립트. 늘봉이/새 세트 배포에 무심코 사용하면 다른 프로젝트를 덮어쓸 수 있음 |
| `tools/code-anim.py` | 옛 정지 그림 변형 실험. 현재 “직접 그린 연속 동작” 제작 기준에서는 사용하지 않음 |

## 4. 동작 설계: 뻔하지 않고 연속적인 한 컷 만들기

### 4.1 컷별 기획 표

각 컷은 최소 `번호 / 한국어 대사 / 고정 소품 / 시작 포즈 / 준비 / 주동작 / 반동·수습 / 복귀 / 접지·공중 구간 / 정상 사지 개수`를 정한다. 늘봉이의 실제 데이터 구조는 `poses.json`의 `id`, `text`, `prop`, `action`이며 필요한 컷에만 `airborne_frames`, `palette_accents`가 있다. 새 캐릭터의 정상 사지는 별도 검수 기록에도 명시한다.

**소품의 역할을 먼저 정한다.** 어느 손이 무엇을 계속 쥐고 있는지, 언제 놓고 언제 다시 잡는지, 가려지는 팔이 무엇인지가 불명확하면 손이 복제된다. 가능하면 동작 내내 그립을 유지하고 표정·몸통·무릎으로 과장한다. 어려운 동작을 무조건 지우는 것이 아니라, 해부학적으로 읽히는 방식으로 설계한다.

### 4.2 24프레임 타임라인

| 프레임 | 기능 | 검사 |
|---|---|---|
| 1 | 소품이 있는 명확한 시작 포즈 | 나중에 루프 기준으로 사용 |
| 2~5 | 준비·예비동작 | 무릎을 굽히고 몸을 반대 방향으로 감는 등 원인 제시 |
| 6~12 | 가장 큰 주동작 | 온몸 실루엣 변화. 단순 통째 평행 이동과 구별 |
| 13~18 | 반동·수습 | 충돌/실패의 결과가 읽히고 소품이 자연스럽게 따라옴 |
| 19~23 | 시작으로 복귀 | 갑자기 리셋하지 말고 작은 연속 변화로 접근 |
| 24 | 1과 동일한 최종 파일 프레임 | 23→1이 자연스러워야 함 |

6→7, 12→13, 18→19는 시트의 줄이 바뀌는 곳이다. 여기서 크기·발높이·포즈가 초기화되는 오류를 특히 본다. 큰 동작도 인접 프레임은 연속 중간 포즈여야 한다. 키포즈만 24개 만든 뒤 빠르게 재생한다고 연속 애니메이션이 되지 않는다.

### 4.3 실제 사용한 동작 예

- **도장 쾅!**: 도장을 양손으로 들어 온몸을 길게 늘림 → 고정된 바닥에 찍으며 납작하게 찌그러짐 → 반동으로 일어남 → 도장을 시작 높이로 들어 복귀.
- **의욕만 만렙**: 작은 아령을 과하게 의욕적으로 듦 → 상상 속 무게에 눌려 크게 주저앉음 → 버티며 일어나 내림. 두 손은 각각 한 아령, 지지발은 바닥 유지.
- **잔고 다이어트**: 지갑을 기대하며 열어 뒤집음 → 빈손 위로 털어 봄 → 온몸이 납작하게 주저앉음 → 다시 희망찬 자세. 없던 동전은 만들지 않음.
- **눕는 게 전략**: 방석 옆에서 계산하는 표정 → 옆으로 크게 드러누움 → 몸을 둥글게 접고 편히 쉼 → 양팔로 밀어 처음 앉은 자세로 복귀.
- **사회성 짜내기**: 억지 미소 → 수건을 비틀며 몸통도 반대 방향으로 크게 비틀고 낮아짐 → 작은 물방울 두 개 → 풀면서 처음 미소로 돌아옴.
- **탈출 성공!**: 노트북을 안고 웅크림 → **한 번의** 실제 점프 → 같은 바닥에 착지하며 찌그러짐 → 일어남. 늘봉이 실제 `airborne_frames`는 1부터 세는 `[6,7,8,9,10,11,12,13]`.

같은 깊은 스쿼트만 24번 반복하는 것도 다양성이 아니다. 옆으로 눕기·몸통 비틀기·받치기·끌어오기·압축·쭉 펴기·관성에 휘청이기·계획된 단발 점프 등으로 방향과 중심 이동의 이유를 구분한다. 달리는 방향은 “화면 오른쪽, 약간 3/4 정면, 얼굴은 보이게”처럼 화면 기준으로 못 박는다. “역동적으로”라는 형용사만 던지지 않는다.

## 5. GPT 그림 생성: 웹과 xd://generate_image

### 5.1 공통 입력

- 같은 승인 참조 PNG 한 장. 늘봉이: `sets/neulbong-gpt/art/concept/reference.png`.
- 크기 `1536x1024`, 가로형 `3:2`, 정확히 6열×4행의 정사각 칸.
- **진짜 투명 알파**. 체커보드를 그림으로 그린 파일은 실패다.
- 캐릭터·소품 전체가 칸의 중앙 약 70% 안에 들어오도록 여유. 이는 **생성 원본의 동작 안전 여유**이며 최종 스티커를 70%로 작게 두라는 뜻이 아니다.
- 생성 이미지에는 한국어·대사·프레임 번호·말풍선·로고·워터마크를 넣지 않는다.
- 참조의 커피잔처럼 이번 컷에 불필요한 소품은 명시적으로 제거한다.
- 출력은 원본 파일로 저장하고 출처·프롬프트·수정 이유를 연결한다. 화면 스크린샷을 원본 대신 쓰지 않는다.

### 5.2 xd 장치 사용 형식

omp에서는 `xd://generate_image` 설명을 먼저 읽고, `write` 도구로 JSON을 보낸다. 실제 늘봉이 기록의 공급자는 `openai-codex`다. 아래는 **현재 장치 스키마에 맞춘 다음 실행용 호출 형식**이며, 문서 작성 과정에서 실행하지 않았다. `subject`에는 다음 절의 공통 원문과 그 컷의 소품·동작을 치환한 **실제 전체 문자열**을 넣는다.

```json
{
  "provider": "openai-codex",
  "image_size": "1536x1024",
  "aspect_ratio": "3:2",
  "input": [
    {"path": "/Users/lilysnc/orca/workspaces/bueop/이모티콘/sets/neulbong-gpt/art/concept/reference.png"}
  ],
  "subject": "이 위치에는 공통 원문에 해당 컷의 prop/action을 치환한 전체 프롬프트를 넣는다"
}
```

이 장치 스키마에는 `output_path`가 없다. 반환된 실제 이미지/아티팩트를 확인한 뒤 해당 세트 `art/sheets/NN.png`로 저장한다. 파일명만 `.png`로 바꾼 JPEG나 다운로드 실패 HTML을 정상 PNG로 취급하지 않는다. 실제 디코딩·크기·알파를 확인한다. 참조 첨부가 실패했는데 텍스트만으로 계속 24종을 만들지 않는다.

### 5.3 웹 ChatGPT 보조 도구

작업 루트를 현재 디렉터리로 한 **향후 실행 명령 예시**:

```bash
node tools/gpt-web.js ask sets/neulbong-gpt/art/prompts/08.txt art/gpt/frame-08-answer.md sets/neulbong-gpt/art/concept/reference.png
```

- `ask <프롬프트파일> <답변저장파일> [첨부파일 ...]` 형태이며 마지막 인자들이 참조 첨부다.
- `node tools/gpt-web.js new`는 대화를 새로 시작한다. 단지 다음 컷을 만들기 위해 매번 실행하지 않는다.
- `art/.gpt-tab`가 현재 전용 탭을 기억한다. 공유 CDP 모듈 경로는 `/Users/lilysnc/orca/workspaces/bueop/유튜브/pipeline/tools/cdp`다. 로그인/브라우저 포트를 환경에서 확인한다.
- 현재 스크립트는 업로드 미리보기·전송 입력창 상태·중지 버튼과 답변 텍스트 안정화를 본다. **텍스트 응답 완료가 이미지 생성/다운로드 완료를 보장하지 않는다.**
- 정적 코드 점검상 이미지 수집 부분의 `filter(...&&i)`는 콜백 범위 밖의 `i`를 참조한다. 해당 예외는 catch되어 “그림 저장 실패” 로그만 남을 수 있다. 또한 페이지 전체의 마지막 이미지들을 고르는 방식이므로 이전 답변 이미지를 섞을 위험이 있다. **이 도구의 종료 코드만으로 그림 확보를 선언하지 말 것.** 웹에서 정확한 해당 답변의 생성 원본을 받아 파일을 검증해야 한다. 이번 문서 작업에서는 코드를 수정하거나 실행하지 않았다.
- `tools/omp-draw.sh`는 1024² 한 장 래퍼이므로 6×4용으로 그대로 대체하지 않는다. 기존 이름의 이미지가 있으면 건너뛰므로 재시도 때 낡은 결과를 새 결과로 오해할 수 있다.

## 6. 실제 프롬프트 원문

아래는 `sets/neulbong-gpt/prompt-base.txt`의 공통 원문이다. 새 캐릭터라면 두 번째 문장의 외형과 정상 사지 개수를 승인 참조에 맞게 바꾸고, `{prop}`, `{action}`만 실제 기획값으로 채운다. 늘봉이 전용 생김새를 다른 캐릭터에 그대로 붙이지 않는다.

```text
Generate ONE 24-frame sequential 2D animation sprite sheet, EXACTLY 6 columns by 4 rows of equal SQUARE cells, landscape 1536x1024. Row-major playback left to right then next row. Not 24 separate expressions: this is ONE coherent action sampled at consecutive evenly spaced moments.
Use the attached reference.png as the EXACT original sloth character and art style. Warm taupe squat pear-shaped body, oatmeal cream face, cocoa teardrop eye patches, relaxed black oval eyes, tiny cocoa nose, apricot cheeks, coral red necktie, short blunt claws, NO tail. Hand-drawn irregular cocoa outline, flat warm wax-crayon color texture, no 3D, no shading gradients. Keep identity, anatomy, relative proportions, colors and outline thickness identical in all 24 cells. Remove the reference coffee cup unless the requested prop is coffee.
ANATOMY LOCK IN EVERY FRAME: exactly TWO arms with TWO hands and TWO legs with TWO feet. Every visible hand must connect continuously through wrist, forearm, elbow and upper arm to its shoulder. Every foot belongs to one leg connected to the pelvis. Never retain a paw or foot at its previous position when it moves; no ghost limbs, duplicate appendages, spare stumps or limb-shaped motion trails. Props and cloth must not create detached hands or an armless torso. Natural occlusion is allowed only when the hidden limb remains anatomically understandable.
PROP: {prop}
ACTION: {action}
The user specifically requires DYNAMIC WHOLE-BODY ACTION, smooth motion continuity and NO meaningless up/down floating. Use an expressive anticipation → broad squash/stretch action → recovery, not just a blink, nod or isolated waving arm. Keep one visible character, all body and all prop inside its own cell. No sudden object appearance or disappearing limbs. No camera motion, zoom, per-frame resizing or arbitrary recentering. Fixed cell-local registration: character body centered around x=50%, supporting foot or seated contact exactly on the same ground baseline at y=88% of each cell throughout. Keep the reference body SCALE consistent; actual squash and stretch is allowed, global scale jitter is not. During a lean, the grounded foot stays pinned. In a deep squat or seated slump, the body lowers naturally without translating the floor. Only if the ACTION explicitly includes an airborne tucked-knee hop may both feet rise: then use one smooth rise-and-fall arc and land at the same baseline. No arbitrary jumps between rows.
Animation timing: frame 1 is a clear neutral starting pose with this prop; frames 2-5 progressively anticipate; frames 6-12 progressively execute the large action; frames 13-18 follow through and recover; frames 19-23 progressively settle smoothly toward frame 1; frame 24 is identical to frame 1. Adjacent frames should have SMALL CONSECUTIVE IN-BETWEEN changes, including the transition from the last column of one row to the first column of the next. The expression must change gradually, not pop abruptly. Keep feet/seat aligned to the fixed floor unless the planned action has genuine airtime. End near the starting pose, not on a completely different pose.
Character including props should fit inside the central 70% of each cell with clear empty margins. Props held close, confetti or effects compact, no flying offscreen. All 24 cells must be drawn and no drawing may cross a cell boundary. Transparent background with REAL alpha, NOT a checkerboard painting. No grid lines, no borders, no frame numbers, no letters, no Korean words, no captions, no speech bubbles, no logos, no watermark, no background shadow. EXACT six-column four-row sheet geometry is mandatory for automatic cutting.
```

### 6.1 실제 08번 도장 동작 값 (`poses.json`)

```text
PROP: one oversized round coral rubber stamp with a cocoa handle and no lettering; NO coffee cup
ACTION: Heaves the heavy stamp up to chest height using both paws, stretches upward in anticipation, slams it onto the invisible floor with a deep pancake-like full-body squash, recoils upright and lifts it back to the starting position. The stamp lands on the same floor as the feet; no ink words.
```

### 6.2 실제 23번 이불 해부학 수정 원문에서 ACTION 발췌

파일: `sets/neulbong-gpt/art/prompts/23-anatomy-fix.txt`

```text
ACTION: The sloth has exactly TWO arms and holds a mustard blanket with two hands, one at each top corner. While unfolding it, the blanket stays BELOW chest height and both FULL arms are visible ABOVE or BESIDE it: shoulders, upper arms, elbows, forearms and wrists visibly connect to the two corner-gripping hands. The arms extend diagonally outward/down, then elbows visibly bend as the sloth squashes into a seated pose and wraps the blanket around its WAIST AND LEGS only. Forearms and hands remain outside and attached, never replaced by floating fingertips. It unwraps and refolds in reverse continuous stages, returning to the same starting pose. Exactly two arms and two legs, no extra appendages when uncovered.
```

### 6.3 실제 13번 점프 바닥 드리프트 수정 원문 추가절

파일: `sets/neulbong-gpt/art/prompts/13-registration.txt`

```text
PRODUCTION REGISTRATION OVERRIDE: Add ONE SHORT BRIGHT MAGENTA registration bar in EACH of the 24 cells. Each bar is flat horizontal, 28px wide and 5px thick, at the LEFT side of the cell (x=10%..21%), at the exact GROUND level where the feet land. It is separate from and never touches the sloth. All 24 magenta bars denote the SAME unchanging physical floor, even while the sloth jumps. The magenta bars are intentional production marks that will be removed later; DO draw them despite the no-grid-lines rule. No other magenta anywhere. The starting sloth feet stand level with this bar, the feet rise ABOVE it only during the planned one smooth airborne hop, and land level with it again. Do not let the ground move during the jump. Make a SINGLE smooth takeoff and landing, not a second jump after a row break. Make the final standing pose body height and size exactly match the first. Clear transparent space separates the character from the registration bar.
```

이 표식은 별도 수정용 예외다. 모든 신규 시트에 자동 삽입하지 않는다. 현재 `build.py`가 표식 제거까지 자동 처리하는 것도 아니다. 원본 기록은 `art/sheets/13-registration.json`: 바닥 표시 높이 범위 0.5px, 제거 조건 `R-G>20 and B-G>20`, 캐릭터에 자홍색이 없다는 조건에서 표식만 제거했다. 새 캐릭터·소품에 자홍색이 있으면 이 판정을 재사용하지 말 것.

## 7. 프레임 분리·위치·누끼·크기 규칙

### 7.1 현재 빌더가 실제로 하는 일

`sets/neulbong-gpt/tools/build.py`의 `cut_sheet` → `compose` → `to_gif` 순서다.

1. RGBA로 읽고 실제 투명 알파가 없는 시트는 거절한다. 6열·4행으로 나누어떨어지는 크기인지 검사한다. 생성 규격은 1536×1024로 별도 확인한다.
2. 시트 **바깥 테두리**에서 불투명 픽셀을 검사한다. 실제 외곽 잘림은 재생성 대상이다.
3. 알파 연결요소를 찾아 각 칸에 소속시킨다. 내부 가상 격자를 조금 넘은 팔·소품은 연결 덩어리째 보존하고 필요한 패딩을 추가한다. 단순 동일 사각형 자르기로 손을 잘라내지 않는다.
4. 각 칸의 좌표계를 유지한다. 매 프레임 캐릭터 바운딩박스를 따로 중앙 정렬하지 않는다.
5. 가장 큰 연결요소의 아래쪽을 몸의 접지 후보로 측정한다. 접지 프레임의 중앙값을 기준선으로 삼아 **세로 오프셋만** 교정한다.
6. `airborne_frames`에 있는 실제 점프는 이 강제 바닥 정렬에서 제외한다. 이를 안 하면 점프가 없어지거나 화면 전체가 따라 움직인다.
7. 모든 프레임의 알파 경계 **합집합 union**으로 공통 크롭한다. 몸뿐 아니라 모든 소품·효과를 포함한다.
8. 마지막 24번째 근사 포즈를 첫 프레임 복사로 교체한다. 동작 내용이 불량한 중간 프레임을 지우는 용도가 아니다.
9. 합집합에 단 하나의 배율을 정해 24장 모두 같은 크기·같은 배치로 합성한다. 대사도 움직이지 않는다.

**알고 써야 할 한계:** 가장 큰 연결요소가 항상 몸이라는 수학적 보장은 없다. 거대한 소품, 분리된 손발, 서로 붙은 두 칸은 소유권/접지 추정을 망칠 수 있다. 수치가 나왔다고 자동 합격시키지 않는다. 실제 발·좌면을 눈으로 확인하고, 해결할 수 없으면 해당 원본을 다시 만든다. 가상 격자 넘침을 복구하는 기능은 “옆 칸에 닿게 그려도 된다”는 허가가 아니다. 행별 스케일 드리프트와 수평 위치 오류를 프레임별 리사이즈·센터링으로 덮지 않는다.

### 7.2 누끼 검수

- 우선 진짜 알파 원본을 받는다. 초록 배경에 초록 잎·사과를 그리면 키잉 때 함께 지워진다.
- 불가피하게 색 배경을 쓰는 별도 파이프라인에서는 캐릭터·소품에 없는 색을 골라야 한다. 흰 몸에 흰 배경을 단순 임계값으로 날리지 않는다.
- 바깥에서 flood-fill만 하면 손잡이·팔·꼬리·컵·의자 다리 안의 **갇힌 배경**이 남는다. 누끼 직후 자홍색 위에서 확인한다.
- 흰 종이·눈 흰자·쌀알·크림 무늬·하이라이트는 배경이 아니다. 민트 배경과 색 거리가 가깝다는 이유만으로 삭제하지 않는다.
- 구형 민트 `CFEFE0`의 참고 판정은 `|R-207|+|G-239|+|B-224|<45`와 `G-R>12`, `G-B>5`를 함께 적용한 것. 다른 색·그림에 그대로 적용하지 않는다.
- 수동 갇힌 배경 선택은 `art/holes.json`, 처리 전 컷아웃은 `art/cut-orig/`로 기록하는 기존 방식이 있다. 새 원본 처리 때 오래된 백업으로 덮어쓰지 않는다.
- 원본·변환 전·**최종 감색 GIF**를 구별해서 본다. 알파가 사라지거나 팔 내부가 뚫린 문제가 변환 탓이면 원본부터 다시 생성하지 말고 변환부터 고친다.

### 7.3 크기·여백·대사

늘봉이 최신 구현 값은 `W=740`, `H=640`, `MX=15`, `MY=13`, `GAP=8`이다. 글자는 `fonts/GamjaFlower-Regular.ttf`, 진갈색 `(74,46,31)`, 흰 테두리. `textbbox`의 실제 잉크·테두리 크기로 글자 크기를 고르고, 글자 높이는 최대 `round(640*.24)`다. 실제 글자 높이만 아래에 배정하므로 그림을 불필요하게 줄이지 않는다.

전체 사용 가능 높이는 최대 `640-2*13=614px`. 가로로 긴 동작은 가로 제한 때문에 실제 높이가 그보다 작아질 수 있다. 비율을 깨서 무조건 세로 614px로 늘리지 않는다. main/tab도 투명이며 이름을 정확히 사용한다. 제작 도중 소품이 커지는 프레임까지 포함한 공통 배율을 정한다. 새 캐릭터가 변형된 것처럼 보이는 프레임별 크기 정규화는 금지다.

## 8. GIF / APNG 묶기와 OGQ 규격

### 8.1 OGQ 제출물

| 종류 | 제출 구성 |
|---|---|
| 정지 | `01.png`~`24.png`, 각 740×640 투명 PNG |
| 움직이는 | `01.gif`~`24.gif`, 각 740×640 투명 GIF |
| 메인 | `main.png`, 240×240 |
| 탭 | `tab.png`, 96×74 |
| 용량·프레임 | 기존 확인 규격: 파일당 1MB 이하, GIF 최대 100프레임, 첫 프레임=끝 프레임 |
| 색·해상도 표기 | RGB 계열, PNG 72dpi. GIF는 팔레트 형식이며 PNG와 동일한 DPI 메타데이터를 강요하지 않음 |
| AI·판매 | 실제 사용에 맞게 **AI 생성(전부)**, 지시된 유료 판매. 늘봉이 기록은 `creationSourceType: AI`, `isFree: false` |

현재 로컬 코드의 1MB 검사는 `1024*1024=1,048,576`바이트다. 늘봉이 기존 최대값은 **1,048,431바이트**로 상한에 매우 가깝다. 새 제출 때 웹이 안내하는 정확한 한도를 다시 보고, 한도가 다르면 더 엄격한 쪽에 맞춘다. 크기·프레임수만 통과했다고 판매 승인된 것은 아니다.

### 8.2 현재 GIF 인코딩

- 24프레임에 `[120,130]*12`ms → 총 3000ms.
- `loop=0`, `disposal=2`, 투명 인덱스 255.
- `MEDIANCUT`, 디더 없음. 색 수를 63→31→23→19→15→13 순서로 줄이면서 파일 크기를 확인한다.
- 살구색 볼 `(245,171,135)`과 컷별 `palette_accents`를 별도 보존한다. 예: 화분 잎 초록 `[104,191,43]`, 물방울 `[164,209,224]`.
- 끝까지 용량이 안 맞으면 오류를 낸다. 저장된 GIF를 다시 열어 **실제 프레임 수 24**를 확인한다. 저장기가 반복 프레임을 합칠 수 있으므로 원본 리스트 길이만 세면 안 된다.
- 첫/끝 비교는 RGBA로 디코딩하고 완전 투명 픽셀의 RGB를 0으로 만든 뒤 비교한다. 보이지 않는 RGB 차이로 잘못 실패시키지 않는다.
- 감색이 작은 소품을 망쳤다면 프레임을 삭제하기보다 색상 보존을 먼저 고친다. 24장 중 절반을 버려 1MB를 맞추고 “24프레임”이라고 보고하지 않는다.

### 8.3 APNG는 별도 경로

**OGQ 움직이는 제출 형식은 GIF다. APNG를 GIF 대신 올리지 않는다.** APNG는 기존 LINE 검토/비교용 계열이며 현재 LINE 제출은 보류다.

기존 기록의 LINE 규격은 5~20프레임, 재생시간 정확히 1/2/3/4초, 300KB 이하, 전체 캔버스 프레임이다. 실제 제출을 다시 하게 되면 당시 공식 규격을 확인한다. OGQ용 24프레임을 그대로 LINE에 넣을 수 없다.

`tools/apng.py`의 실제 인터페이스:

```python
write_apng(frames, path, delay_ms=100, loops=0, colors=255)
```

이 인코더는 공통 팔레트와 tRNS를 만들고, 모든 `fcTL`에 전체 폭·높이, 오프셋 `(0,0)`, dispose 0, blend 0(source)를 쓴다. Pillow 기본 APNG 저장의 차분 사각형 최적화 때문에 이전 LINE 제출에서 문제가 생겨 별도로 구현했다. 기존 영상 계열에는 15프레임×200ms=3000ms 포장이 있었다. 이것을 GPT 24프레임 기본값과 혼동하지 않는다. 프레임 수를 바꿀 때는 동작 연속성과 최종 용량을 다시 검사한다.

## 9. 재현 명령과 검사 절차

아래 명령은 **현재 파일과 함수 인터페이스를 확인한 재현 절차**다. 이 문서 작성 중 실행한 작업 목록이 아니다. 셸의 현재 디렉터리는 작업 루트로 설정한다. 다른 폴더에 복제한 새 세트는 그 경로에 맞춰 명시적으로 바꾼다.

### 9.1 원본이 이미 준비된 경우 빌드

```bash
.venv/bin/python sets/neulbong-gpt/tools/build.py
```

특정 수정 컷만 다시 묶는 실제 CLI:

```bash
.venv/bin/python sets/neulbong-gpt/tools/build.py 07 09 11 16 17 23
```

이 명령은 해당 세트의 기존 제출 파일과 검수 시트를 다시 쓴다. 지금 등록된 작품을 허락 없이 바꾸라는 뜻이 아니다. `poses.json`의 공중 프레임·소품 강조색도 실제 시트와 맞아야 한다.

### 9.2 공용 검사기로 정확한 세트 경로 검사

공용 검사기 CLI에 경로 옵션이 있다고 가정하지 않는다. 현재 `chk` 함수를 호출하는 실행 예:

```bash
.venv/bin/python -c 'import runpy,sys; m=runpy.run_path("tools/check-ogq.py"); sys.exit(0 if m["chk"]("sets/neulbong-gpt/out/submit/ogq-anim", anim=True) else 1)'
```

**이 검사기의 한계:** GIF 투명성을 직접 검사하는 분기가 없고, 최종 팔다리·색·동작·안전 여백도 검사하지 않는다. main/tab는 존재와 크기를 검사할 뿐이다. 따라서 추가로 최종 디코딩 프레임에서 알파, 재생 시간, 전체 바운드, 프레임 개수, 첫/끝을 검사하고, 육안 전수 검수를 별도로 완료해야 한다. 기존 `out/verification.json`은 과거 검사 결과이지 자동으로 새 파일을 보증하는 살아 있는 검사기가 아니다.

### 9.3 확인 사이트와 묶음

```bash
.venv/bin/python sets/neulbong-gpt/tools/site.py
```

결과는 `sets/neulbong-gpt/out/site/`. 파일 내용 해시로 GIF·정지본 URL 버전을 붙이고 체크/다크/자홍 배경 토글, 재생/정지 기능을 만든다. `neulbong-gpt-24.zip`에는 GIF·main/tab와 기존 지침서 3개가 함께 들어간다. **이는 확인용 전체 ZIP이지 OGQ의 26개 업로드 파일과 동일한 내용은 아니다.** OGQ는 `out/submit/ogq-anim/`의 26개를 사용한다.

현재 `site.py`의 `GUIDES`는 옛 세 지침서만 가리킨다. **이 10/29 통합본은 자동으로 사이트/ZIP에 포함되지 않는다.** 문서 작성만 지시받았으므로 그 설정이나 배포본을 이번에 바꾸지 않았다. 향후 문서 배포를 별도 지시받으면 최신 문서 연결을 갱신하고 해시·실제 다운로드를 확인한다.

사이트 배포는 해당 세트의 올바른 프로젝트를 확인한 뒤 별도 수행한다. `tools/deploy.sh`는 jjaeggu 전용이므로 그대로 돌리지 않는다. 배포 후 실제 GIF의 형식·크기·내용 해시를 확인하고 실제 웹에서 투명 배경, 재생/정지, 모바일 넘침, 다운로드를 확인한다. 과거 늘봉이 검증은 `out/deploy-verification.json`, `out/browser-check/result.json`에 남아 있다.

### 9.4 반드시 통과할 검수표

- [ ] 24개 원본 시트가 승인 참조·대사 기획과 맞는다.
- [ ] 실제 알파, 6×4/1536×1024, 각 칸 한 캐릭터, 외곽 잘림 없음.
- [ ] 모든 원본 프레임의 팔·손·다리·발·날개·꼬리 개수와 연결 검사.
- [ ] 6→7, 12→13, 18→19에서 줄별 위치/크기 초기화 없음.
- [ ] 비점프 접지선 고정. 계획된 공중 구간은 한 번의 자연스러운 상승·하강.
- [ ] 크롭·리사이즈·배치가 한 GIF 전체에 같은 기준. 텍스트 위치 고정.
- [ ] 최종 GIF를 디코딩한 모든 프레임에서 해부학·가림·소품색 재검사.
- [ ] 자홍/다크에서 갇힌 배경·흰 몸 구멍·잔상·색 테두리 없음.
- [ ] 실제 재생으로 한 컷의 의도, 주동작, 수습, 루프 이음매 확인.
- [ ] 크기·파일수·용량·프레임수·3000ms·투명·첫=끝·main/tab 확인.
- [ ] 원본/프롬프트/수정 사유/검수 프레임 번호/비용/제출 결과 기록.

팔은 몸통→어깨→위팔→팔꿈치→아래팔→손목→손으로 따라간다. 다리는 골반→다리→발을 따라간다. 정상 가림은 인정하되, 이불 모서리에 손만 떠 있고 어깨와 팔이 사라진 것은 가림이 아니다. 프레임별 문제 부위와 번호를 적는다. 문제 프레임 삭제·복제·덮기·무의미한 잔상으로 해부학 오류를 감추지 않는다.

## 10. OGQ 실제 등록 절차

### 10.1 사전 확인

1. 등록 지시가 있는지 확인한다. 이미 등록된 늘봉이는 **재등록하지 않는다**. 제목과 review ID로 중복을 먼저 찾는다.
2. 로그인된 `https://creators.ogq.me/` 전용 탭을 사용한다. 공용 옛 스크립트 설명은 9222 브라우저, 최근 별도 OGQ 작업 기록은 CDP `http://127.0.0.1:9224/`를 사용했다. **포트를 추정해 다른 사람 탭을 조작하지 말고 현재 세션의 실제 연결을 확인한다.**
3. 24개의 GIF와 main/tab PNG를 준비한다. 정확히 `01`~`24`와 `main.png`, `tab.png`. 검수 시트·원본 시트·폰트 파일은 업로드하지 않는다.
4. 제목 최대 40자, 설명 최대 160자, 태그 3~20개는 기존 화면 기준이다. 현재 폼의 제한도 확인한다.

### 10.2 실제 UI 흐름

- 움직이는 스티커 등록 또는 `/upload/animated?salesType=SINGLE`. 정지는 `/upload/sticker?salesType=SINGLE`.
- 제목·설명·태그 입력. 태그는 하나씩 입력 후 Enter, 실제 칩이 생겼는지 확인한다. 칩이 늘면 좌표가 바뀌므로 `focus()` 또는 DOM 기반 조작을 사용한다.
- **26개 파일을 드롭존에 한 번에** 전달한다. 나누어 넣으면 앞의 파일이 대체될 수 있다. main/tab는 파일명으로 분류된다. 슬롯 24개와 대표/탭 이미지 모두 확인한다.
- 가이드 준수 문구를 눌러 모달을 띄우고 모달의 **확인**을 눌러야 체크가 완료된다.
- **AI 생성(전부)**를 실제로 선택하고 체크 상태를 읽는다. 코드로 한글을 얹었다고 “AI 미사용”이 되지 않는다.
- 유료 설정을 눈으로 확인한다. 최근 폼의 `isFree=false`/라디오 `value=false`가 유료였지만 UI 구조가 달라지면 실제 라벨 기준으로 확인한다.
- 판매 등록 → **“성공적으로 등록”** 확인 → 심사 목록 이동 → 정확한 제목의 상세 페이지 확인.
- 상세에서 심사중, animated, AI, 유료, 파일 24개·순서·미리보기를 검증한다. 원본 URL이 있으면 업로드 파일을 내려받아 SHA256 비교. 최적화된 썸네일과 원본을 혼동하지 않는다.
- `reviewUrl`, `reviewId`, 상태, 판매/AI 설정, 요청 시간, 실제 응답·스크린샷을 `out/ogq-submission.json` 또는 세트의 등록 기록에 저장한다.
- 제출 중 타임아웃이 나도 다시 클릭하기 전에 심사 목록을 확인한다. 요청 성공 후 응답만 놓쳤을 수 있다. 업로드 성공은 심사 통과나 판매 시작이 아니다.

### 10.3 기존 자동화 명령 형식

**아래는 인터페이스 설명용이며 지금 실행하지 않는다. 특히 늘봉이를 다시 제출하지 말 것.**

```bash
node tools/ogq-upload.js animated <검수완료한-새세트의-제출폴더> "<제목>" "<160자-이내-설명>" "<쉼표로-구분한-태그>" DRY
```

`DRY`가 있으면 파일·폼 입력까지 하고 판매 등록 클릭 전에 멈춘다. 즉 **DRY도 브라우저 폼과 업로드 상태를 바꾸므로 읽기 전용이 아니다.** 실제 승인된 신규 제출 때만 마지막 `DRY`를 빼는 인터페이스다.

스크립트의 “파일 6개씩 드롭” 주석은 낡았고 실제 루프는 26개씩이다. 스크립트가 유료 선택을 별도로 강제하는지와 성공 후 실제 review ID 수집은 별도 확인해야 한다. 태그·체크·모달 탐지가 맞지 않으면 UI를 살펴 고친다. 근거 없이 반복 클릭하지 않는다. 브라우저 도구의 일반 `fill/click`이 시간 초과였던 최근 사례에서는 native value setter + bubbling input 이벤트와 `page.evaluate` 클릭으로 진행했지만, 값이 실제 앱 상태에 반영됐는지 반드시 확인했다.

## 11. 실패 사례와 해결법 — 실제 기록 중심

| 실패 | 원인/증상 | 실제 해결 또는 적용 규칙 |
|---|---|---|
| 8프레임 실험이 뚝뚝 끊김 | 중간 포즈 부족 | 16프레임 실험을 거쳐 실제 늘봉이는 24프레임. `smooth consecutive in-between`과 한 동작 타임라인 명시 |
| 키포즈 시트가 표정 모음이 됨 | 독립 그림 요청처럼 해석 | ONE coherent action, row-major, 인접 프레임·줄바꿈 연속성 명시 |
| 칸마다 아래위로 떠다님 | 그리드 줄별 바닥 위치 드리프트 | 접지 구간만 공통 기준선 교정. 점프 컷은 등록 표식으로 실제 바닥을 고정 |
| 늘봉이 13번 점프의 바닥이 이동 | 점프 높이와 카메라 드리프트 혼합 | `13-registration.txt`로 자홍 기준 막대 생성 후 막대만 제거. 기록된 기준선 범위 0.5px. 실제 공중 프레임은 보존 |
| 늘봉이 24번 상자 잘림 | 바깥 이미지 경계에 상자 날개 접촉 | 상자를 작게 하고 여백 넓혀 재생성. `24-retry.txt`, `art/archive/24-clipped.png` |
| 늘봉이 07번 회복 중 추가 팔 | 봉지에 있던 손이 남은 채 먹는 손 생성 | 왼손은 봉지를 계속 잡고 오른손만 집어 먹고 복귀. `07-anatomy-fix.txt` |
| 늘봉이 09번 기울일 때 팔 소실 | 자유 손의 위치/가림 불명확 | 양손이 모래시계 양쪽을 계속 잡게 수정. `09-anatomy-fix.txt` |
| 늘봉이 11번 가방 손+입 손+여분 손 | 그립 유지와 얼굴 만지기 동시 생성 | 두 손 모두 가방에 고정, 졸림은 눈과 몸 처짐으로 표현. `11-anatomy-fix.txt` |
| 늘봉이 16번 화분에 추가 팔 | 받치는 손의 연결 불명확 | 화분 양쪽을 정확히 두 손으로 계속 지지. `16-anatomy-fix.txt` |
| 늘봉이 17번 달리기에 여러 다리 | 이전 발 위치가 잔상/새 다리로 남음 | 셀 수 있는 두 다리 교대, 손은 시계에 고정. `17-anatomy-fix.txt` |
| 늘봉이 23번 이불 모서리에 손만 존재 | 천이 팔을 불가능하게 가림 | 천은 가슴 아래, 어깨~손목 연결이 위/옆에 보이게. 허리·다리만 덮음. `23-anatomy-fix.txt` |
| 초록 소품이 사라짐 | 초록 배경 키잉 | GPT 시트는 진짜 투명 원본 우선. 색 배경은 없는 색만 선택 |
| 팔/손잡이 안에 배경 잔존 | 바깥 flood만 적용 | 자홍 시트로 갇힌 영역 판별, 그림 속 흰색은 보호 |
| 감색 후 잎·물방울이 손발처럼 보임 | 작은 강조색이 몸 색에 흡수 | 참조 살구색과 컷별 `palette_accents` 보존, 최종 GIF 다시 검사 |
| 매 프레임 덜컥거림 | 개별 바운딩박스 중앙 정렬·개별 리사이즈 | 칸 좌표 유지 + 전체 동작 union + 같은 배율/배치 |
| 큰 동작이 사라짐 | 영상 계열에서 몸 면적 1.35배 컷을 자동 삭제 | 면적은 검수 후보 지표일 뿐. 구르기·큰 소품·가림을 오류로 오인하지 않음 |
| 영상에서 화면 밖으로 발사되어 잘림 | 원본 약 96% 채움 또는 무리한 동작 | 영상 입력은 약 50% 크기와 충분한 여백. 그래도 잘리면 화면 안에서 완결되는 동작으로 재설계. GPT의 70% 칸 여유와 혼동 금지 |
| 다른 컷 영상 다운로드 | 최신순·날짜만으로 결과 선택 | 프롬프트 식별자로 해당 기록 카드 매칭. 기존 짹구에서 04 영상이 05·06·07로 저장된 사례 기록 있음 |
| OGQ 앞 이미지가 사라짐 | 파일을 나누어 드롭 | 26개 한 번에, 실제 슬롯 검사 |
| APNG 일부만 갱신되는 제출 문제 | 차분 사각형 저장 | `tools/apng.py`의 full-canvas/source 방식 사용 |

### 11.1 이번 세션의 정지 말풍선 추가 사례

`sets/storybook-animal-bubbles`에서 종이색이 살짝 회색인 양·조랑말·너구리·부엉이 원본이 네모 배경째 남았다. 공용 cutout은 거의 흰 배경을 전제로 했기 때문이다. 세트 빌더의 `_normalize_paper`가 바깥 16px 테두리의 RGB 5백분위 white point를 읽어 필요한 경우에만 종이색을 흰색으로 보정하도록 했다.

**첫 수정에서 모든 그림을 밝히자 강아지의 흰 얼굴/가슴 윤곽이 열려 몸이 투명하게 뚫렸다.** 이미 흰 종이는 `white_point.min() >= 250`일 때 그대로 두도록 고쳐 옅은 털 선을 보존했다. 이후 다크 배경에서 배경 네모와 흰 몸을 다시 확인했다. 이는 손그림 정지 컷의 해결법이지 GPT 알파 시트 전체에 강제로 적용할 보편 누끼가 아니다. 해당 파일: `sets/storybook-animal-bubbles/tools/build.py`.

## 12. 크레딧·비용 — 확정값과 추정을 구별

### 12.1 GPT 프레임 방식

늘봉이 `production.json`의 `video_ai_used`는 false다. **이 방식으로 영상 생성 크레딧을 쓰지 않았다는 것은 확인 가능**하다. 그러나 GPT 이미지 생성 전체 비용을 0원으로 확정할 근거는 없다. 재생성도 구독 사용량이나 별도 과금에 반영될 수 있다. 웹 구독과 `openai-codex` 장치의 인증·사용량·이미지 백엔드가 같은 과금 단위라고 가정하지 않는다.

`sets/neulbong-gpt/out/cost-comparison.json`의 실제 기록:

| 항목 | 값 | 해석 |
|---|---:|---|
| 표본 | 완료된 시트 생성 5호출 | 전체 세션이 아님 |
| 표본의 총 reported tokens | 4,948 / 4,791 / 5,028 / 4,884 / 5,281 | 기록된 요청 16·09·11·17·23 |
| 시트당 평균 | 4,986.4 tokens | 이미지 백엔드 별도 비용 포함 여부 불명 |
| 24장 환산 | 약 119,674 tokens | 단순 추정. 실제 청구액 아님 |
| 30장 환산 | 약 149,592 tokens | 재생성 포함 가정의 예시, 실제 총 생성 횟수 아님 |

기획·대화 이력·이미지 검수·다른 에이전트 호출은 위에서 제외됐다. 구독 사용량 한도를 “세트 몇 개 보장”으로 환산하지 않는다. JSON의 `new_dynamic_images_generated: 0`은 그 비용 비교 작업 당시 신규 생성이 없었다는 기록이지, 늘봉이를 그림 생성 없이 만들었다는 뜻이 아니다.

### 12.2 영상 방식의 과거 비교 자료

- 옛 Seedance 계열 기록: 4초 480p 1:1 **12크레딧/건**, 5초 **15크레딧/건**. 현재 가격표를 다시 확인한 값은 아니다.
- 기존 지침의 한 컷 **700~800원**을 사용한 단순 비교: 24편 16,800~19,200원, 30편 21,000~24,000원. 정지 원본 생성비·기획·검수비 제외. 최신 견적으로 제시하지 않는다.
- 최근 별도 완성 사례 `sets/jjokong-kling/production.json`: Higgsfield / Kling 4.0, 요청 5초·1080p, 실제 원본 1440², **표시 가격 5크레딧/편**, 최초 24편 + 수정 6편 = **표시 가격 합계 150크레딧**. 이는 잔액 차감 명세로 확정한 현금 청구액이 아니라 `quotedGenerationCredits` 기록이다.
- `sets/neulbong-gpt/samples/gameaify-run-stop/claude-review.json`의 **0.044946 USD**는 Claude 검토 호출 1회의 비용 기록이다. 이미지 생성비·GameAIfy 이용료·완성 세트 제작비로 합산해 설명하지 않는다.

### 12.3 다음 담당자의 비용 장부

호출마다 `세트/컷 ID, 공급자·모델, 설정·해상도·길이, 표시 크레딧, 제출 ID, 성공/실패/환불 여부, 저장 파일, 재제작 이유`를 남긴다. 실패를 환불됐다고 추정하지 않는다. 한 번의 실패 때문에 전체 묶음을 재제출하지 않는다. 생성 버튼의 표시 가격이 기대값과 다르면 누르지 않는다. GPT와 영상 비교에는 정지 원본 생성·수정·검수까지 동일 범위로 포함해야 한다.

## 13. 폰트·원본 권리 인계

실제 감사 기록: `out/font-license-audit.json`.

- **Gamja Flower**: 늘봉이, 밥땡이, 일부 다른 세트. 현재 늘봉이 경로 `fonts/GamjaFlower-Regular.ttf`.
- **Hi Melody**: udang 계열. 이름이 비슷하다고 상용 HY 글꼴로 추정하지 않는다.
- **Jua**: bappeu 및 짹구 계열.
- 이 세 실제 바이너리와 OFL 근거를 확인한 최근 제작물은 글자를 래스터화한 PNG/GIF 상업 이용 가능 범위로 기록했다. 폰트 파일 자체는 제출 패키지에 넣지 않는다.
- 공식 라이선스: https://raw.githubusercontent.com/google/fonts/main/ofl/gamjaflower/OFL.txt / https://raw.githubusercontent.com/google/fonts/main/ofl/himelody/OFL.txt / https://raw.githubusercontent.com/google/fonts/main/ofl/jua/OFL.txt
- 영애·모모 2종·앨리스·미니멀 여행 포스터 등 일부 옛 작품은 원본/폰트 사용 기록을 찾지 못해 **확인 불가**로 남아 있다. “예전 등록작 전부 문제없음”으로 확대해서 보고하지 않는다.
- 짧고 일반적인 프롬프트를 참고하는 문제와 기존 그림/캐릭터를 복제하는 문제는 다르다. “모든 프롬프트에는 저작권이 없다”는 식으로 단정하지 않는다. 원본 이미지 재사용 여부·상표·캐릭터·서비스 이용 조건도 별도로 본다. 이번 동물 말풍선 세트는 원본 그림을 제출물에 넣지 않고 새 동물을 생성한 작업이다.

## 14. 인수인계 시점의 다른 진행품 — 지금 재개하지 말 것

아래는 이어받는 사람이 이미 있는 결과를 다시 만들거나 등록 완료로 오인하지 않도록 남기는 상태다. **10/29 새 지시로 다른 생성·업로드는 중단한 상태이며, 이 문서가 재개 승인서는 아니다.**

### 14.1 손그림 동물친구들의 다정한 말풍선

- 루트 `sets/storybook-animal-bubbles/`. **정지 24종**, GPT 움직이는 세트가 아니라 Midjourney V8.2 생성물.
- 원본 참고 동물 12종을 제외한 새로운 24종. 정확한 목록/대사는 `poses.json`, 선택/출처는 `selected.json`, 생성 기록은 `animal-generation-record.json`, 해부학 수정은 `anatomy-refinement-record.json`.
- 06 나무늘보·11 양·12 소는 종 인식/팔다리 문제로 다시 생성해 선택했다.
- 빌더 `tools/build.py`; 완성 `out/png/01.png`~`24.png`, main/tab, `out/submit/storybook-animal-bubbles-ogq.zip`.
- `out/contact.png`, `out/contact-dark.png`, `out/verification.json`. PNG 24종과 main/tab, 총 26개. 실제 캡션 24개 픽셀을 production renderer와 대조했고 폰트 바이너리와 ZIP 무결성도 확인했던 작업이다.
- 판매 문구 `listing.json`. 이번에 파일을 읽은 결과 `production.json`의 **uploaded=false**, `registration.json` 없음. **등록 완료 증거가 없는 준비 완료 상태로 인계**한다. 과거 위임 지시만 있었던 것을 등록 성공으로 바꾸지 않는다. 재개 지시가 오면 웹 심사 목록에서 먼저 중복 확인.

### 14.2 고양이 풍경화 3장

- 루트 `sets/pastel-cat-landscapes/`.
- `final/canal-cat-landscape-2100x2800.png` — 꽃 핀 운하 테라스의 고양이.
- `final/greenhouse-cat-landscape-2100x2800.png` — 빗소리 가득 온실의 고양이.
- `final/seaside-cat-landscape-2100x2800.png` — 노을빛 바닷가 정원의 고양이.
- 각 2100×2800 RGB PNG, 각각 약 7.94/6.62/7.31MB. 원본 Midjourney 업스케일 1856×2464에서 좌우 4px씩 가장자리 크롭 후 Lanczos 확대. 생성 원본 자체가 2100×2800이었다고 설명하지 않는다.
- `listings.json`, `verification.json`, `three-landscapes-preview.jpg`, `cat-anatomy-100-percent.png` 존재.
- 파일 검사 기록의 세 항목 모두 **uploaded=false**, 등록 영수증 파일 없음. 유료 스톡 이미지 등록 계획이었지만 **현재는 등록 미확인**이다. 확인용 합본이나 레퍼런스 그림을 상품으로 올리지 않는다.

## 15. 후속 담당자 실행 순서 요약

1. 사장님의 다음 지시와 작업 대상부터 확인. 이 문서만으로 생성·등록 시작 금지.
2. 기존 원본·승인·등록 기록 확인, 중복 생성/중복 등록 방지.
3. 새 캐릭터면 콘셉트·2×2 시안 승인. 24컷 동작표와 참조/사지 기준 고정.
4. GPT 6×4 연속 프레임 **한 컷** 생성 후 원본 전 프레임 검수.
5. 최신 빌더로 분리·접지·합집합·대사·GIF 포장. 실제 재생 및 최종 전 프레임 검수.
6. 성공한 기준으로 나머지 제작. 오류는 원본/분리/감색 원인별로 최소 범위 수정하고 전수 재검사.
7. 규격+해부학+누끼+연속성 모두 통과한 제출 26개와 확인 페이지 준비.
8. 등록 지시가 있는 경우에만 OGQ 유료/AI 생성(전부)로 제출하고 실제 심사 상세·원본·영수증 확인.
9. 한국어로 제목·확인 링크·심사 상태·실제 비용·재제작 이유 보고. 미확인 정보는 미확인으로 남긴다.

**완료 기준은 “GIF 파일이 생김”이 아니다. 읽히는 한 동작, 흔들리지 않는 좌표계, 올바른 사지, 깨끗한 투명도, 자연스러운 루프, 실제 규격 통과, 지시된 경우 실제 접수 증거까지다.**
