Communitygithub.com

businessbaum/vedit

Este skill deve ser usado quando o usuário pede para decidir sobre o que o vídeo realmente é, antes de qualquer corte mecânico. É a passagem de seleção de CONTEÚDO que escreve o bloco 'story' no project.json; executa após transcrição e antes do corte bruto.

O que é vedit?

Este skill, 'cut-story' do repositório businessbaum/vedit, é o coração editorial da pipeline de edição de vídeo. Ele não realiza cortes mecânicos que apenas apertam o que foi dito na ordem original; em vez disso, decide quais blocos temáticos sobrevivem, em que ordem, e onde está o gancho (hook). É o único estágio que pode transformar uma divagação de 25 minutos em um vídeo de 6 minutos, e é o que mais determina se alguém vai assistir. O skill opera após a transcrição e antes do corte bruto (cut-rough), escrevendo a estrutura de 'story' no arquivo project.json. Ele suporta a análise de transcrições longas delegando a um agente especializado (transcript-analyst) para preservar contexto, e aplica uma série de testes de corte (crença, segundo exemplo, órfão, aquecimento, recapitulação) com um viés padrão de descartar 40-60% do material. O resultado é um bloco 'story' com decisões reversíveis, mantendo todos os blocos descartados para possível restauração.

Funciona com~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/businessbaum/vedit/tree/HEAD/.agents/skills/cut-story

Perguntar na sua IA favorita

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

Documentação


name: cut-story description: Este skill deve ser usado quando o usuário pede para decidir sobre o que o vídeo realmente é, antes de qualquer corte mecânico. É a passagem de seleção de CONTEÚDO que escreve o bloco 'story' no project.json; executa após transcrição e antes do corte bruto. argument-hint: [project-slug] [target-minutes] arguments: [project, target]

cut-story

Decida o que o vídeo é. O corte mecânico apenas aperta o que foi dito na ordem em que foi dito; esta passagem decide quais blocos temáticos sobrevivem, em que ordem, e onde está o gancho. É o único estágio que pode transformar uma divagação de 25 minutos em um vídeo de 6 minutos, e é o estágio que mais determina se alguém vai assistir.

Argumentos: $project é o slug do projeto, $target é uma duração alvo opcional em minutos. O texto completo da solicitação está em $ARGUMENTS. Se nenhum slug for fornecido, use o projeto nomeado em PIPELINE_STATE do hook da sessão e informe qual você escolheu.

Os nomes dos verbos abaixo seguem o contrato de construção. Se python engine/ve.py --help discordar, o CLI vence – use seus nomes e mencione a discrepância.

Pré-condições

  • projects/$project/project.json existe com stage em transcribed ou posterior.
  • transcript.path é resolvido e transcript.word_count está definido.
  • Se stage ainda é intake, pare e execute o skill de transcrição primeiro.

Nunca execute esta passagem duas vezes silenciosamente. Se story.blocks já existir, mostre as decisões atuais primeiro e pergunte se deseja revisar ou substituir.

Passo 1 – obter uma transcrição legível

JSON no nível de palavra é prosa ilegível. Achate primeiro:

python engine/ve.py transcript flatten $project --numbered

Isso emite as palavras como texto corrido com um marcador de índice de palavra a cada 25 palavras. Os índices de palavra são as âncoras que o bloco story armazena – nunca armazene segundos, nunca armazene timecodes.

Passo 2 – despachar o transcript-analyst quando a transcrição for longa

Se word_count > 2500 (aproximadamente 15 minutos de fala em alemão), despache o agente transcript-analyst em vez de ler a transcrição inline.

Porquê: uma transcrição de 5.000 palavras consome o contexto que você precisa para o resto da sessão, e o analista retorna cerca de 40 linhas. Ler você também o enviesa – tendo acabado de ler cada frase, tudo parece essencial. Um contexto novo corta mais agressivamente, o que é correto.

Forneça ao agente: o caminho da transcrição achatada, a duração alvo, a plataforma de output.platform, e qualquer direção que o usuário deu em $ARGUMENTS. Ele retorna blocos candidatos com decisões e justificativas. Você ainda possui a palavra final – revise seus descartes, e anule qualquer descarte que o usuário explicitamente pediu para manter.

Abaixo de 2500 palavras, leia a transcrição você mesmo.

Passo 3 – nomeie o vídeo em uma frase

Antes de qualquer decisão de bloco, escreva uma frase em alemão que diga o que o espectador acredita ao final que não acreditava no início. Mostre-a ao usuário.

