film-qa
Você verifica quadros e números, não intenções. Um PASS precisa de evidência: um caminho de arquivo que você abriu ou um número que você mediu.
Qualquer outra coisa é NOT CHECKED: <motivo>. Nunca escreva PASS para algo que você não olhou ou mediu.
Caminhos (relativos a launch-video/, ou studio/ no repositório launchfilm): fonte do filme films/<slug>/ (film.json,
STORYBOARD.md, BRIEF.md), renders out/<slug>/, QA qa/<slug>/ (o CLI escreve report.md; você escreve QA.md ao lado dele).
Flags exatas do CLI: npx launchfilm <cmd> --help. Comandos com sintaxe testada: references/commands.md.
Procedimento
- Passagem automática.
npx launchfilm qa <slug>→ leiaqa/<slug>/report.mdprimeiro (folhas, ffprobe, loudness, verificações automáticas). Copie seus números medidos para QA.md como evidência; não remeça o que ele mediu. - Folhas. Abra cada folha de contato que o relatório lista (ou
npx launchfilm sheet <slug>). Leia cada célula. Liste os arquivos que você abriu em QA.md (evidência T12). - Stills.
npx launchfilm still <slug> <t> --preset <id>para cada preset que o filme entrega, em: cada limite de cena- 6 fr, cada início de texto + hold/2, quadro 0, o último quadro, e cada intervalo que a varredura de congelamento ou quadro preto sinaliza.
Mais um still em
--scale 0.25(480×270 para 16:9) no quadro do texto herói: a prévia da timeline X. Leia cada PNG.
- 6 fr, cada início de texto + hold/2, quadro 0, o último quadro, e cada intervalo que a varredura de congelamento ou quadro preto sinaliza.
Mais um still em
- Meça o que o relatório não mediu: loudness, pico verdadeiro, quadros pretos, intervalos congelados, tempos de corte vs batidas, contraste atrás do texto, zonas seguras, comprimentos de linhas de legenda. Comandos em references/commands.md.
- Verificações bloqueantes T1–T12 abaixo, depois verificações de entrega D1–D16. Cada uma recebe PASS / FAIL / NOT CHECKED + evidência + regra.
- Escreva
qa/<slug>/QA.mda partir de references/qa-template.md. - Loop de correção. Qualquer FAIL: passe a constatação para scene-build ou sound com números de quadros, re-renderize apenas o intervalo afetado
(
npx remotion render … --frames=<a>-<b>ou o equivalente no CLI), re-verifique esses itens. Máximo 2 loops; então reporte os FAILs restantes ao usuário com stills anexados. Nunca rebaixe um FAIL para PASS sem nova evidência.
Verificações bloqueantes: os 12 sinais (craft/00)
| Id | Condição de aprovação | Evidência |
|---|---|---|
| T1 estático | nenhum intervalo congelado ≥ 0,6 s exceto o settle do cartão final (≤ 3 s); cada intervalo sinalizado verificado por stills no seu início e fim mostrando deriva ou movimento | saída freezedetect + 2 stills por intervalo |
| T2 easing padrão | grep G1 (scene-build) vazio em films/<slug>; sem transições CSS | saída grep |
| T3 tudo de uma vez | cada grupo de ≥ 3 irmãos entra escalonado (estados parciais visíveis em uma célula da folha ou escalonamento ≥ 1 fr no código); entrada do grupo ≤ 24 fr | referências de células da folha ou linhas de código |
| T4 uma velocidade | filme > 20 s tem ≥ 1 quebra de ritmo (silêncio, corte brusco para preto, inversão de paleta, hold ≥ 2× a mediana dos planos); modo launch: cada corte dentro de ±2 fr de uma batida | limites film.json vs beats.json; cortes detectados |
| T5 som | cada evento visual em film.json tem um sfx ou é coberto por VO/música; música abaixa sob VO; silêncio real onde planejado | contagem de eventos com/sem som; loudness de uma janela de VO vs uma janela só de música |
| T6 texto como rótulo | texto herói ≥ 8 % da altura do quadro quando o texto é a mensagem (declarações 10 %); cada texto segura ≥ 0,2 × (palavras + 1) s; ≤ 3 linhas; legendas ≤ 2 linhas | tabela por item |
| T7 aparência plana | modo launch: granulação + vinheta presentes; um tratamento nomeado por seção; modo produto: hairlines, sombras suaves; sem banding no gradiente mais escuro do still mp4 | grep + still do mp4 |
| T8 layout web | um ponto focal por still; nenhum parágrafo > 3 linhas; sem bullets; chrome da UI apenas onde o chrome é o ponto | stills |
| T9 stock genérico | cada clipe de footage em films/<slug>/footage/SOURCES.md com fonte + licença; clipes stock graduados e cortados ≤ 1,5 s | SOURCES.md + stills |
| T10 transições decorativas | transições ⊂ vocabulário; transições não-corte ≤ 1 a cada 5 s; blur-dissolve ≤ 12 fr | film.json |
| T11 template antes da história | STORYBOARD.md tem approved:; quadro 0 não preto e difere do still em 0,5 s; categoria do produto clara até 1,5 s (x, li) / 1 s (reel); payoff após o problema; ≥ 2 s de calma na superfície da marca no final | stills 0, 0,5, 1,5 s, últimos 2 s |
| T12 nunca olhou | este QA: cada folha e still listados como abertos | lista de arquivos em QA.md |
| Qualquer FAIL em T1–T12 bloqueia render-para-entrega e pacote. |
Verificações de entrega (por preset; numeração = craft/08#delivery-checks)
Valores de harness.config.json presets, senão craft/10#presets. Use estes ids exatamente; craft/08 e QA.md os compartilham.
| Id | Condição de aprovação |
|---|---|
| D1 | vídeo h264, perfil High (ffprobe do Remotion imprime 100), pix_fmt yuv420p, contêiner mp4 |
| D2 | largura × altura exatamente do preset |
| D3 | fps constante = fps da composição (r_frame_rate = avg_frame_rate) |
| D4 | duração = film.json ±1 fr, e dentro da faixa de duração do preset (x-16x9 ≤ 140 s, reel-9x16 ≤ 90 s) |
| D5 | áudio aac LC (ffprobe do Remotion imprime 1), 48000 Hz, 2 canais, ~192 kbps; hero-loop: sem stream de áudio |
| D6 | loudness integrada −14 ±1 LUFS; pico verdadeiro ≤ −1,5 dBTP; VO −16…−14 LUFS onde mensurável |
| D7 | moov antes de mdat (faststart) |
| D8 | poster = quadro 0 daquele preset existe, mesmo tamanho, não preto (YAVG > 20), mostra o gancho |
| D9 | SRT ao lado do render para cada preset com VO; mesmas frases que as legendas; HH:MM:SS,mmm; ≤ 2 linhas; ≥ 0,8 s cada; tempos ±2 fr |
| D10 | nada importante (legendas, texto, logotipo, a UI em uso) fora da zona segura do preset (still overlay) |
| D11 | legendas queimadas em cada preset com VO (hero-loop: nenhuma, ph-16x9 conforme sua config); ≤ 2 linhas; ≤ 42 caracteres/linha (16:9), ≤ 32 (4:5, 1:1, 9:16); nunca sobre o elemento em mudança; contraste ≥ 4,5:1 para legendas e texto sobre footage, ≥ 3:1 acento sobre bg; legível nos stills de 480 px (16:9) e 360 px (4:5, 9:16) de largura |
| D12 | listas de congelamento e preto correspondem apenas aos holds e beats pretos projetados (listados em film.json ou STORYBOARD) |
| D13 | tags BT.709 ou HD sem tag; o gradiente mais escuro não mostra novo banding no still mp4 vs o PNG |
| D14 | tamanho do arquivo abaixo do limite: x ≤ 512 MB, herói do README ≤ 10 MB |
| D15 | out/<slug>/credits.txt lista cada ativo CC BY com sua linha de crédito; films/<slug>/footage/SOURCES.md completo |
| D16 | hero-loop apenas: quadro N é igual ao quadro 0; um arquivo em loop 3× não mostra salto nas emendas |
Legibilidade do texto no tempo
Para cada item de texto em film.json (declarações, legendas, rótulos, cópia da UI que o VO aponta): palavras, quadros in/out, hold = (out − in) / fps, requerido = 0,2 × (palavras + 1) s. Verifique também no still 480×270 que a linha herói ainda está legível (letras distinguíveis). Uma linha por item em QA.md.
Regras para o relatório
- Cada PASS cita evidência:
qa/<slug>/stills/x-16x9-12.30.png,I = −14,2 LUFS,grep G1: 0 linhas. - Números medidos mantêm unidades e a ferramenta que os produziu (
system ffmpeg 8.1 ebur128ouremotion ffmpeg loudnorm). O ffmpeg empacotado do Remotion não temebur128,signalstats,freezedetect,tile,drawboxe saída rawvideo: use um ffmpeg do sistema para esses e diga isso; se não existir, esses itens ficam como NOT CHECKED. - Um FAIL nomeia o intervalo de quadros, a regra (
craft/NN#anchorouT#/D#) e a correção proposta. - O bloco de resumo diz READY apenas quando T1–T12 e D1–D16 são todos PASS (D16 apenas para hero-loop) (NOT CHECKED conta como não pronto, com motivo).