Communitygithub.com

businessbaum/vedit

Cette compétence est utilisée lorsque l'utilisateur demande de décider de quoi parle réellement la vidéo avant toute coupe mécanique – « construis l'histoire », « qu'est-ce qui reste », « quels sujets garder », « réduis à 6 minutes », « trouve l'accroche », « structure ça ». C'est la passe de sélection du CONTENU qui écrit le bloc « story » dans project.json ; elle s'exécute après la transcription et avant la coupe brute.

Qu'est-ce que vedit ?

La compétence `cut-story` (alias `businessbaum/vedit`) est le cœur éditorial d'un pipeline de montage vidéo. Contrairement aux coupes mécaniques qui ne font que resserrer le discours dans l'ordre original, cette compétence décide quels blocs de sujets survivent, dans quel ordre, et où se trouve l'accroche. Elle transforme une divagation de 25 minutes en une vidéo de 6 minutes et détermine en grande partie si quelqu'un regardera le résultat. La compétence prend en argument un slug de projet (et optionnellement une durée cible en minutes) et s'appuie sur un transcript aplati. Elle dispose d'un agent spécialisé `transcript-analyst` pour les longs transcripts (plus de 2500 mots) afin de préserver le contexte. Ses principes clés incluent : une attente par défaut de supprimer 40 à 60 % du contenu, une série de tests de suppression (croyance, second exemple, orphelin, échauffement, récapitulatif), et des contrôles stricts d'intégrité des références lors du réordonnancement. Les décisions sont stockées dans `story.blocks[]` avec un champ `rationale` expliquant le POURQUOI, et rien n'est jamais supprimé définitivement (les blocs supprimés restent avec `decision: drop`).

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

Demander à votre IA préférée

Ouvre une nouvelle conversation avec cette compétence d'agent déjà préchargée.

Documentation


name: cut-story description: Cette compétence est utilisée lorsque l'utilisateur demande de décider de quoi parle réellement la vidéo avant toute coupe mécanique – « construis l'histoire », « qu'est-ce qui reste », « quels sujets garder », « réduis à 6 minutes », « trouve l'accroche », « structure ça », « découpe ça en N minutes », « trouve l'accroche », « réorganise les sujets ». C'est la passe de sélection du CONTENU qui écrit le bloc « story » dans project.json ; elle s'exécute après la transcription et avant la coupe brute. argument-hint: [project-slug] [target-minutes] arguments: [project, target]

cut-story

Décidez ce qu'est la vidéo vraiment. La coupe mécanique ne fait que resserrer ce qui a été dit dans l'ordre où cela a été dit ; cette passe décide quels blocs de sujets survivent, dans quel ordre, et où se trouve l'accroche. C'est la seule étape qui peut transformer une divagation de 25 minutes en une vidéo de 6 minutes, et c'est l'étape qui détermine le plus si quelqu'un regarde.

Arguments : $project est le slug du projet, $target une durée cible optionnelle en minutes. Le texte complet de la demande se trouve dans $ARGUMENTS. Si aucun slug n'est fourni, utilisez le projet nommé dans PIPELINE_STATE du crochet de session et indiquez lequel vous avez choisi.

Les noms des verbes ci-dessous suivent le contrat de construction. Si python engine/ve.py --help est en désaccord, la CLI prévaut – utilisez ses noms et mentionnez l'incohérence.

Préconditions

  • projects/$project/project.json existe avec stage à transcribed ou plus tard.
  • transcript.path est résolu et transcript.word_count est défini.
  • Si stage est encore à intake, arrêtez-vous et exécutez d'abord la compétence de transcription.

N'exécutez jamais cette passe deux fois en silence. Si story.blocks existe déjà, affichez d'abord les décisions actuelles et demandez s'il faut réviser ou remplacer.

Étape 1 – obtenir un transcript lisible

Le JSON au niveau des mots est une prose illisible. Aplatissez-le d'abord :

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

Cela émet les mots comme un texte courant avec un marqueur d'index de mot tous les 25 mots. Les indices de mots sont les ancres que le bloc story stocke – ne stockez jamais de secondes, ne stockez jamais de timecodes.

Étape 2 – envoyer un transcript-analyst lorsque le transcript est long

Si word_count > 2500 (environ 15 minutes de discours en allemand), envoyez l'agent transcript-analyst au lieu de lire le transcript en ligne.

