Vídeo com IA: Claude Code, Codex e ElevenLabs · Capítulo 7 de 25 · 25 min
Estruturar o projeto de vídeo para o Claude Code operar sem improvisar
Monte a pasta do projeto de vídeo com CLAUDE.md completo, permissões no settings.json e um hook que bloqueia escrita nos brutos antes de delegar o trabalho.
Este capítulo faz parte do curso gratuito Vídeo com IA: Claude Code, Codex e ElevenLabs.
Sem regras escritas no projeto, você repete a cada sessão onde ficam os brutos, qual formato entregar e quando o agente deve parar. O Claude Code, o agente da Anthropic que trabalha no terminal lendo e escrevendo arquivos, preenche as lacunas com palpites: renderiza antes da sua aprovação, grava a saída na pasta errada ou chama uma API paga sem avisar o preço.
Cada palpite custa caro em vídeo. Um bruto sobrescrito não volta, um render de entrega ocupa a máquina por minutos e uma geração paga sai do seu cartão, não da cota do plano. Falta ao agente um contrato de trabalho, e não inteligência.
Nesta aula você transforma esse contrato em arquivos: pastas com função clara, um CLAUDE.md que o agente lê em toda sessão, permissões no settings.json e um hook que barra a escrita nos brutos e o versionamento. Instrução orienta, permissão e hook impõem, e você termina com as três camadas testadas.
Se a figura ultrapassar a área visível, deslize para os lados. Pelo teclado, foque a figura e use as setas.
Escreva o CLAUDE.md que o agente lê em toda sessão
Pense no CLAUDE.md como a ficha de produção presa na bancada: um arquivo Markdown na raiz do projeto que o Claude Code carrega no início de cada conversa. O comando /init gera um rascunho a partir do que existe na pasta, e o agente procura o arquivo em ./CLAUDE.md ou em ./.claude/CLAUDE.md. O Claude Code só lê o AGENTS.md, o arquivo de instruções do Codex, quando não há CLAUDE.md nem CLAUDE.local.md na pasta ou acima dela; havendo CLAUDE.md, o padrão é ignorar o AGENTS.md. Se você usa os dois agentes, mantenha o CLAUDE.md como arquivo principal do Claude Code, como mostra a aula de configuração do Codex com GPT-6 Astra.
Antes de escrever, fixe o que o Claude faz em vídeo. Ele não gera nem recebe vídeo: escreve código de composição (HyperFrames, Remotion, FFmpeg), coordena serviços externos e lê imagens, então toda revisão visual acontece sobre quadros extraídos. O render, a etapa que transforma a composição em arquivo MP4, roda na sua máquina com Chrome sem interface e FFmpeg e não consome tokens; consomem tokens a escrita e a revisão do código pelo agente.
Boas regras dão para conferir. "Faça um vídeo bonito" não diz nada ao agente; "1080x1920 a 30 fps, pare no preview e espere o sim" diz. Se você nunca escreveu um arquivo desses, a aula sobre o CLAUDE.md, o manual que o Claude sempre lê mostra o formato geral; aqui o foco é o projeto de vídeo. A Anthropic não publica modelo oficial de CLAUDE.md para vídeo, então o bloco abaixo é uma proposta do curso, feita para você adaptar. Ele roda na raiz video-ia e completa o projeto que as aulas da Parte 3 usam, com as etapas do pipeline desenhado na aula 02 organizadas nas pastas em que o agente trabalha: cria só as pastas do agente em .claude/, acrescenta o que falta no .gitignore e no .env.example (variáveis de ambiente e .env estão na aula da bancada) e grava um CLAUDE.md completo, sem sobrescrever o que já existe.
O mesmo bloco grava um slash command, um atalho /nome definido num arquivo Markdown em .claude/commands/. O /render-final executa o ciclo de validação, preview e render do HyperFrames, ensinado na aula 06, com duas paradas obrigatórias para o seu "aprovado". O campo disable-model-invocation impede que o agente o dispare por conta própria, allowed-tools pré-autoriza o CLI do HyperFrames e o ffprobe só no turno em que você chama o comando: a liberação cai quando você manda a mensagem seguinte, então depois do seu "aprovado" valem as regras de permissions do settings.json, que você grava mais adiante. $ARGUMENTS recebe o nome da receita, como em /render-final bolo-de-rolo.
#!/usr/bin/env bash
# Completa o projeto video-ia da aula 02 com regras e configuração sem segredos.
# Rode na raiz video-ia. Nada que já existe é sobrescrito.
set -euo pipefail
# O catálogo da aula 01 prova que você está na pasta certa.
test -f config/catalogo.json || {
printf 'Entre na pasta video-ia antes de continuar.\n' >&2
exit 1
}
# As pastas de produção vêm da aula 02; aqui entram só as do agente.
mkdir -p .claude/hooks .claude/agents .claude/skills .claude/commands
# Mídia pesada e segredos ficam fora do git: acrescenta só o que faltar.
touch .gitignore
for regra in '.env' '.env.*' '!.env.example' 'midia/' 'audio/' 'renders/' \
'qa/frames/' 'logs/' 'node_modules/' '.venv/'; do
grep -Fqx "$regra" .gitignore || printf '%s\n' "$regra" >> .gitignore
done
# Modelo por papel e nomes de variáveis, sem nenhuma chave preenchida.
touch .env.example
for linha in 'MODEL_DIRECTOR=claude-opus-5-5' 'MODEL_COMPOSER=claude-sonnet-5-5' \
'MODEL_FRAME_REVIEWER=claude-haiku-5-5' 'ELEVENLABS_API_KEY='; do
grep -q "^${linha%%=*}=" .env.example || printf '%s\n' "$linha" >> .env.example
done
if [ -e CLAUDE.md ]; then
printf 'CLAUDE.md já existe: compare com o modelo da aula e mescle à mão.\n'
else
cat > CLAUDE.md <<'EOF'
# Projeto de vídeo: Cozinha da Rafa
## O que este projeto entrega
- Receitas em vídeo: um longo 16:9 (1920x1080) e cortes 9:16 (1080x1920), sempre a 30 fps.
- Texto na tela, legendas e relatórios em português do Brasil com acentuação completa.
## Onde ler e onde escrever
Todos os comandos rodam na raiz video-ia; scripts ficam em scripts/.
- briefing/: briefing de cada receita. Leia antes de propor qualquer mudança.
- roteiro/: roteiro aprovado. Só leitura.
- storyboard/: cenas e quadros-chave aprovados.
- midia/raw/: brutos da câmera. Imutáveis: nunca editar, mover, renomear nem sobrescrever.
- audio/: narração, trilha e efeitos gerados por API.
- transcricoes/: transcrições do Scribe em JSON.
- legendas/: arquivos SRT ou VTT.
- composicoes/<receita>/: projetos HyperFrames ou Remotion. Seu código mora aqui.
- qa/frames/<video>/: imagens extraídas com ffmpeg para revisão visual.
- renders/: MP4 de revisão e de entrega. Fora do git.
- logs/: saída de comandos longos, relatórios e logs/<receita>-render.json com versões, comandos e caminhos de cada entrega.
- custos/: custo real de cada chamada paga.
## Ciclo de produção
1. Ler roteiro/ e logs/<receita>-render.json.
2. Compor em composicoes/<receita>/ e rodar o CLI do HyperFrames dentro dessa pasta.
3. Rodar npx hyperframes lint e npx hyperframes check --snapshots.
4. Rodar npx hyperframes preview --background, mostrar o endereço e PARAR até um "aprovado" explícito.
5. Render de revisão: npx hyperframes render --quality draft --output ../../renders/<receita>-draft.mp4
6. Conferir duração, dimensões e fps com ffprobe e extrair quadros para qa/frames/<receita>/.
7. Render de entrega só depois de um segundo "aprovado".
Passar no check não é aprovação estética.
## Modelos
- Direção e roteiro: opus (claude-opus-5-5, padrão do Claude Code).
- Composição em volume: sonnet (claude-sonnet-5-5).
- Triagem de quadros e revisão: haiku (claude-haiku-5-5).
- Fable 5.1 só com pedido explícito (/model fable).
## Serviços pagos
- Antes de qualquer API paga (ElevenLabs, fal, Replicate, Gemini), informe fornecedor, ID exato do modelo, parâmetros, unidade de cobrança e custo estimado, e espere o sim.
- Se preço ou limite não estiver disponível, escreva [conferir] e pare.
- Registre o custo real em custos/.
## Limites do Claude em vídeo
- O Claude não gera nem recebe vídeo. Para revisar, extraia quadros JPEG ou PNG com ffmpeg.
- Não use Sora nem /v1/videos da OpenAI: desligados em 24/09/2026.
- Não adote Veo 3.1 preview do Gemini API como padrão: pode ser desligado a partir de 22/10/2026.
## Segurança e falhas
- Chaves só no ambiente ou em .env. Nunca peça chave no chat nem leia o .env.
- Não execute git add, git commit nem git push: o versionamento é do usuário.
- Ao falhar, informe comando, código de saída e trecho do erro, sem segredos. Não adivinhe a causa.
EOF
fi
# Slash command /render-final: só você dispara; o agente nunca o chama sozinho.
if [ ! -e .claude/commands/render-final.md ]; then
cat > .claude/commands/render-final.md <<'EOF'
---
description: Renderiza a entrega de uma receita depois do check e do "aprovado" do usuário no preview.
argument-hint: [nome-da-receita]
allowed-tools: Bash(npx hyperframes *), Bash(ffprobe *)
disable-model-invocation: true
---
Receita: $ARGUMENTS. Composição em composicoes/$ARGUMENTS/; rode o CLI dentro dessa pasta.
1. Rode npx hyperframes lint e npx hyperframes check --snapshots. Com erro, mostre os achados e pare.
2. Rode npx hyperframes preview --background, mostre o endereço e PARE até um "aprovado" explícito.
3. Render de revisão: npx hyperframes render --quality draft --output ../../renders/$ARGUMENTS-draft.mp4
4. Confira com ffprobe -v error -show_entries stream=width,height,r_frame_rate:format=duration -of json.
5. Peça um segundo "aprovado" e só então: npx hyperframes render --output ../../renders/$ARGUMENTS.mp4
6. Registre versão, comandos e duração em logs/$ARGUMENTS-render.json. Não rode git.
EOF
fi
printf 'Projeto completado em: %s\n' "$PWD"
Modelos Claude para cada papel no projeto, em 12/10/2026
| Modelo e ID | Papel no projeto | Preço por milhão de tokens (entrada / saída) |
|---|---|---|
| Opus 5.5, claude-opus-5-5, de 22/09/2026 | Direção e roteiro; padrão do Claude Code | US$ 4 / US$ 20 |
| Sonnet 5.5, claude-sonnet-5-5, de 28/09/2026 | Composição em volume | US$ 2 / US$ 10 |
| Haiku 5.5, claude-haiku-5-5, de 07/10/2026 | Triagem de quadros e subagente revisor | US$ 0,10 / US$ 0,50 até 100 mil tokens de entrada; US$ 0,50 / US$ 2,50 acima |
| Fable 5.1, claude-fable-5-1, de 01/09/2026 | Raciocínio longo, só com /model fable | US$ 10 / US$ 50 |
Os quatro têm contexto de 1 milhão de tokens e saída máxima de 128 mil. O que se repete entre pedidos, como o CLAUDE.md, é lido do cache por milhão de tokens a US$ 0,25 no Fable 5.1, US$ 0,20 no Opus 5.5, US$ 0,10 no Sonnet 5.5 (desde 07/10/2026) e US$ 0,01 no Haiku 5.5 até 100 mil tokens. O fast mode do Opus 5.5, em prévia, custa US$ 8 / US$ 40. Desde a versão 2.1.280, de 22/09/2026, o plano Pro também abre no Opus 5.5. O alias opusplan usa Opus para planejar e Sonnet para executar.
Fonte: Anthropic, visão geral dos modelos e tabela de preços, 12/10/2026; changelog do Claude Code, v2.1.280
Imponha os limites com permissões e um hook
Texto no CLAUDE.md é orientação: o modelo costuma seguir, mas nada no sistema impede o contrário. Para impor um limite, o Claude Code oferece duas camadas no .claude/settings.json, a configuração do projeto que viaja junto com a pasta. A primeira são as permissões, em três listas: allow roda sem perguntar, ask pergunta antes e deny nunca roda, e a negação vence as outras duas. A segunda são os hooks, pequenos programas que o Claude Code chama em eventos do ciclo de trabalho, como um fiscal posicionado antes de cada operação.
Para bloquear, o evento certo é o PreToolUse, que roda antes da ferramenta e recebe em JSON o nome dela e os argumentos. Se o programa termina com código 2, a operação é bloqueada e a mensagem de erro volta ao agente como motivo; código 1 não bloqueia, só registra a falha. O PostToolUse roda depois e não desfaz nada que já aconteceu. A variável CLAUDE_PROJECT_DIR aponta para a raiz do projeto, e o comando /hooks mostra o que está registrado. Existem outros eventos, como Stop, SubagentStop, SessionStart, PreCompact e FileChanged, mas nenhum deles impede uma escrita já feita.
A política deste exercício tem três regras: os brutos em midia/raw/ não mudam, o agente não versiona (git add, commit e push ficam com você) e render e ffmpeg pedem confirmação. Para ver o mesmo princípio fora do vídeo, a aula sobre o que o Claude faz sem pedir licença mostra como escolher o que liberar e o que manter sob pergunta.

