adnaan-reel
El metraje de Adnaan → un reel que se ve exactamente como la edición de referencia aprobada. Antes de nada, mira assets/style/v8_contact_sheet.jpg — la prueba de estilo del reel-08 aprobado del look v7 "MINT", el predeterminado de la casa desde 2026-10-17 (escenas en examples/reel-08-v7/): beats TALK con él a pantalla completa + nuestros subtítulos cinéticos, beats VISUAL sobre un tablero gris con discos de iconos, una cadena de discos y una cámara viajera, la contracción característica. Lee primero references/style.md "v7" — anula las secciones más antiguas donde haya conflicto; las reglas de sonido v6, zonas seguras, reglas de legibilidad y principios de movimiento siguen aplicando. La dirección artística es vinculante y vive en references/style.md; la gramática de escenas (cómo se divide un reel en escenas y qué tipos de escena existen) está en references/scenes.md. El look es código: el runtime compartido templates/runtime/paper.css + paper.js (mundo, tipo cinético, primitivas, movimiento con principios de Lasseter) + v7.css + v7.js (v7: discos de iconos, la cadena de discos, contraer/agrandar en un disco o tarjeta, cámara, máscara de zona) más un iniciador por tipo de escena en templates/scenes/ (v7: talk, talk_depth, visual, chain, card); slots.py prepare los instala en cada escena, así que una escena son ~150 líneas de copia, posiciones y un objeto a medida. El look PAPER heredado (papel rojo + capa de marcador dibujado a mano marker.css/marker.js, banda dividida, reel-06/07 — assets/style/v6_contact_sheet.jpg, v7_contact_sheet.jpg, examples/reel-06/, reel-07/) es init-brand --look paper, solo cuando él lo pide. Bancos de ideas antiguos: examples/reel-04/, reel-05/ y references/motion-ideas.md (el look editorial serif: examples/reel-03/, init-brand --type editorial).
Nunca ves el vídeo — lo lees: una transcripción a nivel de palabra, tiras de fotogramas en puntos de decisión y herramientas de verificación que transcriben las uniones.
Principios
- Cada beat es una escena, en uno de dos MODOS (v7). El reel completo tiene 8–18 escenas HyperFrames a pantalla completa una tras otra sobre el corte fijo, y cada beat elige un modo en la tabla de beats: TALK (él a pantalla completa, nuestros subtítulos cinéticos sobre él — gancho, transiciones, opiniones, remates, CTA;
talk, otalk_depthcuando algo está DETRÁS de él) y VISUAL (sin orador; el tablero, discos de iconos, props vectoriales planos, páginas reales, una cámara viajera — cada explicación, elemento de lista, ejemplo;visual). Él está en pantalla aproximadamente el 50 % del reel; sin tramo Visual de más de ~8 s sin él. La contracción característica (1–3 por reel: su metraje se encoge dentro del disco de la cadena actual o la tarjeta pequeña a la izquierda,chain/card;V.growlo trae de vuelta para el remate) conecta los modos. La tarjeta pequeña aparece 0–2 veces. El mapa de un reel de lista es la cadena de discos (V.chain). Una grabación de pantalla larga es del tipodemo. - Las palabras son los subtítulos. Sin subtítulos. Frases cinéticas en Inter Tight 900 caen sobre las palabras habladas, grandes (hero 170–270 px autor, ×0.94
--type-scalede la casa; acento por color, sin cursivas; v7: carbón con un resplandor suave sobre su metraje, UNA palabra hero en menta, menta solo en tamaño hero). Las palabras en pantalla son solo palabras que realmente dice (correcciones ASR de nombres fijos) — más un gancho de texto opcional que escribe (titular en el fotograma 0). - Muestra lo real, con el logo real. Cada producto, repo, sitio, archivo o framework que menciona aparece de verdad: página capturada en una tarjeta de navegador, slugs reales de repo, estrellas, encabezados reales y nombres de partes. Cada herramienta o empresa que menciona recibe su logo oficial (
fetch.py logo, registrado comoofficial), mostrado sin alterar como<img>en un chip/píldora junto al nombre o en la tarjeta de la aplicación — nunca redibujado, recolorado o sustituido por una píldora de solo texto cuando existe un logo. La interfaz ilustrativa está bien; los números, citas o publicaciones inventados no. - Aprueba el plan, luego construye todo. Una tabla de beats → aprobación → todas las escenas construidas en paralelo → ensamblaje → autoverificación → entrega. El piloto automático ("hazlo") se salta la espera.
- Nunca soso, siempre animado. Cada escena tiene una idea hero con movimiento real (las cosas se mueven, abren, fusionan, apilan, recorren caminos punteados, pasan de gris a acento) más vida continua, y cada movimiento obedece los principios de Lasseter (
references/animation-principles.md: anticipación, exceso + asentamiento, superposición, arcos, puesta en escena, acción secundaria, un beat exagerado, salidas más rápidas que entradas). El runtime hace esto por defecto; los objetos a medida también deben hacerlo. Si una escena podría ser una diapositiva estática, rehacerla. La riqueza es el nivel de la casa (reel-05), moderado por v6: aproximadamente dos elementos focales a la vez y 35–50 % de la cuadrícula vacía (pautas dependientes del contenido, no límites estrictos) — un objeto hero + 1–3 microanimaciones secundarias que actúan la oración — un cursor que hace la cosa, números reales que ruedan a su valor, iconos que cobran vida, física suave, personajes con personalidad, texto que actúa, iconos hero que aterrizan en su palabra (references/motion-ideas.md). - Vectorial plano limpio encima (v7) — sin marcador dibujado a mano en el look menta. Discos de iconos con glifos Phosphor blancos (
fetch.py icon,V.disc), trazos vectoriales limpios que se dibujan solos (conectores, una barra subrayada, un marco de lupa — ancho uniforme, sin hervir), objetos hero vectoriales planos con personalidad en movimiento, un resaltador menta detrás del texto real. El melocotón es solo para datos. (El look de papel heredado mantiene el rotulador rojo + notas Caveat,hf/marker.js.) - Legible, siempre. Todo dentro de la zona segura (medido), páginas reales como tiras grandes (≥ 0.85, ~45 px de texto) con un resaltador detrás de la frase hablada, sin texto semitransparente, palabras sobre su ropa legibles (v7: carbón + resplandor, menta en tamaño hero; look de papel: sobre papel sólido), chips/logos/bocetos suficientemente grandes para un teléfono. Él lo pidió explícitamente. Zonas seguras de IG (v6): nada en el 20 % inferior y nada a la derecha de x 900 por debajo de y 1200 (Me gusta/Comentar/Compartir) — los CTA van abajo a la izquierda/centro.
- El sonido apoya la voz — la regla del 30 % (v6). Sin Mickey-Mousing: 1–2 sonidos táctiles contundentes en 0:00–0:04, luego solo transiciones estructurales (punto 1/2/3, un cambio de modo, una gran captura de pantalla que se desliza, el CTA que aterriza) — ~10–14 señales en 70 s, del kit v6 bajo y cálido (
assets/sfx/v6_*: sello, golpe seco, porrazo, papel, soplido, pop), filtrado paso bajo a 5 kHz. Los agentes etiquetan esos beats"role": "hook" | "structural"enbeats.json;scenes.py edl(por defecto--sfx-policy sop) deja todo lo demás en silencio. Mezcla: voz al frente, SFX −16…−22 dB, un fondo musical de ElevenLabs (instrumental, sincronizado con el arco) −22…−26 dB bajo el habla via--music, +2.5 dB sobre los últimos 3 s. - Verifica antes de mostrar. Cada unión transcrita, cada escena con lista de verificación, el reel ensamblado escaneado rápidamente y muestreado. Si no lo publicarías, no lo presentes.
Reglas estrictas
- Tabla de beats aprobada antes de construir escenas (a menos que sea piloto automático).
- Extracción por segmento → concatenación sin pérdida para el corte (render.py), fundidos de audio de 30 ms en las uniones, nunca cortar dentro de una palabra, rellenar bordes, transcripciones solo a nivel de palabra, almacenado en caché por fuente.
- Cada corte de relleno y cada unión verificado con
verify_cuts.py— whisper termina las palabras temprano, yaudio_env.py tightencome finales de palabra suaves ("code", "immediately", "base", "use" se recortaron en la edición de referencia; "works" perdió su "s" en reel-05 mientras ASR aún leía "works"). Lee cada línea de unión Y su indicador ⚠ TAIL/HEAD energy (los cortes de relleno deliberados también se marcan — eso es esperado); extiende un final de rango hasta el tiempo sugerido cuando una palabra real se corta, vuelve a sondear hasta que esté limpio. - Nunca renderices una EDL parcial o de prueba desde
edit/. render.py escribebase.mp4ytimeline.jsonjunto a la EDL — una EDL de prueba enedit/sobrescribe la base real. Previsualiza una escena conscenes.py preview <id>; prueba cortes converify_cuts.py --probe. - Las EDL de escena vienen solo de
scenes.py edl. Toma una instantánea de cada escena, pre-roll de 12 ms y mantiene cada escena 0.1 s bajo la siguiente — sin eso, la sincronización de superposición de render.py filtra UN fotograma de metraje sin editar en cada límite de escena. Luegoscenes.py flashcheck <render> --edit-dir edit: 0 fotogramas inesperados de metraje sin editar (compara cada fotograma con base.mp4 — el techo de reel-05 era de color papel, así que la prueba de esquina antigua era ciega; las ventanas planificadas defullscreen/demovienen de slots.json y se esperan). - Un subagente por escena, todos generados en un mensaje. Revisa cada
check_sheet.jpg/motion_strip.jpgcuando lleguen; envía correcciones al mismo agente con SendMessage (mantiene el contexto). Cada escena tiene exactamente su número de fotogramas de TASK.md (slots.py lo preestablece ychecklo impone) — verifica todos los recuentos con ffprobe antes descenes.py edl; un error de 1 fotograma es un espacio o una superposición en un corte. - Fidelidad de marca a través del runtime. Las escenas usan
paper.css/paper.js+v7.css/v7.js(menta) omarker.css/marker.js(papel) según se instalaron — nunca editado, nunca reimplementado por escena (una escena con su propio motor de tarjetas o palabras se rechaza en la revisión). Solo tokens de brand.css; tipos de letra empaquetados asegurados cargados; nunca dibujar o recolorar un logo (solo reales de archivos oficiales, registrados); un acento. Nunca clonar un tipo de letra de pago — si quiere una cara comercial, él compra la licencia y coloca el archivo; hasta entonces usa la cara OFL más cercana (Bootzy TM → Inter Tight 900, el predeterminado actual). Un cambio global (tipo de letra, tamaño de tarjeta, easing) se hace UNA VEZ entemplates/runtime/, luegoscenes.py runtime+scenes.py rerender. - Descargas a través de
fetch.py, capturas a través decapture.py(ambos registran fuente + derechos);fetch.py credits→credits.mdantes de la entrega. Las páginas de terceros se muestran como comentario sobre lo que él está recomendando, enmarcadas en tarjetas de navegador, nunca presentadas como suyas. - Todos los resultados en
<project>/edit/. Nunca escribir dentro del directorio del skill. - Comprobación de espejo antes del corte: haz zoom en cualquier texto o logo en su ropa/fondo en un fotograma fijo a resolución completa (la tira de fotogramas es demasiado pequeña — el parche "SAN DIEGO" al revés de reel-06 solo se detectó en la revisión de escena y costó un recorte de cada clip del orador). Al revés →
"mirror": true. - La legibilidad es una puerta de revisión (style.md "Legibilidad"): una escena con un píxel fuera de zona, una página ilegible, texto fantasma, palabras sobre tela oscura o un chip/boceto pequeño como un teléfono vuelve a su agente.
- Confía en las marcas de tiempo, no en los informes: después de que un agente diga "re-renderizado", comprueba que
render.moves más nuevo que sus entradas (reel-06 v01 informó un re-render que nunca aterrizó).
Configuración
Misma cadena de herramientas que video-edit (detalles en install.md): ffmpeg/ffprobe con libass + zscale, uv (los scripts auxiliares se ejecutan como uv run --project <skill_dir> <skill_dir>/helpers/<name>.py …), transcripción (clave de ElevenLabs → Scribe; si no, Apple Silicon mlx via uv sync --extra mlx; si no, whisper.cpp), Node 22+ para HyperFrames (npx --yes hyperframes …), Google Chrome para capture.py. <skill_dir> es la carpeta que contiene este archivo (~/.claude/skills/adnaan-reel).
Actualización (una vez por sesión, antes de cualquier render): el skill llama a npx --yes hyperframes sin fijar, que resuelve la CLI más reciente publicada (los pines de package.json de la escena solo los usa npm run, que nunca llamamos). Confirma con npx --yes hyperframes --version vs npm view hyperframes version, y ejecuta npx --yes hyperframes skills check → npx --yes hyperframes skills update cuando cualquier skill de HyperFrames esté desactualizado (estaban 10 detrás el 2026-10-14). Anota la versión de la CLI en project.md; si un render se ve diferente del reel anterior después de un aumento, dilo.
Scripts auxiliares
| Script auxiliar | Qué hace |
|---|---|
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 | Copia tipos de letra empaquetados (grotesk default: Inter Tight + Inter + Geist Mono; editorial: Newsreader + Fraunces + Geist), escribe brand.json (paleta de casa + acento + "look"), copia references/style.md → animations/SHARED.md, ejecuta brand_kit.py build, añade --type-scale (house 0.94) y — look menta — los tokens v7 (tinta carbón, menta-suave, panel menta, melocotón, sombra de disco, viñeta fuerte) a brand.css |
fetch.py icon <name…> --edit-dir E [--weight fill] | Glifos de disco de icono v7: SVGs de Phosphor (MIT) → icons/<name>.svg, registrados open-source; listarlos en los "assets" de un slot como icons/<name>.svg, usar como V.disc({icon: name}) (nombres: phosphoricons.com) |
scenes.py words --edit-dir E | Cada segmento de corte con inicio de salida, fotograma y palabras — elige los límites de escena aquí |
scenes.py cut-speaker --edit-dir E [--only ids] | Por escena: ventana de base.mp4 → hf/assets/speaker.mp4 (silenciado; búsqueda exacta de fotograma; última escena rellenada con el fotograma congelado final) + speaker_cut.webm (su máscara) para escenas talk_depth / cutout + copia los "assets" de la escena; --only después de una corrección de corte a mitad de construcción |
scenes.py edl --edit-dir E [--beat-gain-offset -3] | edl.json + animations/slots.json + renders → edl_scenes.json (instantánea de fotograma, pre-roll, esperas de 0.1 s, sin subtítulos) + beats.json de cada escena → señales audio[] temporizadas del kit de ElevenLabs |
scenes.py preview <id> --edit-dir E | Una escena con su voz → verify/<id>_preview.mp4 (seguro: nunca toca base) |
scenes.py flashcheck <video> --edit-dir E [--allow] | Fotogramas que coinciden con base.mp4 (= metraje sin editar visible) fuera de las ventanas planificadas talk/talk_depth/chain/card/fullscreen/demo (debe ser 0); sin --edit-dir una prueba de color de esquina que tolera la viñeta propia de una escena |
scenes.py runtime --edit-dir E / scenes.py rerender --edit-dir E [--jobs 4] [--only ids] | Reinstala el runtime compartido en cada escena / vuelve a renderizar todas las escenas en paralelo y verifica los recuentos de fotogramas — un reestilo completo del reel (nuevo tipo de letra, tamaño de tarjeta, easing) en minutos |
capture.py <url> --edit-dir E --name n --rea | … |
[truncado para traducción]