Pourquoi : un transcript de 5 000 mots consomme le contexte dont vous avez besoin pour le reste de la session, et l'analyste renvoie environ 40 lignes. Le lire vous-même vous biaise aussi – après avoir lu chaque phrase, tout semble important. Un contexte frais coupe plus sévèrement, ce qui est correct.

Donnez à l'agent : le chemin du transcript aplati, la durée cible, la plateforme de output.platform, et toute orientation que l'utilisateur a donnée dans $ARGUMENTS. Il renvoie des blocs candidats avec décisions et justifications. La décision finale vous appartient toujours – examinez ses suppressions, et annulez toute suppression que l'utilisateur a explicitement demandé de conserver.

En dessous de 2500 mots, lisez le transcript vous-même.

Étape 3 – nommer la vidéo en une phrase

Avant toute décision de bloc, écrivez une phrase en allemand qui dit ce que le spectateur croit à la fin qu'il ne croyait pas au début. Montrez-la à l'utilisateur.

Si cette phrase ne peut pas être écrite, le matériau ne contient pas encore de vidéo. Dites-le clairement et arrêtez-vous – recommandez un enregistrement de rattrapage plutôt que d'assembler quelque chose d'informe. C'est un résultat réel, et le livrer honnêtement est plus utile qu'un joli rien de 6 minutes.

Chaque décision ultérieure répond à cette phrase.

Étape 4 – découper le transcript en blocs

Un bloc est une unité de sens qui survit à un déplacement : de 30 secondes à 3 minutes, une idée. Les blocs sont des plages de mots contiguës qui tuilent le transcript sans lacunes ni chevauchements.

Ne coupez pas les blocs aux pauses. Coupez-les là où le sujet change – les propres jalons de l'orateur sont fiables en allemand : also, jetzt zum Thema, das andere ist, kurz noch, um nochmal zurückzukommen, was viele nicht wissen.

Étape 5 – décider, avec un biais vers la suppression

Attente par défaut : supprimez 40 à 60 % des mots enregistrés. Si plus de 70 % du matériau survit, aucune décision n'a été prise – revenez en arrière et appliquez les tests de suppression plus sévèrement.

Tests de suppression, appliqués dans l'ordre :

  1. Le test de la croyance. Supprimez le bloc. Ce que le spectateur croit à la fin change-t-il ? Si non, supprimez-le. C'est le test principal ; les autres ne sont que des raccourcis.
  2. Le test du deuxième exemple. Deux exemples du même point : gardez le plus concret, supprimez l'autre. Les orateurs se répètent pour réfléchir, pas pour enseigner.
  3. Le test de l'orphelin. La mise en place d'une conclusion qui a été supprimée devient du bruit. Supprimez-la, et revérifiez après chaque autre suppression – les orphelins apparaissent en cascade.
  4. Le test de l'échauffement. Les 60 à 90 premières secondes de presque tout enregistrement sont un éclaircissement de gorge. Supprimez-les par défaut et dites à l'utilisateur que vous l'avez fait. Cette seule règle améliore plus de vidéos que toutes les suppressions de mots de remplissage combinées.
  5. Le test du récapitulatif. Les résumés oraux de ce qui vient d'être dit (« also nochmal kurz zusammengefasst ») sont une béquille de parole, pas une structure. Supprimez sauf si la vidéo est vraiment didactique et longue.

Signaux à conserver, du plus fort au plus faible : un nombre, un nom, une date, une erreur spécifique que l'orateur admet, un exemple concret travaillé. La spécificité est le signal de conservation le plus fort qui soit. Un cadrage abstrait est bon marché et peut être réenregistré en dix secondes ; une anecdote spécifique ne le peut pas.

Utilisez "decision": "maybe" pour les blocs dont le sort dépend de la durée finale. Maintenez maybe sous 20 % des blocs – au-delà, c'est de l'indécision, pas de la nuance, et l'utilisateur doit faire le travail qu'on vous a demandé de faire.

Si $target est défini, vérifiez sa plausibilité : additionnez les comptes de mots des blocs conservés et divisez par le débit mesuré de l'orateur (word_count / durée source en minutes). Rapportez l'estimation avant d'écrire quoi que ce soit. Le discours en plan tête parlante en allemand tourne autour de 130-160 mots par minute.

