Add motion compose and final review skills

This commit is contained in:
NINI
2026-10-08 00:54:01 +09:00
parent 5be510704a
commit ccd952b0d0
3 changed files with 127 additions and 0 deletions
@@ -0,0 +1,41 @@
---
name: short-video-compose
description: 승인된 대본·제목과 실제 컷 영상·통합 음성·자막을 연결해 13-compose 합성 요청을 작성하고 받은 MP4·SRT를 확인한다.
---
# 합성 요청과 실제 완성본 확인
## 시작 조건
[공통 계약](../../../docs/workflow-contracts.md)의 저장·전달, 실제 파일과 시간, 승인·수정 규칙과 [제작 지침](../../../docs/short-video-guide.md)의 자막·주석, 모바일 판독성, 제목과 도입의 약속 절을 읽는다. [13 양식](../../../templates/stages/13-compose.json)과 [결과 스키마](../../../contracts/artifact.schema.json)의 `13-compose` 정의를 사용하며 새 필드를 추가하지 않는다.
개별 호출에서도 같은 제작물의 유효한 `03-script`, `04-title`, `06-tts`, `07-cuts`, `12-motion`과 그 선행 관계를 확인한다. 실제 사용한 다섯 결과의 `{stage_id, revision}`을 `inputs`에 기록한다. project.json의 story·scenes가 실제 사용자 승인이며 사용 버전과 연결되는지 확인한다. pending·changes_requested·stale 승인을 우회하지 않고 같은 승인 버전은 다시 묻지 않는다. 누락·미확인 파일·길이 불일치가 있으면 문제 단계·컷을 총괄에 보고하고 요청 준비 완료로 처리하지 않는다.
Qwen3-TTS 통합 WAV와 실측 구간, `gpt-image-2.5-sunburst` 이미지에서 이어진 실제 컷 영상, `references/1.png` 그림체를 유지한다. 이 스킬은 합성 엔진을 선택·구현하거나 실제 모델 API·합성을 실행하지 않고 도구에 중립적인 요청과 받은 결과 확인을 담당한다.
## 요청 연결
기존 `payload.request`의 다음 필드를 채운다.
- `timeline`: 07 컷 순서대로 `{cut_id, video_path, start_ms, end_ms}`를 정확히 한 번씩 넣는다. video_path는 12 결과에서 같은 cut_id의 검증된 MP4 상대 경로이며 시간은 07의 통합 음성 구간이다.
- `narration_path`: 06 `result.narration.path`의 실제 검증된 통합 WAV. 단위 파일을 임의 순서로 재조합하지 않는다.
- `captions`: 07의 별도 자막 `{id, start_ms, end_ms, text}`를 의미·순서·실측 시간 그대로 연결한다. 자막은 여러 컷을 걸칠 수 있으며 컷마다 억지로 나누지 않는다.
- `title`: 04 selected_id에 해당하는 후보의 실제 text. 03의 도입과 끝에서 설명하는 약속에 맞고 입력 언어인지 확인한다.
timeline은 0부터 통합 음성 끝까지 빈 구간·겹침 없이 이어져야 한다. 각 구간은 양수·5000ms 이하이고 12 실제 클립 길이와 같아야 한다. 자막은 `0 <= start_ms < end_ms <= 통합 길이`이며 원문·발화와 맞아야 한다. 실제 길이가 요청과 다르면 수정할 `12-motion` 또는 `07-cuts`와 cut_id를 보고한다. 180000ms를 넘는 음성은 대본 수정·story 재승인으로 돌아가며 속도를 바꿔 감추지 않는다.
자막은 말의 내용을, 도해 주석은 물체·수치·방향을 전달하도록 배치 의도를 review.md에 적는다. 근거가 확인된 주석만 사용하며 새 JSON 필드를 만들지 않는다. 모바일에서 글자 크기·대비·줄바꿈·표시 시간과 중요한 움직임의 가림을 확인할 수 있게 전달한다. 플랫폼 공통 안전영역 수치를 임의로 고정하지 않는다.
## 받은 결과 확인
요청만 작성되면 `payload.result=null`, awaiting_input으로 보고한다. 실제 결과는 기존 `payload.result.video`와 `captions_path`에 기록한다. MP4 또는 SRT만 받은 부분 결과는 보존하되 complete로 보고하지 않는다.
video는 `{path, kind, verified, duration_ms, width, height}`이며 kind=video, 경로는 저장소 루트 기준 상대 경로다. 실제 MP4 존재·형식·재생 내용·길이·화면 크기를 확인한 뒤에만 verified=true와 실측값을 기록한다. 파일 미확인은 verified=false, 확인하지 못한 메타데이터는 null이다. captions_path의 실제 SRT 파일도 열어 입력 언어·텍스트·순서·시간을 확인한다. SRT 검증용 새 media 필드를 만들지 않는다.
실제 영상의 width:height가 9:16이고 전체 길이가 양수·180000ms 이하인지 확인한다. 실제 컷 순서와 경계, 통합 음성의 시작·끝·누락·중복, SRT 표시 구간이 요청과 일치하는지 재생·청취한다. 파일이나 요청 길이만으로 재생·청취를 확인했다고 기록하지 않는다. 모바일 크기로 제목·자막·주석의 판독성과 주요 설명의 가림을 확인한다. 불일치는 실제 구간·수정 단계·cut_id로 보고하며 완성으로 통과시키지 않는다.
## 저장과 final 검토 전달
담당은 `projects/<project_id>/stages/13-compose/r<revision>/artifact.json`과 같은 버전 `review.md`만 작성하고 이전 버전을 보존한다. [검토 양식](../../../templates/review.md)에 연결한 선행 버전, 실제 MP4·SRT 확인 방법과 결과, 자막·주석·모바일 원칙의 적용 및 비적용 이유, 문제 단계·컷을 적는다.
총괄만 project.json의 상태·포인터·승인을 작성한다. 담당은 실제 완성본과 보고서를 14 검수에 전달하고 수정으로 영향을 받는 후속 결과·승인을 보고한다. 13 실제 완성본과 14 검수 보고는 사용자 final 검토 대상이며, 검수 준비나 통과 추천만으로 사용자 final 승인 전 제작 완료를 선언하지 않는다.
@@ -0,0 +1,39 @@
---
name: short-video-motion
description: 승인된 컷·장면과 실제 시작/끝 이미지로 12-motion 영상 요청을 작성하고 받은 MP4의 길이·상태·연결을 확인한다.
---
# 컷 영상 요청과 결과 확인
## 시작 조건
[공통 계약](../../../docs/workflow-contracts.md)의 저장·전달, 실제 파일과 시간, 승인·수정 규칙과 [제작 지침](../../../docs/short-video-guide.md)의 설명에 필요한 움직임·장면 연결 절을 읽는다. [12 양식](../../../templates/stages/12-motion.json)과 [결과 스키마](../../../contracts/artifact.schema.json)의 `12-motion` 정의를 사용하며 새 필드를 추가하지 않는다.
개별 호출에서도 같은 제작물의 유효한 `07-cuts`, `08-scenes`, `11-images`와 그 선행 관계를 확인한다. 실제 사용한 세 결과의 `{stage_id, revision}`을 `inputs`에 기록한다. `project.json`에서 story·scenes가 사용 버전과 연결된 실제 사용자 승인인지 확인하며 pending·changes_requested·stale 승인을 우회하지 않는다. 이미 승인된 같은 버전은 재승인을 요구하지 않는다. 자료·승인이 없으면 빠진 항목과 돌아갈 단계를 총괄에 보고한다.
선행 조건인 Qwen3-TTS 통합 WAV의 실측 컷, `gpt-image-2.5-sunburst`의 실제 PNG, `references/1.png` 그림체를 유지한다. 그림체 참고에 캠핑 소재를 강제하지 않는다. 이 스킬은 영상 엔진을 선택·구현하거나 실제 모델 API·영상 생성을 실행하지 않고 도구에 중립적인 요청과 받은 결과 확인을 담당한다.
## 요청 작성
`payload.request.clips`는 07의 컷 순서대로 모든 컷을 정확히 한 번 포함한다. 각 항목은 다음 기존 필드만 사용한다.
- `cut_id`: 07의 컷 ID. 08 장면과 11 프레임의 컷 참조가 같은지 확인한다.
- `start_frame_id`, `end_frame_id`: 11 요청에서 해당 컷의 start/end인 ID. 11 결과의 `frame_id`로 실제 PNG를 찾고 `media.verified=true`와 이미지 내용을 확인한다.
- `duration_ms`: 07의 실측 `end_ms-start_ms`. 양수이고 5000ms 이하이며 글자 수 추정으로 대체하지 않는다.
- `motion_prompt`: 08의 시작→끝 상태, 설명에 필요한 물체·인물 동작, 흐름 방향과 카메라 동작을 전달한다. 별도 camera 필드를 만들지 않는다.
물높이 변화·부품 조작 등 원인과 결과를 보여주는 움직임을 우선한다. 줌·흔들림으로 설명을 대신하거나 근거 없는 구조·수치를 더하지 않는다. 시작/끝 이미지와 요청이 같은 변화를 설명해야 한다. continuous 연결은 이전 끝과 다음 시작의 위치·방향·카메라·인물·배경을 맞추고 cut 전환은 승인된 이유를 보존한다.
## 받은 결과 확인
요청만 준비되면 `payload.result=null`을 유지하고 awaiting_input으로 보고한다. 실제 결과는 `payload.result.clips`의 `{cut_id, media}`로 기록한다. 각 요청 cut_id에 MP4 한 개씩 대응해야 하며 누락·중복·요청 외 ID를 허용하지 않는다. 부분 결과는 보존하되 전체 요청을 받기 전 complete로 보고하지 않는다.
media는 기존 `{path, kind, verified, duration_ms, width, height}`다. path는 저장소 루트 기준 상대 경로, kind는 video다. 실제 파일 존재·MP4 형식·재생 내용·길이·화면 크기를 확인한 뒤에만 verified=true와 실측 메타데이터를 기록한다. 파일 미확인은 verified=false, 확인하지 못한 메타데이터는 null이다. 요청값이나 확장자만으로 실측했다고 쓰지 않는다.
각 실제 클립 길이를 요청 duration_ms와 비교한다. 다르면 cut_id·요청/실측 길이·수정할 `12-motion`을 보고하며 임의로 컷·음성을 늘리거나 속도를 바꿔 통과시키지 않는다. 실제 시작/끝 상태와 동작·카메라·인접 연결도 확인한다. 프레임 문제는 `11-images`, 장면 설계 문제는 `08-scenes`, 시간 기준 문제는 `07-cuts`로 돌린다. 모든 컷의 실제 파일·길이·상태가 맞아야 합성 전달 준비로 보고한다.
## 저장과 보고
담당은 `projects/<project_id>/stages/12-motion/r<revision>/artifact.json`과 같은 버전 `review.md`만 작성한다. 이전 버전을 덮어쓰지 않고 [검토 양식](../../../templates/review.md)에 선행 버전, 요청 대비 실측 결과, 적용한 움직임 원칙·적용하지 않은 구성과 이유, 문제 단계·컷을 적는다.
총괄만 project.json의 상태·포인터·승인을 작성한다. 담당은 준비 여부·미확인 내용·후속 13/14 및 final 검토에 미치는 수정 영향을 보고한다. 사용자 final 승인 전 제작 완료를 선언하지 않는다.
@@ -0,0 +1,47 @@
---
name: short-video-review
description: 13-compose의 실제 완성본을 여섯 영역에서 검수해 14-review의 근거·수정할 단계와 컷·추천을 작성하고 사용자 final 검토를 준비한다.
---
# 최종 영상 검수
## 시작 조건
[공통 계약](../../../docs/workflow-contracts.md)의 저장·전달, 승인·수정, 검수 판정 규칙과 [제작 지침의 최종 영상 검토](../../../docs/short-video-guide.md#최종-영상-검토)를 읽는다. [14 양식](../../../templates/stages/14-review.json)과 [결과 스키마](../../../contracts/artifact.schema.json)의 `14-review` 정의를 사용하며 새로운 입력·필드·검토 지점을 만들지 않는다.
개별 호출에서도 같은 제작물의 유효한 `13-compose`와 검수에 직접 사용한 선행 결과를 확인하고 실제 사용한 `{stage_id, revision}`을 `inputs`에 기록한다. 대본·제목·근거, 실측 음성·컷, 장면·인물·배경·이미지·영상은 검수에 필요한 해당 결과와 그 선행 관계를 읽는다. 다른 제작물·오래된 버전·stale 결과를 섞지 않는다.
project.json에서 story·scenes가 사용 버전과 연결된 실제 사용자 승인인지 확인한다. pending·changes_requested·stale 승인을 우회하지 않으며 같은 승인 버전은 재승인을 요구하지 않는다. 선행 조건인 Qwen3-TTS 음성, `gpt-image-2.5-sunburst` 이미지, `references/1.png` 그림체를 유지한다. 이 스킬은 실제 모델 API·영상 생성·합성 실행이나 엔진 선택을 담당하지 않는다.
13의 실제 MP4·SRT를 열고 영상을 끝까지 시청·청취한다. `media.verified=true`만으로 검수자의 관찰을 대신하지 않는다. 실제 최종 영상이 없거나 재생해 볼 수 없으면 recommendation=incomplete이며 확인하지 못한 영역은 not_checked로 남긴다. 빠진 결과·파일·승인과 돌아갈 단계를 총괄에 보고한다. 선행 파일 미확인은 verified=false, 미확인 메타데이터는 null로 취급하며 부분 결과의 완료를 인정하지 않는다.
## 여섯 영역의 실제 근거
`payload.checks`에 아래 area를 각각 한 번 포함하고 기존 `{area, verdict, evidence}`를 사용한다. verdict는 pass/fail/not_checked이며 증거 없이 pass로 만들지 않는다. evidence에 실제 파일·관찰/청취 구간·관련 블록/주장/자막/컷 ID와 확인 결과를 적는다. 검수하지 못한 이유도 이 필드에 남긴다.
| area | 실제 완성본에서 확인할 내용 |
|---|---|
| story | 중심 질문에 답하고 쉬운 말·구체적 행동으로 이해와 재미를 주는가. 블록 연결·근거의 범위가 유지되고 도입과 선정 제목의 약속을 끝에서 회수하는가. 확인한 02 주장과 03 블록·04 제목, 실제 영상 구간을 연결한다. |
| visual | 설명에 필요한 상태 변화·동작·카메라가 보이고 시작/끝 상태가 맞는가. 구조·수치·주석이 조사 근거와 맞으며 장식적 움직임이 설명을 가리지 않는가. 실제 컷과 관찰 내용을 기록한다. |
| audio | 실제 청취에서 내레이션의 의미·발음·음량이 자연스럽고 누락·중복이 없는가. 배경음·효과음이 있다면 말을 가리는지도 듣는다. 텍스트·파일 존재만으로 통과시키지 않는다. |
| captions | 실제 SRT와 표시 자막이 입력 언어·원문 의미·표시 순서를 지키고 음성 시간에 맞는가. 자막과 도해 주석의 역할, 모바일에서 대비·글자 크기·줄바꿈·표시 시간·가림을 확인한다. |
| timing | MP4 실측 길이가 양수·180000ms 이하, width:height가 9:16인가. 모든 실제 컷이 양수·5000ms 이하이고 요청/클립 길이, 통합 음성·영상·자막 구간이 일치하며 빈 구간·겹침이 없는가. |
| consistency | 인접 컷의 끝/시작 상태, 인물·배경 고정 특징, 위치·방향·카메라·그림체가 일관되는가. continuous 연결과 cut 전환이 승인된 장면 이유를 지키는가. 연결 컷 쌍으로 기록한다. |
## 문제와 추천
`payload.findings`는 `{severity, description, stage_id, cut_id}`다. severity는 blocking/minor, stage_id는 실제 수정할 단계, cut_id는 해당 컷 ID이며 전체 문제는 null이다. description에 실제 증상·구간·기대 결과·수정 방향을 적고 evidence와 일치시킨다.
대본·제목·근거 문제는 03/04/02, 음성 누락·중복은 05/06, 컷·자막 시간은 07, 장면 연결·고정 특징은 08/09, 이미지 문제는 10/11, 동작·클립 길이는 12, 합성·배치·SRT 문제는 13으로 보고한다. 정확한 stage_id 값을 사용하며 원인에 맞춰 돌아갈 단계를 고른다. 실제 클립 길이가 요청과 다른 것을 요청값으로 덮거나 재생 속도로 감추지 않는다.
recommendation은 다음 기존 값만 사용한다.
- pass: 여섯 영역이 모두 실제 근거를 가진 pass이고 fail/not_checked와 blocking 발견이 없을 때만 사용한다.
- revise: 확인된 실패나 blocking 문제를 수정해야 할 때 사용하고 담당 단계·컷을 연결한다. minor 발견도 보존하고 수정 필요성을 설명한다.
- incomplete: 실제 최종 영상이 없거나 볼 수 없고, 필수 영역·선행 자료를 확인하지 못해 판정을 완료할 수 없을 때 사용한다. 이미 확인한 실패도 findings에 보존한다.
## 저장과 사용자 final 검토
담당은 `projects/<project_id>/stages/14-review/r<revision>/artifact.json`과 같은 버전 `review.md`만 작성하고 이전 버전을 보존한다. [검토 양식](../../../templates/review.md)에 여섯 영역의 checks.evidence·findings·추천을 같은 의미로 요약하고, 제작 지침을 적용한 실제 결과와 소재에 맞지 않아 적용하지 않은 구성의 이유를 적는다.
총괄만 project.json의 상태·현재 포인터·승인을 작성한다. 담당은 검수 준비 여부·미확인 내용·수정 단계/컷과 영향받는 후속 결과·승인을 총괄에 보고한다. 13 실제 완성본과 14 보고서를 사용자 final 검토에 제시하며 검수자의 pass는 사용자 승인이 아니다. 응답 없음이나 담당의 추천을 승인으로 기록하거나 사용자 final 승인 전 제작 완료를 선언하지 않는다.