Motion transfer — beat sheet, provenance sheet, proof call
Percentages are of the finished ad. Segments are cut on the source's shot boundaries, never mid-move. One segment = one generation.
1. Provenance sheet (fill FIRST; G0 — nothing paid runs without Fish's yes on this block)
## Provenance
source_file: output/motion-transfer/<slug>/source.mp4 (never uploaded to Meta or the hub)
source_type: own-winner | licensed | organic-viral (format-ad-clone §5 names; licensed added here)
receipt: own → ad ID + CPA, or camera-roll origin + who is in it (consent: yes/no)
licensed → licence URL/PDF path; AI modification allowed: yes/no; paid ads allowed: yes/no
organic-viral → table of ≥5 unrelated accounts: handle | date | play_count | link
creator footage → Fish confirmed the usage terms cover AI modification: yes/no
not a competitor: brand(s) visible in source: none / <name> (any brand → stop, route to format-ad-clone)
not one creator's: is the move credited to a choreographer or claimed as a creator's routine? no / yes (yes → stop)
taken: MOTION ONLY (mode T/O third-party) | footage + motion + audio (own, mode R)
replaced: people ✓ set ✓ outfit ✓ audio ✓ text/captions ✓ product ✓
route class: motion-control (any allowed source) | recast/restyle/edit (own or licensed only)
mouth: source performer mouths words? no / yes (yes → face away or drop)
wrist: hand/arm rises to camera or face? no / yes (yes → drop or crop)
2. Mode T — trend hook on a paying body
Runtime = parent runtime − parent hook + transfer hook. Hook 3-8 s (motion-control image orientation caps the source at 10 s; video at 30 s).
| # | Beat | % | Source | Job | Rules |
|---|---|---|---|---|---|
| 1 | Motion hook | 0-20 | transfer clip | The borrowed move, our cast, our set | Overlay line 1 (≤10 words) names HER by an observable symptom; no product; no mouthed words; wrists low |
| 2 | Turn | 20-30 | transfer clip tail or first body line | The gag is her morning | First VO line (hook-only pack, parent's narrator voice), pronoun-first, said-out-loud test; the stake lands on her |
| 3 | Root cause | 30-50 | parent body | Why he doesn't wake | Fish's ruled line verbatim (sound doesn't reach a deep-sleeping brain) |
| 4 | Mechanism + product | 50-75 | parent body | Touch gets through | Silent to everyone else; keeps going until he turns it off; wrist rule |
| 5 | Payoff | 75-92 | parent body | Relief / vindication on HER | Recipe A or B per the parent |
| 6 | CTA | 92-100 | parent body | Offer + end card (optional, --end-card; off by default per Fish 10-06) |
Price/guarantee per live PDP |
- The hook VO must fit the transfer clip: words = hook_secs × 3.4-3.8 wps, minus 0.3 s lead-in. A 6 s hook carries ~18 words.
- The splice point is the parent's
body_startline start time (from the parent's run dir words/lines files). Cut on a line start, never mid-word.
3. Mode R — refresh our own winner with a new cast
| # | Beat | Rule |
|---|---|---|
| all | Parent's beats 1:1 | Same cuts, same audio, same timing. Only the people change (recast reference_image_urls, one photo per person, left-to-right order) |
| pass 2 | Voice (optional, separate ad) | New EL voice over the same words; vo_check |
| pass 3 | Product (optional, separate ad) | Only if the source product shot is off-truth: replace it with real footage, the real cutout composite, or a ugc-omni b-roll frame that passed pick --product |
| any | Band-in-hand / band-on-wrist segments | Not recast (no product gate in recast); the original real footage stays, or a gated ugc-omni b-roll replaces it |
| - Recast takes 5-30 s per call with no single shot over 15 s: split longer winners on shot boundaries, recast each, re-join with the original audio track. |
4. Mode O — own performance
Fish/team films the gag on a phone: vertical, one person, full or upper body, unoccluded, plain wall, 5-10 s, no speech. That clip is the motion source for mode T (motion-control) and the proof clip for both routes.
5. Segment line grammar (## Segments in plan.md)
N. src 0.0-6.2s → target target.png | orientation video | MOM (ours) walks to the teen-room door, knocks twice, throws hands up, walks out; camera static at hallway height
6. Proof call shape (G-proof only; paid; Fish's go; read schema + price first)
cd ~/.openclaw/workspace
python3 - <<'EOF'
import sys, json; sys.path.insert(0, "scripts"); import fal_api; fal_api._ensure_key(); import fal_client
D = "output/motion-transfer/<slug>"
vid = fal_client.upload_file(f"{D}/motion.mp4"); img = fal_client.upload_file(f"{D}/target.png")
# P1 recast (own/licensed footage only): ~$1.50 for 5 s at 768P (page 10-06: $0.30/s)
r = fal_client.subscribe("minimax/h3-max/recast", arguments={"video_url": vid, "reference_image_urls": [img], "resolution": "768P"})
# P2 motion-control (any allowed source): price from the fal page, cap ~$2
# r = fal_client.subscribe("fal-ai/kling-video/v3/standard/motion-control", arguments={"image_url": img, "video_url": vid, "character_orientation": "video", "keep_original_sound": False})
print(json.dumps(r)[:600])
EOF
- Download the result with
fal_api.fal_download(url, path). Then the 2 fps contact sheets of source and output side by side; Fish judges. - Never loop this. One call per proof. A failed proof is logged in memory/learnings.jsonl with the reason.
7. Structure example (ILLUSTRATIVE — shape only, not shipping copy; real lines come from VOC and Fish's approval)
Mode T, parent = a paying cartoon story body.
1. (transfer, 0-6 s) Our cartoon mom walks to a closed teen-room door, knocks, waits, throws both hands up, walks off; the move mirrors a "fifth time asking" trend. Overlay: "Trip number five. He hasn't moved."
2. (VO, mom) "I've been his alarm clock for three years." → splice into the parent at body_start.
3. (parent body) root cause line → band buzzes on a resting wrist, display dark → he's up before her → end card (optional, --end-card; off by default per Fish 10-06).