Communitygithub.com

Finderchangchang/promo-video-skill

Skill para criar vídeos promocionais verticais com baixo custo (LLM → Remotion). Para software/alimentação/e-commerce/educação/beleza/viagens. Bilíngue zh/en. O README contém exemplos em PNG por setor.

O que é promo-video-skill?

Este skill permite que um agente de IA (como Claude Code, Cursor ou Codex) crie vídeos promocionais verticais de alta qualidade para produtos ou serviços, usando o LLM para planejar o roteiro e storyboard, e o Remotion para renderizar o vídeo final. O usuário (desenvolvedor) não precisa escrever código, apenas 'escolher cenas' e 'preencher textos' em um arquivo JSON estruturado (storyboard.json). O skill suporta 6 setores pré-definidos (software, food, ecommerce, education, beauty, travel) e é bilíngue (chinês/inglês). O fluxo principal envolve: definir o setor e idioma, ler um brief do produto (perguntando informações faltantes), selecionar 5-9 tipos de cena de um catálogo de 18 opções, escrever legendas curtas (estilo TikTok), e gerar o vídeo. Um validador integrado (Node.js) verifica regras de compliance (limites de caracteres, proibições de palavras absolutas, consistência de dados, regras por setor) e levanta erros, avisos e itens para revisão humana. O skill é ideal para times de marketing, growth ou produto que precisam de um fluxo rápido e consistente para prototipar e gerar vídeos promocionais sem depender de editores tradicionais. Ele usa Node 22 e Python 3.10 para execução.

Funciona com~Claude Code~Codex CLI~Cursor
npx skills add Finderchangchang/promo-video-skill

Perguntar na sua IA favorita

Abre um novo chat com esta habilidade de agente já pré-carregada.

Documentação

Product Promo Video (promo-video)

Skill para fazer vídeos promocionais verticais polidos, com baixo custo (LLM → Remotion). Apenas escolha cenas e preencha textos. Não escreva código, não modifique arquivos em template/, scripts/, industries/, não insira coordenadas, frames, valores de cor.

Abaixo, <SKILL> = diretório onde este arquivo está. Comandos rodam com Node 22 / Python 3.10. Para falantes de inglês ou vídeo em inglês → leia <SKILL>/SKILL.en.md.

