E1 · Seus quadros
10 minRode o bloco "seus quadros na página e verificar" (precisa da pasta de quadros da aula 2).
Pronto quando: quadros: 144 (frames/), OK: 3 de 3 posições e saída: 0.
Aula 3 · 18 min
O motor que liga a rolagem aos quadros tem poucas peças, e cada uma resolve um engasgo medido. Você vê as peças, troca os quadros da página do kit pelos seus da aula 2, prova pelo contrato de teste que o quadro certo aparece em cada ponto e pede a página nova à skill scroll-film-studio, do INEMA.
Começar a aula
Objetivo: ligar seus quadros ao motor de rolagem do kit, provar pelo contrato ?jump e __ready e pedir a página à skill.
As peças do motor-rolagem.js (site-movimento, INEMA). Clique em cada uma.
No site-movimento, a correção da janela de bitmaps levou a travada máxima na rolagem de 150–315 ms para 33–36 ms (README e comentário do motor, 18/10/2026).
Copie a página para uma pasta de ensaio, troque frames/ pelos quadros da aula 2 e verifique.
K=~/projetos/formacao-cinema-ia-sites-v72/kit
E=${TMPDIR:-/tmp}/ensaio-sites/a3; rm -rf "$E/site"
cp -r "$K/site" "$E/site"; rm -rf "$E/site/frames"
cp -r "${TMPDIR:-/tmp}/ensaio-sites/a2/quadros" "$E/site/frames"
node "$K/scripts/servir.mjs" "$E/site" > "$E/url.txt" & S=$!
until U=$(cat "$E/url.txt") && [ -n "$U" ] && curl -s -o /dev/null "$U"; do sleep 0.3; done
node "$K/scripts/verificar.mjs" "$U"; echo "saída: $?"
kill $S filme = MotionEngine.Scrub({
canvas: document.getElementById('tela'), driver: secao, count: m.count, fps: m.fps || 24, dpr: 1,
maxCrop: VERT ? 0.8 : 0.22, bg: '#0c0c10',
frozen: parado,
src: function (i) { return m.dir + '/f_' + String(i + 1).padStart(4, '0') + '.jpg'; },K=~/projetos/formacao-cinema-ia-sites-v72/kit
E=${TMPDIR:-/tmp}/ensaio-sites/a3
node "$K/scripts/servir.mjs" "$K/site" > "$E/url.txt" & S=$!
until U=$(cat "$E/url.txt") && [ -n "$U" ] && curl -s -o /dev/null "$U"; do sleep 0.3; done
node "$K/scripts/verificar.mjs" "${U}erro-sem-contrato.html"; echo "saída: $?"
kill $SChromium 156.0.8078.4 (Playwright 1.64.0) · 1366×768 quadros: 144 (frames/) rolagem 0% → quadro 0 · tela pintada rolagem 50% → quadro 72 · tela pintada rolagem 100% → quadro 143 · tela pintada transbordo horizontal: não OK: 3 de 3 posições saída: 0
O verificador abre a página três vezes com ?jump= no começo, no meio e no fim do trilho e lê o quadro do motor.
Chromium 156.0.8078.4 (Playwright 1.64.0) · 1366×768 FALHA: a página não marcou window.__ready em 15 s (falta o contrato ?jump + __ready) saída: 1
A cópia erro-sem-contrato.html não chama MotionEngine.ready: a página funciona para quem rola com a mão, mas nenhum teste sabe quando olhar.
Duas linhas que as duas skills do INEMA pedem em toda página que elas constroem.
A página lê o parâmetro jump da URL e rola até y pixels antes de qualquer coisa, sem rolagem suave. Abrir a página em 50% vira uma URL.
O motor do kit faz isso em MotionEngine.ready.
Depois de posicionar e desenhar, a página marca window.__ready = true. O teste espera essa marca em vez de esperar um tempo fixo.
Esperar 2 s "para dar tempo" passa na sua máquina e falha numa máquina carregada.
Captura de tela, verificador e o agente conferindo o próprio trabalho, todos pelo mesmo caminho.
O verify.js da skill recusa capturar a tela se __ready nunca chegar.
Skill do INEMA para Codex e Claude Code: entrevista, conceitos, direção de arte, página e portões. Duas pistas: Lane A só código (sem custo) e Lane B com filme do seu gerador. O verificar.mjs do kit lê os ganchos do kit (seção [data-filme], canvas #tela, window.__filme e window.__filmeInfo) além do contrato; por isso o prompt manda a skill partir de kit/site. Página feita do zero pela skill confere com o verify.js dela.
E=${TMPDIR:-/tmp}/ensaio-sites/a3; rm -rf "$E"; mkdir -p "$E"; cd "$E"
git clone -q https://github.com/inematds/scroll-film-studio && git -C scroll-film-studio checkout -q 9d64875; echo "clone: $?"
cd scroll-film-studio/skills/scroll-film-studio
ls; ls references scripts
sed -n 2p SKILL.mdgit clone https://github.com/inematds/scroll-film-studio ~/projetos/scroll-film-studio mkdir -p ~/.claude/skills ~/.codex/skills ln -s ~/projetos/scroll-film-studio/skills/scroll-film-studio ~/.claude/skills/scroll-film-studio ln -s ~/projetos/scroll-film-studio/skills/scroll-film-studio ~/.codex/skills/scroll-film-studio # Codex que não achar a skill em ~/.codex/skills: use ~/.agents/skills
Use a skill scroll-film-studio na Lane A (só código, sem gerar vídeo). Produto: <nome e uma frase do que ele é>. Para quem: <quem compra>. O filme de abertura usa os quadros que já estão em frames/ (manifest.json com a contagem). Texto: só o que está neste arquivo: <caminho do seu texto>. Não invente número nem depoimento. Regras fixas: página estática, sem build; parta de kit/site (motor-rolagem.js e site.js) e mude só o visual e o texto, mantendo a seção [data-filme], o canvas #tela, window.__filme, window.__filmeInfo, o contrato ?jump=<y> + window.__ready e o modo parado com reduzir movimento. Pronto quando: node ~/projetos/formacao-cinema-ia-sites-v72/kit/scripts/verificar.mjs <url> responde OK: 3 de 3 posições.
clone: 0 agents references scripts SKILL.md references: engine.md finishing.md playbook.md scripts: assemble.sh chain-step.sh continuity-gate.sh copy-gate.js kie-chain.py package.json package-lock.json shot.js vector-check.py verify.js name: scroll-film-studio
A skill foi escrita em jul/2026 e cita geradores pelo nome daquela época para a Lane B. Qual gerador usar hoje é assunto do curso 1; aqui a Lane A basta.
O texto sobre o filme vende o produto. Se ele narra a câmera ("a câmera avança") ou manda rolar, é roteiro de filmagem vazando para a página. O copy-gate.js reprova.
K=~/projetos/formacao-cinema-ia-sites-v72/kit
G=${TMPDIR:-/tmp}/ensaio-sites/a3/scroll-film-studio/skills/scroll-film-studio/scripts/copy-gate.js
node "$G" "$K/site/index.html"; echo "saída: $?"
node "$G" "$K/exemplos/texto-ruim.html" 2>&1 | head -5; echo "saída: ${PIPESTATUS[0]}"✓ ~/projetos/formacao-cinema-ia-sites-v72/kit/site/index.html — copy clean
saída: 0
✗ ~/projetos/formacao-cinema-ia-sites-v72/kit/exemplos/texto-ruim.html — 5 copy defect(s)
line 6: narrates the scroll instead of performing it
…ction class="beat">Aurora 35As you scroll, the camera pushes in through the glass…
line 7: instructs the visitor to scroll
…s="beat">One continuous takeKeep scrolling to see the reveal. </body…
saída: 1O copy-gate.js lê inglês. Para páginas em português e espanhol, o site-movimento tem um portão de texto equivalente, que você roda na aula 6.
Seus quadros na página, o contrato provado e a skill instalada.
Rode o bloco "seus quadros na página e verificar" (precisa da pasta de quadros da aula 2).
Pronto quando: quadros: 144 (frames/), OK: 3 de 3 posições e saída: 0.
Rode o verificador contra erro-sem-contrato.html (bloco "erro comum: página sem o contrato") e depois abra kit/site/site.js e ache a linha que chama MotionEngine.ready.
Pronto quando: FALHA: a página não marcou window.__ready em 15 s com saída: 1.
Rode "baixar a skill" e instale no seu agente. Rode o portão de texto. Opcional: peça a página pelo prompt da Lane A com o seu produto, numa pasta nova.
Pronto quando: ls ~/.claude/skills/scroll-film-studio/SKILL.md (ou ~/.codex/skills/…) mostra o arquivo, e o bloco do portão de texto mostra copy clean e depois saída: 1.
A explicação aparece depois da sua resposta.
Pergunta 1 de 4
A rolagem trava quando você rola rápido pela primeira vez. Qual peça do motor resolve isso?
Pergunta 2 de 4
Por que o verificador espera window.__ready em vez de esperar 2 segundos?
Pergunta 3 de 4
Qual destas frases o portão de texto reprova sobre o filme de uma lente?
Pergunta 4 de 4
Na skill scroll-film-studio, o que muda entre a Lane A e a Lane B?
Escolha uma alternativa. A explicação aparece depois da sua tentativa.