Motion choreographer
Skill event4u-app/agent-config/src/skills/motion-choreographer
Use when turning a locked still + blueprint into a provider-tuned motion prompt — camera, primary + secondary motion, physics, native-audio sync. Triggers 'motion prompt for Veo/Kling/Sora'.From its SKILL.md
npx -y skills add event4u-app/agent-config --skill motion-choreographerAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 7 stars7 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
SKILL.md
7.9 KB, ~1.9k tokens by cl100k_base, as published. Nobody here has run it
motion-choreographer
Turn an approved still + the 12-block scene blueprint into a provider-tuned motion prompt that the target video adapter consumes. Camera choreography, primary subject motion, secondary environment motion, physics constraints, and — when the adapter declares
audio: native— a synchronized audio direction block. Reads adapter capabilities fromadapter-contract.md; never speaks to a network API.
When to use
- An image is locked (operator picked one candidate via
operator-pick.sh) and the next step is motion + audio direction for the video adapter. - The blueprint exists in
scenes/<id>/blueprint.jsonbut the motion prompt has not been emitted yet. - A provider switch (Veo → Kling, Sora → Higgsfield) requires the same scene retuned for the new adapter's capability profile.
Do NOT use when:
- The blueprint is still prose only — run
scene-expander→parse-blueprint.shfirst. - No still has been locked — the operator-selection checkpoint must complete first.
- The output is a still graphic —
canvas-design.
Procedure
Step 0: Inspect
- Read
scenes/<id>/blueprint.json— fail loud if missing. - Read
scenes/<id>/selection.json— fail loud if missing; the locked image path is required as the motion anchor. - Read the target adapter's capability via
scripts/ai-video/adapters/<id>.sh capability. Cacheaudio=*for Step 3. - If a
character.jsonlock exists, load it verbatim — identity tokens are immutable.
Step 1: Camera choreography
Emit a CAMERA MOTION block with the move type, distance, speed
in seconds, and start-end framing.
- Move types: lock-off, pan, tilt, dolly-in, dolly-out, truck, pedestal, push, pull, handheld, gimbal-glide, crane, whip.
- Speed in seconds per beat (
0.4s push, hold 1.6s, 0.4s pull). - Start and end framing named (
MS → CU,WS → MS).
Blueprint intent-class decoding — the blueprint CAMERA block names one of six provider-agnostic intent classes; map it to the move types above before encoding:
| Intent class | Move-type mapping |
|---|---|
| static hold | lock-off |
| push-in | push / dolly-in |
| pull-back | pull / dolly-out |
| lateral track | truck / pan |
| handheld drift | handheld / gimbal-glide |
| orbit | crane / arc via truck+pan |
Adapter quirks (per-provider encoding of the mapped move):
- Veo — accepts named moves; prefers ≤ 8s clips.
- Kling — motion intensity 0–1 token; map our speed to that.
- Sora — natural-language move + duration; no token.
- Higgsfield — preset-driven; pick the preset that matches the move; record the preset id in the motion prompt.
- LENS handling — blueprint mm + aperture translate to the provider's nearest lens / FOV idiom; never forward raw mm to a provider that lacks lens grammar.
- DURATION handling — the blueprint value is free; clamp to the
provider ceiling here and record the clamp in
review.md(a silent clamp is a drift bug).
Step 2: Primary + secondary motion
Two blocks:
- PRIMARY MOTION — what the subject does, beat-counted, with
physics anchors (mass, contact points, momentum). Reuse
ACTIONfrom the blueprint; refine for the adapter's preferred verb density. - SECONDARY MOTION — what the world does (hair, fabric, foliage, water, dust, particles, breath). One layer per line.
Step 3: Audio direction (conditional)
If adapter capability is audio: native AND the blueprint's
audio.enable_native_audio is true:
Emit an AUDIO DIRECTION block with:
DIALOGUE TIMING—speaker @ 0.4s: "line"per dialogue entry.AMBIENT LAYERS— copy from blueprint; one layer per line.SYNC CUES— which action beat maps to which audio cue (footstep @ 1.2s,door close @ 2.1s).
If adapter capability is audio: none:
- Emit a
# AUDIO: ffmpeg-mux fallbackcomment with the blueprint's audio paths queued for stitch-time mux. - Set
enable_native_audio: falsein the motion-prompt JSON. - Blueprint carries DIALOGUE → the mux fallback cannot speak text
lines. Emit a mandatory
AUDIO DOWNGRADEwarning block inmotion-prompt.txtANDadapter-notes.mdlisting every dialogue line that will not render. The decision whether that is acceptable belongs to the orchestrator gate (adapter-contract § Audio ownership) — this skill translates, it never validates, and it NEVER silently strips dialogue.
Step 4: Physics constraints
Emit PHYSICS — a short list of what the model must respect:
gravity direction, contact friction, fluid behavior, hair / cloth
inertia, lens parallax. Single line per constraint.
Step 5: Emit motion-prompt JSON
Write scenes/<id>/motion-prompt.json with the adapter-contract
stdin shape. The orchestrator pipes this into the video adapter's
submit subcommand.
Step 6: Validate
- JSON parses (
jq .). requires.audio_nativeis consistent with the chosen adapter's capability.- Duration in the motion prompt matches blueprint duration ±0.
- Identity tokens (if
character.jsonexists) are verbatim.
Output format
scenes/<id>/motion-prompt.json— adapter-contract stdin.scenes/<id>/motion-prompt.txt— labeled prose blocks (CAMERA MOTION · PRIMARY MOTION · SECONDARY MOTION · AUDIO DIRECTION · PHYSICS) for operator review.scenes/<id>/adapter-notes.md— which adapter, which capability, which preset / model, with rationale.
Gotcha
- The model wants to "improve" the blueprint's
SUBJECTblock — identity tokens are immutable; refuse the temptation. - Picking
audio: nativeon an adapter that returnsaudio: noneproduces silent video — always read capability first, never guess from the adapter name. - Higgsfield preset id must be recorded; otherwise the rerun drifts to whichever preset the model picks on the next call.
- Sora durations > 8s often degrade — clamp at the adapter table limit; surface the clamp to the operator.
Do NOT
- Do NOT emit motion prompts for an adapter whose capability you did not query this turn.
- Do NOT skip the still-locked check — motion direction without an anchored image diverges on every call.
- Do NOT paraphrase identity tokens from
character.json. - Do NOT call any network API — this skill is provider-tuning prose only.
Policies
Motion prompts inherit every constraint the upstream blueprint carries. Before emitting provider-tuned prose:
agents/settings/policies/media/disclosure.md— every distributed clip carries the non-removable AI-generation disclosure; refuse adapter flags that would suppress it.agents/settings/policies/media/transparency.md— provider provenance (C2PA / SynthID) is preserved; refuse re-encode flags whose effect is to strip provenance.agents/settings/policies/media/voice-cloning.md— when the motion prompt requestsaudio: nativenarration in a named voice.agents/settings/policies/media/brand-impersonation.md— when the motion prompt copies a recognised brand's chyron / mascot / signature transition.
Refuse-and-surface; the motion prompt cannot launder a policy gap upstream skills should have caught.
What ships with it
Read from the repository
Just SKILL.md. No reference files, no scripts.