adnaan-reel
Adnaan의 영상 → 승인된 참조 편집과 정확히 동일한 릴로 변환합니다. 그 전에 assets/style/v8_contact_sheet.jpg를 보십시오 — v7 'MINT' 룩의 승인된 reel-08 스타일 테스트로, 2026-10-17 이후 하우스 기본값입니다(examples/reel-08-v7/의 장면): 그가 전체 화면으로 등장하는 TALK 비트 + 당사의 운동성 자막, 회색 보드의 VISUAL 비트, 아이콘 디스크, 디스크 체인 및 이동 카메라, 시그니처 축소. 먼저 references/style.md 'v7'을 읽으십시오 — 이전 섹션과 충돌하는 경우 이를 재정의합니다. v6 사운드 규칙, 안전 영역, 가독성 규칙 및 모션 원칙은 여전히 적용됩니다. 아트 디렉션은 references/style.md에 있으며 바인딩됩니다. 장면 문법(릴이 장면으로 분할되는 방식 및 존재하는 장면 유형)은 references/scenes.md에 있습니다. 룩은 코드입니다: 공유 런타임 templates/runtime/paper.css + paper.js(세계, 운동성 유형, 프리미티브, Lasseter 원칙의 모션) + v7.css + v7.js(v7: 아이콘 디스크, 디스크 체인, 디스크/카드로 축소/확대, 카메라, 영역 마스크) + templates/scenes/의 장면 유형별 하나의 스타터(talk, talk_depth, visual, chain, card); slots.py prepare가 이를 모든 장면에 설치하므로 장면은 약 150줄의 복사본, 위치 및 하나의 맞춤 개체입니다.
레거시 PAPER 룩(빨간 종이 + 손으로 그린 마커 레이어 marker.css/marker.js, 분할 밴드, reel-06/07 — assets/style/v6_contact_sheet.jpg, v7_contact_sheet.jpg, examples/reel-06/, reel-07/)은 init-brand --look paper이며, 그가 요청할 때만 사용합니다. 이전 아이디어 뱅크: examples/reel-04/, reel-05/ 및 references/motion-ideas.md(세리프 편집 룩: examples/reel-03/, init-brand --type editorial).
비디오를 시청하지 않습니다 — 읽습니다: 단어 수준의 트랜스크립트, 결정 지점의 필름스트립, 그리고 조인을 트랜스크립션하는 검증 도구.
원칙
- 모든 비트는 장면이며, 두 가지 MODE(v7) 중 하나입니다. 전체 릴은 잠긴 컷 위에 8–18개의 전체 화면 HyperFrames 장면이 연속적으로 구성되며, 모든 비트는 비트 테이블에서 모드를 선택합니다: TALK(그가 전체 화면, 그 위에 당사의 운동성 자막 — 후크, 전환, 의견, 페이오프, CTA;
talk, 또는 그 뒤에 무언가가 있을 때talk_depth) 및 VISUAL(화자 없음; 보드, 아이콘 디스크, 평면 벡터 소품, 실제 페이지, 이동 카메라 — 모든 설명, 목록 항목, 예제;visual). 그는 릴의 약 50% 동안 화면에 있습니다. 그가 없는 Visual 스트레치는 ~8초를 넘지 않습니다. 시그니처 축소(릴당 1–3회: 그의 영상이 현재 체인 디스크 또는 작은 왼쪽 카드로 축소됨,chain/card;V.grow가 그를 페이오프를 위해 다시 가져옴)가 모드를 연결합니다. 작은 카드는 0–2회 나타납니다. 목록 릴의 맵은 디스크 체인(V.chain)입니다. 긴 화면 녹화는demo유형입니다. - 단어가 자막입니다. 자막이 아닙니다. 운동성 Inter Tight 900 구문이 음성 단어에 맞춰 나타납니다(크게, 히어로 170–270 px 작성, ×0.94 하우스
--type-scale; 색상으로 강조, 이탤릭체 없음; v7: 그의 영상 위에 부드러운 광택이 있는 차콜, 하나의 민트 히어로 단어, 민트는 히어로 크기에서만). 화면의 단어는 그가 실제로 말하는 단어만(이름의 ASR 철자 수정됨) — 더하기 그가 작성하는 선택적 텍스트 후크(프레임-0 헤드라인). - 실제 제품을 실제 로고와 함께 보여주세요. 그가 이름을 언급하는 모든 제품, 리포지토리, 사이트, 파일 또는 프레임워크는 실제로 나타납니다: 브라우저 카드에 캡처된 페이지, 실제 리포지토리 슬러그, 별표 수, 실제 제목 및 부품 이름. 그가 언급하는 모든 도구 또는 회사는 공식 로고를 받습니다(
fetch.py logo,official로 기록됨), 수정되지 않은<img>로 이름 옆 또는 앱 카드에 칩/필 형태로 표시됨 — 로고가 존재하는 경우 다시 그리거나 색상을 변경하거나 텍스트 전용 필로 대체하지 않습니다. 예시 UI는 괜찮습니다. 발명된 숫자, 인용문 또는 게시물은 허용되지 않습니다. - 계획을 승인한 다음 모든 것을 구축하십시오. 하나의 비트 테이블 → 승인 → 모든 장면 병렬 구축 → 조립 → 자체 점검 → 제공. 오토파일럿('그냥 해')은 대기를 건너뜁니다.
- 절대 지루하지 않고, 항상 애니메이션됩니다. 각 장면에는 실제 모션이 있는 히어로 아이디어(사물이 처리, 열림, 병합, 쌓임, 점선 경로를 타고, 회색에서 강조 색상으로 전환)와 지속적인 생동감이 있으며, 모든 움직임은 Lasseter의 원칙(
references/animation-principles.md: 예측, 오버슛 + 안정, 오버랩, 호, 스테이징, 2차 동작, 하나의 과장된 비트, 진입보다 빠른 퇴장)을 따릅니다. 런타임이 기본적으로 이를 수행합니다. 맞춤 개체도 마찬가지여야 합니다. 장면이 정적 슬라이드가 될 수 있다면 다시 하십시오. 풍부함은 하우스 수준(reel-05)이며, v6에 의해 조정됩니다: 한 번에 약 2개의 초점 요소와 그리드의 35–50%가 비어 있음(콘텐츠 종속 지침, 엄격한 게이트 아님) — 히어로 개체 + 1–3개의 2차 마이크로 애니메이션으로 문장을 표현함 — 작업을 수행하는 커서, 실제 값으로 롤링되는 실제 숫자, 살아 움직이는 아이콘, 부드러운 물리, 개성이 있는 캐릭터, 공연하는 유형, 단어에 착지하는 히어로 아이콘(references/motion-ideas.md). - 상단에 깨끗한 평면 벡터(v7) — 민트 룩에 손으로 그린 마커 없음. 흰색 Phosphor 글리프가 있는 아이콘 디스크(
fetch.py icon,V.disc), 스스로 그리는 깨끗한 벡터 스트로크(커넥터, 밑줄 막대, 돋보기 테두리 — 동일한 두께, 끓지 않음), 모션에 개성이 있는 평면 벡터 히어로 개체, 실제 텍스트 뒤의 민트 하이라이터. 복숭아색은 데이터 전용입니다. (레거시 페이퍼 룩은 빨간 펠트 팁 마커 + Caveat 노트,hf/marker.js를 유지합니다.) - 항상 읽을 수 있어야 합니다. 모든 것은 안전 영역 내부(측정됨), 실제 페이지는 큰 스트립(≥ 0.85, ~45 px 텍스트)이며 음성 구문 뒤에 하이라이터가 있고, 반투명 텍스트가 없으며, 그의 옷 위에 단어가 읽기 쉽습니다(v7: 차콜 + 광택, 히어로 크기에서 민트; 페이퍼 룩: 단색 종이 위에), 칩/로고/낙서는 휴대폰에서 충분히 큽니다. 그가 이것을 명시적으로 요청했습니다. IG 안전 영역(v6): 하단 20%에는 아무 것도 없고, y 1200 아래 x 900 오른쪽에는 아무 것도 없음(좋아요/댓글/공유) — CTA는 하단 왼쪽/중앙에 배치됩니다.
- 사운드는 음성을 지원합니다 — 30% 규칙(v6). 미키마우싱 없음: 0:00–0:04에 1–2개의 펀치감 있는 촉각적 사운드, 그 다음 구조적 전환만(포인트 1/2/3, 모드 전환, 큰 스크린샷 슬라이드 인, CTA 착지) — 70초 동안 약 10–14개의 큐, 낮고 따뜻한 v6 키트(
assets/sfx/v6_*: 스탬프, 클렁크, 썰드, 종이, 우쉬, 팝)에서 가져와 5 kHz에서 저역 통과됨. 에이전트는 해당 비트를beats.json에서"role": "hook" | "structural"로 태그합니다.scenes.py edl(기본값--sfx-policy sop)은 다른 모든 것은 침묵 상태로 둡니다. 믹스: 음성이 전면, SFX −16…−22 dB, ElevenLabs Music 배경(악기, 아크에 맞춰 시간 조정됨) −22…−26 dB(음성 아래),--music을 통해, 마지막 3초 동안 +2.5 dB. - 보여주기 전에 확인하십시오. 모든 조인이 트랜스크립션되고, 모든 장면이 체크시트로 확인되며, 조립된 릴이 플래시 스캔되고 샘플링됩니다. 직접 게시하지 않을 것 같으면 제시하지 마십시오.
하드 규칙
- 장면이 구축되기 전에 비트 테이블이 승인되어야 함(오토파일럿이 아닌 경우).
- 세그먼트별 추출 → 무손실 연결 컷용(render.py), 조인에서 30ms 오디오 페이드, 단어 내부에서 절대 자르지 않음, 가장자리 패딩, 단어 수준 트랜스크립트만, 소스별 캐시.
- 모든 필러 컷과 모든 조인 확인
verify_cuts.py로 — whisper가 단어 끝을 조기에 끝내고,audio_env.py tighten이 부드러운 단어 끝을 먹음('code', 'immediately', 'base', 'use'는 참조 편집에서 모두 잘렸습니다. 'works'는 reel-05에서 's'를 잃었지만 ASR은 여전히 'works'로 읽었습니다). 모든 조인 라인과 그 ⚠ TAIL/HEAD 에너지 플래그를 읽으십시오(의도적인 필러 컷도 플래그 지정 — 예상됨); 실제 단어가 잘린 경우 범위 끝을 제안된 시간으로 확장하고 깨끗해질 때까지 다시 프로브하십시오. edit/에서 부분 또는 테스트 EDL을 절대 렌더링하지 마십시오. render.py는 EDL 옆에base.mp4와timeline.json을 씁니다 —edit/의 테스트 EDL은 실제 베이스를 덮어씁니다.scenes.py preview <id>로 하나의 장면을 미리 보십시오.verify_cuts.py --probe로 컷을 테스트하십시오.- 장면 EDL은
scenes.py edl에서만 생성됩니다. 모든 장면을 프레임 스냅하고, 12ms를 사전 롤링하며, 각 장면을 다음 장면 아래에서 0.1초 동안 유지합니다 — 그렇지 않으면 render.py의 오버레이 동기화가 모든 장면 경계에서 하나의 RAW 영상 프레임을 누출합니다. 그런 다음scenes.py flashcheck <render> --edit-dir edit: 0개의 예상치 못한 RAW 영상 프레임(모든 프레임을 base.mp4와 비교합니다 — reel-05의 천장은 종이 색상이었으므로 이전 모서리 테스트는 눈이 멀었습니다. 계획된fullscreen/demo창은 slots.json에서 제공되며 예상됩니다). - 장면당 하나의 하위 에이전트, 모두 하나의 메시지에서 생성됨. 각
check_sheet.jpg/motion_strip.jpg가 도착할 때 검토하십시오. 수정 사항을 동일한 에이전트에게 SendMessage로 보내십시오(컨텍스트 유지). 모든 장면은 정확히 해당 TASK.md 프레임 수입니다(slots.py가 사전 설정하고check가 강제 실행) —scenes.py edl전에 ffprobe로 모든 개수를 확인하십시오. 1프레임 누락은 컷에서 간격 또는 겹침입니다. - 런타임을 통한 브랜드 충실도. 장면은 설치된 대로
paper.css/paper.js+v7.css/v7.js(민트) 또는marker.css/marker.js(종이)를 사용합니다 — 절대 편집하지 않으며, 장면별로 재구현하지 않습니다(자체 카드 또는 단어 엔진이 있는 장면은 검토에서 거부됨). brand.css 토큰만; 번들된 글꼴이 로드되었는지 확인; 로고를 그리거나 색상을 변경하지 마십시오(공식 파일의 실제 로고만, 기록됨); 하나의 강조 색상. 유료 글꼴을 복제하지 마십시오 — 그가 상업용 얼굴을 원하면 라이선스를 구매하고 파일을 넣습니다. 그때까지는 가장 가까운 OFL 얼굴을 사용하십시오(Bootzy TM → Inter Tight 900, 현재 기본값). 전역 변경(글꼴, 카드 크기, 이징)은templates/runtime/에서 한 번 수행한 다음scenes.py runtime+scenes.py rerender를 수행하십시오. - 다운로드는
fetch.py를 통해, 캡처는capture.py를 통해(둘 다 소스 + 권한 기록);fetch.py credits→credits.md를 제공 전에. 타사 페이지는 그가 추천하는 것에 대한 논평으로, 브라우저 카드에 표시되며 그의 것으로 오해되지 않습니다. - 모든 출력물은
<project>/edit/에 있습니다. 스킬 디렉토리 내부에 절대 쓰지 마십시오. - 컷 전 미러 확인: 전체 해상도 스틸에서 그의 옷/배경의 텍스트 또는 로고를 확대하십시오(필름스트립은 너무 작습니다 — reel-06의 거꾸로된 'SAN DIEGO' 패치는 장면 검토에서만 발견되었으며 모든 스피커 클립의 재컷이 필요했습니다). 거꾸로 →
"mirror": true. - 가독성은 검토 게이트입니다(style.md '가독성'): 영역 밖의 픽셀, 읽을 수 없는 페이지, 고스트 텍스트, 어두운 직물의 단어 또는 휴대폰 크기의 칩/낙서가 있는 장면은 해당 에이전트로 돌아갑니다.
- 보고서가 아닌 타임스탬프를 신뢰하십시오: 에이전트가 '다시 렌더링됨'이라고 말한 후
render.mov가 해당 입력보다 최신인지 확인하십시오(reel-06 v01은 결코 도착하지 않은 재렌더를 보고했습니다).
설정
video-edit와 동일한 툴체인(install.md의 세부 사항): libass + zscale이 있는 ffmpeg/ffprobe, uv(도우미는 uv run --project <skill_dir> <skill_dir>/helpers/<name>.py …로 실행됨), 트랜스크립션(ElevenLabs 키 → Scribe; 그렇지 않으면 Apple Silicon mlx via uv sync --extra mlx; 그렇지 않으면 whisper.cpp), HyperFrames용 Node 22+(npx --yes hyperframes …), capture.py용 Google Chrome. <skill_dir>은 이 파일이 포함된 폴더입니다(~/.claude/skills/adnaan-reel).
신선도(세션당 한 번, 렌더링 전): 스킬은 언핀된 npx --yes hyperframes를 호출하며, 이는 최신 게시된 CLI로 확인됩니다(장면 package.json 핀은 npm run에서만 사용되며, 우리는 절대 호출하지 않습니다). npx --yes hyperframes --version 대 npm view hyperframes version으로 확인하고, HyperFrames 스킬이 오래된 경우 npx --yes hyperframes skills check → npx --yes hyperframes skills update를 실행하십시오(2026-10-14에 10개가 뒤쳐져 있었습니다). project.md에서 CLI 버전을 기록하십시오. 업데이트 후 렌더링이 이전 릴과 다르게 보이면 그렇게 말하십시오.
도우미
| 도우미 | 기능 |
|---|---|
scenes.py init-brand --edit-dir E [--look mint|paper] (mint = v7 house default) [--accent red|ocean|…|#hex] (paper look only; red default) [--type grotesk|editorial] [--type-scale 0.94] --frame still.jpg | 번들된 글꼴 복사(grotesk 기본값: Inter Tight + Inter + Geist Mono; editorial: Newsreader + Fraunces + Geist), brand.json 작성(하우스 팔레트 + 강조 + "look"), references/style.md → animations/SHARED.md 복사, brand_kit.py build 실행, --type-scale(하우스 0.94) 추가 및 — 민트 룩 — v7 토큰(차콜 잉크, 민트-소프트, 민트 패널, 복숭아, 디스크 그림자, 강한 비네트)을 brand.css에 추가 |
fetch.py icon <name…> --edit-dir E [--weight fill] | v7 아이콘 디스크 글리프: Phosphor(MIT) SVG → icons/<name>.svg, open-source로 기록됨; 슬롯의 "assets"에 icons/<name>.svg로 나열, V.disc({icon: name})으로 사용(이름: phosphoricons.com) |
scenes.py words --edit-dir E | 출력 시작, 프레임 및 단어가 있는 모든 컷 세그먼트 — 여기에서 장면 경계 선택 |
scenes.py cut-speaker --edit-dir E [--only ids] | 장면별: base.mp4 창 → hf/assets/speaker.mp4(음소거됨; 프레임 정확 검색; 마지막 장면은 끝 고정 프리즈로 패딩됨) + speaker_cut.webm(그의 매트) for talk_depth / cutout 장면 + 장면의 "assets" 복사; 중간 구축 컷 수정 후 --only |
scenes.py edl --edit-dir E [--beat-gain-offset -3] | edl.json + animations/slots.json + 렌더링 → edl_scenes.json(프레임 스냅, 사전 롤, 0.1초 유지, 자막 없음) + 모든 장면의 beats.json → ElevenLabs 키트의 시간 조정된 audio[] 큐 |
scenes.py preview <id> --edit-dir E | 음성이 있는 하나의 장면 → verify/<id>_preview.mp4(안전: base를 건드리지 않음) |
scenes.py flashcheck <video> --edit-dir E [--allow] | 계획된 talk/talk_depth/chain/card/fullscreen/demo 창 외부에서 base.mp4(= 표시되는 원시 영상)와 일치하는 프레임(0이어야 함); --edit-dir 없이 장면 자체의 비네트를 허용하는 모서리 색상 테스트 |
scenes.py runtime --edit-dir E / scenes.py rerender --edit-dir E [--jobs 4] [--only ids] | 공유 런타임을 모든 장면에 다시 설치 / 모든 장면을 병렬로 다시 렌더링하고 프레임 수 확인 — 몇 분 안에 전체 릴 스타일 변경(새 글꼴, 카드 크기, 이징) |
| `capture.py --edit-dir E --name n --rea |
… [번역 위해 잘림]