film-qa
Revisa fotogramas y números, no intenciones. Un PASS necesita evidencia: una ruta de archivo que hayas abierto o un número que hayas medido.
Cualquier otra cosa es NOT CHECKED: <razón>. Nunca escribas PASS para algo que no miraste o mediste.
Rutas (relativas a launch-video/, o studio/ en el repositorio launchfilm): fuente del film films/<slug>/ (film.json,
STORYBOARD.md, BRIEF.md), renders out/<slug>/, QA qa/<slug>/ (la CLI escribe report.md; tú escribes QA.md al lado).
Flags exactos de la CLI: npx launchfilm <cmd> --help. Comandos con sintaxis probada: references/commands.md.
Procedimiento
- Pase automático.
npx launchfilm qa <slug>→ lee primeroqa/<slug>/report.md(hojas, ffprobe, volumen, comprobaciones automáticas). Copia sus números medidos en QA.md como evidencia; no vuelvas a medir lo que ya midió. - Hojas. Abre cada hoja de contactos que el reporte liste (o
npx launchfilm sheet <slug>). Lee cada celda. Lista los archivos que abriste en QA.md (evidencia T12). - Fotogramas fijos.
npx launchfilm still <slug> <t> --preset <id>para cada preset que el film distribuya, en: cada límite de plano- 6 fr, cada inicio de texto + hold/2, fotograma 0, el último fotograma, y cada intervalo que el escaneo de congelados o fotogramas negros marque.
Además, un fotograma fijo a
--scale 0.25(480×270 para 16:9) en el fotograma del texto principal: la vista previa de la línea de tiempo X. Lee cada PNG.
- 6 fr, cada inicio de texto + hold/2, fotograma 0, el último fotograma, y cada intervalo que el escaneo de congelados o fotogramas negros marque.
Además, un fotograma fijo a
- Mide lo que el reporte no midió: volumen, pico verdadero, fotogramas negros, intervalos congelados, tiempos de corte vs compás, contraste detrás del texto, zonas seguras, longitudes de líneas de subtítulos. Comandos en references/commands.md.
- Comprobaciones de bloqueo T1–T12 a continuación, luego comprobaciones de entrega D1–D16. Cada una recibe PASS / FAIL / NOT CHECKED + evidencia + regla.
- Escribe
qa/<slug>/QA.mda partir de references/qa-template.md. - Bucle de corrección. Cualquier FAIL: entrega el hallazgo a scene-build o sound con números de fotograma, re-renderiza solo el rango afectado
(
npx remotion render … --frames=<a>-<b>o el equivalente de la CLI), vuelve a verificar esos elementos. Máximo 2 bucles; luego reporta los FAILs restantes al usuario con los fotogramas fijos adjuntos. Nunca degrades un FAIL a PASS sin nueva evidencia.
Comprobaciones de bloqueo: los 12 indicadores (craft/00)
| Id | Condición de aprobación | Evidencia |
|---|---|---|
| T1 estático | ningún intervalo congelado ≥ 0.6 s excepto el asentamiento del plano final (≤ 3 s); cada intervalo marcado verificado por fotogramas fijos al inicio y al final que muestren deriva o movimiento | salida de freezedetect + 2 fotogramas fijos por intervalo |
| T2 easeo predeterminado | grep G1 (scene-build) vacío en films/<slug>; sin transiciones CSS | salida de grep |
| T3 todo de golpe | cada grupo de ≥ 3 hermanos entra escalonado (estados parciales visibles en una celda de hoja o escalonamiento ≥ 1 fr en código); entrada del grupo ≤ 24 fr | referencias a celdas de hoja o líneas de código |
| T4 una velocidad | film > 20 s tiene ≥ 1 ruptura de ritmo (silencio, corte brusco a negro, cambio de paleta, hold ≥ 2× mediana del plano); modo lanzamiento: cada corte dentro de ±2 fr del compás | límites en film.json vs beats.json; cortes detectados |
| T5 sonido | cada evento visual en film.json tiene un sfx o está cubierto por VO/música; la música baja con la VO; silencio real donde se planeó | recuento de eventos con/sin sonido; volumen de una ventana de VO vs una ventana solo de música |
| T6 texto como etiqueta | texto principal ≥ 8 % de la altura del fotograma cuando el texto es el mensaje (afirmaciones 10 %); cada texto se mantiene ≥ 0.2 × (palabras + 1) s; ≤ 3 líneas; subtítulos ≤ 2 líneas | tabla por elemento |
| T7 aspecto plano | modo lanzamiento: grano + viñeta presente; un tratamiento nombrado por sección; modo producto: líneas finas, sombras suaves; sin bandas en el degradado más oscuro del mp4 estático | grep + fotograma fijo del mp4 |
| T8 diseño web | un punto focal por fotograma fijo; ningún párrafo > 3 líneas; sin viñetas; croma de UI solo donde el croma es el punto | fotogramas fijos |
| T9 stock genérico | cada clip de footage en films/<slug>/footage/SOURCES.md con fuente + licencia; clips de stock graduados y cortados ≤ 1.5 s | SOURCES.md + fotogramas fijos |
| T10 transiciones decorativas | transiciones ⊂ vocabulario; transiciones no de corte ≤ 1 cada 5 s; blur-dissolve ≤ 12 fr | film.json |
| T11 plantilla antes que historia | STORYBOARD.md tiene approved:; fotograma 0 no es negro y difiere del fotograma fijo en 0.5 s; categoría de producto clara a los 1.5 s (x, li) / 1 s (reel); recompensa después del problema; ≥ 2 s de calma en la superficie de la marca al final | fotogramas fijos 0, 0.5, 1.5 s, últimos 2 s |
| T12 nunca miraste | este QA: cada hoja y fotograma fijo listado como abierto | lista de archivos en QA.md |
| Cualquier FAIL en T1–T12 bloquea el render-para-entrega y el empaquetado. |
Comprobaciones de entrega (por preset; numeración = craft/08#delivery-checks)
Valores de harness.config.json presets, si no de craft/10#presets. Usa estos ids exactamente; craft/08 y QA.md los comparten.
| Id | Condición de aprobación |
|---|---|
| D1 | video h264, perfil High (ffprobe de Remotion imprime 100), pix_fmt yuv420p, contenedor mp4 |
| D2 | ancho × alto exactamente el del preset |
| D3 | fps constante = fps de la composición (r_frame_rate = avg_frame_rate) |
| D4 | duración = film.json ±1 fr, y dentro del rango de longitud del preset (x-16x9 ≤ 140 s, reel-9x16 ≤ 90 s) |
| D5 | audio aac LC (ffprobe de Remotion imprime 1), 48000 Hz, 2 canales, ~192 kbps; hero-loop: sin flujo de audio |
| D6 | volumen integrado −14 ±1 LUFS; pico verdadero ≤ −1.5 dBTP; VO −16…−14 LUFS donde sea medible |
| D7 | moov antes de mdat (inicio rápido) |
| D8 | póster = fotograma 0 de ese preset existe, mismo tamaño, no negro (YAVG > 20), muestra el gancho |
| D9 | SRT junto al render para cada preset con VO; mismas frases que los subtítulos; HH:MM:SS,mmm; ≤ 2 líneas; ≥ 0.8 s cada una; tiempos ±2 fr |
| D10 | nada importante (subtítulos, texto, logotipo, la UI en uso) fuera de la zona segura del preset (fotograma fijo superpuesto) |
| D11 | subtítulos quemados en cada preset con VO (hero-loop: ninguno, ph-16x9 según su configuración); ≤ 2 líneas; ≤ 42 caracteres/línea (16:9), ≤ 32 (4:5, 1:1, 9:16); nunca sobre el elemento cambiante; contraste ≥ 4.5:1 para subtítulos y texto sobre footage, ≥ 3:1 acento sobre fondo; legible en los fotogramas fijos de 480 px (16:9) y 360 px (4:5, 9:16) de ancho |
| D12 | las listas de congelados y negros coinciden solo con los holds diseñados y los beats negros (listados en film.json o STORYBOARD) |
| D13 | etiquetas BT.709 o HD sin etiquetar; el degradado más oscuro no muestra nuevas bandas en el fotograma fijo mp4 vs el PNG |
| D14 | tamaño de archivo por debajo del límite: x ≤ 512 MB, README héroe ≤ 10 MB |
| D15 | out/<slug>/credits.txt lista cada activo CC BY con su línea de crédito; films/<slug>/footage/SOURCES.md completo |
| D16 | solo hero-loop: fotograma N es igual al fotograma 0; un archivo en bucle 3× no muestra ningún salto en las uniones |
Legibilidad del texto en el tiempo
Para cada elemento de texto en film.json (afirmaciones, subtítulos, etiquetas, texto de UI al que apunta la VO): palabras, fotogramas in/out, hold = (out − in) / fps, requerido = 0.2 × (palabras + 1) s. También verifica en el fotograma fijo de 480×270 que la línea principal siga siendo legible (letras distinguibles). Una fila por elemento en QA.md.
Reglas para el informe
- Cada PASS cita evidencia:
qa/<slug>/stills/x-16x9-12.30.png,I = −14.2 LUFS,grep G1: 0 líneas. - Los números medidos mantienen las unidades y la herramienta que los produjo (
system ffmpeg 8.1 ebur128oremotion ffmpeg loudnorm). El ffmpeg incluido en Remotion carece deebur128,signalstats,freezedetect,tile,drawboxy salida rawvideo: usa un ffmpeg del sistema para esos y dilo; si no existe, esos elementos son NOT CHECKED. - Un FAIL nombra el rango de fotogramas, la regla (
craft/NN#anchoroT#/D#) y la corrección propuesta. - El bloque de resumen dice READY solo cuando T1–T12 y D1–D16 son todos PASS (D16 solo para hero-loop) (NOT CHECKED cuenta como no listo, con razón).