Motion reel
이 저장소 자체 엔진으로 새로운 필름을 빌드하세요. 사용자가 명시적으로 언급하지 않는 한 Remotion이나 HyperFrames로 전환하지 마세요; 저장소의 렌더링 계약은 CLAUDE.md에 있으며 이 파일보다 우선합니다.
필름은 두 세션으로 실행되며, 오너가 샷 목록과 보드를 함께 승인하는 시점에서 분할됩니다:
- 사전 제작 (이 파일): 브리핑, 스토리, 자산, 음성, 비트 그리드, 샷 목록, 보드.
- 빌드 (
/motion-reel build <film>): build.md를 읽고 따르세요; 이 파일은 건너뜁니다.
분할 지점은 빌드를 새로운 컨텍스트에서 시작하게 합니다. 사전 제작은 창을 참고 자료, 테이크 및 보드 이미지로 채우며, 이후의 모든 턴은 그 비용을 부담합니다.
1. 브리핑 확정
오너의 초안에 대해 node tools/brief.mjs --in=<draft.md>를 실행하세요 (--film=<film>은 프로젝트가 존재할 때 사용: 포함된 base64 없이 brief/original.md를 작성합니다). 헤더, 예산 대비 VO 단어, 초안이 남겨둔 미결 사항을 출력합니다. 초안이 없으면 요청에 따라 docs/brief-template.md의 헤더 필드를 채우고 각 공백에 기본값을 제안하세요: 오너는 "oke" 하나 또는 수정 사항으로 답변합니다.
코드를 건드리기 전, 그리고 크레딧을 인용하기 전에 한 메시지로 여전히 열려 있는 사항을 물어보세요; brief/decisions.md에 이미 있는 답변은 유지됩니다. 도구가 볼 수 없는 다음을 추가하세요:
- 중복: 동일 주제 또는 기둥에 대한 과거 필름 (
projects.json). 어떤 것인지, 그리고 이 필름이 추가하는 내용을 말하세요. 리메이크는 기존 폴더를 그대로 두고 해당decisions.md의 답변 중 어떤 것이 여전히 유효한지 물어보세요. - 제품 + URL (또는 주제). OpenView 필름의 경우,
docs/content-map.md의 기둥과 공식. - 브랜드: OpenView 필름은
lib/brand.js를 사용합니다. 다른 브랜드: 색상, 글꼴, 하나의 악센트, 실제 로고. - 참고 자료: 프레임, 비디오 또는 이미지 폴더. 또는 "없음" (그렇다면 그렇게 말하세요; 기본 룩은 없습니다).
- 음악: 제공된 트랙 (측정) 또는 "합성" (기본값).
- 음성 해설:
.env에ELEVENLABS_API_KEY가 필요합니다. 비어 있으면 중단하고 변수 이름을 알리세요.
언어, 음성, 길이, 비율, 주제 (티커 포함), 데이터 소스 (앱, 키트 또는 일러스트레이션) 및 에너지가 확정되면 브리핑이 확정됩니다. 이 중 하나라도 과거 필름의 첫 번째 테이크 이후 이동되면, mi-demo-40은 VO에 세 번 비용을 지불했습니다. 답변을 <project>/brief/decisions.md에 기록하세요.
다른 도구(스토리보드, zip, 핸드오프)의 패키지: 수정 없이 <project>/references/<tool>-<date>/에 복사하세요. 이 폴더는 커밋에서 제외되며, 해당 브리핑에 대해서만 tools/brief.mjs를 실행하세요. 결정에 해당 파일이 필요할 때만 다른 파일을 엽니다. 해당 샷 목록과 스크립트는 초안의 순서처럼 중요한 자료입니다.
제한 사항: 브리핑 또는 법적 규칙이 화면에서 금지하는 단어, 수치 또는 사실은 <src>/forbid.json에 넣습니다 (tools/forbid-lib.mjs): tools/vo.mjs는 크레딧을 사용하기 전에 거부하고, tools/check.mjs는 화면에 있을 때 실패 처리합니다. 패턴이 볼 수 없는 제한 (백분율을 표시하지 않는 이름)은 brief/decisions.md에 넣고, 모든 보드 및 검토 시트와 대조하여 읽습니다.
필름 슬러그([a-z0-9-]+)를 선택하세요. 아래 모든 것은 해당 슬러그로 이름이 지정됩니다: <film>.
프로젝트 레이아웃. 새 필름은 CONTENT 프로젝트 폴더 (CLAUDE.md "새 비디오 프로젝트 폴더")와 projects.json에 "<film>": "CONTENT/<n>. <제목> (<날짜>)" 줄을 받습니다; 그러면 도구가 해당 위치를 찾습니다 (tools/paths.mjs): 샷 목록과 브리핑은 <project>/brief/ (shotlist.md), 코드는 <project>/src/ (film.js, timeline.js, vo-lines.json, beats.json, sfx-<film>.mjs), 테이크와 미디어는 <project>/assets/, 보드, 시트 및 렌더링은 <project>/output/에 있습니다. 오래된 필름은 docs/<film>-shotlist.md, film/<film>/, assets/<film>/ 및 out/을 유지합니다. 아래에서 <shotlist>, <src>, <assets> 및 <output>은 해당하는 것을 의미합니다.
2. 사전 제작
-
자산.
<assets>/에 넣고, 애니메이션 전에 나열하세요.- OpenView 로고 및 심볼:
lib/brand.js를 통해서만 그립니다; SVG를 필름에 직접 복사하지 마세요. - OpenView 마스코트:
lib/mascot/의 코드 리그 (API는lib/mascot/index.js의 헤더와 내보내기에 있음). - OpenView Market Intel: 최신
origin/main의 수치와 이름, 코드로 Market Intel UI 키트를 사용하여 그림을 그립니다. 브리핑이 실제 앱을 요청할 때만 실행 중인 앱을 캡처하세요; 그런 다음CLAUDE.md의 "Market Intel source"를 따르세요;capture_mi.mjs --review에서 밴드를 선택하고lib/proof.js로 그립니다. - URL이 있는 다른 제품: Playwright로 실제 스크린샷, 로고, 색상, 글꼴을 캡처하세요.
- OpenView 로고 및 심볼:
-
시각적 세계.
REFERENCES/motion/visual-grammar-2026-10.md를 읽은 다음,<shotlist>상단에## World를 샷보다 먼저 작성하세요: 한 장소, 그 객체, 그 안에 서 있는 사람, 빛이 하는 일, 브리핑의 각 인물과 관계가 가리킬 수 있는 것이 되는 방법.lib/world.js로 그리세요. 디자인 시스템은 제품 자체 화면에 남아 있습니다. 스타일 가이드. 참고 자료가 있으면 먼저 측정하세요:uv run --python 3.11 --with librosa --with numpy tools/ref_probe.py refs/<film>/ref.mp4 refs/<film>/analysis.json그런 다음docs/<film>-style_guide.md를 작성하세요: 팔레트 (hex), 타입, 샷 길이, 전환, 카메라 움직임, 텍스처, 텍스트 진입 및 종료 방식. 문법은 취하되 내용은 취하지 마세요. 기본 룩은CLAUDE.md"Look"과docs/motion-vocab.md입니다; 다른 필름의 스타일 가이드는 해당 필름을 기록하며 기본 룩을 기록하지 않습니다. -
스토리. story.md를 읽고, 주제를 Topic 사다리에 통과시키고,
<shotlist>상단에 스크립트보다 먼저 스파인 테이블을 작성하세요. 모든 행이 채워지고 해당 파일 끝의 스크립트 테스트가 첫 번째 줄과 개요를 통과하면 스파인이 완료됩니다; 초안의 순서는 여기서 중요한 자료이지 스크립트가 아니며, 초안의ALUR CERITA및KANDIDAT HOOK(docs/brief-prompt.md)은 첫 번째 버전입니다. VO 인용문과 함께 스파인을 보여주세요: 필름을 변경하기에 가장 저렴한 순간입니다. 초안에서, 동일한 메시지는 초안이 다루고 스크립트가 생략하는 내용을 두 단어 수와 함께 명명합니다:pandu-supra-80은 첫 번째 필름 후 "ga selengkap draft"로 돌아왔으며, 확장은 세 번의 추가 세션이 걸렸습니다. -
음성 해설 (브리핑에 VO가 있는 경우):
CLAUDE.md의 "Voice-over"를 따르세요. 스파인에서 조사자 음성(story.md "The viewer")으로 스크립트를 작성하되, 단어 예산까지, 숫자가 말해지는 대로 계산하세요: 인도네시아어 1,7은 6개 필름이 1.12 (1,65–1,75 단어/필름-초)로 실행되었으므로, 전체 예산은 브리핑의 초에 가깝게 도달합니다.character기본값은calm, fair narrator, talking to one person입니다. 그런 다음<src>/vo-lines.json과 story.md의 마지막 섹션을tools/script.mjs가 통과할 때까지 진행하세요;credits줄이 견적입니다.tools/vo.mjs로 생성하고--check를 전달하세요. 정의 및 법적 용어는 다른 수치와 마찬가지로references/sources.md에 출처가 필요합니다; R-120은 등록 이름을 화면에서 제외하지만, 소스 파일에서 제외하지는 않습니다. 테이크는 장면 길이를 설정합니다:<src>/timeline.js는lib/vo-clock.js의 장면 목록입니다 (sceneTimeline; 모델: iata-55), 그리고node tools/prepare.mjs --film=<film>은 테이크를 확인하고 클록을beats.json에 씁니다. -
비트 그리드. 제공된 트랙: BPM/비트/다운비트/히트를 측정하여 (librosa)
<src>/beats.json에 넣습니다. 합성: BPM을 선택하고<src>/sfx-<film>.mjs를 작성하세요.lib/synth.mjs의 큐 목록 (모델: iata-55의src/sfx-iata-55.mjs)으로,beats.json과<output>/<film>-audio.wav를 -14 LUFS로 출력합니다. -
샷 목록. 비트 그리드에
<shotlist>를 작성하세요: 모든 샷의 프레임, 카메라, 화면 텍스트, SFX, 스파인 비트, 사용된docs/motion-vocab.md의 효과, 다음 샷으로의 컷 이유 (다음 단계, 같은 위치, 원인과 결과, 시간 점프, 콜백, 크기 변화). 컷 이유가 없는 샷은 카메라 움직임으로 다음 샷에 합쳐집니다. 제품으로의 진입 경로를 하나의 움직임으로 계획하세요. 세계 객체가 화면이 되어 컷 양쪽의 샷에서 이름이 지정됩니다: 이로 인해delisting-18-80(45–50초)의 빌드에서 오너의 유일한 창의적 수정이 발생했습니다. 여기서 장면별로 밀도를 계획하세요: 각 움직임이 담을 내용, 최근 모든 필름의 첫 번째 빌드가 밀도에서 4–5점을 받고 추가하는 라운드를 소비했기 때문입니다. 오너의 승인이 필요한 결정을 나열하세요. 여기서 멈추지 마세요: 샷 목록은 보드와 함께 오너에게 전달됩니다. -
보드. 먼저
<src>/film.js에서 필름의 가장 넓은 샷과 가장 가까운 샷을 그립니다 (board: [{ t, shot, note }]내보내기) 그리고 그 쌍만 살펴보세요 (node tools/board.mjs --film=<film> --only=<wide>,<close>, 그-view.jpg): 세계가 얼마나 많은 것을 담아야 하는지와 그 형상이 클로즈업에서도 살아남는지 보여주며, 다시 그리는 데는 두 샷이 소요됩니다. 그런 다음 샷당 하나의 스틸을 그립니다.node tools/board.mjs --film=<film>을 실행하세요. 그 텍스트는 기계적 검토입니다: 모든warn … mid-move줄 (t를 확정된 프레임으로 이동)과 모든layout발견 사항 (안전 영역 외부, 캡션 밴드 내, 겹침, 너무 작음)을 수정한 다음, 텍스트가 깨끗한지 확인하기 위해 한 번 더 실행하세요. 보드의-view.jpg개요만 읽거나, 18샷 이상인 경우 출력하는pages를 각각 한 번씩 읽어 룩을 확인하세요: 한 번에 잘못 읽힌 것을 수정하고, 룩-패치-재렌더 루프나 장면별 시트 없이 (--scenes는 이 검토가 아닌 오너를 위해 존재합니다). 해당 개요의 룩 테스트: 음소거하고 그림만으로 스토리를 따라가세요; 낯선 사람은 장소, 사람, 사물을 보며 슬라이드가 아닙니다. 캡션 외에 샷은 객체에 최대 6단어를 보유합니다; 브리핑이 전체를 요구하는 증명 판과 줄만 예외입니다. 실패 시 텍스트를 자르는 것이 아니라 샷을 다시 그리는 것을 의미합니다. -
오너 검토 (유일한 게이트). 샷 목록과 보드(
<output>/<film>-board.png)를 함께 보여주고, 승인이 필요한 결정과 함께, 단일 승인을 기다리세요. 그 전에는 모션이나 사운드가 없습니다. -
핸드오프. 오너가 검토를 승인하면,
<shotlist>상단에## Build brief섹션을 작성하세요: 승인된 사항, 여전히 열려 있는 사항, 빌드에 필요한 파일 (필름 모듈, 테이크, 비트, sfx 스크립트). 그런 다음 새 컨텍스트에서 빌드를 시작하세요:- 데스크톱 앱: 새 컨텍스트로 새 세션 시작 (포크 아님), 프롬프트
/motion-reel build <film>. - 터미널: 오너에게
/clear실행을 지시한 다음/motion-reel build <film>.
사전 제작은 여기서 끝납니다: 샷 목록과 보드에 대한 오너의 승인이 완료 기준이며, 빌드는 새 세션에 속합니다.
- 데스크톱 앱: 새 컨텍스트로 새 세션 시작 (포크 아님), 프롬프트
3. 엄격한 규칙
- 순수 시간 함수:
seek(t)만 사용합니다.Math.random, 타이머, CSS 전환, 렌더 모드의requestAnimationFrame, 프레임 간 상태는 없습니다. -view.jpg미리보기를 엽니다; 전체 해상도 이미지는 하나의 세부 사항에 대한--crop으로만 사용합니다. 이미지는 룩을 위한 것입니다; 기계적 검사는 도구의 숫자입니다 (node tools/check.mjs --film=<film>: seek 스윕, 결정론, 글꼴 px, 레이아웃 린트).- 컨텍스트가 비용이며, 턴이 이를 증폭시킵니다: 300k에서의 턴 하나는 100k에서 세 턴의 비용과 같으며, 최근 메시지의 2/3는 하나의 도구를 수행했습니다. 단계의 모든 독립적인 읽기, 검색 및 편집을 한 메시지로 보내세요. 도구는 읽는 것이 아니라 실행합니다 (
--help가 사용법을 제공함); 편집은 Edit로 하되 전체 파일을 다시 쓰지 마세요; 긴 명령은 백그라운드에서 실행되며 알림을 기다리되,sleep이나 폴링 루프는 사용하지 마세요. - 다른 필름의 소스는 템플릿이 아닙니다: 필름은 코드의 3–16%만 공유합니다. 필요한 하나의 함수를 찾아서 (Grep, 또는 오프셋/제한으로 읽기) 해당
film.js는 닫아 두세요. - 상태는 파일에 저장됩니다:
brief/decisions.md,references/sources.md,<shotlist>,docs/review_log.md. 프로젝트는 250k에서 자동 압축되므로, 대화에만 유지된 사실은 필름 중간에 사라질 수 있습니다. - 비밀은
.env에서만 가져옵니다. 키를 절대 출력, 로그 또는 붙여넣지 마세요. - 브랜드당 하나의 세션: 엔진, 합성 및 내보내기 파이프라인은 재사용되며 다시 빌드되지 않습니다.