video-talkcraft — Skill para Vídeos de Apresentação Oral
Três fontes combinadas: Pipeline (narração → timestamps de caractere → Remotion) + Vocabulário (108 cartas de efeitos de motion design, todas com demo reproduzível + tsx autocontido) + Enquadramento (sistema anti-PPT de 7 camadas) + Linguagem Visual (Apple paradigm padrão).
Paradigma central: a narração dirige o visual; cada frase deve ter uma resposta visual viva (câmera extremamente lenta push/pull / mudança nos elementos existentes), mas novos elementos só entram nos limites das unidades semânticas, proibindo o mecânico 'um novo elemento por frase' (um elemento por frase é a raiz da desordem e do acúmulo; o storyboard é cortado por parágrafos semânticos, com orçamento de layout descrito em cinematography.md §4.5); cada batida tem apenas um protagonista, que cede o lugar após terminar; os limites das frases das legendas são os âncoras temporais de todo o vídeo.
Fluxo
① Roteiro → ② Entrada de narração + timestamps (CPU local) → ③ Materiais → ④ Matriz de camadas SHOTBOOK → ⑤ Implementação (sistema global → primeiro quadro feito primeiro e confirmado → quadros restantes)
→ ⑥ Renderização → ⑦ Tripla validação (todas as verificações automáticas aprovadas + 1 rodada de revisão e correção de P0/P1) → ⑧ Entrega (revisão opcional ≤3 rodadas)
⓪ Verificação Inicial: Dependências Unificadas + Proporção e Linguagem Visual
Apenas um conjunto de dependências: todos os remotion/node_modules e workbench/node_modules dos projetos de narração são links simbólicos para <raiz-do-skill>/runtime/node_modules, com versões fixadas apenas em runtime/package.json (toda a família @remotion/* com o mesmo número). Primeira coisa ao iniciar um novo vídeo (usuário decidiu em 2026-09-15: verificar atualizações sempre que fizer um novo vídeo):
bash <raiz-do-skill>/runtime/check-runtime.sh --upgrade # Instala dependências compartilhadas + navegador headless compartilhado + linka o workbench; se houver nova versão do Remotion, atualiza toda a família e renderiza 1 frame como teste, se falhar, reverte automaticamente
Só prossiga se a última linha for [runtime] OK; se houve upgrade, comite as alterações em runtime/package.json / package-lock.json. Não atualize durante a produção (o cache dos segmentos mestres não reconhece versões de dependências, misturar versões resulta em segmentos inconsistentes). Nunca execute npm install no diretório do projeto (isso escreveria no diretório compartilhado); para adicionar um pacote → adicione em runtime/package.json, execute npm ci, e comite.
Proporção e Linguagem Visual (definir antes de começar, referenciar em todo o fluxo)
- Proporção padrão: 1920×1080 horizontal (preferência do usuário); use 1080×1920 apenas para Douyin / canais verticais
- Linguagem visual: se o usuário especificou um estilo, siga-o (substituição completa de tokens); se não, primeiro determine o domínio a partir do roteiro de narração e derive o perfil de estilo para este vídeo (
references/design-language.md§0: leia o roteiro completo e responda "O que está sendo dito / Para quem / Em que tom" → domínio → tabela de perfis de estilo fornecendo estratégia de cor de fundo / cor de destaque / personalidade da fonte / textura e forma dos cards / linguagem de gráficos / personalidade dos materiais / nível de energia, escreva em SHOTBOOK §0G0 Perfil de Estilo), a estrutura ainda é o Apple Paradigm (uma cor de destaque / uma sombra projetada / cores de fundo alternadas para separar cenas / dois pesos de fonte / fundo de cena padrão: claropastel-mesh-flow/ escuromesh-flow-dark——12 fundos de cena em §1.1, códigotemplate/motion-systems/backdrop.tsx), os tokens derivados para este vídeo são colocados emtheme.ts. A única regra que se aplica a qualquer estilo: proibido escolher cores de quadro a quadro. Os cards são UI neutra; devem ser "vestidos" para o vídeo: os demos / tsx dos cards de efeitos são apresentações neutras e sem estilo. Ao copiá-los para o projeto, modifique sua aparência de acordo com o perfil de estilo (cores / fontes / cantos arredondados / texturas / eixos e marcadores de gráficos / gráficos de placeholder), não altere os pontos críticos do movimento (timing / easing / proporções geométricas / hierarquia), contrato e contraexemplos em design-language §0.4; cada quadro do SHOTBOOK deve ter uma linha de customização
① Roteiro de Narração
- Cada frase = um ponto de informação, gancho na primeira frase (números / conflito); 13 frases ≈ 95s
- Números sempre em caracteres chineses (os timestamps são ancorados caractere por caractere no texto,
197747não se alinha com a pronúncia de "十九万七千"); palavras de marcas em inglês escreva diretamente (alinhamento misto chinês-inglês já validado) - Primeiro pesquise e verifique os fatos, crie uma "lista vermelha de fatos" (números que não podem ser ditos errados / dados não verificados não cite)
② Entrada de Narração → Pré-edição → Timestamps em Nível de Caractere (Padrão: CPU Local; Opcional: Fish Audio)
Padrão: usar narração finalizada (gravação humana ou qualquer TTS); entrada = uma narração completa (wav/mp3) + um roteiro de narração idêntico palavra por palavra. Se não houver gravação e o usuário optar por síntese, use o Plano B abaixo; ele não substituirá a narração existente ou o fluxo de CPU local padrão.
②-0 Pré-edição da Narração (obrigatório para gravação humana; TTS só precisa remover respirações, pode pular)——Corte palavras de preenchimento (嗯 / 呃 / 那个…), gagueiras e repetições, pausas muito longas, execute antes de fazer os timestamps (se você mover o áudio depois de fazer os timestamps, o timing / beats ficará todo desalinhado; pré-edição → timestamps → todo o resto, a ordem não pode ser trocada):
python3 scripts/voice_trim.py audio/raw.wav script.json --dry-run --words-out audio/asr_words.json # Primeiro apenas gere um relatório: lista de [filler / repeat / pause] com início e fim + total cortado; resultado do ASR salvo em disco
python3 scripts/voice_trim.py audio/raw.wav script.json --words audio/asr_words.json --out audio/full.wav \
[--video dh/host_raw.mp4 --video-out dh/host.mp4] # Após aprovação do usuário, salve em disco (usa a lista de palavras da etapa anterior, não executa ASR novamente); o vídeo da mesma pessoa da mesma gravação é cortado usando o mesmo EDL (áudio e vídeo têm o mesmo comprimento quadro a quadro)
- O roteiro é a verdade; é melhor perder do que errar: corte apenas segmentos inseridos que não estão no roteiro no ASR——compostos inteiramente por palavras de preenchimento (filler), ou gagueiras / repetições que são iguais ao texto adjacente do roteiro (repeat); nunca corte caracteres que o ASR ouviu errado do roteiro (cortá-los cortaria a pronúncia real daquele caractere); repetições de reformulações fora do roteiro são apenas relatadas, cortadas apenas com
--cut-unmatched. Por padrão, a lista de palavras usa o FireRed (mesmo backend dos timestamps abaixo), mas também aceita SRT caractere por caractere (--srt) ou JSON em nível de palavra (--words) exportados do Jianying etc.; SRT em nível de frase não consegue localizar palavras de preenchimento, o script emitirá um aviso. Sem roteiro, corte apenas palavras de preenchimento cujo texto do token inteiro esteja exatamente na lista conservadora (嗯 / 呃 / 额 / um…)——comparação precisa por texto normalizado, não por som semelhante (五 ≠ 唔, 饿 ≠ 呃); palavras curtas repetidas adjacentes sem roteiro são apenas relatadas, não cortadas (sob tokens caractere por caractere, é impossível distinguir reduplicação de gagueira). Ao cortar um webm transparente gravado simultaneamente, decodifique um quadro para verificar o alpha; falha se o número de quadros corresponder, mas a transparência for perdida, considerado FAIL. - Pausas: silêncios ≥0.7s são comprimidos para 0.35s (mantenha o ruído ambiente real da janela mais silenciosa dentro do segmento, não adicione zeros digitais), deixe 0.25 / 0.5s de espaço no início e fim;
primeiro encontre o vale de energia para o ponto de corte, depois ajuste para a grade de 30fps;
cuts.jsoné o EDL (contém o mapa de origem → nova linha do tempo, usado para cortar o vídeo da pessoa e qualquer reconciliação futura). - O relatório dry-run deve ser mostrado ao usuário antes de salvar: itens marcados com "ponto de corte não está em silêncio, ouça"——o usuário ouve aquele ponto; o script apenas remove, não sintetiza, não altera velocidade ou tom.
Após cortar o vídeo da pessoa, execute
preflight.py --media-onlyda ③ para verificar a duração——o mesmo EDL só é válido para a mesma gravação.
Timestamps em nível de caractere (para audio/full.wav após a pré-edição):
# Plano A (gravação existente, alinhamento CPU local):
pip install zhconv pypinyin sherpa-onnx soundfile numpy # Todas as dependências para o backend padrão FireRedASR2-CTC int8
# Primeira vez: baixe o modelo 767MB (model.int8.onnx + tokens.txt) para ~/.cache/koubo/<nome-do-modelo>/, o endereço está no comentário do cabeçalho do script
python3 scripts/timestamps_cpu.py audio/full.wav script.json audio/timestamps.json
# Alternativa (evita baixar o modelo manualmente): pip install faster-whisper e adicione --backend whisper (primeira execução baixa automaticamente 460MB)
python3 scripts/make_timing.py audio/timestamps.json remotion/src/timing.json
# Plano B (opcional: gerar narração + timestamps, padrão solicita s2.1-pro-free; disponibilidade depende do Fish Audio):
pip install requests python-dotenv # Também precisa de ffmpeg, verificado antes da geração
# Configure FISH_AUDIO_API_KEY=xxx em .env e opcional FISH_AUDIO_REFERENCE_ID=xxx (veja .env.example)
python3 scripts/tts_fishaudio.py script.json audio/full.wav audio/timestamps.json --timing-out remotion/src/timing.json
- tts_fishaudio.py: padrão
--mode sentenceuma solicitação por frase, insere o silêncio real especificado por--pause-sec(padrão 0.25 segundos);--mode streamuma solicitação para o roteiro inteiro, mantém pausas naturais. Ambos recebem UTF-8 SSE, escrevem o arquivo somente após a conclusão da geração, não fornecem reprodução em fluxo. Primeiro decodifica PCM, depois concatena, deslocamento calculado por número de amostras. Relata erro para áudio vazio, alinhamento ausente/inválido ou texto incompatível; ignora apenas pontuação, maiúsculas/minúsculas e largura de caracteres, não converte automaticamente a leitura de números. Chinês usa âncoras em nível de caractere da API, inglês interpola dentro de tokens;match/okapenas confirma o mapeamento de texto, ainda requer audição. Se a narração gerada for pré-editada novamente, o alinhamento da CPU deve ser executado novamente. - timestamps_cpu.py: timestamps em nível de palavra do ASR → alinhamento caractere por caractere com o roteiro de narração (CJK são âncoras confiáveis, chave de correspondência = simplificado/tradicional unificado + pinyin sem tom, homófonos não são considerados erros; palavras latinas são frequentemente escritas incorretamente por vários ASRs, interpole entre âncoras) → verificação de qualidade match para cada frase, <0.90 marca para audição manual. Backend padrão FireRedASR2-CTC (mais estável no final, zero falsos positivos; alimentar todo o segmento de ~200s trava, a memória aumenta quadraticamente, o script divide por padrão em segmentos ≤75s por silêncio e adiciona o deslocamento de volta, ajustável com
--chunk-sec), alternativa faster-whisper; dados de avaliação comparativa de backends e endereços de download de modelos nos comentários do cabeçalho do script. - Schema de timestamps.json:
{sr, total, sentences:[{i,text,start,end,match,ok,words:[{text,start,end}]}]}——words são CJK caractere por caractere + tokens latinos de segmento inteiro (pontuação ignorada); qualquer ferramenta de alinhamento que satisfaça este schema pode ser substituída. - make_timing.py: converte para timing.json (chars tem correspondência 1:1 com o texto caractere por caractere, pontuação com duração zero), usado para consulta de âncora
tSay/msSay - Auto-verificação da narração (ouvir): sem estouros / cortes / erros de pronúncia; deixe ~0.3s de respiro entre frases para âncoras de tempo mais estáveis
②-1 Anotação Semântica (obrigatório a partir de 2026-09-22, autoridade: references/semantic-annotation.md)
Rotule cada frase do roteiro de narração com "o que esta frase está fazendo", salve como semantics.json na raiz do projeto——este é o artefato do lado da demanda para seleção de cards, sem ele, a seleção de cards fica apenas com um filtro de tipo de entrada e o resto das dezenas de cards são escolhidas por memória (foi assim que o vídeo "Eu sou Wanli" de 2026-09-21 acabou com o card de texto de menor energia de toda a biblioteca, enquanto o P0 de faixa de nome de pessoa não foi encontrado por ninguém).
python3 <raiz-do-skill>/scripts/semantic_annotate.py --init # Gera o esqueleto a partir de timestamps.json (com dica hint léxica)
# Preencha sem (vocabulário fechado de 26 palavras, veja taxonomy.md "Índice Semântico") / weight (main frase principal = permite entrada de novos elementos, sub frase de suporte) / entities / need para cada frase
python3 <raiz-do-skill>/scripts/semantic_annotate.py --stats # Validação: correspondência caractere por caractere com timestamps · vocabulário fechado · regras léxicas rígidas (Eu sou X → auto-apresentação, curtir e inscrever → chamada para ação, quantificador → dados) · pelo menos um main por quadro
A anotação é um artefato derivado: pré-edição → timestamps → anotação → tudo depois; se o roteiro for alterado ou reeditado, o text não corresponderá, tornando a anotação inválida, execute --init novamente.
②-1 vem antes do storyboard, então o campo shot está vazio neste ponto (SHOTBOOK ainda não foi escrito): após ④, ele deve ser preenchido, caso contrário, a verificação de cobertura em nível de quadro a jusante não encontrará nada——
python3 <raiz-do-skill>/scripts/semantic_annotate.py --sync-shots # Após ④: preenche shot com base nos segundos de início/fim do título do SHOTBOOK (ou shots.json), mexe apenas em shot, a anotação não é perdida
③ Materiais
- A lista de materiais é gerada a partir da anotação semântica de ②-1, não é inventada: frases com
needigual aevidênciavão capturar páginas reais / encontrar fontes,identidadeprecisa de avatar e informações de conta,quantificaçãoprecisa de gráficos ou fontes de dados,entities(nomes de pessoas / marcas / locais / URLs) são os termos de pesquisa. - Primeiro, marque o modo de material para cada quadro (múltipla escolha, pode ser combinado):
B-roll(vídeo gravado) /Imagem(foto / pôster / ilustração) /Captura de tela(página da web / tela de evidência) /Apenas Motion Design——exemplo: "B-roll como base + card de evidência de captura de tela". Para tópicos de notícias/informação, evidência em primeiro lugar: capturas de tela ao vivo do Playwright são mais informativas do que B-roll genérico. As quatro categorias correspondem aos códigos de tipo de entrada em taxonomy.md V / 图 / 截图 / 文, cada quadro do SHOTBOOK escreve uma linhaMaterial:V(caminho)· 图(caminho)· 文(formato em ④) - Materiais gravados são obrigatórios, não opcionais (regra rígida de 2026-09-06): zero B-roll / imagens em todo o vídeo = apenas motion design + apresentador = o público vê "apresentação de PPT".
preflight.pyreconcilia com o SHOTBOOK: quadros com zero V / 图 geram FAIL diretamente, quadros com V / 图 com proporção < 1/3 geram WARN (deve fornecer justificativa no SHOTBOOK, por exemplo, tópicos de evidência baseados principalmente em capturas de tela). "Este vídeo não terá B-roll" não é permitido como decisão de design; se a fonte do vídeo não puder ser encontrada, degrade para imagem (fotos originais do Pexels → Pixabay), se também não houver imagem, então entre na "Lista de Incompletos / Não Coletados". Imagens e vídeos da mesma fonte e mesma chave; especificações de coleta (resolução mínima, diretório de salvamento, registro) vejareferences/broll-sources.md"Coleta de Imagens" - Regra rígida de imagens reais: quando o tópico tem páginas reais que podem ser capturadas (site oficial do produto / GitHub / documentação / galeria),
é proibido usar mock de código para fingir capturas de tela para quadros de navegador/página no vídeo final——as barras cinzas de UI falsas nos demos dos cards são placeholders,
o vídeo final deve substituir o bloco inteiro por
<img>de imagem real de acordo com as "instruções de reutilização" do card; mock só é permitido para UI esquemática sem contraparte real, e o SHOTBOOK deve anotar quadro a quadro "por que não há imagem real". Extensão: quando a narração diz "um resultado/efeito como este", a imagem de exemplo deve ser um clipe de vídeo real (<OffthreadVideo>incorporando vídeo existente / gravação de dispositivo real cortada, muted); quando fala sobre "página longa / painel / página de parâmetros", use captura de tela de página inteira do Playwright (screenshot de página inteira) (efeitos de lupa / tour consomem diretamente as coordenadas da imagem real). As coordenadas de anotação em imagens reais devem ser medidas por máquina, proibido olhômetro: usegetBoundingClientRectdo DOM para elementos de página, e medição pixel a pixel para imagens renderizadas (olhômetro de ±30px pode colocar o círculo em outro elemento); para imagens reais que rolam / se movem, as anotações (círculo / caixa / pill) devem ser fixadas no sistema de coordenadas do conteúdo e se mover com ele, fixá-las em uma posição fixa da tela é a raiz do desalinhamento - Quadros de vídeo único devem ter uma moldura temática (usuário decidiu em 2026-09-07): quando o único assunto em um quadro é um vídeo (gravação de tela / B-roll único / clipe de vídeo ou entrevista de outra pessoa),
proibido colocar sem moldura em tela cheia, proibido colocar em cartão branco sem moldura, também proibido fingir um player falso (sem barra de progresso / botão de play / timecode——se não for um player real, é mentira), a área de vídeo deve envolver
<ThemeFrame kind>detemplate/components/theme-frame.tsx: oito estilos (janela de navegador retro / moldura de revista / filme 35mm / Polaroid / desenho técnico / notebook / borda de selo / linha dupla de cabelo), escolha um estilo de acordo com o tom do vídeo, use apenas um estilo por vídeo, escreva na linha de customização do SHOTBOOK; a área de vídeo de cards com vários vídeos (primeiro plano bed-echo-blur / grade esquerda split-60-40-story / gallery-wall-dolly) também envolve o mesmo estilo. A moldura cuida apenas de sua própria forma e decoração de transição, a entrada / saída / push/pull extremamente lento pertencem à camada da câmera; a imagem dentro da moldura não tem processamento (sem filtro / sem escala / sem fade in/out). As únicas duas exceções: quando o vídeo é usado como fundo não como assunto (bed-echo-blur / §1.2 fundo real gravado), e cards de interface de produto (chat-gpt / claude-code, a pele é o conteúdo). Imagens estáticas não entram em molduras (a moldura diz "isso é uma gravação", uma imagem parada parece falsa; imagens usam media-pop-in / slow-push-in). Regras e tabela dos oito estilos: design-language §1.3 - Páginas da web não são coladas como imagens: ao encontrar / coletar materiais, determine páginas da web utilizáveis, proibido colá-las como capturas de tela estáticas no vídeo final,
elas devem ser "filmadas" como uma câmera de mão——Rolar (
evidence-scroll-tour◆: rolagem uniforme para cima ≈10% da altura da página/s, desacelere 1~2s antes de chegar ao item chave) / Percorrer (stage-keyframe-tour◇: página longa imóvel no palco, câmera para em pontos de interesse um por um) / Ampliar (magnifier-detail: lupa circular dá uma olhada e sai,pip-zoom-box◈puxa e mantém por mais tempo) / Riscar (highlighter-sweep: varre frase inteira,ink-underline◇: risca uma palavra,scribble-annotation: círculo e seta,corner-bracket-frame◈: quadro de área); páginas que cabem em uma tela devem ter pelo menosslow-push-incomo ruído de fundo. Um modo principal por quadro: durante segmentos de rolagem/tour, não pop lupas, não risque ao vivo; a ordem é "rolar para → parar → riscar/ampliar → rolar novamente"; tabela de seleção de métodos de filmagem veja shot-design.md §2④ "Filmagem de Páginas da Web". Materiais salvos de acordo com as especificações de "Coleta de Materiais de Filmagem de Páginas da Web" em broll-sources.md: Playwright captura de tela de página inteira 2× + arquivo JSON de coordenadas de destino medidas pelo DOM da mesma sessão (lupa / risco / ponto de parada consomem este conjunto de coordenadas, conectando-se à regra "proibido olhômetro" acima). A filmagem é sempre feita pelo Remotion na captura de tela longa (seguro seek, pode ancorar em palavras), proibido usar gravação de tela do navegador (taxa de quadros instável, carregamento lento e cabeçalhos pegajosos aparecem, não pode corresponder aos timestamps em nível de caractere). A única exceção permitida: pequenas capturas de tela que cabem em uma tela e são apenas coadjuvantes (uma das várias imagens empilhadas em media-pop-in) podem entrar no card estaticamente, mas ainda com Ken Burns, não podem ser o assunto principal daquela filmagem - Para quadros marcados com B-roll, liste 2-3 palavras-chave de conceito visual em inglês e execute API Pexels + Pixabay em paralelo, candidatos salvos em
assets/broll/; fontes em camadas e linha vermelha de licenciamento (use apenas fontes sem atribuição) vejareferences/broll-sources.md - Contabilidade da pesquisa: páginas de origem que carregam fatos chave são capturadas de tela e arquivadas uma a uma,
sources.mdtem uma correspondência um-para-um de links e capturas de tela locais (proibido salvar apenas links sem deixar evidências); ao citar no vídeo final, use preferencialmente as capturas de tela arquivadas como evidência visual + linha de fonte em nível micro - Quando há B-roll/capturas de tela + material do apresentador correspondente (gravação / produto digital humano), o apresentador é sempre rebaixado para um canto residente——
avatar redondo encolhido (
host-shrink-to-chip◆) ou pessoa recortada colada no canto, no canto inferior esquerdo / direito; não é permitido cortar a pessoa, não é permitido que a pessoa ocupe o quadro inteiro. Seleção de duas opções e todas as restrições rígidas emreferences/host-footage.md§5, predefinições de quadro em shot-design.md §2⑦ - Gráficos Manim: após
--transparent --format=mov, deve converter para VP9 webm (-c:v libvpx-vp9 -pix_fmt yuva420p) - Tudo salvo em public/, proibido buscar remoto durante a renderização
- ③ Finalização: deve executar verificação de materiais (transforme as regras rígidas de entrada de host-footage / broll-sources em afirmações; as respostas já estão escritas nas referências, mas ninguém as verifica no momento certo, este foi o modo de falha comum dos dois maiores buracos na retrospectiva de 2026-09-06——então, em vez de adicionar mais documentos, torne obrigatório executar antes de começar):
python3 scripts/preflight.py --media-only --host remotion/public/dh/host.webm --fps 30 --voice audio/full.wav
# Verificar: material da pessoa tem taxa de quadros r/avg consistente (VFR) · sem assinatura de quadro duplicado no arquivo de origem · fps do material = fps do vídeo final (se não → alterar fps do vídeo final para o fps do material, proibido usar -r para converter diretamente) ·
# duração alinhada quadro a quadro com a narração · proporção real · inventário de materiais (número de vídeos reais / imagens / capturas de tela longas de páginas da web) · sources.md registrado. Qualquer FAIL impede entrada em ④
④ SHOTBOOK (deve ser produzido, revisado antes da implementação)
Primeiro, use references/shot-design.md para preencher a folha de trabalho de três camadas (camada de fundo / camada de assunto / camada de texto + efeitos de cada camada
- predefinições de 7 tipos de quadro), depois expanda para uma matriz de camadas de acordo com
references/cinematography.md§4, exemploreferences/shotbook-example.md. Cada cena: uma frase de intenção + linha de revezamento de assunto + matriz de camadas batida por batida (batida ancora no timestamp em nível de caractere; cada ação deve responder "com quem está cooperando"). Cada quadro deve ter uma linhaMaterial:(legível por máquina, preflight faz stat de arquivo um por um):- Material:V(public/broll/gpu.mp4)· 图(public/stills/a.jpg, public/stills/b.jpg)· 截图(public/pages/gh/page.png)· 文—— V / 图 / 截图 devem ter caminhos entre parênteses, escrever "a ser coletado" = FAIL; quadros de apenas motion design também devem escreverMaterial:文. Seção obrigatória## Lista de Incompletos / Não Coletados: qualquer "este vídeo não fará X"——ou coloque na decisão de design da §0 (+ justificativa), ou coloque nesta seção (+ motivo do bloqueio + se a fonte de fallback foi tentada); permitido escrever "nenhum", não permitido omitir a seção. Esta seção é especificamente para impedir "incompletos disfarçados de princípios de design, que então se tornam premissas não questionadas" (o verdadeiro modo de falha na retrospectiva de 2026-09-06). G0 escreve uma linhaQuadro de Amostra:sNN(para ⑤-1 primeiro quadro feito primeiro e confirmado): padrão s01; se s01 for um card de capítulo / cena vazia sem efeitos de assunto, selecione o primeiro quadro com um card, legenda e pessoa ou material. As batidas devem ser verificáveis por máquina: cada acento visual é colocado emremotion/beats.json({t, anchor, sentence, what}, t é sempre consultado de timing.json/atChar(), proibido digitar segundos aproximados manualmente—— QA de quadros parados não consegue ver erros de digitação), a tabela de batidas do SHOTBOOK deve ser consistente com beats.json, verificação de máquina usandoscripts/beat_lint.pyem relação a timestamps.json para |Δ|≤0.1s. Não aparecer até a batida: números / gráficos cuja âncora de palavra não foi atingida devem estar completamente invisíveis (opacity 0), proibido escurecer/cinza para "pré-visualizar"; números inline devem ser bloqueados junto com seus caracteres subsequentes (o buraco vazio de "são __ tipos" pendurado também é um defeito). Quadro não começa vazio: a janela vazia do início do quadro até o primeiro ponto de ancoragem de efeito >1.5s deve ter uma imagem de sustentação (B-roll real / elemento do quadro anterior continuado / parede de material real), proibido quadro vazio esperando a âncora da palavra. Margem de proteção no final do quadro: se o ponto de aterrissagem do efeito da âncora da palavra estiver a <0.7s do ponto de saída do quadro, ou adiante ou mova para o próximo quadro——o ponto de aterrissagem será engolido pela transição;beat_lint.py --shots shots.jsonverifica máquina com limite rígido de ≥0.5s. Eventos de transição em nível de cena também entram em beats.json: o pico de oclusão de shape wipe / mudança de cena também é gerado pela âncora da palavra e entra na tabela—— a tabela de eventos de transição com segundos absolutos digitados manualmente fica fora do sistema verificável por máquina, QA de quadro parado e beat_lint não podem vê-los. Orçamento de layout (tabela completa em cinematography.md §4.5): o storyboard é cortado por parágrafos semânticos, cada quadro tem um primary visual job; quadros de apenas texto devem ter gráficos de acompanhamento (feedback do usuário em 2026-09-07 "apenas animação de texto empilhada é muito monótona"): linhas de material com apenas文(excluindo cards de capítulo), a matriz de camadas deve ter uma linha extra 「G5 Diagrama Esquemático ← falando sobre X então desenhe Y」(references/schematic.md, códigotemplate/motion-systems/schematic.tsx), preflight emite WARN para quadros de apenas texto sem esta linha; os efeitos de frases pivot (tipo de reviravolta/pergunta retórica "mas desta vez não é X") pertencem ao próximo quadro que elas abrem; em qualquer momento, o grupo de assuntos na tela ≤3 (guardiões rebaixados contam), cada quadro deixa pelo menos um quadrante vazio; um hero shape por tela. Convenções de layout (tabela completareferences/layout.md): orçamento gerencia "quanto colocar", as convenções gerenciam "onde colocar, quão grande, como alinhar"—— cada quadro do SHOTBOOK escreve linha de layout (largura da coluna + caixa delimitadora do grupo + base de alinhamento + hierarquia de fontes), quadro de maquiagem final comdebugOverlayverifica nove itens, qualquer falha = P1; frase única hero centralizada, mas não pode cobrir rostos (incluindo rostos em B-roll, verticalmente mude para a linha dos terços fora do rosto). Rotação de layout (usuário em 2026-09-21: o vídeo final "pessoa no canto inferior esquerdo, material em um bloco no meio, texto à direita, muito fixo"; tabela completa em cinematography.md §4.5, item 9): antes de escrever a matriz quadro a quadro, escreva primeiro a Tabela de Ritmo de Layout em G0 (| Quadro | Forma e Posição da Pessoa | Recipiente do Material | Card Principal |, formato em cinematography.md §4)——o mesmo cartão de apresentação (tipo apresentação de material / dados / movimento de câmera) não é usado por 3 quadros consecutivos, ≤1/3 de todo o vídeo (para vídeos com ≥6 quadros); a forma da pessoa (meio corpo / canto inferior esquerdo / canto inferior direito / dentro da grade dividida / pessoa recortada colada no canto / saída breve) e o recipiente do material (tela cheia sangrada / emoldurado / grade dividida / fundo / layout de múltiplas imagens / parede 3D / página longa) devem mudar pelo menos um em 3 quadros consecutivos; o mesmo clipe de B-roll não entra em quadros adjacentes. Clipe único de B-roll selecionado entre os sete estilos de shot-design.md §2⑦, quadros adjacentes usam estilos diferentes, materiais múltiplos usam a tabela de relações de §2④′; preflight verifica pela tabela de ritmo + linha de customização (uso consecutivo / proporção FAIL). A rotação é sobre mudar a composição, não adicionar movimento——cada estilo ainda tem apenas push/pull de câmera extremamente lento. Cada quadro deve ter umalinha de seleção de card(semântica de ②-1 → card; candidatos dados pela máquina):
python3 <raiz-do-skill>/scripts/card_match.py --out qa/card-candidates.md # Semântica × linha de material × índice de card → para cada semântica de frase principal de cada quadro, candidatos viáveis + motivo da classificação + motivo da não seleção
Antes de executar, faça semantic_annotate.py --sync-shots para preencher shot de volta (②-1 ainda não tem storyboard). Além de listar candidatos por semântica, a tabela de candidatos também listará uma linha separada para quadros que declararam material
Candidato de Herança de Material——declarou V / 图 / 截图 mas não tem card de apresentação / movimento de câmera para recebê-lo = material colado sem moldura, preflight julga FAIL.
Cada quadro do SHOTBOOK escreve - Linha de Seleção de Card:<semântica> → <card>、<semântica> → <card> (o card na linha de seleção de card deve realmente cair na linha de customização, preflight reconcilia);
selecionar um card fora dos candidatos deve escrever uma linha naquele quadro - Desvio semântico:auto-apresentação ← já identificado na abertura, s11 não repete (motivo ≥4 caracteres, preflight reconhece esta linha e libera).
A linha de batida da matriz de camadas adiciona uma coluna semântica (valor retirado de semantics.json, sem criar novas palavras), assim "o que esta batida está fazendo" é legível por máquina no storyboard.
Seleção de card deve ler a experiência do card: para cada card selecionado, copie as "armadilhas conhecidas" e "auto-verificação de posicionamento" de references/cards/<slug>.md linha por linha na coluna de auto-verificação da matriz de camadas daquele quadro, e verifique item por item após a implementação (exemplo: cards de moldura / círculo / sublinhado devem verificar se a anotação envolve o alvo; gooey-morph só é usado para imagens, não para texto, e centralizado quando não há pessoa; chapter-title-card cada capítulo tem um conjunto de cores temáticas + um motivo de diagrama de linha relacionado ao conteúdo do capítulo, SHOTBOOK escreve a linha de tema do capítulo——quatro cards de capítulo da mesma cor e padrão são "lá vem ele de novo", não "virar página")——
experiência do card que não entra no SHOTBOOK é como se não fosse lida.
Os vocabulários de efeitos são selecionados de 108 cartas de receita, ambos os filtros consultam o índice gerado por máquina de references/taxonomy.md (fonte são os cinco campos do frontmatter de cada card: input / semantic / material form / position / props, gerado por scripts/cards_index.py --write, verificado por --check, modificar o índice manualmente é inválido): primeiro filtre pelo input deste quadro (pessoa / V / 图 / 截图 / 文 / interface / cena——"Índice de Tipo de Input"), depois filtre pela semântica desta frase de narração (auto-apresentação / dados / comparação / enumeração / citação / chamada para ação……vocabulário fechado de 26 palavras——"Índice Semântico", um card só é listado sob a semântica para a qual foi especificamente projetado); cards com ◦ no índice não têm prop com conteúdo trocável (apenas expõem recursos / skin, ou nada expõem), alterar texto / dados requer mexer no tsx (a linha props de cada instrução de reutilização de card indica onde alterar). Os dois lotes de novos cards ◉◎ (29 cards) têm uma tabela de "Tipo de Input" no início do md + quatro "Cenários Comuns". Em seguida, references/taxonomy.md índice de classificação → references/cards/<slug>.md parâmetros e armadilhas → template/cards/<slug>.tsx código fonte Remotion autocontido (a implementação deve seguir isso, copie para o projeto e modifique CONFIG para usar); demos/<slug>/index.html é a prévia HTML da mesma tela (open gallery/index.html navega em uma tela, demo rola e reproduz automaticamente; cards de produção com ★ têm matriz de produção em template/motion-systems|components).
Regra rígida de fidelidade: cada card usado no projeto deve existir de verdade em src/cards/<slug>.tsx
(copiado de template e modificado CONFIG)——apenas ler o md e escrever manualmente uma versão simplificada "parecida" é a maior fonte de acidentes
(ressalto / batida / densidade tudo perdido, parênteses da moldura desenhados ao contrário, bloco de cor do cartão de visita), verificação de máquina usando scripts/card_lint.py
verifica existência e similaridade slug por slug (≥0.55, modificar CONFIG/texto está dentro da tolerância).
Customização não é reescrever: o card copiado é UI neutra, deve ser customizado de acordo com o perfil de estilo do SHOTBOOK §0——troque todas as cores para tokens de tema, pilha de fontes e pesos, cantos arredondados / bordas / sombras / texturas,
eixos de gráficos de card / grade / marcadores / fonte de números, gráficos de placeholder de cards de imagem trocados por material real ou gráficos estilizados——mude apenas a camada de pele, não mude timing / easing / proporções geométricas / hierarquia;
escreva linha de customização ao lado da matriz de camadas de cada quadro (nome do card → qual pele foi alterada), cards do mesmo tipo no mesmo vídeo compartilham um conjunto de peles; contrato, exceções (cards de interface de produto não são customizados, cores semânticas não mudam de matiz) e contraexemplos em design-language §0.4.
O 0.55 do card_lint é a margem deixada para customização: alterar a pele passa, reescrever o movimento cai abaixo.
Regra rígida de três estágios: entrada 0.20.8s → segurar (apenas parado é suficiente——a vivacidade da imagem é responsabilidade do push/pull de câmera extremamente lento da cena) → saída 0.150.5s; entrada sempre mais forte que saída; apenas um acento na mesma tela ao mesmo tempo.
Se um efeito for escolhido, seu efeito sonoro deve vir junto: cada card tem uma tabela de cue em demos/_lib/sfx-map.js ({t, name, vol, rate?, clip?}, t é o tempo relativo dentro do card)——
quando o SHOTBOOK seleciona o card, copie o cue para a matriz de camadas daquele quadro (converta para segundos absolutos; vol deve ser reajustado para ≤0.35 para a bitola do vídeo final,
o limite superior de 0.65 da biblioteca de demo é para audição, não para a bitola do vídeo final). Implemente de acordo com a etapa sfx de ⑤.
Cobertura da bitola: cobertura total da entrada dos principais efeitos, alinhada com a densidade da biblioteca de demo
(cada card 26 batidas ≈ 0.4 batidas/s, um vídeo de 100s tem cerca de 4050 batidas)——"pouco e preciso" gerencia não sobrepor duas batidas em um ponto,
volume contido (≤0.35), cartas de revelação contínua (slow pull / foco / caracteres subindo um por um) e cards de texto de frase de ouro, espaço em branco no logotipo final,
transições apenas com acumulação, sem ponto de aterrissagem, sem sinos e bombas no final; não é para cortar a cobertura. Amostras reais (pk-
…
[truncado para tradução]