feat: subtractive editing as default strategy

This commit is contained in:
2026-07-15 15:25:56 +08:00
parent 87eb3392df
commit 7a4d3fc74b
4 changed files with 77 additions and 45 deletions
+53 -30
View File
@@ -1,6 +1,6 @@
---
name: video-edit-planner
description: "Use when planning video edits: transcribe audio, extract key frames, analyze visuals, and produce cut/transition/assembly plans via iterative dialogue."
description: "Use when planning video edits: transcribe audio, extract key frames, analyze visuals, and produce cut/transition/assembly plans via iterative dialogue. Defaults to subtractive editing (delete boring parts from continuous timeline) for coherent results."
license: MIT
tags:
[
@@ -22,6 +22,18 @@ A conversational video-editing planning assistant. The user provides a video fil
The skill is **agent-driven, not scripted**: it provides tools (transcription, clipping, frame extraction, index management) and guidance for the agent to autonomously decide when and what to extract based on user needs.
## Editing Strategy
The skill defaults to **subtractive editing** — the most reliable way to produce coherent video from long recordings.
**Subtractive (default):** Load the full recording onto the NLE timeline and delete boring parts. What remains is a continuous, naturally flowing video. The transcript is used to **identify what to cut** (sparse dialogue, repetitive actions, dead air), not what to extract. Best for: story-driven content, medium-length videos (515 min), gameplay with narrative arcs.
**Additive (supplementary):** Extract individual interesting moments and assemble them from scratch. Best for: Shorts/TikTok, pure highlight reels, very short videos (<3 min). Produces short fragments that are hard to transition smoothly — use only when the target format demands it.
**Hybrid (recommended for most cases):** Subtractive backbone with optional inserts. Delete boring parts from the continuous timeline, then optionally insert high-impact moments from elsewhere in the recording as cutaways. This combines coherence with the ability to spotlight great moments that occur outside the main narrative flow.
When the user asks for a full edit plan, ask which strategy they prefer. Default to subtractive unless the user specifically wants Shorts/highlight-reel format.
## When to Use
- User provides a video path and wants help planning cuts, transitions, or assembly.
@@ -70,6 +82,12 @@ Before transcribing, ask the user what they want to do with the video. User requ
For full video-edit planning requests, ask early whether the user wants **one focused recommended cut** or **multiple alternative editing strategies**. If they want alternatives, analyze a wider set of candidate segments and present modular options the user can freely combine into their own final cut. Do not force the plan into a rigid one-path timeline where every section has only one fixed choice.
Also ask which editing strategy the user prefers:
- **Subtractive (default):** Delete boring parts from the full recording, keeping continuous segments. Best for coherence and flow.
- **Additive:** Extract individual clips and assemble them. Best for Shorts/highlight reels.
- **Hybrid (recommended):** Subtractive backbone with optional inserts from elsewhere.
If the user doesn't specify, default to subtractive — it produces more coherent results and is easier to execute in an NLE.
If the agent's runtime supports structured questioning (e.g., a `clarify` tool or a `grill-me` skill), use it to gather requirements systematically. Ask questions one at a time with multiple-choice options — this is much more effective than a free-text wall of questions.
**The requirements questionnaire below covers the key axes for gameplay/creator video editing.** Not every question applies to every session — pick the relevant ones based on the user's initial request. See `references/editing-requirements-questionnaire.md` for the full questionnaire with choices.
@@ -79,6 +97,7 @@ If the agent's runtime supports structured questioning (e.g., a `clarify` tool o
| Target platform (Bilibili / Douyin / YouTube / Shorts) | Determines aspect ratio, pacing, subtitle density, meme density |
| Narrative style (funny compilation / story + comedy / highlights montage) | Determines structure: pure clip reel vs. narrative arc |
| Planning mode (single recommended cut / multiple alternatives) | Determines whether to produce one focused timeline or modular strategy options the user can mix and match |
| Editing strategy (subtractive / additive / hybrid) | Determines whether to plan by deleting boring parts from continuous timeline (default) or by extracting and assembling clips |
| Role distribution (main POV / equal co-op / host / commentator) | Determines whose voice/reactions to prioritize in cuts |
| Effect density (minimal / medium / high) | Determines how many stickers, overlays, and effects to search for and apply |
| Editor tool (Premiere Pro / CapCut / DaVinci / other) | Determines how specific transition/effect instructions are phrased |
@@ -333,6 +352,8 @@ Use whatever vision capability the agent's runtime provides to analyze extracted
When the user asks for **clip candidates from a specific time range** of an already-transcribed video (for example, `22:0045:00`) rather than a full edit plan for the whole recording, do a lightweight **transcript-first mining pass** before any heavy extraction:
**Subtractive framing:** When using a subtractive strategy, the transcript mining pass identifies BORING ranges to cut, not just interesting ranges to keep. A range with sparse dialogue, repetitive actions, or no reactions is a cut candidate. A range with dense dialogue, reactions, or story progression is a keep candidate.
1. Load every relevant transcript track covering that window and slice to the requested range.
2. Compute simple density signals per minute or rolling window (segment count, character count, keyword hits, overlapping reactions across tracks).
3. Print and review the top windows plus manually chosen story pivots (setup / escalation / payoff), not just the numerically densest span.
@@ -355,53 +376,53 @@ Output a Markdown table with overall recommendations, then let the user iterate.
<1-3 sentences of high-level recommendation addressing the user's goal>
### Segments
### Editing strategy
Each segment below is self-contained: timecode, suggested duration, content/reason, edit technique, visual materials, sound effects, and BGM are all listed together — not split into separate chapters.
<Subtractive / Hybrid / Additive — one sentence explaining why>
#### Segment 1 — <short title>
### Timeline
The timeline below shows what to KEEP and what to CUT. In subtractive mode, the "keep" segments form the backbone — the user loads the full recording into their NLE and deletes the "cut" ranges. In hybrid mode, "insert" segments are moments from elsewhere to drop into the timeline.
#### Keep — <short title>
| Field | Value |
|---|---|
| Timecode | 00:01:2300:01:45 |
| Suggested duration | ~22s |
| Content / reason | Character enters town, NPC dialogue reveals quest hook |
| Edit technique | Hard cut in, match-on-action to next segment |
| Visual materials | Sticker: shocked reaction face; search: shocked / surprised meme |
| Sound effects | Whoosh on cut; search: whoosh / transition sound effect |
| BGM | Light exploration theme, fade in at 00:01:25 |
| Timecode | 00:01:2300:03:45 |
| Suggested duration | ~2m22s |
| Content / reason | Combat encounter with multi-phase boss, includes reactions and callouts |
| Edit technique | Keep continuous; trim start/end by ±3s for tighter entry |
| Visual materials | Zoom-in on phase transition; search: zoom-in / magnify meme |
| Sound effects | Impact hit on phase change; search: impact / hit sound effect |
| BGM | Combat track, sync phase change to beat drop |
#### Segment 2 — <short title>
#### Cut — <short title>
| Field | Value |
|---|---|
| Timecode | 00:01:4500:02:10 |
| Suggested duration | ~25s |
| Content / reason | Walking with no dialogue or event — cut |
| Edit technique | Cut entirely |
| Visual materials | — |
| Sound effects | — |
| BGM | — |
| Timecode | 00:03:4500:08:20 |
| Duration | ~4m35s |
| Reason | Walking between areas, no dialogue or events |
| Bridge shot | Optional: 0.5-1s fast-forward clip if the transition feels abrupt |
#### Segment 3 — <short title>
#### Insert (optional, hybrid mode) — <short title>
| Field | Value |
|---|---|
| Timecode | 00:02:1000:02:35 |
| Suggested duration | ~25s |
| Content / reason | Combat starts, highlight moment with reaction |
| Edit technique | Keep, slow-motion on hit, fade in from black |
| Visual materials | Zoom-in effect on impact; search: zoom-in / magnify meme |
| Sound effects | Impact hit + record scratch on slow-mo; search: impact / punch / hit sound effect / record scratch |
| BGM | Switch to combat track, sync hit to beat drop |
| Source timecode | 00:45:1000:45:25 |
| Suggested duration | ~15s |
| Content / reason | Funny reaction from later in the recording, works as a cutaway |
| Insert at | After the first keep segment (00:03:45) |
| Edit technique | Cutaway, audio dip under BGM |
| Visual materials | Reaction sticker; search: shocked / laughing meme |
| Sound effects | Record scratch on cutaway; search: record scratch |
### Alternative Strategy Options (if requested)
| Module | Option | Best for | Candidate segments | Tradeoffs |
| ------ | ------ | -------- | ------------------ | --------- |
| Opening | Cold open with funniest quote | Fast hook | 00:03:1000:03:24 / 00:18:4000:19:05 | Strong hook, weaker story setup |
| Story arc | Slow setup → escalation → payoff | Clear narrative | 00:01:2000:02:30 / 00:12:0000:14:10 / 00:22:3000:23:20 | Better story, slower pacing |
| Insert | Short visual gag bridge | Rhythm reset | 00:08:1000:08:16 | Optional; use only if pacing feels too dense |
| Opening | Cold open with funniest quote | Fast hook | 00:03:1000:03:24 | Strong hook, weaker story setup |
| ... | ... | ... | ... | ... |
```
**Completion criteria:** user receives a Markdown table addressing their stated goal, and is invited to ask follow-up questions.
@@ -555,6 +576,8 @@ This creates an isolated venv with `funasr`, `torch`, `torchaudio`. If the user
26. **Saving frames to `/tmp/` or other temporary directories.** All extracted frames must go in the video file's directory (e.g., `<video_stem>_frames/`). When using `execute_code` or direct `ffmpeg` commands, always set the output path to the video directory — not `/tmp/frames/` or any other temp directory. Temporary directories are not portable, get cleaned up by the OS, and break the self-contained workflow. This applies to both spot-verification frames and full clip extraction.
27. **Using shell `&` to parallelize ffmpeg commands.** Some terminal tools reject shell-level backgrounding (`command &`) and require using `background=true` instead. When extracting multiple spot-verification frames in parallel, use a sequential `for` loop (each frame takes <1s so the total is still fast), or use the terminal tool's `background=true` parameter if available. Do not use `&` inside a single terminal call.
28. **Forgetting `--video` on `manage_index.py add-transcription`.** The `add-transcription` subcommand requires `--video VIDEO_PATH` to locate the index file next to the video. Omitting it causes an argument error. The same applies to `add-clip` and `add-frames` — always pass `--video`.
29. **Defaulting to additive editing for long-form content.** For videos longer than 34 minutes, subtractive editing (deleting boring parts from a continuous timeline) produces more coherent results than extracting and stitching short clips. The agent should default to subtractive unless the user explicitly wants Shorts/TikTok format or a pure highlight reel. See "Editing Strategy" section above.
30. **Recommending keep segments that are too short for subtractive editing.** In subtractive mode, "keep" segments should be continuous ranges of 30 seconds or longer — not 510 second fragments. If a 10-second moment is interesting but surrounded by boring content, recommend keeping a wider range (e.g., 3060s) that includes setup and payoff, rather than extracting just the punchline. Short fragments are for "insert" segments in hybrid mode, not for the backbone timeline.
## Verification checklist