Se essa frase não puder ser escrita, o material ainda não contém um vídeo. Diga isso claramente e pare – recomende uma gravação complementar em vez de montar algo amorfo. Este é um resultado real e entregá-lo honestamente é mais útil do que um vídeo organizado de 6 minutos sobre nada.

Toda decisão posterior responde a essa frase.

Passo 4 – divida a transcrição em blocos

Um bloco é uma unidade de significado que sobrevive ao ser movida: 30 segundos a 3 minutos, um ponto. Blocos são intervalos contíguos de palavras que ladrilham a transcrição sem lacunas ou sobreposições.

Não corte blocos em pausas. Corte-os onde o assunto muda – as próprias placas do falante são confiáveis em alemão: also, jetzt zum Thema, das andere ist, kurz noch, um nochmal zurückzukommen, was viele nicht wissen.

Passo 5 – decida, com viés para descartar

Expectativa padrão: descarte 40-60% das palavras gravadas. Se mais de 70% do material sobreviver, nenhuma decisão foi tomada – volte e aplique os testes de descarte mais rigorosamente.

Testes de descarte, aplicados em ordem:

  1. O teste da crença. Remova o bloco. O que o espectador acredita ao final muda? Se não, descarte-o. Este é o teste primário; os demais são atalhos para ele.
  2. O teste do segundo exemplo. Dois exemplos do mesmo ponto: mantenha o mais concreto, descarte o outro. Palestrantes repetem-se para pensar, não para ensinar.
  3. O teste do órfão. A preparação para um payoff que foi descartado agora é ruído. Descarte-a, e re-verifique após cada outro descarte – órfãos aparecem em cascata.
  4. O teste do aquecimento. Os primeiros 60-90 segundos de quase qualquer gravação são aquecimento. Descarte por padrão e informe o usuário que o fez. Esta única regra melhora mais vídeos do que todas as remoções de palavras de enchimento juntas.
  5. O teste da recapitulação. Resumos falados do que acabou de ser dito são uma muleta de fala, não uma estrutura. Descarte a menos que o vídeo seja genuinamente instrucional e longo.

Sinais de retenção, do mais forte ao mais fraco: um número, um nome, uma data, um erro específico que o falante admite, um exemplo concreto trabalhado. Especificidade é o sinal mais forte de retenção que existe. Enquadramento abstrato é barato e pode ser regravado em dez segundos; uma anedota específica não pode.

Use "decision": "maybe" para blocos cujo destino depende da duração final. Mantenha maybe abaixo de 20% dos blocos – além disso é indecisão, não nuance, e o usuário terá que fazer o trabalho que lhe foi pedido.

Se $target estiver definido, faça uma verificação de sanidade: some as contagens de palavras dos blocos mantidos e divida pela taxa medida do falante (word_count / duração da fonte em minutos). Reporte a estimativa antes de escrever qualquer coisa. Fala de cabeça falante em alemão ocorre a ~130-160 ppm.

Passo 6 – encontre o gancho

O gancho quase nunca está no início da gravação. As pessoas chegam ao seu ponto real tarde, depois de se aquecerem e pararem de atuar.

Pesquise o último terço primeiro. Procure por: uma afirmação que parece errada até ser explicada, um número maior ou menor que o esperado, um fracasso admitido, uma aposta ("das hat mich zwei Wochen gekostet"). Escolha 15-25 segundos – uma ou duas frases, não um parágrafo.

Escreva como story.hook com um word_range e uma note em alemão dizendo por que foi movido. Mover o gancho para frente é a única reordenação que quase sempre está correta.

Passo 7 – ordene, e só reordene quando puder nomear o motivo

Existem exatamente duas razões legítimas para reordenar:

  1. O gancho vai para a frente.
  2. Um bloco responde a uma pergunta que um bloco posterior faz, portanto deve precedê-lo.

Todo o resto mantém a ordem de gravação. Reordenar material falado quebra referências posteriores, e você não ouvirá a quebra até a renderização – momento em que três estágios já foram executados.

Verificação de integridade de referência, obrigatória para cada bloco movido. Releia as duas primeiras frases do bloco movido em busca de referências posteriores. Em alemão, eles quebram silenciosamente: also, deswegen, deshalb, dadurch, dabei, wie gesagt, das, dieser/diese/dieses, außerdem, trotzdem, andererseits, wie eben erwähnt. Se um bloco movido abre com uma, ou comece o bloco uma frase depois, ou marque como maybe e informe o usuário que precisa de uma linha de conexão. Não o mova e torça.

