edit-workflow
Skill6 starsChanged 28 days agoMITView on GitHub
The engine for every BashCut edit, raw footage to export: intake, recipe, survey, the cut as one plan, sound, text, review, draft, through the user's gates with evidence and audits; names the skill per stage. Triggers: "dựng video", "cắt video", "làm vlog", "dựng giúp", "sửa lại video", "edit this", "bắt đầu từ đâu", "video quảng cáo".
1 other project uses a version of this.
Adopted by
Most recently taken up by
- ethereum/execution-specstheir own version, first seen Oct 8, 2026
Other versions1 project uses a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 1
- ethereum/execution-specs★ 1.2ksame name
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository16 other files it gives its agents.
- audio-mixSkill
- beat-cutSkill
- captions-textSkill
- color-gradeSkill
- effectsSkill
- footage-surveySkill
- librarySkill
- motion-graphicsSkill
- reviewSkill
- rough-cutSkill
- self-learnSkill
- setupSkill
- stock-imagesSkill
- style-studySkill
- visual-planSkill
- voiceoverSkill
The file
We split this skill into the rules it gives an agent
3 rules. About 0 are common, 0 are distinctive, and 3 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈0
Distinctive · estimate
This author's own choices. Worth a look.
3
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 8
Read one section when a step names it, never a whole file (sed -n '/^## Starting/,/^## [A-Z]/p' <skill_dir>/REFERENCE.md):
- Very specific: line 59
No recipe plugin: tell the user /bc:setup, use kit defaults.
- Very specific: line 67
No footage (an explainer): no survey.
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Editing a video in BashCut
Read one section when a step names it, never a whole file
(sed -n '/^## Starting/,/^## [A-Z]/p' <skill_dir>/REFERENCE.md):
<skill_dir>/REFERENCE.md: Starting a project, Intake questions, The brief and the plan as data, Story, Screen recording with a presenter, Taste of the user, Working efficiently, Syntax the runs looked up, Run log, The hand-off report.<skill_dir>/FULL.md: Modes, Stages, checklist and gates, Gates, Audits, Review, draft and export, Learn.
A recipe (plugin skill) writes data into the plan; this skill runs the process.
Editorial numbers are ranges with their source: choose within them for this footage, say why in the plan
("deliberate": true with the reason to leave one).
Hard rules
- Tool rules are BashCut's (its instructions):
--base-rev, [Scope], errors, library first, downloads, no ffmpeg. Stop only at gates. The syntax given here and in REFERENCE "Syntax the runs looked up" is enough: nobashcut help,help <cmd>,--helporschema getfor a command this skill names. - Downloads need no source or licence records. Install a plugin the edit needs (
plugins search --capability,plugins install). Plugin skills are read-only (fixes:bc:self-learn). - Every call resends the whole context (cost ≈ calls × context): write
plan.cutwhole once, fix it on the plan (check, audits), then apply and render once. Keep whatcontext getreturned and what you wrote: noproject get,project dataortimeline getbetween steps.--base-rev laston every edit (it is the revision your session's last command saw, reads included): never read the project forrev. One plan write per stage: oneproject set-data plan --mergewith every key that changed (stagetoo; a list is replaced whole, so send the whole list), never one per key. - Sub-agents run in the foreground (
run_in_background: false) and fix their own findings first. A fix round is a new foreground call, neverSendMessage; never end a turn to wait. Everyplan apply/timeline applycarries--why(and--evidence). - You never certify yourself:
doneneeds evidence, "fixed" needsreview verify, "exported" needs the job, a pass needs an audit by someone else (or markedself). You cannot hear: say which sound you did not check. - Kit scripts run with
uv. Files named in English, lowercase, hyphens (draft-v1).
The quick path (default)
Unless the user asked for the full process, the video runs over ~3 min, or plan.mode is full (then FULL.md).
Same gates and audits. Target: a 45 s ad or explainer in about 20 main calls (two system-diagram benches made
25 and 48; most of the rest were the lookups this path now gives).
Bootstrap, one call (no
ls,which,bashcut helporworkflow gates:context gethas the gates andnext; recipes are plugin skillsvlog-<kind>):K=<skill_dir>/..; bashcut context get; bashcut knowledge get bashcut skills get vlog-<kind> --section "Plan data,Ranges,Review notes,Build,Structure,Sound" \ | jq -r '.sections, .text' # every section you need, in this one read sed -n '/^## Before round 1/,/^## The loop/p' $K/review/SKILL.md sed -n '/^## The brief and the plan as data/,/^## Story/p' $K/edit-workflow/REFERENCE.md "$HOME/Library/Application Support/BashCut/Plugins/bashcut.hyperframes/bin/graphic" examples \ | jq -r '.[]|"\(.name): \(.about)"' # widget names, only when the recipe uses graphicsNo recipe plugin: tell the user
/bc:setup, use kit defaults. A widget's variables, an example's HTML and the recipe's "every field:help plan check" arebc:graphics' reading, never yours.- Ask once (≤4 questions, REFERENCE "Intake questions"), each led by "AI chọn: …". User away: write your
choices
inferred, never ask later. - Project, sound and survey, two calls:
project create --name N --dir D --footage FILE_OR_FOLDER --canvas landscape|portrait|square --fps 30 --language <tag> --import(--save-currenton "unsaved changes" of a project not yours) and the sound in the same call (step 4 "Sound"). Then the survey sub-agent (media and job IDs):bc:surveyor, else one briefed with<skill_dir>/../footage-survey/SURVEYOR.md, else that brief yourself. No footage (an explainer): no survey. Never print a transcript or digest or open source frames; its quotes resolve as they are (context:media transcript --media M --ranges 640:652 --as text). Brief, plan, limits in one call (music and SFX imported in step 3), then
project format --outputs <preset> --base-rev last,project set-data brief brief.json --base-rev last(fields{value, status: stated|inferred|confirmed, source}) andproject set-data plan plan.json --merge --base-rev lastwithpromise,sections,recipe,checks,decisions,rangesand the wholecut:{"cut": {"clips": [{"id": "c1", "media": "M", "quote": "exact words as transcribed", "section": "hook"}, {"id": "c2", "media": "M", "from": 642.8, "to": 648.0, "section": "proof", "zoom": 1.2, "transition": "dissolve:9", "cover": [{"media": "M", "from": 950.0}]}], "titles": [{"id": "t1", "text": "HOOK LINE", "clip": "c1", "preset": "hook-title"}, {"id": "t2", "text": "Place", "section": "proof", "offset": 0.5, "seconds": 2.5, "preset": "place-card", "style": {"positionY": 0.8}, "enter": "slide", "exit": "iris:8"}], "captions": {"from": "speech", "style": {"background": {"color": "#000000", "opacity": 0.6}}, "replace": {"misheard": "right"}}, "music": {"media": "S"}, "sfx": [{"media": "W", "on": "t1", "offset": -0.1}], "review": {"minTextSize": 0.035, "minTextContrast": 3, "minShotSeconds": 0.6}}}Transitions live in the plan:
transitionon a clip or graphic row is the cut into it,enter/exiton a title or graphic its In/Out ("kind","kind:frames"or"none"; kinds inbc:effects). Later applies and graphic re-renders keep them; don't set them by hand afterwards. White text over daylight measured 1.2–2:1: plate captions and titles now; two texts at once need differentpositionY. Sound: amusicbed unless the brief says none (one fixed level, set on apply 16 dB under the measured voice;duckonly for silences of 2.5 s or more,bc:audio-mix);sfxonly where a moment needs one (offset-0.1 peaks on it;bc:audio-mix"SFX"). Not in the library (library list --kind audio --query <word>;library searchis a plugin job, not a library read):uv run <skill_dir>/../audio-mix/fetch_audio.py --dest <project>/media/audio --music "chill electronic" --music-count 2 --min-seconds 50 --sfx whoosh,pop --sfx-count 1 --import, with two genre words (a four-word mood phrase found nothing in both benches and cost a retry; these are all its options, no--help). Graphics in a recipe that uses them: rows withid,section,trackandrender.composition(a name from the bootstrap list) plus what each shows and on which words inplan.visuals;bc:graphicsfillsrender.set. Review limits (review) come from the recipe'sRangesand the review table: set every limit the table lists andreview-profile-unsetwould name now, in this write (the benches addedblackMinSeconds,stillMotion,jumpCutChangeand caption limits in two or three later writes); one no source covers: choose it, say so inranges. Request G1 with the brief.- Check once:
plan checkresolves quotes on a scratch copy. An edit led by voiceover (lines, no clips) skips this step:bc:voice(step 7) fits the pauses to the length and runs the check,bc:graphicsbuilds. Fix every problem it lists in oneplan check --patch '{"clips": {"c2": {"to": 953.0}}}'(by entry ID; no scripts on plan files), check again only after that patch:cut-in-wordgivesfacts.before/afterfor the edge;same-framingis a jump cut to come (azoom1.15–1.3 on the second clip,bc:beat-cut§5, never over text, or acover). The strategy audit is yours (--by self): promise, sections,inferredbrief fields, recipe checks. - Build in the call that records it:
run append audit --point strategy --verdict pass --findings N --by self --evidence "…", G2 unless skipped (checkpoint request G2 --summary "…"),plan apply --base-rev last --sheet --why "…"(--patchholds the check's fixes: a check saves nothing). Its storyboard sheet is for G3. Every later change isplan apply --patch …. - Voice and graphics go to sub-agents (recipe steps too), lines and rows in the plan:
bc:voice, thenbc:graphics(else sub-agents briefed with<skill_dir>/../voiceover/VOICE.mdand<skill_dir>/../motion-graphics/GRAPHICS.md, else yourself). Give each the kit folder (<skill_dir>/..), project, IDs, facts, look, limits, andbc:voicethe target length (it sets the pauses and returns the duration: no second round for length); each checks its own takes or frames. Never read their skills, renders or frames (ui frameon their work is the critic's), and neverproject data planafter they return: their report says what changed. Then only what the plan cannot say: colour, effects, a mixaudio mix-measurefinds off (one call:J=$(bashcut audio mix-measure | jq -r .job); bashcut jobs wait $J --done --timeout 110). - Review:
review run --measure --summary. Fix every problem in oneplan apply --patch(nevertimeline applyon plan-built items) withreview runandreview verify allin the same call. Draft audit:bc:critic(else a sub-agent briefed with<skill_dir>/../review/CRITIC.md, else--by self) gets the project, revision and your suspicions; it reads the plan and contact sheets and returns every finding as oneplan.cutpatch. Never open the packet: in one callrun append audit --point draft --by critic …,plan apply --patch … --base-rev last,review run --measure --summary,review verify all. A new critic call only for an unproven blocker. Captions that split a phrase: a widercaptions.maxChars(andreview.captionLineChars) in that patch; hand groups only for a phrase still split (REFERENCE "Syntax the runs looked up"). Laterplan apply --patch(music level too) keeps grouped captions. - Draft:
export start --preset quick-draft --name draft-v1 --include-srt --normalize-audio --wait --save, then G5 and REFERENCE "The hand-off report".
The plan as data
Brief and plan are project data that context get summarises: after a reset resume from them and run log, not
memory. A recipe writes recipe, promise, stages (deviations only), checks (≤8), askAtIntake; you the rest.
Shapes: REFERENCE "The brief and the plan as data".
Checklist, gates and audits in short
Stage ids: intake, survey, story, rough-cut, rhythm, voiceover, visuals, sound, captions,
colour, effects, review, export, learn. BashCut records intake, survey, story, rough-cut,
captions, review, export; optional stages left out need no entry; one by hand: run append stage --stage
colour --status done --evidence "a;b" in the call that finishes it (a long stage: --text "…" --eta 120). Request
every gate, any mode, with something cheap to look at (checkpoint request G2 --summary "…" --attach sheet.png,
then checkpoint status --wait 100 while awaiting_user). Only the user answers a gate. Skipped G2 needs the
strategy audit, skipped G5 the draft audit. A stage the plan marks required (a tutorial's effects, sound with a
voiceover beside live speech) is done or logged skipped with the reason before review: BashCut answers
stage_pending to review done, G5 and the final export while one is open. Details: FULL "Stages, checklist and gates", "Gates", "Audits". review
run incomplete is never a pass.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

