The video factory with agents|INEMA.CLUB-PRO

Lesson 5 · 18 min

Shorts with a quality gate: hook, 9:16 cut and QA

A short that loses its first three seconds doesn't get a second chance. MakeShorts puts two gates in the way: one on the script, which measures the hook before you record, and one on the video, which measures format, sound and frozen screen before you publish. In this lesson you fail and pass both, using dry-run files.

Start the lesson
A phone locked in vertical on a desk stand showing a blurred frame, next to a monitor with a timeline of short clips.

In this lesson you will

  1. 1The three layers of the hook: phrase, scene, and text on frame zero
  2. 2The script gate: short hook, banned opening, keyword up front
  3. 3The video gate: 1080×1920, 30 fps, h264/aac, −14 LUFS, no black screen
  4. 4cardshorts: a narrated card short, five styles

Goal: write a hook that passes the script gate, and fail or approve a 9:16 video with the makeshorts QA.

01The two gates of a short

Click each step.

Click each block in the diagram to see what it does.

makeshorts at commit 52eb799, QA contract 1.2.1.

02The hook in three layers

Write all three before you record, and check that each one holds up on its own.

1. Phrase

What you say in the first two seconds. Get straight to it, with minimal context: no introduction.

Example"Your video dies in the first three seconds."

03The script gate

Two scripts from the kit: one that passes and one that fails. The keyword is "gancho".

File · kit/exemplos/a5-roteiros/fraco.md
# Roteiro fraco
### FALA
Olá pessoal, hoje eu vou mostrar para vocês uma coisa muito interessante sobre como fazer vídeos curtos que prendem a atenção das pessoas. O gancho tem três camadas: a frase, a cena e o texto. Fica até o fim que no final eu conto o segredo.
Terminal · check the scripts
K=~/projetos/formacao-cinema-ia-fabrica-v72/kit
cd ${TMPDIR:-/tmp}/ensaio-fabrica/a5; Q=makeshorts/.claude/skills/makeshorts/scripts
python3 $Q/qa_roteiro.py "$K/exemplos/a5-roteiros/bom.md" --keyword gancho > bom.txt; echo "bom: $?"
python3 $Q/qa_roteiro.py "$K/exemplos/a5-roteiros/fraco.md" --keyword gancho > fraco.txt; echo "fraco: $?"
grep -hE "❌|RESULTADO" bom.txt fraco.txt
Example from the repository
bom: 0
fraco: 1
RESULTADO: APROVADO (falta: teste da lacuna, tese, fontes — revisão humana)
  ❌ gancho (palavras)        23 palavras: “Olá pessoal, hoje eu vou mostrar para vocês uma coisa muito interessante sobre c” (máx. 9)
  ❌ abertura proibida        começa com “ola”
  ❌ palavra-chave no início  “gancho” fora das primeiras 15 palavras (≈ 5 s)
RESULTADO: REPROVADO

The APROVADO on the script flags what the machine doesn't measure: whether the hook opens a gap, whether the thesis takes a side, whether the facts have sources. That part is up to you.

04The video gate

The block clones makeshorts at a fixed commit, makes a 20 s dry-run video at 1080×1920 with normalized sound, and runs the QA on the promo profile.

Terminal · QA of a dry-run short
E=${TMPDIR:-/tmp}/ensaio-fabrica/a5; rm -rf "$E"; mkdir -p "$E"; cd "$E"
git clone -q https://github.com/inematds/makeshorts.git && git -C makeshorts checkout -q 52eb799
Q=makeshorts/.claude/skills/makeshorts/scripts
ffmpeg -v error -f lavfi -i "testsrc2=s=1080x1920:r=30:d=20" -f lavfi -i "sine=f=220:d=20" \
  -af loudnorm=I=-14:TP=-2:LRA=7 -ar 48000 -c:v libx264 -pix_fmt yuv420p -c:a aac -shortest ensaio-916.mp4
python3 $Q/qa_short.py ensaio-916.mp4 --profile divulgacao > qa.txt; echo "saída: $?"
grep -E "^(✅|⚠️|❌)|RESULTADO" qa.txt
Terminal · the same QA on a 16:9 video
cd ${TMPDIR:-/tmp}/ensaio-fabrica/a5; Q=makeshorts/.claude/skills/makeshorts/scripts
ffmpeg -v error -y -f lavfi -i "testsrc2=s=1920x1080:r=30:d=20" -f lavfi -i "sine=f=220:d=20" \
  -af loudnorm=I=-14:TP=-2:LRA=7 -ar 48000 -c:v libx264 -pix_fmt yuv420p -c:a aac -shortest ensaio-169.mp4
