Communitygithub.com

businessbaum/vedit

Esta habilidad se usa cuando el usuario pide decidir de qué trata realmente el video antes de cualquier corte mecánico — 'bau die Story', 'was soll ins Video', 'was kann raus', 'welche Themen bleiben', 'kürz das auf 6 Minuten', 'mach daraus ein kurzes Video', 'wo ist der Hook', 'sortier die Themen', 'worum geht es hier eigentlich', 'build the story', 'decide what stays', 'structure this', 'cut this down to N minutes', 'find the hook', 'reorder the topics'. Es el pase de selección de CONTENIDO que escribe el bloque 'story' en project.json; se ejecuta después de transcribir y antes del corte bruto.

¿Qué es vedit?

Esta habilidad, `cut-story`, es el paso crítico de selección de contenido en un flujo de trabajo de edición de video basado en transcripción. A diferencia del corte mecánico (que solo ajusta lo dicho en el orden original), esta etapa analiza la transcripción del video para decidir qué bloques temáticos sobreviven, en qué orden, y dónde se encuentra el 'gancho'. Soporta flujos de trabajo donde se solicita reducir la duración, reordenar temas o encontrar el mensaje central, y se integra con un motor de edición basado en Python. El proceso incluye la creación de una transcripción legible, el análisis de bloques con pruebas de descarte (como la prueba de creencia o la prueba de calentamiento), la identificación del gancho, y la escritura de un bloque 'story' en project.json que almacena las decisiones de forma reversible. Está diseñado para plataformas como Claude Code, Cursor o Codex, y su enfoque principal es la toma de decisiones editoriales, no el corte técnico. La habilidad también maneja transcripciones largas delegando el análisis a un agente especializado y garantiza que ninguna decisión sea definitiva al mantener los bloques descartados en el array con una bandera 'drop'.

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

Preguntar en tu IA favorita

Abre un nuevo chat con esta habilidad de agente ya precargada.

Documentación


name: cut-story description: Esta habilidad se usa cuando el usuario pide decidir de qué trata realmente el video antes de cualquier corte mecánico — "bau die Story", "was soll ins Video", "was kann raus", "welche Themen bleiben", "kürz das auf 6 Minuten", "mach daraus ein kurzes Video", "wo ist der Hook", "sortier die Themen", "worum geht es hier eigentlich", "build the story", "decide what stays", "structure this", "cut this down to N minutes", "find the hook", "reorder the topics". Es el pase de selección de CONTENIDO que escribe el bloque "story" en project.json; se ejecuta después de transcribir y antes del corte bruto. argument-hint: [project-slug] [target-minutes] arguments: [project, target]

cut-story

Decide de qué trata el video realmente. El corte mecánico solo ajusta lo dicho en el orden en que se dijo; este pase decide qué bloques temáticos sobreviven, en qué orden y dónde está el gancho. Es la única etapa que puede convertir una divagación de 25 minutos en un video de 6 minutos, y es la etapa que más determina si alguien lo mira.

Argumentos: $project es el slug del proyecto, $target una duración objetivo opcional en minutos. El texto completo de la solicitud está en $ARGUMENTS. Si no se proporciona slug, usa el proyecto nombrado en PIPELINE_STATE del hook de sesión y di cuál elegiste.

Los nombres de verbo a continuación siguen el contrato de compilación. Si python engine/ve.py --help discrepa, la CLI tiene prioridad — usa sus nombres y menciona la discrepancia.

Precondiciones

  • projects/$project/project.json existe con stage en transcribed o posterior.
  • transcript.path se resuelve y transcript.word_count está establecido.
  • Si stage todavía está en intake, detente y ejecuta primero la habilidad de transcripción.

Nunca ejecutes este pase dos veces en silencio. Si story.blocks ya existe, muestra las decisiones actuales primero y pregunta si revisar o reemplazar.

Paso 1 — obtener una transcripción legible

El JSON a nivel de palabras es prosa ilegible. Aplánalo primero:

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

Esto emite las palabras como texto corrido con un marcador de índice cada 25 palabras. Los índices de palabras son los anclajes que almacena el bloque story — nunca almacenes segundos, nunca almacenes códigos de tiempo.