Se a figura ultrapassar a área visível, deslize para os lados. Pelo teclado, foque a figura e use as setas.
Grave o settings.json abaixo em .claude/settings.json. As permissões liberam só leitura de metadados e validação, deixam render, ffmpeg e scripts Python sob pergunta e negam a leitura do .env, a edição dos brutos e o push. Se o arquivo já existir, mescle as chaves permissions e hooks em vez de sobrescrever.
{
"permissions": {
"allow": [
"Bash(ffprobe *)",
"Bash(npx hyperframes lint*)",
"Bash(npx hyperframes check*)",
"Bash(npx hyperframes preview*)"
],
"ask": [
"Bash(npx hyperframes render*)",
"Bash(ffmpeg *)",
"Bash(python3 *)"
],
"deny": [
"Read(./.env)",
"Read(./.env.*)",
"Edit(./midia/raw/**)",
"Bash(git push*)"
]
},
"hooks": {
"PreToolUse": [
{
"matcher": "Bash|Edit|Write|MultiEdit|NotebookEdit",
"hooks": [
{
"type": "command",
"command": "python3 \"$CLAUDE_PROJECT_DIR/.claude/hooks/guarda.py\"",
"timeout": 10,
"onFailure": "block"
}
]
}
]
}
}
"""Hook PreToolUse do projeto de vídeo. Salve em .claude/hooks/guarda.py.
O Claude Code envia pela entrada padrão um JSON com tool_name e tool_input.
Saída 0 libera a ferramenta. Saída 2 bloqueia, e a mensagem em stderr volta ao
agente como motivo. Saída 1 NÃO bloqueia: por isso todo erro aqui vira 2.
É uma segunda camada, depois das permissões; não é fronteira de segurança.
Se este arquivo sumir ou estourar o tempo, quem bloqueia é o onFailure: block do settings.json.
"""
import json
import os
import re
import sys
from pathlib import Path
def bloquear(motivo: str) -> None:
print(motivo, file=sys.stderr)
sys.exit(2)
try:
dados = json.load(sys.stdin)
except (ValueError, TypeError):
bloquear("Entrada do hook inválida; operação bloqueada por precaução.")
ferramenta = dados.get("tool_name", "")
entrada = dados.get("tool_input") or {}
raiz = Path(os.environ.get("CLAUDE_PROJECT_DIR", ".")).resolve()
brutos = raiz / "midia" / "raw"
if ferramenta == "Bash":
comando = entrada.get("command", "")
# Versionamento é do usuário: staging, commit e push ficam fora do agente.
if re.search(r"\bgit\s+(add|commit|push)\b", comando):
bloquear("Versionamento reservado ao usuário. Liste os arquivos alterados e pare.")
# Apagar, mover ou redirecionar saída para dentro dos brutos.
if re.search(r"\b(rm|mv|truncate)\b[^;&|]*midia/raw", comando) or re.search(
r">\s*\S*midia/raw", comando
):
bloquear("midia/raw/ é imutável. Trabalhe numa cópia em composicoes/ ou qa/frames/.")
if ferramenta in {"Edit", "Write", "MultiEdit", "NotebookEdit"}:
alvo = entrada.get("file_path") or entrada.get("notebook_path") or ""
caminho = (raiz / alvo).resolve() # caminho absoluto continua absoluto
if caminho == brutos or brutos in caminho.parents:
bloquear(f"Escrita negada em {caminho}: os brutos não mudam.")
sys.exit(0)
#!/usr/bin/env bash
# Simula o que o Claude Code envia ao hook. Nenhum git roda e nenhum bruto é tocado.
set -euo pipefail
# Rode na raiz video-ia; o catálogo da aula 01 prova que é a pasta certa.
test -f config/catalogo.json || { echo "Entre na pasta video-ia antes de continuar." >&2; exit 1; }
export CLAUDE_PROJECT_DIR="$PWD"
motivo="$(mktemp)"
testa() { # $1 = JSON de entrada, $2 = código esperado, $3 = nome do caso
set +e
printf '%s' "$1" | python3 .claude/hooks/guarda.py 2>"$motivo"
obtido=$?
set -e
printf '%-28s saída %s (esperada %s)\n' "$3" "$obtido" "$2"
[ "$obtido" -eq "$2" ] || { echo "Falhou. Mensagem: $(cat "$motivo")"; exit 1; }
}
testa '{"tool_name":"Bash","tool_input":{"command":"git add ."}}' 2 "git add"
testa '{"tool_name":"Bash","tool_input":{"command":"git commit -m entrega"}}' 2 "git commit"
testa '{"tool_name":"Write","tool_input":{"file_path":"midia/raw/bolo.mov"}}' 2 "escrita no bruto"
testa '{"tool_name":"Bash","tool_input":{"command":"rm midia/raw/bolo.mov"}}' 2 "rm no bruto"
testa '{"tool_name":"Bash","tool_input":{"command":"ffprobe -v error midia/raw/bolo.mov"}}' 0 "ffprobe lendo o bruto"
testa '{"tool_name":"Write","tool_input":{"file_path":"composicoes/intro/index.html"}}' 0 "escrita em composicoes"
testa 'isto não é JSON' 2 "entrada inválida"
rm -f "$motivo"
echo "Os sete casos passaram."
Se a figura ultrapassar a área visível, deslize para os lados. Pelo teclado, foque a figura e use as setas.
Expressão regular não cobre todos os jeitos de rodar Git ou de apagar um arquivo: um script intermediário, um alias ou outro executor escapa da inspeção. Por isso o hook é a segunda camada, depois da regra deny, e nunca a fronteira de segurança. Quando o risco for real, como um bruto único de uma gravação que não se repete, rode o agente sobre uma cópia de teste ou dentro de um contêiner.
Na Cozinha da Rafa, canal de receitas regionais de Recife com três vídeos por semana (um longo 16:9 e dois cortes 9:16), cada receita vira uma subpasta em composicoes/, um registro como logs/bolo-de-rolo-render.json, com versões, comandos e caminhos, e o custo real em custos/. O mesmo CLAUDE.md serve para os três vídeos da semana, porque o formato está escrito como regra e não depende da memória da conversa.
Hook que falha fechado e sessão em modo auto
Faça o hook falhar fechado
O guarda.py transforma em código 2 todo erro que ele percebe, mas nada faz quando nem chega a rodar. Se o arquivo sumir, o python3 faltar no PATH, o script passar dos 10 segundos do timeout ou devolver JSON inválido, o Claude Code segue com a operação: por padrão, o hook falha aberto. Desde 08/10/2026, na versão 2.1.295, o campo "onFailure": "block" nos hooks do tipo command e http inverte isso, e qualquer falha do hook vale como saída 2. O padrão continua "continue", por isso o settings.json da aula já traz a linha.
Para conferir, renomeie o guarda.py para guarda.py.off, abra uma sessão nova e peça ao agente um comando inofensivo, como ls midia. Com o campo no lugar, a chamada aparece negada por falha do hook; devolva o nome do arquivo em seguida. Se o ls rodar, o campo está fora do bloco do hook ou a versão é anterior à 2.1.295: confira com claude --version e atualize. Hooks do tipo prompt e agent, em que um modelo julga a ação, deixavam passar o que deviam bloquear até a correção da versão 2.1.294; para barreira, fique com o hook de comando.
Se a figura ultrapassar a área visível, deslize para os lados. Pelo teclado, foque a figura e use as setas.
Confira quem aprova quando a sessão nasce em modo auto
Desde 25/09/2026, na versão 2.1.283, toda sessão interativa nova do Claude Code, no terminal ou no VS Code, abre em modo auto em todos os planos: um classificador, um segundo modelo que avalia cada ação, aprova o que julga seguro e pergunta o resto. As regras deny do settings.json valem em qualquer modo, inclusive no auto, e o hook PreToolUse roda antes da ferramenta do mesmo jeito. Por isso as camadas desta aula continuam na mesma ordem, e o classificador não substitui nenhuma delas.
Abra uma sessão nova na raiz video-ia e rode /status para ver o modo. Se você quer aprovar cada render à mão, grave o modo padrão no ~/.claude/settings.json, o arquivo do usuário, como no bloco abaixo: é ali que a documentação manda fazer a troca, e o valor auto não é aceito no settings.json do projeto. Deu certo quando a sessão seguinte mostra o modo padrão no /status. Erro comum: apagar a lista deny porque o auto parece cuidadoso; ele decide caso a caso, e a lista vale sempre.
Se a figura ultrapassar a área visível, deslize para os lados. Pelo teclado, foque a figura e use as setas.
{
"permissions": {
"defaultMode": "default"
}
}
Montar o projeto e provar que as três camadas funcionam
Siga na ordem: cada passo usa o arquivo criado no anterior.
Passo 1: Confirme que está na raiz video-ia
Rode pwd e ls config/catalogo.json: o catálogo da aula 01 prova que é a pasta certa.
Deu certo quando: O terminal está na pasta video-ia criada nas aulas 01 e 02.
Erro comum: Rodar o bloco em outra pasta e espalhar regras fora do projeto.
Passo 2: Rode o bloco que completa o projeto e grava o CLAUDE.md
Ele para sozinho fora de video-ia e não sobrescreve CLAUDE.md nem .gitignore.
Deu certo quando: Existem CLAUDE.md, .env.example, .gitignore completo e as pastas de .claude/.
Erro comum: Guardar o bruto em renders/ e depois sobrescrevê-lo com um render.
Passo 3: Leia o CLAUDE.md antes de abrir o agente
Ajuste formato, pastas e modelos ao seu canal.
Deu certo quando: Você consegue dizer onde entra cada arquivo e quando o agente para.
Erro comum: Aceitar uma regra vaga, como "faça um vídeo bom", como especificação.
Passo 4: Grave o settings.json e o guarda.py
Os dois ficam dentro de .claude/, ao lado de commands/render-final.md.
Deu certo quando: O /hooks mostra o PreToolUse com o matcher Bash|Edit|Write|MultiEdit|NotebookEdit.
Erro comum: Registrar o hook em PostToolUse esperando impedir uma operação já concluída.
Passo 5: Rode o teste do hook
O script simula as entradas que o Claude Code enviaria.
Deu certo quando: Os cinco casos proibidos, inclusive a entrada inválida, devolvem 2 e os dois permitidos devolvem 0.
Erro comum: Encerrar com código 1 e concluir que a operação foi bloqueada.
Passo 6: Abra o Claude Code e cole o prompt de inspeção
Use uma sessão nova na raiz video-ia.
Deu certo quando: O agente resume as regras e não tenta renderizar nem chamar API.
Erro comum: Confundir a leitura do CLAUDE.md com isolamento real do sistema.
Passo 7: Observe a escrita proibida falhar
O prompt pede para criar midia/raw/teste.txt de propósito.
Deu certo quando: A tentativa aparece negada, pela regra deny ou pela mensagem do hook.
Erro comum: Aprovar o diálogo de permissão sem ler e anular o teste.
No fim você tem: Um projeto com regras escritas, limites impostos e prova de que eles funcionam.
Delegue a primeira inspeção e transforme falhas em regra
Se faltar uma regra operacional, escreva no CLAUDE.md uma instrução que dê para conferir, com número ou caminho. Quando a regra protege arquivo ou dinheiro, não confie só no texto: leve-a para a lista deny do settings.json ou para o hook. Caso um dia o agente precise versionar, mude a política de propósito, editando o hook, e não abra exceção no meio de uma sessão. Diante de um comando que falhou, entregue ao agente o comando, o código de saída e o trecho do erro sem segredos; pedir que ele adivinhe a causa produz correções inventadas.
O prompt abaixo faz a inspeção de ponta a ponta e termina num relatório. Ele não pede vídeo nenhum: o objetivo é ver o agente ler as regras, esbarrar num limite e registrar o que aconteceu.
Guia prático: regras por pasta e auditoria do CLAUDE.md
O CLAUDE.md da aula cresce a cada falha que vira regra, e um arquivo longo é lido com menos atenção. Aqui você mantém o arquivo principal curto, leva para .claude/rules/ as regras que só valem em legendas, composição e áudio, deixa notas de manutenção em comentário HTML, que o agente não lê, roda a auditoria de instruções do Claude Code e registra em logs/ quando cada regra entrou na sessão.
Funções, casos de uso e aplicações
Funções
Recursos para organizar as instruções do projeto video-ia
| Função ou recurso | O que faz | Quando usar | Desde |
|---|---|---|---|
| Regra em .claude/rules/ com o campo paths | Só entra no contexto quando o agente lê, escreve ou edita um arquivo que casa com o padrão, como legendas/** | Regras que valem para uma pasta só: formato de legenda, nome de composição, registro de custo de áudio | 02/10/2026 (v2.1.288, carrega também ao escrever e editar); 07/10/2026 (v2.1.293, também com cat, head, tail, sed -n ou grep de um arquivo) |
| Importação com @caminho | Puxa outro arquivo para dentro do CLAUDE.md na abertura, com até quatro saltos de importação | Organizar um arquivo grande; não economiza contexto, porque o importado também carrega na abertura | Em vigor em 12/10/2026 |
| Comentário HTML <!-- --> | É removido antes de o texto chegar ao agente | Nota para quem mantém o projeto, como o motivo de uma regra, sem gastar tokens | Em vigor em 12/10/2026 |
| /doctor prompt-audit | Procura instruções escritas para modelos antigos, arquivos ou comandos que não existem e regras que se contradizem; propõe edições e só aplica quando você pede | Depois de mudar o formato do canal, trocar de modelo ou juntar regras de duas pessoas | 25/09/2026 (v2.1.283) |
| /context, lista Memory files | Mostra quais CLAUDE.md e regras carregaram na abertura | Quando o agente parece ignorar uma regra | Em vigor em 12/10/2026 |
| Hook InstructionsLoaded | Dispara quando um CLAUDE.md ou uma regra entra no contexto e informa o motivo (session_start, path_glob_match, include, compact); não bloqueia nada | Registrar em logs/ qual arquivo disparou cada regra | Em vigor em 12/10/2026 |
A documentação recomenda menos de 200 linhas por CLAUDE.md; cada regra e cada importação conta como arquivo separado no aviso de tamanho, e um arquivo acima de 4 MiB é ignorado.
Fonte: Claude Code Docs, memória e hooks; changelog v2.1.283, v2.1.288 e v2.1.293; 12/10/2026
Casos de uso
Editora de uma produtora de videoaulas em Curitiba que atende três cursos livres
Educação, produção de videoaulas
Dor
O CLAUDE.md passou de 300 linhas com regras de legenda, de narração e de cada cliente. O agente começou a esquecer a regra de duas linhas por legenda justamente nas aulas longas.
Solução
Ela deixou no CLAUDE.md só formato, pastas e paradas obrigatórias, levou as regras de legenda para .claude/rules/legendas.md com paths em legendas/** e as de narração para audio.md, e passou a conferir pelo /context o que carregou.
Resultado
O que observar: nas três aulas seguintes, se a regra de legenda aparece no registro de logs/instrucoes.jsonl sempre que um arquivo de legendas/ é aberto, e se os SRT entregues respeitam as duas linhas sem correção manual.
Cenário construído para fins didáticos. Números não correspondem a cliente específico.
Coordenador de conteúdo de uma faculdade EAD com dois editores no mesmo projeto
Marketing educacional, vídeos de captação
Dor
Cada editor acrescentava regras no próprio estilo. Um escreveu 25 fps para os cortes de Reels, o outro 30 fps no formato geral, e os renders saíam com taxas diferentes na mesma campanha.
Solução
Ao rodar /doctor prompt-audit na raiz video-ia, ele recebeu a contradição apontada com a proposta de edição, decidiu por 30 fps e anotou o motivo num comentário HTML acima da regra.
Resultado
O que observar: na próxima rodada de cortes, se o ffprobe de todos os renders mostra 30 fps, e se a auditoria do mês seguinte volta sem contradições.
Cenário construído para fins didáticos. Números não correspondem a cliente específico.
Na prática
O bloco abaixo roda na raiz video-ia e cria três regras por pasta e o hook que registra cada carregamento. As regras são proposta do curso para a Cozinha da Rafa: ajuste números e nomes ao seu canal. Depois de criá-las, apague do CLAUDE.md as linhas que passaram para as regras, para que a mesma instrução não exista em dois lugares.
#!/usr/bin/env bash
# Rode na raiz video-ia. Nada que já existe é sobrescrito.
set -euo pipefail
test -f CLAUDE.md || { echo "Entre na pasta video-ia antes de continuar." >&2; exit 1; }
mkdir -p .claude/rules .claude/hooks logs
grava() { # $1 = arquivo; o conteúdo vem da entrada padrão
if [ -e "$1" ]; then echo "$1 já existe: mescle à mão."; cat >/dev/null; else cat > "$1"; fi
}
grava .claude/rules/legendas.md <<'EOF'
---
paths:
- "legendas/**"
- "transcricoes/**"
---
# Legendas
- SRT em UTF-8, no máximo duas linhas por bloco e 42 caracteres por linha.
- Nome de ingrediente com acentuação completa; nunca corrigir só no SRT, corrigir também o roteiro.
EOF
grava .claude/rules/composicoes.md <<'EOF'
---
paths: "composicoes/**"
---
# Composições
<!-- 30 fps decidido em 12/10 para os três formatos; ver logs/decisoes.md -->
- Uma receita por subpasta. Trecho do bruto entra como cópia em composicoes/<receita>/assets/.
- Nunca apontar para midia/raw/ por caminho absoluto.
EOF
grava .claude/rules/audio.md <<'EOF'
---
paths:
- "audio/**"
- "custos/**"
---
# Áudio e custos
- Antes de gerar narração ou trilha, anote em custos/ fornecedor, modelo, caracteres e custo estimado.
EOF
# Hook que só registra: InstructionsLoaded não bloqueia e o código de saída é ignorado.
grava .claude/hooks/registrar_instrucoes.py <<'EOF'
import json, os, sys, datetime
from pathlib import Path
d = json.load(sys.stdin)
linha = {"hora": datetime.datetime.now().isoformat(timespec="seconds"),
"arquivo": d.get("file_path"), "motivo": d.get("load_reason"),
"gatilho": d.get("trigger_file_path"), "padroes": d.get("globs")}
destino = Path(os.environ.get("CLAUDE_PROJECT_DIR", ".")) / "logs" / "instrucoes.jsonl"
with destino.open("a", encoding="utf-8") as f:
f.write(json.dumps(linha, ensure_ascii=False) + "\n")
EOF
echo "Pronto. Mescle o hook no .claude/settings.json e abra uma sessão nova."{
"hooks": {
"InstructionsLoaded": [
{
"hooks": [
{
"type": "command",
"command": "python3 \"$CLAUDE_PROJECT_DIR/.claude/hooks/registrar_instrucoes.py\"",
"timeout": 5
}
]
}
]
}
}Enxugar o CLAUDE.md e provar que cada regra carrega na hora certa
Faça numa sessão nova, na raiz video-ia, depois de rodar o bloco acima.
Passo 1: Corte do CLAUDE.md o que foi para as regras
Legenda, composição e custo de áudio passam a morar só em .claude/rules/.
Deu certo quando: O CLAUDE.md fica com formato, pastas, ciclo de produção e segurança, abaixo de 200 linhas.
Erro comum: Manter a mesma regra nos dois lugares e depois editar só um deles.
Passo 2: Abra a sessão e rode /context
Deu certo quando: Em Memory files aparece o CLAUDE.md; as regras com paths ainda não aparecem.
Erro comum: Esperar ver as regras por pasta antes de qualquer arquivo daquela pasta ser aberto.
Passo 3: Peça ao agente para ler um SRT de legendas/
Por exemplo: leia legendas/bolo-de-rolo.srt e diga quantos blocos têm mais de duas linhas.
Deu certo quando: logs/instrucoes.jsonl ganha uma linha com legendas.md, motivo path_glob_match e o SRT como gatilho.
Erro comum: Pedir uma busca em várias pastas de uma vez e não saber qual arquivo disparou a regra.
Passo 4: Rode /doctor prompt-audit
Para auditar só as regras novas: /doctor prompt-audit .claude/rules
Deu certo quando: Você recebe a lista de achados com proposta de edição, e nada muda sem você pedir.
Erro comum: Aceitar todas as propostas de uma vez sem ler qual regra cada uma altera.
No fim você tem: CLAUDE.md curto, três regras por pasta, registro de carregamento em logs/ e uma auditoria lida.
Armadilhas
Instruções que pesam contra instruções que ajudam
Evite
Coluna a evitar
- Importar cinco arquivos com @ achando que isso economiza contexto
- Pôr no CLAUDE.md regra que só vale para legendas/
- Explicar o motivo de cada regra em texto que o agente lê em toda sessão
- Confiar numa regra por pasta para proteger midia/raw/
- Escrever paths com colchete sem escape, como "fotos [2026/**", que não casa com nada
Prefira
Coluna recomendada
- Regra com paths, que só entra quando a pasta é tocada
- CLAUDE.md abaixo de 200 linhas, com formato, pastas e paradas
- O motivo em comentário HTML, visível para pessoas e invisível para o agente
- Proteção de arquivo no deny e no hook da aula; regra é orientação
- /context e o registro do InstructionsLoaded para saber o que carregou
Glossário rápido
CLAUDE.md
Arquivo Markdown na raiz do projeto que o Claude Code lê no início de toda sessão, como a ficha de produção presa na bancada.
/init
Comando do Claude Code que gera um rascunho de CLAUDE.md a partir do que já existe na pasta.
settings.json do projeto
Arquivo .claude/settings.json com permissões e hooks; impõe limites que o texto do CLAUDE.md só pede.
permissões allow, ask e deny
Três listas do settings.json: roda sem perguntar, pergunta antes ou nunca roda. A negação vence as outras duas.
hook
Pequeno programa que o Claude Code chama num evento do ciclo de trabalho, como um fiscal posicionado antes de cada operação.
PreToolUse
Evento de hook que roda antes da ferramenta e pode bloqueá-la; o PostToolUse roda depois e não desfaz nada.
código de saída 2
Valor com que o hook encerra para bloquear a operação; a mensagem em stderr volta ao agente. Código 1 não bloqueia.
CLAUDE_PROJECT_DIR
Variável de ambiente que aponta para a raiz do projeto quando o hook roda.
slash command
Atalho /nome definido num arquivo Markdown em .claude/commands/, que dispara um procedimento escrito do projeto.
Crie o projeto, grave as permissões e o hook, rode o teste e peça a inspeção. Está pronto quando a pasta video-ia tem CLAUDE.md, .claude/settings.json e .claude/hooks/guarda.py, o hook traz onFailure: block, os sete casos do teste devolvem o código esperado, o /status mostra o modo de permissão que você escolheu, o /render-final aparece na lista de comandos, o agente descreve as regras sem tentar renderizar nem chamar API, a escrita em midia/raw/ aparece negada e o relatório logs/inspecao-07.md está salvo. Na próxima aula, a mesma pasta recebe as skills de vídeo do Claude Code.
Seu caderno neste capítulo
Abrir o caderno completoSelecione um trecho do capítulo para destacar ou anotar. Nos vídeos e áudios, use Anotar este momento. No teclado, selecione com Shift e as setas e use Alt+Shift+D para destacar ou Alt+Shift+N para anotar.
Salvo neste navegador. Entre na sua conta para levar o caderno a outros aparelhos.
Entre na sua conta para compartilhar o que aprendeu e convidar alguém para estudar com você.
Conexões deste capítulo
Veja o que estudar antes e para onde seguir depois, explore os conceitos e compare abordagens em outros cursos. Sugestões marcadas como “sugerido pelo grafo” vêm dos assuntos em comum, não do índice do curso.
Estude antes
- CursoClaude Code CLI: Programação com IA
- Veja o que o Claude Code faz antes de instalarsugerido pelo grafoApresenta o conceito “Claude Code”, usado em “Estruturar o projeto de vídeo para o Claude Code operar sem improvisar”.
- CursoAstra profundosugerido pelo grafoA quinta parte do Astra planeja o vídeo e edita o material bruto com o modelo dirigindo a ferramenta. O curso de vídeo com IA aprofunda esse trabalho com Claude Code, Codex e ElevenLabs, do roteiro à publicação. O grafo já sugeria esta ordem pela regra de entrada da trilha; com a ordem anterior curada, ela passa a ser declarada (Etapa 4, wave 3).
- CursoSetup Completo: do zero ao Claude Codesugerido pelo grafo7 capítulos de “Vídeo com IA: Claude Code, Codex e ElevenLabs” usam conceitos apresentados em “Setup Completo: do zero ao Claude Code”.
Depois, siga para
- CursoFrontends com Vibecodingsugerido pelo grafo21 capítulos de “Frontends com Vibecoding” usam conceitos apresentados em “Vídeo com IA: Claude Code, Codex e ElevenLabs”.
- CursoDo Agile ao Agentic Operating Modelsugerido pelo grafo5 capítulos de “Do Agile ao Agentic Operating Model” usam conceitos apresentados em “Vídeo com IA: Claude Code, Codex e ElevenLabs”.
- CursoAgentes de IA Autônomos: Do Conceito à Produçãosugerido pelo grafo7 capítulos de “Agentes de IA Autônomos: Do Conceito à Produção” usam conceitos apresentados em “Vídeo com IA: Claude Code, Codex e ElevenLabs”.
- CursoLLM FinOps: o custo da IA para quem assina o orçamentosugerido pelo grafo4 capítulos de “LLM FinOps: o custo da IA para quem assina o orçamento” usam conceitos apresentados em “Vídeo com IA: Claude Code, Codex e ElevenLabs”.
Conceitos deste capítulo
O mesmo assunto em outros cursos
- Claude Code CLI: Programação com IARevisar o plano antes de agir e ligar suas ferramentasExaminar conexões de Revisar o plano antes de agir e ligar suas ferramentas
- Setup Completo: do zero ao Claude CodeVeja o que o Claude Code faz antes de instalarExaminar conexões de Veja o que o Claude Code faz antes de instalar
- Skills de IA com Vibecoding e TerminalOrquestração Persistente: OpenClaw e Agentes que Vivem 24/7Examinar conexões de Orquestração Persistente: OpenClaw e Agentes que Vivem 24/7
- Bastidores: Como Este Portal Foi ConstruídoAgentes em worktrees: produção em paraleloExaminar conexões de Agentes em worktrees: produção em paralelo
Voltar ao capítulo anterior: Montar vídeo em HTML com HyperFrames e escolher entre ele e o Remotion
Leve uma ideia para a prática
Escolha uma atividade no painel e volte a este curso quando quiser.
Atividades e evolução ficam reunidas no painel da sua conta.
Laboratórios ao vivo deste curso
Cada laboratório monta a biblioteca real dentro da aula, com controles para você mexer e o código do exemplo para copiar. O texto de reserva descreve a demonstração para quem lê sem JavaScript. O link abre o capítulo já no ponto do laboratório.
MediaRecorder, Canvas 2D e Long Animation Frames (plataforma)
Grave a cena em tempo real e veja os quadros que se perdem
Suba as partículas, force um bloqueio de 300 ms e grave seis segundos; compare com o render quadro a quadro desta aula.
Pacote
Abrir no capítuloMontar vídeo em HTML com HyperFrames e escolher entre ele e o Remotionsem pacoteMotion
Ver agentes em paralelo trocando mensagens numa linha do tempo
Reproduza a cena, percorra o tempo pelo controle e compare o tempo de parede com a soma das barras de cada agente.
Pacote
Abrir no capítuloParalelizar cenas com subagentes sem estourar o limite das APIsmotionReact (sem dependência extra), com as APIs do Veo e do fal.ai
Prompt de vídeo em cinco camadas, pronto para a API
Escolha plano, câmera, luz, ação e áudio e copie o prompt e o JSON para o Veo ou para o fal.ai.
Pacote
Abrir no capítuloEscrever prompt de vídeo em cinco camadas e manter o personagem consistentereactReact (sem dependência extra), com o comando para o FFmpeg
Corte o vídeo apagando palavras da transcrição
Aperte as palavras para removê-las, ligue a remoção de pausas e copie o comando FFmpeg e a legenda SRT gerados.
Pacote
Abrir no capítuloRemover pausas e reenquadrar o vídeo de 16:9 para 9:16 com legenda por palavrareactReact (sem dependência extra)
Quanto custa cada etapa do seu pipeline de vídeo
Troque a ferramenta de cada etapa e o percentual de b-roll e veja qual etapa pesa no custo por minuto e por vídeo.
Pacote
Abrir no capítuloOrquestrar o pipeline com etapas idempotentes e teto de gastoreact
Capítulos vizinhos em Vídeo com IA: Claude Code, Codex e ElevenLabs
- 05Montar vídeo em React com Remotion e renderizar na sua máquina ou na AWS
- 06Montar vídeo em HTML com HyperFrames e escolher entre ele e o Remotion
- 07Estruturar o projeto de vídeo para o Claude Code operar sem improvisar
- 08Instalar e invocar skills de vídeo no Claude Code
- 09Conectar fal, Replicate e ElevenLabs por MCP com permissões mínimas