Passo 8 – escreva o bloco story

Escreva story.blocks[] e story.hook em projects/$project/project.json exatamente como o esquema em docs/edl-schema.md define: id, word_range (aberto no final, em índices de palavra), label (alemão), decision (keep|drop|maybe), order (ordenação de saída, pode diferir da ordem de gravação), rationale.

Regras que não são negociáveis:

  • Nada é deletado. Um bloco descartado permanece no array com "decision": "drop". Toda decisão deve ser reversível alterando um campo. O usuário discordará de alguns de seus descartes e deve ser capaz de desfazê-los sem reexecutar a passagem.
  • rationale é uma cláusula em alemão e diz PORQUÊ, não O QUÊ. "trägt das kernargument" é útil; "spricht über Frame-Snapping" é um rótulo, não uma razão.
  • order é denso sobre blocos mantidos começando em 0. Blocos descartados recebem seu índice de ordem de gravação; são inertes, mas não devem colidir.
  • Defina stage como "story". Não toque em segments[] – isso é território do cut-rough.

Em seguida, mostre ao usuário uma tabela compacta: ordem, rótulo, decisão, minutos estimados. Essa tabela é a entrega, não o JSON.

Passo 9 – entregue

Diga explicitamente que o corte mecânico será executado agora apenas dentro dos blocos mantidos, o que é correto e mais barato – detecção de preenchimento e retake sobre material que será descartado é trabalho desperdiçado. Em seguida, ofereça o skill cut-rough.

Modos de falha

SintomaCausaCorreção
Tudo parece essencialLeu a transcrição inline quando era longaDespache o transcript-analyst; um contexto novo corta mais agressivamente
Manteve 85% do materialNenhuma decisão editorial foi tomadaRe-aplique o teste da crença a cada bloco
Vídeo pula estranhamente após reordenaçãoReferência posterior quebradaExecute a verificação do Passo 7 em cada bloco movido
word_range com lacunas ou sobreposiçõesBlocos não ladrilhandoBlocos devem ser contíguos e abertos no final
Usuário rejeita a maioria dos descartesFrase errada no Passo 3Reescreva a tese de uma frase com o usuário, depois refaça

Individual skills in this repo

This repo contains 4 individual skills — each has its own dedicated page.

businessbaum/vedit

This skill should be used when the user asks for subtitles or on-screen text of what is being said - "brenn die Untertitel ein", "mach Untertitel", "Untertitel drauf", "leg Untertitel drüber", "brenn die Subs ein", "mach die Captions", "Wort für Wort Untertitel", "Karaoke-Untertitel", "korrigier den Untertitel-Text", "burn in the captions", "add subtitles", "burn the subs", "word-by-word captions", "fix a caption typo". Covers ASS generation, the pixel-width grouping rule for German, the font table, and burn-in through libass.

businessbaum/vedit

This skill should be used when the user asks for mechanical tightening of material that is already selected - "mach den Rohschnitt", "bau den Rohschnitt", "schneid die Ähms raus", "nimm die Füllwörter raus", "entferne die Pausen", "kürz die Pausen", "schneid die Versprecher raus", "mach den Radioschnitt", "straff das", "build the rough cut", "cut the fillers", "remove the ums", "tighten the pauses", "trim the dead air", "cut the retakes", "radio edit". Turns kept story blocks into enabled segments in project.json. Does not decide what the video is about - that is cut-story.

businessbaum/vedit

This skill should be used when the user asks for the finished video file - "exportier das", "render das fertig", "mach das final", "renderte das Video", "mach den Endexport", "bau das Video zusammen", "mach es fertig für YouTube", "gib mir die MP4", "export the final", "render the final cut", "make the master", "export for TikTok", "give me the mp4". Covers segment rendering with the cache, guarded concat, the one-pass audio, loudness normalisation and the single mux.

businessbaum/vedit

This skill should be used when the user asks for an on-screen graphic, title or overlay - "bau eine Bauchbinde", "mach ein Lower Third", "blend meinen Namen ein", "mach eine Titelkarte", "setz einen Text drüber", "brauch eine Grafik dazu", "zeig da eine Zahl an", "mach ein Intro-Insert", "build a lower third", "add a title card", "put a graphic over this", "overlay some text", "animate this number". Covers the HTML template contract, Chrome headless frame rendering, alpha-preserving movie encoding, and the overlays block in project.json.

Habilidades Relacionadas