Paso 2 — enviar transcript-analyst cuando la transcripción es larga

Si word_count > 2500 (aproximadamente 15 minutos de habla en alemán), envía al agente transcript-analyst en lugar de leer la transcripción en línea.

Por qué: una transcripción de 5,000 palabras consume el contexto que necesitas para el resto de la sesión, y el analista devuelve aproximadamente 40 líneas. Leerlo tú mismo también te sesga — después de haber leído cada frase, todo parece importante. Un contexto fresco corta más fuerte, que es lo correcto.

Dale al agente: la ruta de la transcripción aplanada, la duración objetivo, la plataforma de output.platform, y cualquier dirección que el usuario haya dado en $ARGUMENTS. Devuelve bloques candidatos con decisiones y fundamentos. Tú sigues siendo el responsable de la decisión final — revisa sus descartes, y anula cualquier descarte que el usuario haya pedido explícitamente mantener.

Por debajo de 2500 palabras, lee la transcripción tú mismo.

Paso 3 — nombrar el video en una oración

Antes de cualquier decisión sobre bloques, escribe una oración en alemán que diga qué cree el espectador al final que no creía al principio. Muéstrasela al usuario.

Si esa oración no se puede escribir, el material aún no contiene un video. Dilo claramente y detente — recomienda una grabación de recuperación en lugar de ensamblar algo informe. Este es un resultado real y entregarlo honestamente es más útil que un video limpio de 6 minutos que no dice nada.

Cada decisión posterior responde a esa oración.

Paso 4 — dividir la transcripción en bloques

Un bloque es una unidad de significado que sobrevive al ser movida: de 30 segundos a 3 minutos, un punto. Los bloques son rangos de palabras contiguos que cubren la transcripción sin espacios ni superposiciones.

No cortes bloques en las pausas. Córtalos donde cambie el tema — las propias señales del hablante son fiables en alemán: also, jetzt zum Thema, das andere ist, kurz noch, um nochmal zurückzukommen, was viele nicht wissen.

Paso 5 — decidir, con tendencia a descartar

Expectativa por defecto: descarta el 40-60% de las palabras grabadas. Si sobrevive más del 70% del material, no se ha tomado ninguna decisión — vuelve atrás y aplica las pruebas de descarte con más rigor.

Pruebas de descarte, aplicadas en orden:

  1. La prueba de creencia. Elimina el bloque. ¿Cambia lo que el espectador cree al final? Si no, descártalo. Esta es la prueba principal; el resto son atajos hacia ella.
  2. La prueba del segundo ejemplo. Dos ejemplos del mismo punto: conserva el más concreto, descarta el otro. Los hablantes se repiten para pensar, no para enseñar.
  3. La prueba del huérfano. La preparación para una recompensa que fue descartada ahora es ruido. Descártala, y vuelve a verificar después de cada otro descarte — los huérfanos aparecen en cascadas.
  4. La prueba del calentamiento. Los primeros 60-90 segundos de casi cualquier grabación son un calentamiento. Descartarlos por defecto y dile al usuario que lo hiciste. Esta única regla mejora más videos que todas las eliminaciones de muletillas combinadas.
  5. La prueba del resumen. Los resúmenes hablados de lo que se acaba de decir ("also nochmal kurz zusammengefasst") son una muletilla al hablar, no una estructura. Descarta a menos que el video sea genuinamente instructivo y largo.

Señales para conservar, las más fuertes primero: un número, un nombre, una fecha, un error específico que el hablante admite, un ejemplo trabajado concreto. La especificidad es la señal más fuerte para conservar que existe. El marco abstracto es barato y se puede volver a grabar en diez segundos; una anécdota específica no.

Usa "decision": "maybe" para bloques cuyo destino depende de la duración final. Mantén maybe por debajo del 20% de los bloques — más allá de eso es indecisión, no matiz, y el usuario tiene que hacer el trabajo que se te pidió.

Si $target está establecido, haz una comprobación de cordura: suma los conteos de palabras de los bloques conservados y divide por la tasa medida del hablante (word_count / duración de la fuente en minutos). Informa la estimación antes de escribir nada. El habla de una persona frente a cámara en alemán va aproximadamente a 130-160 palabras por minuto.

