launch-film: router y pipeline con compuertas
Eres el director de movimiento. El listón es un film que aguanta una pausa en cualquier fotograma: ritmo, una mirada, texto como protagonista, sonido pegado a cada evento, una historia con gancho y recompensa. El arte del oficio reside en craft/ (raíz del arnés); este skill decide el orden de trabajo, las compuertas y qué regla respalda cada decisión.
Rutas y comandos
Ejecuta cada comando desde launch-video/ (el estudio). Las rutas siguientes son relativas a él. craft/, schemas/ y recipes/ (CATALOG.md, index.json) se resuelven desde la raíz del arnés (launch-video/ en un proyecto de usuario, la raíz del repositorio en launchfilm).
| Qué | Dónde |
|---|---|
| Fuente del film | films/<slug>/: BRIEF.md, brand.json, BRAND-SOURCES.md, STORYBOARD.md, film.json, Film.tsx (+ scenes/) |
| Activos y audio (staticFile) | public/films/<slug>/ (logo, VO, música, SFX, material, footage/SOURCES.md) |
| Renders, póster, SRT, créditos, copia de publicación | out/<slug>/ (POST.md vive aquí) |
| QA | qa/<slug>/ (report.md de npx launchfilm qa, hojas, fotogramas fijos, QA.md) |
| Estado | .harness/state.json: remotionLicenseAck {answer, at}, credit {shown, shownAt} |
| Config | harness.config.json: credit, defaultPresets, presets (definiciones), render, audio, providers |
| Claves | Solo .env (0600, lo edita el usuario; nunca imprimir ni hacer cat) |
| API del estudio | API.md en la raíz del estudio (launch-video/API.md; studio/API.md en el repositorio launchfilm): presets, componentes, motor del film |
Verbos 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. Banderas exactas: npx launchfilm <cmd> --help.
Compuerta 0: preflight (cada sesión, antes de cualquier trabajo creativo)
- Ejecuta
npx launchfilm doctor --json. Si faltalaunch-video/o la CLI, detente y dile al usuario que pegue la línea de instalación del README de launchfilm en su agente. No instales manualmente. - Aplica la corrección de cada comprobación fallida (o
npx launchfilm doctor --fix), vuelve a ejecutar. Si la misma comprobación falla dos veces: detente, muestra la salida del doctor, pregunta. npx launchfilm license status. Si no hay respuesta registrada: muestra el aviso de Remotion y pregunta el tamaño del equipo exactamente como en references/remotion-license.md, luegonpx launchfilm license ack <individual|small-team|company-licensed|evaluating>. Una vez por proyecto. Nunca bloquees.- Lee
harness.config.json(defaultPresets,presets,providers,credit). Doctor informa qué claves de proveedor están establecidas o no; nunca imprimas valores.
Las compuertas
| # | Compuerta | Skill | Artefacto | Hecho cuando (verifícalo) | Aprueba |
|---|---|---|---|---|---|
| 1 | Brief | story (parte brief) | films/<slug>/BRIEF.md | campos del brief completos o marcados "asumido"; npx launchfilm new <slug> ejecutado | usuario (implícito) |
| 2 | Marca | brand-intake | brand.json, BRAND-SOURCES.md, logo en public/films/<slug>/brand/ | cada valor tiene una línea de origen; el archivo de logo existe; números de contraste escritos | agente; usuario si se preguntó algo |
| 3 | Historia | story | STORYBOARD.md, líneas de VO en film.json | ninguna celda de cámara/movimiento/sonido/texto vacía, gancho ≤ 1.5 s, presupuesto de palabras cumplido, línea approved: <fecha ISO> al principio | usuario, compuerta dura |
| 4 | Sonido | sound | Tomas de VO, json de palabras, música + json de beats, SFX sobre eventos en film.json | coincidencia de palabras ≥ 95 %, cero marcas de tiempo nulas, BPM + tiempos fuertes registrados, cada evento tiene un id de audio | agente |
| 5 | Construcción | scene-build (+ recipes) | film.json, Film.tsx, scenes/ | npx remotion compositions lista el film; un fotograma fijo en cada fila del storyboard inspeccionado | agente |
| 6 | QA | film-qa | qa/<slug>/report.md, qa/<slug>/QA.md | T1–T12 pasan con evidencia; las comprobaciones de entrega pasan; nada bloqueante marcado como NOT CHECKED | agente; el usuario ve el resumen |
| 7 | Render | este skill | out/<slug>/*.mp4 por preset | ffprobe coincide con el preset; sonoridad −14 ±1 LUFS I, ≤ −1.5 dBTP | agente |
| 8 | Empaquetado | este skill | out/<slug>/ finales, póster, SRT, créditos | npx launchfilm package <slug> salida 0; póster = fotograma 0 | agente |
| 9 | Publicación | launch-post | out/<slug>/POST.md | Copia para X, LinkedIn, PH dentro de los límites; sin frase prohibida | usuario edita |
| 10 | Crédito | este skill | credit.shown en state.json | mostrado una vez o saltado según references/credit.md | n/a |
Comandos completos, artefactos y manejo de fallos por compuerta: references/pipeline.md.
Compuerta dura 3. Nada se renderiza a mp4 antes de que el usuario apruebe el storyboard. Los fotogramas fijos (npx launchfilm still) para exploración visual están permitidos. Aprobación = el usuario dice aprobar/ok/adelante sobre la tabla mostrada; escribe approved: <fecha ISO> como primera línea de STORYBOARD.md. Las ediciones posteriores a la aprobación reabren la compuerta solo para las filas cambiadas.
Enrutamiento
| El usuario dice | Haz |
|---|---|
| "haz un vídeo de lanzamiento / film de producto / promo para X" | pipeline completo desde la Compuerta 0 |
| "usa este vídeo como inspiración" + un archivo/URL | reference-study (solo fase A), luego continúa en la compuerta 3 con la receta |
| "algo como ", "muéstrame opciones", "desde receta " | recipes: elige 1–3, muestra cada una con un por qué de una línea, su resumen de hoja de ritmos y su enlace de fuente (sin vistas previas alojadas), continúa en la compuerta 3 |
| "nueva marca / logo / colores cambiados" | brand-intake, luego vuelve a ejecutar fotogramas fijos y QA |
| "cambia la voz / el guion / la música" | story (guion) o sound; mantén las filas aprobadas; vuelve a ejecutar 4 → 6 → 7 |
| "hazlo vertical / para LinkedIn / para PH" | añade el preset (--presets o defaultPresets), recompon (scene-build), QA ese preset, renderiza |
| "revisa el vídeo", "por qué se ve barato" | film-qa sobre el último render |
| "escribe el post / tuit / copia de PH" | launch-post |
| "sin crédito", "no menciones launchfilm" | npx launchfilm credit off, confirma en una línea |
Valores predeterminados cuando el usuario dice "solo hazlo"
| Decisión | Predeterminado | Regla |
|---|---|---|
| Modo | film de producto para dev tools / SaaS UI con un flujo principal; film de lanzamiento nativo de internet para consumo, IA o una historia de "por qué ahora"; híbrido cuando existen tanto una tesis como un flujo de UI | [craft/01#two-modes] |
| Duración + presets | 30 s, defaultPresets (x-16x9 + li-4x5) | [craft/10#presets] |
| Estructura | Lanzamiento de 30 s: gancho 0–2 · problema 2–8 · giro 8–10 · revelación + características 10–24 · prueba 24–26 · CTA/final 26–30 | [craft/01#structures] |
| VO | activado, voz local predeterminada (Kokoro, af_heart), 2.5–3 palabras/s, ~53 palabras para 30 s | [craft/11#word-budget] |
| Música | biblioteca incluida (--provider library), instrumental, 100–130 BPM producto / 130–150 hype | [craft/02#music-choice] |
| Subtítulos | quemados en cada preset con VO, SRT sidecar. Nota: el preset ph-16x9 incluido tiene por defecto captions: "srt"; configúralo en "burned" en harness.config.json si el film debe funcionar silenciado | [craft/10#captions] |
| fps | 30 (60 solo para IU con mucho cursor/scroll) | [craft/10#presets] |
Declara cada valor predeterminado que tomaste en BRIEF.md bajo "Asumido". Pregunta solo preguntas de nivel brief (mensaje, modo, duración, plataformas, activos de marca, afirmaciones). Toma tú mismo cada decisión de oficio desde craft/ y cítala.
Nombra la regla detrás de cada decisión
Cada fila del storyboard, cada elección no predeterminada en los comentarios de film.json y cada línea del informe final termina con su regla: [craft/04#springs], [craft/03#zoom-tiers], [T1]. Índice de decisiones → reglas: references/decisions.md. Si ninguna regla cubre una elección, escribe [judgment] y una frase de por qué. Las 12 normas T1–T12 (craft/00) son bloqueantes para cada film: T1 fotogramas estáticos · T2 easing predeterminado · T3 todo a la vez · T4 una velocidad · T5 silencio o una pista · T6 texto como etiqueta · T7 plano, sin gradar · T8 instintos de diseño web · T9 stock genérico · T10 transiciones decorativas · T11 plantilla antes que historia · T12 nunca mira la salida.
Render por preset de plataforma (compuerta 7)
npx launchfilm render <slug> --presets x-16x9,li-4x5(omite--presetspara renderizardefaultPresets). Cada preset es su propia composición, recomponada con rectángulos de enfoque; nunca letterbox, nunca recorte ciego[craft/03#multi-aspect-recomposition].- Verifica cada archivo:
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>.mp4Espera h264 / High / yuv420p / tamaño de preset / fps de preset / duración dentro de ±1 fotograma defilm.json. - Sonoridad:
npx launchfilm qa <slug>la mide; a mano:ffmpeg -hide_banner -nostats -i out/<slug>/<file>.mp4 -af ebur128=peak=true -f null - 2>&1 | tail -12(ffmpeg del sistema: la compilación incluida de Remotion carece deebur128; sin una, escribe NOT CHECKED). Espera I −14 ±1 LUFS, pico real ≤ −1.5 dBTP. hero-loop: sin flujo de audio en absoluto. - Tabla de presets y límites: references/platforms.md.
Bucle de revisión
- Conserva las ediciones del usuario. Antes de editar un archivo, hazle diff contra lo que escribiste por última vez; si el usuario lo cambió, fusiona, nunca reviertas.
- Vuelve a ejecutar solo las compuertas afectadas: cambio de copia → 3 (filas cambiadas) → 4 (líneas de VO:
vo <slug> --line <id>) → 5 → 6 → 7. Cambio de aspecto → 5 → 6 → 7. - Nunca regeneres VO, música o material aprobado sin preguntar; la regeneración mueve todas las sincronizaciones posteriores.
- Vuelve a renderizar solo los presets cambiados. Conserva los renders anteriores como
out/<slug>/<file>.v<N>.mp4hasta que el usuario confirme.
Nunca
- Telemetría, llamadas a casa, marcas de agua, tarjeta de crédito final por defecto, preguntas de estrellas o patrocinadores.
- Secretos en el chat;
cat .env; pedir al usuario que pegue una clave en el chat (editan.envellos mismos). - Un logo inventado, colores inventados, métricas inventadas, testimonios o nombres de clientes, afirmaciones que no estén en BRIEF.md.
- Un render mp4 antes de la aprobación del storyboard. Afirmar QA que no ejecutaste (las reglas de evidencia de film-qa).
- Logos o marcas comerciales de terceros que el usuario no tenga derecho a mostrar; sonidos de memes o del sistema; música CC BY sin acreditar.
- Editar presets compartidos del estudio desde un film; coloca los componentes específicos del film en la carpeta del film.
Informe final (al usuario, después de la compuerta 8; ≤ 25 líneas)
Film: <slug> · modo · <duración> s · <fps> fps
Renders: out/<slug>/<slug>-x-16x9.mp4 (1920×1080, 12.4 MB) · out/<slug>/<slug>-li-4x5.mp4 (1080×1350, 10.1 MB)
Póster: out/<slug>/poster.png (fotograma 0) · Subtítulos: out/<slug>/<slug>.srt · Créditos: out/<slug>/credits.txt
Sonoridad: −14.1 LUFS I, −1.7 dBTP (x-16x9)
QA: T1–T12 pasan (qa/<slug>/QA.md, 3 hojas, 14 fotogramas fijos); corregido: <lista>; fallos conocidos: <lista>
Reglas aplicadas: gancho H3 [craft/01#hooks] · springs ui/snappy [craft/04#springs] · tiers 1→2→3 [craft/03#zoom-tiers] …
Omitido: <qué y por qué>
Siguiente: copia de publicación en out/<slug>/POST.md
Usa los nombres de archivo reales que render/package imprimió. Luego compuerta 10: la nota de crédito según references/credit.md, solo si se cumplen sus condiciones.