Fluxo

  1. Definir setor e idioma.
    • meta.industry: software (padrão) / food / ecommerce / education / beauty / travel. Escolher o setor errado fará com que as cenas disponíveis e regras de compliance estejam incorretas.
    • meta.lang: zh (padrão) / en. Se o vídeo precisar de legendas em inglês ou o usuário for falante de inglês, defina en (uso explicado no passo 5).
    • Se o setor não for software → primeiro leia <SKILL>/industries/<industry>/recipe.md (para projetos em inglês, leia recipe.en.md): contém combinações de cenas recomendadas, brief-template.md (perguntas do brief para este setor), test-brief.md/expected.md (exemplos de violações de compliance). Pular este passo leva a conteúdo bloqueado.
  2. Ler o brief. Entenda as seções do brief-template.md correspondente; se faltar "nome do produto / proposta de valor em uma frase / cenário de dor / ação principal / 2–4 pontos fortes", pergunte primeiro, não invente dados e funcionalidades.
    • meta.product = nome exato do produto do brief. Use apenas este nome em todo o vídeo (hook, endCard). O brand no endCard deve ser idêntico.
    • meta.action: obrigatório. Uma frase: "o que o usuário faz → o que o produto fornece" (ex.: "tirar foto do comprovante → valores e categorias preenchidos automaticamente"), sem descrição visual. Cenas de demonstração (chat/phone/mockApp/photoShot) devem refletir esta ação no texto da tela; a validação verificará.
    • Se o brief tiver "como obter" → escreva em meta.cta, e o cta no endCard deve ser idêntico. Se o brief disser "nenhum" → não escreva em nenhum dos dois. Não invente "baixe na loja XX".
    • Funcionalidades não mencionadas no brief não devem aparecer nos pontos fortes nem no endCard.
    • Se o brief tiver "números e fontes" → copie cada um em meta.facts, formato [{"id":"f1","text":"texto original…"}] (não é array de strings simples). Qualquer número com unidade na tela (duração, porcentagem, múltiplo, quantidade, valor monetário) deve ter o mesmo número aqui. Sem fonte → erro, não aviso. Se não houver dados, use texto qualitativo, não invente números. O campo params.refs: ["f1"] em uma cena pode associar uma afirmação (ex.: "feito na hora") a um fato, para verificação de regras do setor.
    • Todo o vídeo deve usar apenas um número para a mesma duração: se o counter diz "3 minutos", não pode haver "segundos" ou "3 seg" em outro lugar. Se o hook diz "meio dia", o valor antigo do counter também deve ser "meio dia". A validação bloqueará. Em compare, os stat e items de uma mesma coluna não podem ser contraditórios (ex.: coluna esquerda com "5 minutos" e "três dias").
    • Para sobrescrever a faixa de duração padrão de 15–45 segundos (ex.: estrutura recomendada pelo setor exige >27s), use meta.durationRange: [15, 60] (array de dois elementos).
    • Se precisar de texto fixo no rodapé (ex.: "Oferta por tempo limitado. Consulte página de detalhes do grupo"), use meta.notices: array de strings, máximo 3 itens, exibido em uma linha no rodapé.
  3. Criar diretório: promo/<nome_do_produto_em_ingles>/, storyboard em promo/<nome_do_produto_em_ingles>/storyboard.json. Capturas de tela, gravações de tela, logotipos fornecidos pelo usuário → copiar para o mesmo diretório.
  4. Escolher tema (meta.theme):
    • Emocional, social, estilo de vida → warm-emotion
    • Desenvolvedores, IA, ferramentas avançadas → tech-dark
    • Saúde, aprendizado, controle financeiro, ferramentas leves → fresh-light
    • Escritório, B2B, produtividade → business-blue
    • Festas, promoções, lançamentos → festival-red
    • Premium, minimalista, design → mono-premium Se houver cor da marca, use meta.brandColor (#RRGGBB); ela altera apenas a cor de destaque.
  5. Escolher 5–9 cenas (descrição das cenas em <SKILL>/shots.md; tabela resumo das 18 cenas no topo). hook deve ser a 1ª cena (2–3s), endCard a última (4s). Deve haver pelo menos uma cena demonstrando a ação principal (passo 2, meta.action); a validação bloqueará:
    • chat: escreva messages + panel (pergunta → resposta); ou mockApp: escreva input (entrada/pergunta do usuário) + resultado (dashboard stat, editor items, done). Se houver captura de tela, use phone.
    • meta.industry determina quais cenas estão disponíveis (veja industries/<industry>/rules.json para enabledShots, ou diretamente o recipe.md). Selecionar cenas não permitidas causará erro na validação. 7 cenas específicas por setor (software não as habilita por padrão):
      • photoShot: fotos/vídeos reais (pratos, produtos, obras, quartos, áreas comuns, cozinha)
      • priceCard: cardápio/preços; storeCard: loja/mapa/reserva; reviewCard: avaliações reais de clientes (citação exata, sem exageros)
      • factSheet: ficha técnica/lista de itens/grade curricular/informações de exame/amostra de cores; credCard: credenciais/premiações
      • beforeAfter: slider de antes/depois (apenas para beleza, requer consent:true + retouched:false)
    • Escolha cenas de acordo com o tipo de produto, não use template fixo. features (card de pontos fortes) não é obrigatório. Dois requisitos (validação alertará):
      • Pelo menos uma cena do meio deve vir de {compare, steps, phone, meter};
      • quickList e counter não podem ser usados juntos (ambos resultam em hook → quickList → mockApp → counter → endCard, um template genérico).
    • Para setor software, combinações opcionais (escolha uma e adapte ao produto; outros setores sigam industries/<industry>/recipe.md):
      • B2C emocional/social (chat, emoção, companhia): hook(bubble) → chat demo (2–3 legendas) → meter ou compare mostrando o impacto → quickList → endCard
      • Ferramenta de produtividade (escrita, finanças, postagem, edição): hook(stat) → compare "antes vs. agora" → mockApp editor/form demo "entrada → resultado" → steps "como usar" → endCard; ou hook → quickList mostrando problemas → mockApp → steps → endCard
      • B2B dados/escritório (relatórios, reuniões, CRM): hook(icon) → phone com captura anotada ou mockApp dashboard com input "pergunte → dados" → compare ou meter mostrando resultado → steps → endCard; use counter apenas se o brief der números de tempo (e então não use quickList)
    • Duração total ideal: 20–30s (permitido 15–45s, ou faixa personalizada em meta.durationRange). Não use o mesmo tipo de cena consecutivamente. A diferença de mood entre duas cenas adjacentes não deve exceder 0.5 (insira uma cena de transição intermediária), caso contrário o fundo cortará abruptamente.
  6. Escrever legendas (caption de cada cena): uma frase por cena, letras grandes estilo TikTok, falando para o espectador, não descrevendo animações (❌ "cards aparecem um por um, mostrando o que ele faz" é descrição de cena, não legenda).
    • Chinês: máximo 2 linhas, use \n para quebra; cada linha ≤12 caracteres chineses (letras/números contam como meio). Para meta.lang: "en", legendas em inglês seguem limite de caracteres latinos (~1.8x o limite chinês; ver docs/shots/<type>.en.md).
    • Use {} para destacar 2–5 caracteres mais importantes (cor de destaque); no máximo 1 ocorrência por legenda.
    • caption do hook = título da capa; escreva o problema do usuário ou uma pergunta contra-intuitiva.
    • endCard não usa caption; o slogan vai em params.slogan.
    • Cada legenda pode ficar na tela no máximo 5 segundos. Para cenas >5s (ex.: chat 8–10s), escreva caption como array de 2–3 frases, dividindo igualmente a duração: "caption": ["Não saia sem entender,\nele quer {sua atenção}", "Escolha uma e preencha,\n{decida você}"]
    • As legendas devem falar da situação do usuário ou da mudança que o produto traz, e se conectar com as cenas anterior e posterior. A animação é responsabilidade do componente, não precisa ser descrita. Palavras entre «» na legenda devem ter aparecido na tela nesta cena ou em cena anterior (validação bloqueará).
    • Se a legenda menciona quantidade ("estes 4 itens", "três respostas"), deve corresponder ao número de itens na cena (validação bloqueará).
    • Evite frases genéricas ("três coisas, {ele…}", "estes três passos", "esses momentos, você também…") e não copie legendas/parâmetros dos exemplos, shots.md ou especificações; a validação alertará e fornecerá um modelo para preenchimento direto. Exemplos servem apenas para mostrar formato.
    • Não repita caracteres ("排期排期"), não remova caracteres para caber no limite ("卡脖子" → "卡脖"), não escreva erros de digitação ("登陆" = "登录", a menos que seja literalmente navio de desembarque/lua). Se ultrapassar o limite de caracteres, reformule toda a frase.
    • Evite linguagem absoluta ("resolve tudo", "cristalino", "100% seguro"): o produto dificilmente cumpre; a validação alertará; substitua por termos moderados.
    • Use apenas uma barra invertida \n para quebra de linha; use «» para aspas na legenda, não ".
  7. Escrever mood (0–1): dor/tensão 0.8–1, virada 0.5, produto e pontos fortes 0–0.3, endCard 0. A cor do fundo e a trilha sonora acompanham este valor.
  8. Escrever storyboard.json (formato no exemplo completo no final). Duração em dur (segundos), múltiplos de 0.5. O arquivo deve estar em UTF-8. Windows em chinês usa GBK por padrão: use editor/ferramenta de escrita de arquivo que suporte UTF-8; no PowerShell use [IO.File]::WriteAllText($p, $json, [Text.UTF8Encoding]::new($false)); no Python use open(p, "w", encoding="utf-8"). Não use echo > ou Out-File (versão 5.1) para escrever chinês. No chat, panel.replies são sugestões do produto "eu" envia para a outra pessoa; escreva do ponto de vista do "eu" (se eu digo que preciso fazer hora extra, a resposta sugerida não deve ser "não faça hora extra, fique comigo" — isso é do ponto de vista do outro). Se houver panel, não use typing.
  9. Validar, corrigindo cada erro até passar:
    node <SKILL>/scripts/validate.mjs promo/<nome>/storyboard.json
    
    Formato do erro: "cena N (tipo) campo: problema → como corrigir". Siga "como corrigir". Resultado em três níveis:
    • Erros (errors): devem ser corrigidos; sem correção, não gera vídeo.
    • Avisos (warnings): tente corrigir (qualidade do texto, estrutura não muito similar a template); se não der, ainda gera vídeo, mas na entrega explique ao usuário por que não foi corrigido.
    • Revisão humana (human): itens que a validação não consegue julgar (ex.: "esta avaliação é realmente uma citação exata?", "esta credencial é realmente do brief?"). Não altere o storyboard, apenas liste para o usuário confirmar.
  10. Gerar vídeo (~2 minutos, a trilha sonora é gerada automaticamente):
    node <SKILL>/scripts/make.mjs promo/<nome>/storyboard.json --out promo/<nome>
    
    --out é obrigatório (para testes, use --round <rodada>, os artefatos vão para tests/<rodada>/<nome>/; vários vídeos da mesma rodada usam o mesmo nome de rodada, não crie diretórios com timestamp manualmente). Artefatos: video.mp4, sheet.png (mosaico de um frame por segundo), check/ (frame 0 + frame full-size antes do fim de cada cena), report.txt (relatório de layout de texto: quebra de palavras, estouro de largura), layout.json. Para ver rapidamente alguns frames: adicione --stills 0,3.5,8 (em segundos); apenas gera frames, não o vídeo completo.
  11. Primeiro veja o final de report.txt ("autoverificação", "relatório de layout de texto", "autoverificação de layout" — o make.mjs faz automaticamente: verifica barras invertidas, nome do produto, forma de obtenção, tempo de exibição da legenda, ícone do endCard e texto de aviso não se sobrepõem, linhas quebradas/largura excedida; durante a renderização mede a posição de cada bloco de texto, verificando se o texto é cortado por cards, blocos se sobrepõem, texto sai da área x150–930). Corrija qualquer ✗ (✗ de layout geralmente é causado por muitos itens ou texto longo demais: remova itens ou encurte o texto). Depois veja sheet.png e check/ e faça a autoinspeção abaixo; se houver problemas, corrija storyboard.json e volte ao passo 9.
  12. Entrega: forneça ao usuário o caminho de video.mp4 e sheet.png, junto com a "lista de verificação pré-publicação" (abaixo) — itens do passo 9 marcados como "revisão humana" devem ser listados exatamente como estão, para o usuário confirmar um por um. Não decida pelo usuário.

Lista de Autoinspeção (veja o mosaico, escreva conclusões para cada item, não apenas marque)

  • O frame 0 já tem título grande + visual principal, não está em branco ou cortado; a capa não tem \n, barras invertidas ou caracteres estranhos
  • Cada cena tem um protagonista animado (ponteiro, número, card, bolha de chat), não é uma imagem estática; não é "zoom in/out de imagem" para preencher
  • As legendas não cobrem o elemento principal, não são cortadas, não quebram palavras (uma palavra partida em duas linhas); legenda e tela falam da mesma coisa, a história das cenas se conecta
  • As legendas falam para o espectador, não são descrições de cena (não aparecem frases como "cards aparecem um por um")
  • A ação principal está realmente demonstrada (vê-se "entrada/pergunta → resultado"), não apenas um painel pronto
  • Cor de fundo muda com a emoção: dor tende a vermelho, pontos fortes e endCard tendem a cores frias
  • Nome do produto no endCard = meta.product; forma de obtenção = texto original do brief ou nenhum; sem URLs, QR codes
  • Números consistentes: recalcule os números do compare (30 min vs. 5s → conclusão não pode ser "economizou 25 minutos"); números na tela devem ter fonte em meta.facts
  • Sem erros de digitação, sem palavras inventadas removendo caracteres para caber no limite ("自动上传" não pode virar "自传"), sem linguagem absoluta
  • Cenas específicas do setor usadas corretamente: beforeAfter apenas em beleza; reviewCard com citação exata, sem exageros

Lista de Verificação Pré-Publicação (entregue ao usuário, não apenas para sua própria conferência)

  1. Liste todos os itens de "revisão humana": a lista human do passo 9 de validação, copie exatamente para o usuário, não decida por ele "deve estar tudo bem". Comuns: citações em reviewCard/credCard são idênticas ao brief? Regras da plataforma foram atualizadas? Qualificações do setor estão completas?
  2. meta.industry está correto? (se não, cenas disponíveis e regras de compliance estarão erradas).
  3. Para aparições de pessoas reais, avaliações de clientes, fotos antes/depois: já obteve consentimento por escrito? (campos como consent/retouched são apenas exigência de validação; obter consentimento real é responsabilidade do usuário, não da validação).
  4. A plataforma de destino (Douyin/WeChat Video/Xiaohongshu/exterior) coincide com meta.platform? As regras específicas da plataforma (ex.: carrinho de compras não pode ter legenda de preço) já foram verificadas?
  5. Projetos bilíngues (zh/en): as legendas em inglês foram revisadas por um falante nativo? A máquina só verifica contagem de caracteres e palavras sensíveis, não detecta expressões estranhas.

Regras Rígidas (validação bloqueará)

  • 1ª cena deve ser hook; endCard deve ser a última
  • Duração total entre 15–45s (ou faixa personalizada em meta.durationRange); cada tipo de cena tem sua própria faixa de duração (ver shots.md)
  • Cada campo tem limite de caracteres; se ultrapassar, reformule a frase inteira para uma mais curta; não remova caracteres de dentro da palavra para caber, nem mude para inglês (para meta.lang: "en", o inglês tem seu próprio limite de caracteres, ver documentação do campo)
  • Use apenas os campos, valores opcionais e nomes de ícones listados em shots.md; nomes errados ou campos extras causarão erro
  • Pelo menos uma cena demonstra meta.action (ver passo 5); cada legenda pode ficar no máximo 5 segundos na tela
  • brand no endCard = meta.product; cta no endCard = meta.cta (se o brief não fornecer, nenhum dos dois terá cta)
  • O texto na tela não pode conter barras invertidas literais (no JSON, \\n aparecerá literalmente na tela)
  • Na tela não pode aparecer: URLs, QR codes, "escaneie", @contas, "XX号: nome", "siga/pesquise XX号". Palavras da própria categoria do produto (ex.: ferramenta de formatação de "公众号" WeChat Official Account) não são consideradas desvio de tráfego: adicione a palavra a meta.allowWords. Não altere o nome do produto para passar na validação.
  • Proibido usar palavras de propaganda absoluta da Lei de Publicidade: "o mais", "primeiro", "único", "primeiro", "preferido", "exclusivo", "top", "absoluto", "100%", "em toda a rede", "muito à frente"... (exceções: "recentemente", "último", "primeiro passo" não contam). Se houver fundamento real, adicione a meta.allowWords.
  • Números com unidade (duração/porcentagem/múltiplo/quantidade/valor monetário) devem ter o mesmo número em meta.facts; sem fonte, é invenção, e será erro.
  • Regras do setor têm três níveis: block (bloqueia) — ex.: alegação de eficácia de procedimentos estéticos, preço com desconto sem base legal, avaliação real sem mês; warn (avisa, mas não bloqueia); human (validação não decide, lista para usuário na entrega — ver item 1 da "Lista de Verificação Pré-Publicação").
  • Caminhos de assets relativos ao diretório do storyboard.json; arquivos devem existir. Capturas de tela suportam png/jpg/webp; gravações de tela suportam mp4.

Proibições

  • Não modifique arquivos em template/, scripts/, industries/; não escreva coordenadas, pixels, números de frame, valores de cor, CSS
  • Não invente dados ou fontes que o usuário não forneceu; números na tela devem estar em meta.facts; sem fonte, escreva "dados de exemplo, consulte situação real"
  • Não use nomes, logotipos ou cores características de aplicativos de terceiros (ex.: bolha verde de um app de chat); refira-se como "outra pessoa", "colega", "cliente"
  • Não use nomes reais de pessoas, números de telefone, contas
  • Não use o campo bgm (make.mjs o preenche automaticamente)
  • Não decida por conta própria sobre áreas cinzentas de compliance do setor (ex.: "esta frase conta como termo médico?"): se a validação bloquear, corrija; se a validação permitir mas você estiver em dúvida, inclua em "revisão humana" para o usuário, não decida sozinho que "deve estar tudo bem"

Erros Comuns e Como Corrigir

ErroComo corrigir
Linha N … caracteres, máximo 12 por linhaEncurte, ou use \n para quebrar em duas linhas em pausa semântica
Usou 2 pares de {} para destaqueDeixe apenas o mais importante
{} sem fechamentoCada { deve ter } correspondente, e não pode cruzar linhas
Contém palavra absoluta da Lei de Publicidade "mais"Substitua por afirmação verificável: "mais rápido" → "resultado em 3 segundos"
1ª cena deve ser hookAdicione hook no início
Cena endCard não pode ter legendaRemova caption, texto grande vai em params.slogan
Campo desconhecidoVeja "campos disponíveis" no erro, corrija ortografia (ex.: mockApp usa kind, não variant)
Não existe ícone chamado "xx"Escolha da lista de ícones no topo de shots.md
Duração total … deve estar entre 15–45sAdicione/remova cenas, ou altere dur
Arquivo de asset não encontradoVerifique caminho relativo ao diretório do storyboard.json
Falha ao analisar JSON: linha NVeja a linha: vírgula faltando, vírgula sobrando no final, legenda com aspas duplas inglesas (troque por «»)
Esta legenda ficará na tela por N segundosEscreva caption como array de 2–3 frases, ou divida esta cena em duas
Nenhuma cena demonstra a ação principalAdicione chat (pergunta → resposta no panel) ou mockApp (input + resultado)
Nome do produto no endCard é diferente de meta.productAltere brand para ser idêntico a meta.product
cta foi escrito, mas meta.cta está vazioSe o brief tiver forma de obtenção, escreva em meta.cta e depois copie; senão, remova cta
Contém \n literal no textoNo JSON, quebra de linha é apenas uma barra invertida \n
Contém nome de plataforma "公众号" (aviso)Se for categoria do produto: adicione a meta.allowWords; se for desvio de tráfego: remova
Campo obrigatório meta.action ausenteEscreva "o que o usuário faz → o que o produto fornece"
Número sem fonte em meta.factsSe o brief forneceu o número, copie exatamente em meta.facts (formato {"id":"f1","text":"…"}). Se não forneceu, substitua o número específico por texto qualitativo
Legenda contém descrição de cena (ex.: "cards aparecem um por um")É legenda para o espectador, não instrução de edição. Substitua por uma frase na perspectiva do usuário
"登陆" é erro de digitação, deveria ser "登录"Corrija para "登录" (exceção: "登陆舰/登陆月球" não conta)
"一清二楚" é promessa absolutaSubstitua por termo moderado, ex.: "informações-chave visíveis"
Setor "XX" não permite cena "YY"Troque por uma cena permitida para este setor, ou verifique se meta.industry está correto
[B-xxx] Viola regra de compliance do setorSiga o "como corrigir" na mensagem de erro; apenas para palavras absolutas com fundamento real, considere meta.allowWords (válido apenas para nível warn; nível block deve remover)

Quando Não Há Captura de Tela Real

Prefira usar cena mockApp (ela é animada). Se for absolutamente necessário mostrar "clicar aqui no celular", primeiro renderize um mockApp como screenshot de exemplo e depois use em phone:

cd <SKILL>/template
npx remotion still src/index.ts Screen <caminho_absoluto_do_diretorio_da_cena>/screen.png --frame=145 --props=<caminho_absoluto_do_diretorio_da_cena>/screen-props.json

screen-props.json deve conter {"type":"mockApp","theme":"<tema>","dur":5,"params":{...params do mockApp...}}. Consulte <SKILL>/examples/_src/screen-props.json. Em seguida, na cena phone, use "src": "screen.png" e adicione em meta.disclaimer: "Tela de demonstração, conteúdo simulado".

Mais Exemplos (estruturas variadas; escolha pelo tipo de produto, não copie legendas)

  • <SKILL>/examples/jev.json: B2C emocional, setor software (chat demo com 2 legendas → dashboard → quickList → endCard; obtenção: "baixe a versão Android no site oficial")
  • <SKILL>/examples/ledger.json: Ferramenta de produtividade, setor software (quickList de problemas → compare → mockApp foto do comprovante → resultado → counter → endCard; brief sem forma de obtenção → sem cta no endCard)
  • <SKILL>/examples/meeting.json: B2B escritório, setor software (captura de tela anotada → mockApp dashboard → counter → steps → endCard; obtenção: "solicite teste gratuito no site oficial")
  • <SKILL>/examples/en-focus.json: Exemplo em inglês (meta.lang: "en", app fictício, mostra como escrever legendas em inglês)
  • Outros setores (food/ecommerce/education/beauty/travel): exemplos de compliance em industries/<industry>/test-brief.md + expected.md: test-brief é um brief de exemplo, expected mostra quais partes do storyboard baseado neste brief seriam bloqueadas e por quê. Recomendado ler ambos antes de criar o primeiro vídeo para um novo setor.

Exemplo Completo (examples/ledger.json, passa na validação diretamente)

{
  "meta": {
    "title": "App Controle Financeiro - Vídeo Promocional (Dor → Produto → 3 Pontos Fortes → EndCard)",
    "product": "App Controle Financeiro",
    "theme": "fresh-light",
    "disclaimer": "Tela de demonstração, dados são exemplos",
    "action": "Tirar foto do comprovante → valores e categorias preenchidos automaticamente",
    "facts": [
      {"id": "f1", "text": "Usuários de teste economizaram cerca de R$ 120 a mais este mês comparado ao mês anterior (dados de exemplo)"},
      {"id": "f2", "text": "Exemplo de livro contábil: delivery R$ 180, café/refri R$ 30, assinatura automática esquecida R$ 19,90, corrida noturna R$ 45 (dados de exemplo)"},
      {"id": "f3", "text": "Lançamento manual leva em média 5 minutos; com este app, foto do comprovante leva cerca de 10 segundos (dados de exemplo)"},
      {"id": "f4", "text": "Resultado da leitura: almoço R$ 38,50, orçamento de alimentação deste mês já usado 62% (dados de exemplo)"}
    ]
  },
  "shots": [
    {
      "type": "hook",
      "dur": 2.5,
      "caption": "Salário caiu,\nmas no fim do mês {sumiu tudo}",
      "mood": 0.85,
      "params": {"visual": "stat", "text": "R$ 0,00", "sub": "Onde foi parar este mês?", "badge": "Tire foto do comprovante e pronto", "tone": "bad"}
    },
    {
      "type": "quickList",
      "dur": 3.5,
      "caption": "Onde foi parar o dinheiro?\n{Mal lembro de nada}",
      "mood": 0.8,
      "params": {
        "title": "Destinos do Mês",
        "items": [
          {"text": "Delivery", "tag": "R$ 180", "tone": "bad", "icon": "bell"},
          {"text": "Café/Refri", "tag": "R$ 30", "tone": "warn", "icon": "heart"},
          {"text": "Assinatura automática esquecida", "tag": "R$ 19,90", "tone": "bad", "icon": "calendar"},
          {"text": "Corrida noturna", "tag": "R$ 45", "tone": "warn", "icon": "clock"}
        ]
      }
    },
    {
      "type": "compare",
      "dur": 4.5,
      "caption": "Controlar gastos\n{é mais fácil do que parece}",
      "mood": 0.45,
      "params": {
        "mode": "lr",
        "left": {"title": "Manual", "items": ["Lançamento um por um", "Categoria? Adivinha", "Desisto no fim do mês"], "tone": "bad", "icon": "doc", "stat": "5 minutos", "level": 8},
        "right": {"title": "App Controle", "items": ["Foto do comprovante automática", "Categorias preenchidas", "Resumo mensal com um clique"], "tone": "good", "icon": "bolt", "stat": "10 segundos", "level": 2},
        "meterLabel": "Nível de Dificuldade",
        "verdict": "Lançar um gasto leva apenas 10 segundos"
      }
    },
    {
      "type": "mockApp",
      "dur": 4.5,
      "caption": "Tire foto do comprovante,\n{valor e categoria já preenchidos}",
      "mood": 0.25,
      "params": {
        "kind": "editor",
        "title": "Novo Lançamento",
        "source": "Dados de exemplo, não são faturas reais",
        "input": "Foto: comprovante de almoço",
        "button": "Reconhecer",
        "items": [
          {"text": "Almoço R$ 38,50"},
          {"text": "Estabelecimento: Padaria do Bairro"},
          {"text": "Categoria: Alimentação (automático)"},
          {"text": "Orçamento de alimentação usado: 62%"}
        ],
        "highlight": 3,
        "done": "Lançado!"
      },
      "note": "Demonstração da ação principal: usuário tira foto → app retorna valor, estabelecimento e categoria"
    },
    {
      "type": "counter",
      "dur": 3,
      "caption": "Fim do mês,\n{surpresa: sobrou dinheiro!}",
      "mood": 0.1,
      "params": {"to": 120, "prefix": "R$ ", "label": "Economia extra neste mês", "sub": "Dados de exemplo, resultados variam", "icon": "money", "tone": "good"}
    },
    {
      "type": "endCard",
      "dur": 4,
      "mood": 0,
      "params": {
        "brand": "App Controle Financeiro",
        "slogan": "Cada centavo gasto,\n{você sabe exatamente onde foi}",
        "points": ["Foto do comprovante = lançamento automático", "Livro contábil só no seu celular"],
        "icon": "money"
      }
    }
  ]
}

Habilidades Relacionadas