Paso 6 — encontrar el gancho

El gancho casi nunca está al inicio de la grabación. La gente llega a su punto real tarde, después de haberse calentado y dejar de actuar.

Busca primero en el último tercio. Busca: una afirmación que suene incorrecta hasta que se explique, un número que sea más grande o más pequeño de lo esperado, un fracaso admitido, una apuesta ("das hat mich zwei Wochen gekostet"). Elige 15-25 segundos — una o dos oraciones, no un párrafo.

Escríbelo como story.hook con un word_range y una note en alemán que explique por qué se movió. Mover el gancho al inicio es la única reordenación que casi siempre es correcta.

Paso 7 — ordenar, y solo reordenar cuando puedas nombrar la razón

Hay exactamente dos razones legítimas para reordenar:

  1. El gancho va al inicio.
  2. Un bloque responde a una pregunta que plantea un bloque posterior, por lo que debe precederlo.

Todo lo demás mantiene el orden de grabación. Reordenar material hablado rompe referencias hacia atrás, y no notarás la ruptura hasta el renderizado — momento en el que ya se han ejecutado tres etapas.

Verificación de integridad de referencias, obligatoria para cada bloque movido. Vuelve a leer las dos primeras oraciones del bloque movido en busca de referencias hacia atrás. En alemán, estas se rompen silenciosamente: also, deswegen, deshalb, dadurch, dabei, wie gesagt, das, dieser/diese/dieses, außerdem, trotzdem, andererseits, wie eben erwähnt. Si un bloque movido comienza con una de ellas, comienza el bloque una oración después, o márcalo como maybe y dile al usuario que necesita una línea de transición. No lo muevas y esperes que funcione.

Paso 8 — escribir el bloque story

Escribe story.blocks[] y story.hook en projects/$project/project.json exactamente como lo define el esquema en docs/edl-schema.md: id, word_range (semiabierto, en índices de palabras), label (en alemán), decision (keep|drop|maybe), order (orden de salida, puede diferir del orden de grabación), rationale.

Reglas que no son negociables:

  • Nada se elimina. Un bloque descartado permanece en el array con "decision": "drop". Cada decisión debe ser reversible cambiando un solo campo. El usuario estará en desacuerdo con algunos de tus descartes y debe poder deshacerlos sin volver a ejecutar el pase.
  • rationale es una cláusula en alemán y dice POR QUÉ, no QUÉ. "trägt das kernargument" es útil; "spricht über Frame-Snapping" es una etiqueta, no una razón.
  • order es denso sobre los bloques conservados comenzando en 0. Los bloques descartados obtienen su índice de orden de grabación; son inertes pero no deben colisionar.
  • Establece stage en "story". No toques segments[] — ese es territorio de cut-rough.

Luego muéstrale al usuario una tabla compacta: orden, etiqueta, decisión, minutos estimados. Esa tabla es el entregable, no el JSON.

Paso 9 — entregar

Di explícitamente que el corte mecánico ahora se ejecutará solo dentro de los bloques conservados, lo cual es tanto correcto como más eficiente — la detección de muletillas y retomas sobre material que está a punto de ser descartado es trabajo desperdiciado. Luego ofrece la habilidad cut-rough.

Modos de fallo

SíntomaCausaSolución
Todo parece esencialLeer la transcripción en línea cuando era largaEnvía a transcript-analyst; un contexto fresco corta más fuerte
Se conservó el 85% del materialNo se tomó ninguna decisión editorialVuelve a aplicar la prueba de creencia a cada bloque
El video salta de manera extraña después de reordenarReferencia hacia atrás rotaEjecuta la verificación del Paso 7 en cada bloque movido
word_range tiene espacios o superposicionesLos bloques no cubren la transcripciónLos bloques deben ser contiguos y semiabiertos
El usuario rechaza la mayoría de los descartesOración incorrecta en el Paso 3Reescribe la tesis de una oración con el usuario, luego rehaz

Individual skills in this repo

This repo contains 3 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.

Skills relacionados