Étape 6 – trouver l'accroche

L'accroche n'est presque jamais au début de l'enregistrement. Les gens arrivent à leur vrai point tardivement, après s'être échauffés et avoir arrêté de performer.

Cherchez d'abord dans le dernier tiers. Cherchez : une affirmation qui semble fausse jusqu'à ce qu'elle soit expliquée, un nombre plus grand ou plus petit que prévu, un échec admis, un enjeu (« das hat mich zwei Wochen gekostet »). Choisissez 15 à 25 secondes – une ou deux phrases, pas un paragraphe.

Écrivez-la comme story.hook avec un word_range et une note en allemand expliquant pourquoi elle a été déplacée. Déplacer l'accroche vers l'avant est le seul réordonnancement qui est presque toujours correct.

Étape 7 – ordonner, et ne réordonner que lorsque vous pouvez nommer la raison

Il y a exactement deux raisons légitimes de réordonner :

  1. L'accroche va au début.
  2. Un bloc répond à une question qu'un bloc ultérieur pose, donc il doit le précéder.

Tout le reste conserve l'ordre d'enregistrement. Réordonner du matériel parlé brise les références arrière, et vous n'entendrez pas la rupture avant le rendu – moment où trois étapes ont déjà été exécutées.

Vérification d'intégrité des références, obligatoire pour chaque bloc déplacé. Relisez les deux premières phrases du bloc déplacé pour détecter les références arrière. En allemand, elles se brisent silencieusement : also, deswegen, deshalb, dadurch, dabei, wie gesagt, das, dieser/diese/dieses, außerdem, trotzdem, andererseits, wie eben erwähnt. Si un bloc déplacé commence par l'un d'eux, soit commencez le bloc une phrase plus tard, soit marquez-le maybe et dites à l'utilisateur qu'il a besoin d'une phrase de liaison. Ne le déplacez pas en espérant.

Étape 8 – écrire le bloc story

Écrivez story.blocks[] et story.hook dans projects/$project/project.json exactement comme le schéma dans docs/edl-schema.md le définit : id, word_range (semi-ouvert, en indices de mots), label (allemand), decision (keep|drop|maybe), order (ordre de sortie, peut différer de l'ordre d'enregistrement), rationale.

Règles non négociables :

  • Rien n'est supprimé. Un bloc supprimé reste dans le tableau avec "decision": "drop". Chaque décision doit être réversible en basculant un champ. L'utilisateur sera en désaccord avec certaines de vos suppressions et doit pouvoir les annuler sans réexécuter la passe.
  • rationale est une proposition en allemand et dit POURQUOI, pas QUOI. « trägt das kernargument » est utile ; « spricht über Frame-Snapping » est un libellé, pas une raison.
  • order est dense sur les blocs conservés en commençant à 0. Les blocs supprimés obtiennent leur index d'ordre d'enregistrement ; ils sont inertes mais ne doivent pas entrer en conflit.
  • Réglez stage sur "story". Ne touchez pas à segments[] – c'est le territoire de cut-rough.

Ensuite, montrez à l'utilisateur un tableau compact : ordre, libellé, décision, minutes estimées. Ce tableau est le livrable, pas le JSON.

Étape 9 – passer la main

Dites explicitement que la coupe mécanique va maintenant s'exécuter à l'intérieur des blocs conservés uniquement, ce qui est à la fois correct et moins coûteux – la détection des mots de remplissage et des reprises sur du matériel qui va être supprimé est un travail gaspillé. Proposez ensuite la compétence cut-rough.

Modes de défaillance

SymptômeCauseCorrectif
Tout semble essentielLecture du transcript en ligne alors qu'il était longEnvoyez transcript-analyst ; un contexte frais coupe plus sévèrement
85 % du matériau conservéAucune décision éditoriale n'a été priseRéappliquez le test de la croyance à chaque bloc
La vidéo saute étrangement après réordonnancementRéférence arrière briséeExécutez la vérification de l'étape 7 sur chaque bloc déplacé
Lacunes ou chevauchements de word_rangeBlocs non tuilésLes blocs doivent être contigus et semi-ouverts
L'utilisateur rejette la plupart des suppressionsMauvaise phrase à l'étape 3Réécrivez la thèse en une phrase avec l'utilisateur, puis recommencez

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 associés