Constrói e valida edit_plan.json do Content Lab conforme contrato único, preservando IDs, cache, assets e distinção entre intenção criativa e propriedades suportadas.
Install
npx skillscat add danielhabdias/contentlab/contentlab-contrato Install via the SkillsCat registry.
Content Lab — Contrato de edição
Autoridade técnica
- Fonte de verdade:
schemas/edit_plan.schema.jsone validações emserver/plan.mjs; complemente comEDIT_PLAN_REFERENCE.md,MOTION_DESIGN_JSON.mde documentação gerada. - Há um
edit_plan.json, sem campoversionno topo. - Estrutura principal:
project,audio,timeline;sourcesé opcional. - JSON é declarativo; nunca embutir JS executável.
- Campos arbitrários de
configque o renderer não usa não produzem efeito. Se a skill criativa pedir recurso sem parâmetro suportado, marque como gap técnico para a próxima etapa.
Identidade e cache
- Cada cena tem
idestável e único,start < end; cada elemento visual temidúnico na cena. - Preservar IDs ao editar plano existente para aproveitar o cache por cena, exceto quando a identidade lógica realmente mudou.
- Cache do storyboard não prova que o rascunho foi renderizado; preview da cena anterior é distinto da versão modificada.
- Não inserir novas cenas para toda frase se uma cena longa puder evoluir por camadas/keyframes.
Assets, posições e componentes
- Mídia existente:
project://assets/arquivo.extebuiltin://categoria/arquivo.ext. Não criar links nem caminhos fictícios. fit:"contain"preserva a imagem inteira;coverrecorta intencionalmente.cellsdefine disposição no grid;transform.scaleé escala,transform.offsetX/offsetYdeslocamentos em pixels etransform.opacityopacidade.- A ordem de camadas é definida por
z. Posições em PNG podem ser afetadas por transparência assimétrica. camera.keyframese keyframes de elementos usam tempo relativo à cena; cenas/elementos usam tempo absoluto. Não introduzir um segundo relógio implícito.- Presets,
kinetic_text,word_stack_verticalebangers_highlight_blockdevem seguir o contrato real e exemplos disponíveis. - No
word_stack_vertical, a faixa central ocupa a largura do quadro; o painel opcional fica somente na faixa central.config.itemsdefine tempos de frases. - Em
bangers_highlight_block, o fundo entre palavras faz crossfade sem mover o texto, respeitando tempos das palavras.
Contrato para uma cena programável TSX
O projeto pode conter custom-scenes/MinhaCena.tsx e uma cena declarativa com customComponent:
{"id":"grafico","start":0,"end":8,"layout":"fullscreen","background":{"color":"#080a10"},"elements":[],"customComponent":{"module":"project://custom-scenes/MinhaCena.tsx","mode":"replace","props":{"titulo":"Exemplo","cor":"#ff4444"},"assets":{}}}moduleé obrigatório:project://custom-scenes/...tsx, na raiz do projeto de edição. TSX não vai dentro do JSON.mode:replacepara cena inteira em TSX (não desenha as camadas tradicionais) ouoverlaypara sobreposição.props: objeto JSON de conteúdo reutilizável.assets: mapa de nomes para URIs locaisproject://oubuiltin://; os URLs resolvidos ficam emassetsdo componente.- O TSX exporta default de um componente React e usa
useCurrentFrame/useVideoConfigpara quadros determinísticos. - Destino canônico obrigatório: criar cada TSX na subpasta
custom-scenes/da pasta específica do vídeo (Drive:Guia de Edições/Vídeos Longos/VD_XXXX/custom-scenes/ouShorts/SH_XXXX/custom-scenes/; computador:<pasta-do-vídeo>/custom-scenes/). Oedit_plan.jsonpermanece na raiz do mesmo vídeo e referenciaproject://custom-scenes/Nome.tsx. Se o Drive estiver conectado com escrita, publicar ali imediatamente e verificar; se o projeto local estiver acessível e autorizado, copiar para a mesma estrutura local. Não deixar os arquivos apenas em ZIP, conversa ou pasta temporária, nem afirmar instalação inexistente. O site não instala código do chat automaticamente. - Componentes TSX em
custom-scenes/renderizam sem configuração extra, mas são código executável sem sandbox: usar somente projetos confiáveis. JSON válido não garante compilação TSX: inspecionar MP4. - Exemplo versionado:
examples/custom-scenes/FollowDot.tsx+examples/programmatic-motion-edit-plan.json. Para montagem em um plano existente pedir só o fragmento, economizando tokens.
Para planejamento de uma cena complexa, carregar skills/contentlab-cenas-tsx/SKILL.md antes de gerar o componente.
Revisão de plano
Antes de entregar: validar schema, regras semânticas, existência de assets, formatos, limites de tempo, IDs, camadas, transcript e eventos. Não afirmar suporte de um efeito apenas por campo desconhecido ter passado pelo parser. A saída deve refletir o estado atual do contrato; novos recursos de composição planejados nas skills serão implementados na fase técnica subsequente, sem serem falsamente simulados no JSON atual.
Alterações de schema
Quando a engenharia introduzir campo real: atualizar schema, validação, renderer, server/docs-fields.mjs e server/docs-content.mjs; regenerar documentos com npm run docs:generate, validar com npm run docs:check e testes. Nunca criar schema alternativo.
Tempos e camadas internas ao TSX, não ao schema
Ao converter mapa de narração em TSX, subtrair timeline[].start dos timestamps absolutos e passar tempos derivados como números em customComponent.props (se necessário) ou constantes no componente. Não inventar propriedades de contrato como visualReadyBy, layerDepth, cameraTarget no edit_plan.json: registrar no guia, no briefing ou em props existentes. O customComponent continua com module/mode/props/assets; vídeos e imagens devem vir de assets locais verificados. Ao pronunciar uma palavra, seu objeto visual deve estar reconhecível e a entrada estar concluída até o final da palavra.
Registro de SFX e QA de movimentos no contrato instalado
Para cada element.type="sfx" usar element.at (início audível absoluto), element.asset existente, element.config.duration opcional e element.fadeOut opcional, campos presentes no schema/código do ContentLab. O mixer remove silêncio nas bordas do SFX, calcula audibleLength e aplica fadeOut no final do trecho efetivamente usado. Não colocar fadeOut dentro de config; não presumir audio.sfx ou timestamps relativos para at. Um corte em config.duration só é aceitável se seu fadeOut evitar truncamento audível.
Validar no guia/mapeamento de eventos que cada animação editorial (inclusive câmera e TSX) tenha som correspondente ou áudio original verificado; o início audível deve ocorrer dentro do evento visual, a duração do áudio pode divergir, e a cauda pode continuar suavemente. Schema válido não prova cobertura, coerência, variedade, presença audível ou sincronização: executar contentlab-revisao antes de exportar para edição automática e depois do render.