Atomic MCP Timeline Assembly & Verification (/assemble-timeline)
Option A: FilmCraft MCP Execution (filmcraft MCP server — Requires FilmCraft v0.17.0+)
1. Environment & Bridge Verification
- Run
python3 ./.agents/skills/assemble-timeline/scripts/check_filmcraft_env.pyfirst to verify FilmCraft $\ge$v0.17.0, auto-syncfilmcraft-cliwithFilmCraft.app, and surface any newly added MCP commands in00_Archive_Indexes/filmcraft_capabilities.json. - Ensure FilmCraft is running in bridge mode with caches routed to
~/Movies/Cache_And_Previews:mkdir -p ~/Movies/Cache_And_Previews && cd ~/Movies/Cache_And_Previews open -a FilmCraft --args --control 9876
2. Live Visual Assembly Mode (Default & Recommended)
Watching the timeline assemble live in the open FilmCraft GUI adds less than 1.5 seconds of total socket execution time (calls take $< 20\text{ ms}$ over the local bridge) and provides instant visual verification:
- Open Blank Canvas at Second 0:
Immediately creates and opens the clean
.fcprojshell in FilmCraft viacommand_run({"id": "file.open", "params": {"path": "<fcproj_path>"}}) orsequence.new. The user sees their empty 4K sequence appear at Second 0. - Streamed Media Ingest:
Call
media_importwith the absolute file paths of all selected video cuts, photos, archival pulls, and chosen03_Audio_Library/01_Curated_BGM/tracks (A2). - Live Scene-by-Scene Stream:
As each scene from the approved
Cut Tableis processed, streamcommand_batchcalls live over the 9876 bridge:playhead.set: Moves playhead to scene start timecode.source.overwrite/timeline.insertClip: Places visual clip ontoV1(orV2for overlays/PIP) and synchronous audio onA1.motion.apply: Injects Ken BurnsEaseIn/EaseOutscale & pan keyframes onto stills (100% $\rightarrow$ 108%, or 134% $\rightarrow$ 142% on 4:3 photos to prevent pillarbox cropping).audio.append: DropsA2background music with 1.5s fade-in and swells.voiceover.insert: DropsA4voice-over segments onto the live timeline as each audio cue finishes synthesizing.
- Broadcast Polish:
- Same-Language Live Dialogue Honor Law: Never place
A4Voice-Over in language $L$ overA1live camera dialogue spoken in that same language $L$ (ENVO honors liveENdialogue;RUVO honors liveRUdialogue;UAVO honors liveUAdialogue). WhenA4VO translates a clip containing foreign-language camera dialogue (edition_lang != clip_dialog_lang), duckA1by-12 dBduring active VO cues. - Natural
1.00xSpeech Speed,1:1 V1 == A1Lip-Sync & Opening Music Intro Law: Never applyatempo > 1.0or internal pause-stripping (stop_periods=-1) to live camera speech (A1) or synthesized Voice-Over (A4). Always size speaking visual cuts (V1) to fit the complete1.00xspoken sentence (src_in,dur) soV1andA1remain locked 1:1 in frame-and-sample sync (sliced viaatrim=start=...:end=...,asetpts=PTS-STARTPTSwithdynaudnorm=f=150:g=7:p=0.90applied once post-amix) and never overflow into unrelated scenes. Always begin every timeline and rendered.mp4with a1.5s–2.0smusic intro before the first voice-over cue starts. - RMS-Calibrated Music Ducking (
-28.5 dBMean Under Speech): Measure eachA2music track'smean_volumeviaffmpeg volumedetect(compute_bgm_ducked_gain_db) and setgain_db = -28.5 - raw_mean_dbso ducked BGM sits at-28.5 dBmean — a full12.5 dBquieter than normalized-16.0 dBmean Voice-Over and Live Dialogue, even on hot-mastered upbeat tracks. - Tag
A4voiceover andA1dialog asDialogue(clarity.eqPreset: "Balanced Voice"), and executeessentialSound.generateDucking(reduceDb: -6.0,fadeS: 0.45) onA2Music. - Apply native 1.5s to 2.0s
dip_to_blacktransition on the closing visual clip. - Mandatory Synchronized Outro Audio Fade: The master audio output (
[fullout]) and music onA2MUST execute a synchronized2.0s–2.5shalf-sine fade-out (afade=t=out:st=<TOTAL_DUR - FADE_DUR>:d=<FADE_DUR>:curve=hsin) so all audio (music, camera noise, SFX tails) reaches complete silence (-infinity dB) at or before the final frame. In.fcproj, trackA2MUST carry anEndAtCutaudio fade transition (from: Some(clip.id), to: None, align: "EndAtCut"). Sound must NEVER cut off abruptly. - Write multi-language subtitle tracks to
caption_tracks(C1) withenabled: false(burnCaptions: falsedefault).
- Same-Language Live Dialogue Honor Law: Never place
3. Headless Batch Fallback (assemble_engine.py)
If FilmCraft GUI is not running or bridge mode is offline, automatically assemble the .fcproj directly via assemble_engine.py in $< 1$ second and render 4K master MP4 via filmcraft-cli.
- Repository Hygiene Rule: Keep
.agents/skills/assemble-timeline/scripts/strictly reserved for universal, project-agnostic engines (assemble_engine.py,gpx_widgets.py,generate_voiceover.py,check_filmcraft_env.py). If a custom or project-specific assembly script is ever created for a particular project, always save it inside that project's git-ignored catalog folder (04_Project_Catalog/YEAR/<project_name>/) and never inside.agents/skills/.
4. Visual Verification & Master Render
- Call
render_frameat three timestamps (Act 1 intro, midpoint, epilogue) to confirm framing. - Render master 4K MP4 to
~/Movies/Exports/YEAR/<project_name>.mp4. - If multilingual editions requested (
option_b), remux with_UA.mp4and_RU.mp4localized stems.
Option B: DaVinci Resolve Studio MCP Execution (davinci-resolve)
- Create a new timeline (
1920x1080or3840x2160,29.97fps,DaVinci YRGB Color Managed Rec.709). - Import the selected media into a
Selectsbin viamedia_pool, append clips toV1/V2/A1and music toA2viatimeline_edit, applyCross Dissolvetransitions viatransitions, set Ken Burns zoom keyframes viakeyframes, and set audio ducking viaaudio/inspector. - Call
export_stillat three timestamps to visually verify the cut, export a.drp/.drtbackup to04_Project_Catalog/YEAR/<project_name>/, and queue the final.mp4render to~/Movies/Exports/YEAR/viarender.