python3 $Q/qa_short.py ensaio-169.mp4 --profile divulgacao > qa169.txt; echo "saída: $?"
grep -E "^❌|RESULTADO" qa169.txt
Example from the repository
saída: 0
✅ duração                  20.0s
✅ formato                  1080x1920
✅ fps                      30.00
✅ codec vídeo              h264
✅ codec áudio              aac
✅ loudness                 -13.9 LUFS
✅ sem tela preta inicial   imagem desde o frame 0
✅ frame 0 (informação)     0.063 de bordas
⚠️  trechos parados          1 acima de 4 s: 0.0–20.0s — justificar ou quebrar
⚠️  legendas                 não verificadas (passe --srt ou --words); reel sem legenda conferida não vai pro Nei
RESULTADO: APROVADO (falta a revisão humana: gancho, prova, pronúncia)

The numbers (−13.9 LUFS, 0.063 of edges) are from this machine, ffmpeg 6.1.1; on yours they may vary a little. What matters is the RESULTADO line. The captions warning refers to Nei's flow: in yours, pass --srt.

05The contract's three profiles

Duration in seconds and spoken words, from references/reel-profiles.json (contract 1.2.1).

1. divulgacao

Minimum 15 s, ideal 20 to 50 s, maximum 59 s. Speech of 60 to 125 words.

06The second engine: cardshorts

roteiro.yaml becomes a narrated 9:16 card short. MIT license. To render, it needs a local voice and image (inemavox and an image server with a GPU); here you only list the styles.

Terminal · cardshorts styles
cd ${TMPDIR:-/tmp}/ensaio-fabrica/a5
git clone -q https://github.com/inematds/cardshorts.git && git -C cardshorts checkout -q d7f5c6d
cd cardshorts && python3 cardshorts.py estilos | grep -E "^[a-z]" 
grep -E "^(estilo|max_seg):" exemplos/versus/roteiro.yaml
Example from the repository
celular    celular — interface de telefone: notificação, busca, fila e enquete SIM/NÃO
cracha     cracha — alvo, crachás carimbados e cédula; fundo grafite, acento vermelho
documento  documento — papel datilografado, formulário em branco, carimbos e certificado
extrato    extrato — nota fiscal / extrato bancário com borda picotada e carimbos
versus     versus — editorial preto e branco com vermelho; foto x foto, telas divididas, chamadas em Anton
estilo: versus
max_seg: 30          # a velocidade da fala é ajustada para caber (até 1,2x)

The max_seg is a ceiling: speech is sped up to 1.2× to fit and, if it still doesn't fit, the engine fails instead of cutting.

07Practice

The two gates, first with the kit, then with your script.

E1 · Video QA

5 min

Run "QA of a rehearsal short" and "the same QA on a 16:9 video".

Done when: RESULTADO: APROVADO (falta a revisão humana: gancho, prova, pronúncia) with saída: 0, and then ❌ formato 1920x1080, RESULTADO: REPROVADO and saída: 1.

E2 · Script QA

5 min

Run "check the scripts".

Done when: bom: 0, fraco: 1 and the line ❌ abertura proibida começa com “ola”.

E3 · Your hook

15 min

Write ${TMPDIR:-/tmp}/ensaio-fabrica/a5/meu.md with the ### FALA section of a short of your own (60 to 125 words) and the three hook layers noted outside the section.

Done when: cd ${TMPDIR:-/tmp}/ensaio-fabrica/a5 && python3 makeshorts/.claude/skills/makeshorts/scripts/qa_roteiro.py meu.md --keyword [sua palavra]; echo "saída: $?" → RESULTADO: APROVADO and saída: 0.

08Lesson quiz

The explanation appears after you answer.

Question 1 of 4

qa_short.py approved the video. What did it NOT check?

09In three sentences

Hooksentence, scene, and text on frame zero, each one understandable on its own.
Two gatesqa_roteiro before recording, qa_short before publishing.
Humanthe machine checks format and rules; gap, thesis, and source are up to you.

Going further

Previous lessonNext lesson