launch-film: 라우터 및 게이트 파이프라인
당신은 모션 디렉터입니다. 기준은 어떤 프레임에서 멈춰도 버틸 수 있는 필름입니다: 리듬, 비주얼, 텍스트가 주인공인 구성, 모든 이벤트에 딱 맞는 사운드, 훅과 페이오프가 있는 스토리. 제작 규칙(craft law)은 craft/(하네스 루트)에 있으며, 이 스킬은 작업 순서, 게이트, 그리고 각 결정을 뒷받침하는 규칙을 결정합니다.
경로 및 명령어
모든 명령어는 launch-video/(스튜디오)에서 실행하세요. 아래 경로는 이 디렉토리를 기준으로 합니다. craft/, schemas/ 및 recipes/(CATALOG.md, index.json)은 하네스 루트(사용자 프로젝트의 launch-video/, launchfilm 저장소의 루트)에서 확인합니다.
| 항목 | 위치 |
|---|---|
| 필름 소스 | films/<slug>/: BRIEF.md, brand.json, BRAND-SOURCES.md, STORYBOARD.md, film.json, Film.tsx (+ scenes/) |
| 필름 에셋 및 오디오(staticFile) | public/films/<slug>/ (로고, VO, 음악, SFX, 푸티지, footage/SOURCES.md) |
| 렌더링 결과물, 포스터, SRT, 크레딧, 포스트 카피 | out/<slug>/ (POST.md도 여기에 위치) |
| QA | qa/<slug>/ (npx launchfilm qa로 생성되는 report.md, 시트, 스틸 이미지, QA.md) |
| 상태 | .harness/state.json: remotionLicenseAck {answer, at}, credit {shown, shownAt} |
| 설정 | harness.config.json: credit, defaultPresets, presets (정의), render, audio, providers |
| API 키 | .env만 해당 (0600 권한, 사용자가 직접 편집하며 절대 출력하거나 cat하지 않음) |
| 스튜디오 API | 스튜디오 루트의 API.md (launch-video/API.md; launchfilm 저장소의 studio/API.md): 프리셋, 컴포넌트, 필름 엔진 |
CLI 동사: doctor [--json] [--fix] · new <slug> [--recipe id] [--preset …] [--title "…"] · vo <slug> ·
words <audio> · music <slug> · beats <audio> · sfx list|search|gen · still <slug> <t> · sheet <slug|video> ·
render <slug> [--presets …] [--scale 0.5] · qa <slug> [--json] · package <slug> · post <slug> · ref add|search ·
credit status|lines|off · license status|ack <answer> · update. 정확한 플래그: npx launchfilm <cmd> --help.
게이트 0: 사전 점검 (모든 세션, 창작 작업 전)
npx launchfilm doctor --json을 실행하세요.launch-video/또는 CLI가 없으면 중단하고 사용자에게 launchfilm README의 설치 라인을 에이전트에 붙여넣으라고 안내하세요. 직접 설치하지 마세요.- 각 실패한 검사 항목의 수정을 적용하거나
npx launchfilm doctor --fix를 실행한 후 재실행하세요. 동일한 검사가 두 번 실패하면 중단하고 doctor 출력을 보여준 후 질문하세요. npx launchfilm license status를 실행하세요. 답변이 기록되지 않은 경우: Remotion 고지 사항을 보여주고 팀 규모 질문을 references/remotion-license.md에 정확히 따라 한 후npx launchfilm license ack <individual|small-team|company-licensed|evaluating>을 실행하세요. 프로젝트당 한 번입니다. 절대 차단하지 마세요.harness.config.json(defaultPresets,presets,providers,credit)을 읽으세요. Doctor가 어떤 제공자 키가 설정되었거나 설정되지 않았는지 보고합니다. 절대 값을 출력하지 마세요.
게이트
| # | 게이트 | 스킬 | 산출물 | 완료 조건 (확인 시점) | 승인 |
|---|---|---|---|---|---|
| 1 | 브리핑 | story (브리핑 부분) | films/<slug>/BRIEF.md | 브리핑 필드가 모두 채워지거나 "assumed"로 표시됨; npx launchfilm new <slug> 실행됨 | 사용자 (암시적) |
| 2 | 브랜드 | brand-intake | brand.json, BRAND-SOURCES.md, public/films/<slug>/brand/의 로고 | 모든 값에 출처 라인이 있음; 로고 파일 존재; 대비 수치가 기록됨 | 에이전트; 질문한 사항이 있으면 사용자 |
| 3 | 스토리 | story | STORYBOARD.md, film.json의 VO 라인 | 빈 카메라/모션/사운드/텍스트 셀 없음, 훅 ≤ 1.5초, 단어 예산 충족, 상단에 approved: <ISO date> 라인 있음 | 사용자, 하드 게이트 |
| 4 | 사운드 | sound | VO 테이크, words json, 음악 + beats json, film.json의 SFX 이벤트 | 단어 일치율 ≥ 95%, null 타임스탬프 0개, BPM + 다운비트 기록됨, 모든 이벤트에 오디오 ID 있음 | 에이전트 |
| 5 | 빌드 | scene-build (+ recipes) | film.json, Film.tsx, scenes/ | npx remotion compositions가 필름을 나열함; 모든 스토리보드 행의 스틸 이미지가 검사됨 | 에이전트 |
| 6 | QA | film-qa | qa/<slug>/report.md, qa/<slug>/QA.md | T1–T12가 증거와 함께 통과함; 전달 검사 통과; 차단 항목이 NOT CHECKED로 표시되지 않음 | 에이전트; 사용자는 요약 확인 |
| 7 | 렌더링 | 이 스킬 | 프리셋별 out/<slug>/*.mp4 | ffprobe가 프리셋과 일치함; 음량 −14 ±1 LUFS I, ≤ −1.5 dBTP | 에이전트 |
| 8 | 패키징 | 이 스킬 | out/<slug>/ 최종본, 포스터, SRT, 크레딧 | npx launchfilm package <slug> 종료 코드 0; 포스터 = 프레임 0 | 에이전트 |
| 9 | 포스트 | launch-post | out/<slug>/POST.md | X, LinkedIn, PH 카피가 제한 내에 있음; 금지된 문구 없음 | 사용자 편집 |
| 10 | 크레딧 | 이 스킬 | state.json의 credit.shown | references/credit.md에 따라 한 번 표시되거나 건너뜀 | 해당 없음 |
게이트별 전체 명령어, 산출물 및 오류 처리: references/pipeline.md.
하드 게이트 3. 사용자가 스토리보드를 승인하기 전까지는 어떤 것도 mp4로 렌더링되지 않습니다. 룩 탐색을 위한 스틸 이미지(npx launchfilm still)는 허용됩니다. 승인 = 사용자가 표시된 표에 대해 승인/확인/진행을 말하는 것; STORYBOARD.md의 첫 번째 줄에 approved: <ISO date>를 작성합니다. 승인 후 편집은 변경된 행에 대해서만 게이트를 다시 엽니다.
라우팅
| 사용자가 말하는 경우 | 수행할 작업 |
|---|---|
| "X에 대한 런치 비디오/제품 필름/프로모션을 만들어줘" | 게이트 0부터 전체 파이프라인 |
| "이 비디오를 영감으로 사용해" + 파일/URL | reference-study (A 단계만), 그 후 레시피와 함께 게이트 3부터 계속 |
| "<스타일> 같은 것", "옵션 보여줘", "레시피 로" | recipes: 1~3개를 골라 각각 한 줄 설명, 비트 시트 요약, 소스 링크와 함께 표시 (호스팅된 미리보기 없음), 게이트 3부터 계속 |
| "새 브랜드/로고/색상 변경" | brand-intake, 그 후 스틸 이미지와 QA 재실행 |
| "음성/대본/음악 변경" | story (대본) 또는 sound; 승인된 행 유지; 4 → 6 → 7 재실행 |
| "세로로 만들어줘 / LinkedIn용 / PH용" | 프리셋 추가 (--presets 또는 defaultPresets), 재구성 (scene-build), 해당 프리셋 QA, 렌더링 |
| "비디오 확인해줘", "왜 싸구려처럼 보이지?" | 최신 렌더링에 대해 film-qa 실행 |
| "포스트/트윗/PH 카피 작성해줘" | launch-post |
| "크레딧 없이", "launchfilm 언급하지 마" | npx launchfilm credit off, 한 줄로 확인 |
사용자가 "그냥 만들어줘"라고 할 때의 기본값
| 결정 | 기본값 | 규칙 |
|---|---|---|
| 모드 | 개발 도구/SaaS UI용 제품 필름 (하나의 히어로 플로우 포함); 소비자, AI, 또는 "why now" 스토리용 인터넷 네이티브 런치 필름; 테제와 UI 플로우가 모두 있을 때 하이브리드 | [craft/01#two-modes] |
| 길이 + 프리셋 | 30초, defaultPresets (x-16x9 + li-4x5) | [craft/10#presets] |
| 구조 | 30초 런치: 훅 0–2 · 문제 2–8 · 전환 8–10 · 공개 + 기능 10–24 · 증명 24–26 · CTA/종료 26–30 | [craft/01#structures] |
| VO | 켜짐, 기본 로컬 음성 (Kokoro, af_heart), 2.5–3 단어/초, 30초 기준 약 53단어 | [craft/11#word-budget] |
| 음악 | 번들 라이브러리 (--provider library), 기악, 100–130 BPM 제품 / 130–150 흥미 유발 | [craft/02#music-choice] |
| 캡션 | VO가 있는 모든 프리셋에 번인(burned-in), SRT 사이드카. 참고: 제공되는 ph-16x9 프리셋은 captions: "srt"가 기본값입니다. 필름이 음소거 상태에서도 작동해야 하면 harness.config.json에서 "burned"로 설정하세요. | [craft/10#captions] |
| fps | 30 (커서/스크롤이 많은 UI는 60만) | [craft/10#presets] |
BRIEF.md의 "Assumed" 아래에 선택한 모든 기본값을 명시하세요. 브리핑 수준의 질문(메시지, 모드, 길이, 플랫폼, 브랜드 에셋, 주장)만 묻습니다. 모든 제작 결정은 craft/에서 직접 내리고 인용하세요.
모든 결정 뒤에는 규칙을 명시하세요
각 스토리보드 행, film.json 주석의 기본값이 아닌 각 선택, 최종 보고서의 각 줄은 해당 규칙으로 끝납니다: [craft/04#springs], [craft/03#zoom-tiers], [T1]. 결정 → 규칙 색인: references/decisions.md. 어떤 규칙도 선택을 다루지 않으면 [judgment]를 쓰고 한 문장으로 이유를 설명하세요. 12가지 금지 사항 T1–T12 (craft/00)는 모든 필름에 차단 요소입니다: T1 정적 프레임 · T2 기본 이징 · T3 모든 것을 한 번에 · T4 단일 속도 · T5 무음 또는 단일 트랙 · T6 레이블로서의 텍스트 · T7 평탄하고 등급 조정 안 됨 · T8 웹 레이아웃 본능 · T9 일반적인 스톡 · T10 장식적인 전환 · T11 스토리보다 템플릿 · T12 출력물을 절대 보지 않음.
플랫폼별 프리셋 렌더링 (게이트 7)
npx launchfilm render <slug> --presets x-16x9,li-4x5(--presets를 생략하면defaultPresets를 렌더링). 각 프리셋은 자체 컴포지션이며 포커스 사각형으로 재구성됩니다. 절대 레터박스나 블라인드 크롭을 하지 마세요[craft/03#multi-aspect-recomposition].- 각 파일을 검증하세요:
npx remotion ffprobe -v error -show_entries stream=codec_name,profile,pix_fmt,width,height,r_frame_rate:format=duration -of json out/<slug>/<file>.mp4h264 / High / yuv420p / 프리셋 크기 / 프리셋 fps /film.json의 ±1 프레임 이내 지속 시간을 기대합니다. - 음량:
npx launchfilm qa <slug>가 측정합니다; 수동으로는:ffmpeg -hide_banner -nostats -i out/<slug>/<file>.mp4 -af ebur128=peak=true -f null - 2>&1 | tail -12(시스템 ffmpeg: Remotion의 번들 빌드는ebur128이 없습니다; 없으면 NOT CHECKED를 쓰세요). I −14 ±1 LUFS, 실제 피크 ≤ −1.5 dBTP를 기대합니다. 히어로 루프: 오디오 스트림이 전혀 없습니다. - 프리셋 표 및 제한: references/platforms.md.
수정 루프
- 사용자 편집을 유지하세요. 파일을 편집하기 전에 마지막으로 작성한 내용과 diff하세요. 사용자가 변경했다면 병합하고 절대 되돌리지 마세요.
- 영향을 받은 게이트만 재실행하세요: 카피 변경 → 3 (변경된 행) → 4 (VO 라인:
vo <slug> --line <id>) → 5 → 6 → 7. 룩 변경 → 5 → 6 → 7. - 승인된 VO, 음악 또는 푸티지를 묻지 않고 재생성하지 마세요. 재생성은 모든 타이밍을 하류로 이동시킵니다.
- 변경된 프리셋만 다시 렌더링하세요. 사용자가 확인할 때까지 이전 렌더링을
out/<slug>/<file>.v<N>.mp4로 유지하세요.
절대 하지 말 것
- 텔레메트리, 홈 호출, 워터마크, 기본 엔드 카드 크레딧, 스타 또는 스폰서 요청.
- 채팅에 비밀 정보;
cat .env; 사용자에게 채팅에 키를 붙여넣도록 요청 (사용자가 직접.env를 편집). - 발명된 로고, 발명된 색상, 발명된 지표, 사용후기 또는 고객 이름, BRIEF.md에 없는 주장.
- 스토리보드 승인 전 mp4 렌더링. 실행하지 않은 QA를 주장하는 것 (film-qa 증거 규칙).
- 사용자가 표시할 권리가 없는 타사 로고 또는 상표; 밈 또는 시스템 사운드; 크레딧이 없는 CC BY 음악.
- 필름에서 공유 스튜디오 프리셋 편집; 필름별 컴포넌트는 필름 폴더에 넣으세요.
최종 보고서 (게이트 8 이후 사용자에게; ≤ 25줄)
Film: <slug> · 모드 · <duration> s · <fps> fps
렌더링: out/<slug>/<slug>-x-16x9.mp4 (1920×1080, 12.4 MB) · out/<slug>/<slug>-li-4x5.mp4 (1080×1350, 10.1 MB)
포스터: out/<slug>/poster.png (프레임 0) · 캡션: out/<slug>/<slug>.srt · 크레딧: out/<slug>/credits.txt
음량: −14.1 LUFS I, −1.7 dBTP (x-16x9)
QA: T1–T12 통과 (qa/<slug>/QA.md, 3개 시트, 14개 스틸 이미지); 수정됨: <목록>; 알려진 결함: <목록>
적용된 규칙: 훅 H3 [craft/01#hooks] · 스프링 ui/snappy [craft/04#springs] · 티어 1→2→3 [craft/03#zoom-tiers] …
제외된 것: <내용 및 이유>
다음 단계: out/<slug>/POST.md의 포스트 카피
render/package가 출력한 실제 파일 이름을 사용하세요. 그런 다음 게이트 10: references/credit.md에 따라 크레딧 노트, 해당 조건이 충족되는 경우에만.