← ArcadsCONTENT HISTORY
WHAT CHANGED
Update to Arcads
Snapshot Oct 26, 2026 · 12:07 UTC · version 1.0.10
Collection source: downloaded plugin package.
First saved snapshot
No earlier snapshot is available to establish a change.
Save Arcads and check future changes in Following.
Up to 10 plugins free · no card required.
Compare saved observations
Download comparison JSONFull technical diff · 0 changed fields
Full snapshot data
{
"description": "Turn a finished static ad into short video for paid social on the Arcads MCP connector using Seedance 2.0. Reads the static, classifies its layout archetype, then offers two modes: SIMPLE, where the composition is preserved and only what would really move moves, elements revealed one beat at a time; and CREATIVE, where the static seeds one stated idea, with morph, scale violation, match cuts and camera moves allowed. Trigger when a user uploads a static ad, Meta static, product still, flatlay, shade chart, swatch layout or offer card and asks to animate it, make it move, turn it into a video or Reel, animate my statics, make this a video, or asks for a build-up or assemble-from-empty reveal. Also trigger when they want both a safe and a creative version to A/B test. Do NOT use for cloning a reference video with a swapped product (viral-clone), restyling raw footage (omniflash-restyle), or building ads from a product URL with no static (arcads-meta-ad-engine).",
"included_files": [],
"name": "static-to-motion",
"skill_md_contents": "---\nname: static-to-motion\ndescription: 'Turn a finished static ad into short video for paid social on the Arcads MCP connector using Seedance 2.0. Reads the static, classifies its layout archetype, then offers two modes: SIMPLE, where the composition is preserved and only what would really move moves, elements revealed one beat at a time; and CREATIVE, where the static seeds one stated idea, with morph, scale violation, match cuts and camera moves allowed. Trigger when a user uploads a static ad, Meta static, product still, flatlay, shade chart, swatch layout or offer card and asks to animate it, make it move, turn it into a video or Reel, animate my statics, make this a video, or asks for a build-up or assemble-from-empty reveal. Also trigger when they want both a safe and a creative version to A/B test. Do NOT use for cloning a reference video with a swapped product (viral-clone), restyling raw footage (omniflash-restyle), or building ads from a product URL with no static (arcads-meta-ad-engine).'\n---\n\n# Static to Motion\n\nInput: one finished static ad. Output: short video for paid social that either preserves that\nstatic exactly or uses it as a seed for one clear idea.\n\nThe input is **already validated**: approved, tested, legally cleared. That is the whole reason\nthis pipeline exists and it sets the constraint that everything else follows from. Treat the\nstatic as truth, not as a suggestion.\n\n---\n\n## Hard tool facts\n\nVerified against the live schemas. Do not assume otherwise.\n\n**`arcads_generate_video_seedance_20` has no `startFrame` and no `endFrame`.**\nOnly `referenceImages` (up to 3), `referenceVideos`, `referenceAudios`, `audioEnabled`,\n`duration` 4-15, `aspectRatio` **16:9 or 9:16 only**, `resolution` up to 1080p,\n`nbGenerations` 1-10. There is no way to hard-lock the first or last frame. Frame fidelity is\nenforced downstream in QA, not upstream by a parameter.\n\n**Escape hatch:** `arcads_generate_video_seedance_15` has `endFrame` and does **not** require\n`startFrame`. It is the only model on the connector that accepts a target last frame alone.\nCosts: 4-12s only, 1 reference image only, no `audioEnabled` param. Use only when a client\ndemands the exact approved end frame.\n\n### Asset upload, exact sequence\n\n```\n1. arcads_get_upload_url(mimeType)\n2. curl -X PUT -H \"Content-Type: <mime>\" --data-binary @file \"<presignedUrl>\"\n → must return HTTP 200. Retry up to 3 times.\n3. arcads_register_image(imagePath: \"external-api-temp-uploads/<uuid>.png\")\n4. reference it everywhere as \"videoassets/<assetId>.png\"\n```\n\n- Local filesystem paths **fail**. The MCP runs remotely.\n- `external-api-temp-uploads/...` works for image generation but is **rejected by\n `seedance_20`** with `INVALID_REFERENCE_IMAGES`. Always register.\n- A temp upload path **dies after one consumption**. PUT once per static, register immediately,\n then reuse the asset id for every downstream call.\n- The S3 host intermittently returns `503 / DNS resolution failure`. Retry 3x; if it still\n fails, do Phase 0 locally and continue.\n\n### Variants\n\nUse `nbGenerations`. Never make the same call several times to get several outputs.\n\n---\n\n## PHASE 0 — Aspect fit\n\nSeedance outputs 16:9 or 9:16 only. Real statics are 1:1, 4:5, 2:3. This always needs handling\nand it is the step people skip.\n\n**Never crop the sides.** Edge content is where shade names, prices, CTAs and composition\nanchors live. Extend instead, and **put the extension at the bottom** where possible: it is the\ncaption and CTA safe zone on Meta and TikTok.\n\nDecide by measuring, not by looking:\n\n```\nedge std = std of the outer 10px band, all four edges\n\n1. edge std < 3 → LOCAL PAD with the sampled background colour\n zero generation, original pixels intact\n2. extension ≤ 15% AND the side being\n extended is low detail (out-of-focus\n floor, plain wall, sky, seamless sweep) → LOCAL STRETCH\n stretch the last ~56 rows, blur ~1.2,\n match grain (sigma ≈ band std × 0.06),\n anchor row 0 of the new band to the original\n last row and decay the offset over ~50 rows\n3. anything else → nano-banana-2 OUTPAINT\n prompt: preserve every existing element\n identically, add only above and below\n```\n\n**Never touch the original pixels.** Do not feather across the join into the source image.\nSolve the seam entirely inside the new band.\n\nThen run numeric QA and report the numbers:\n\n```\noriginal pixels preserved must be True\nseam abs diff target < 3\nband std new vs source must be within ~1\nfinal ratio target 0.5625 or 1.7778\n```\n\nIf the letterboxed grey bars or a watermark are present, strip the bars before anything else.\nA watermark means the asset belongs to someone else: usable as a style reference, not as a\nshippable base. Say so once and move on.\n\n---\n\n## PHASE 1 — Read the static\n\n**If the static is in context, read it yourself.** Only call `arcads_analyze_media` when the\nstatic exists solely as an S3 path. Spending a minute and a generation to describe an image\nalready visible is waste.\n\nProduce this, and show it to the operator:\n\n```\narchetype: see table below\nbeats: the ordered list of information units, each with id / element / position\nmotion_sources: things that would move in reality (light, air, liquid, fabric, breath, focus)\nstatic_locks: things that must never move, named explicitly\ntypography: every text string, its position, and whether it is brand-critical\npalette: dominant colours plus accents\nlight: direction, colour temperature, hardness\nratio: source ratio and the Phase 0 decision taken\n```\n\n`static_locks` is the highest-leverage field. Seedance drifts by default. Naming the things\nthat must hold still, per beat, buys more fidelity than any other instruction.\n\n### Archetype table\n\n| Archetype | Beats | SIMPLE grammar |\n|---|---|---|\n| Multi-product lineup / flatlay | element count | each enters and settles, one cut per placement |\n| Single hero product | 1 → borrow 3 | subject locked; animate light, shadow rotation, rack focus to label, dust or steam |\n| Product in hand / model present | 2-3 | living photograph: breath, blink, grip adjust; cut between 2-3 scales of the same pose |\n| Before / After split | 1 | animate the divider only, never the content |\n| Copy-led offer card | text block count | background plate lives, type is stamped in on a hard cut, never animated |\n| Ingredient / benefit callouts | callout count | product locked, callouts appear in order, one cut each |\n| Shade chart / swatch list | row count | rows enter top to bottom, name appears with its row |\n| UGC screenshot / testimonial | line count | line-by-line reveal, scroll, camera locked |\n| Lifestyle scene, product embedded | 1-2 | product unmoving; curtain, steam, liquid, passing shadow; one push-in maximum |\n\n---\n\n## PHASE 2 — Mode fork\n\nAsk with `ask_user_input_v0`. This is the only decision the operator must make, and it is where\ntheir taste enters.\n\n```\nSIMPLE fidelity is the goal. Ships against the approved creative.\nCREATIVE fidelity is the floor. One stated idea, executed hard.\nBOTH render both, operator picks.\n```\n\nIf SIMPLE and the archetype has ≥ 2 elements, also ask: **unmanned placement or hand placement.**\n\n---\n\n## SIMPLE\n\n> **Only animate what would move in reality. Anything that should be still stays still.\n> The number of cuts equals the number of times new information appears.**\n\nLight, air, liquid, breath, fabric and focus move. A solid object, once placed, never moves\nagain. Every beat declares what holds still.\n\n### Tempo splits by type\n\n```\nplacement type (objects being set down) beat 1.8 - 2.0s physical weight needs time\nlist type (rows, shades, callouts, copy) beat 0.8 - 1.0s information wants to be clipped\n```\n\nSame \"reveal N things in order\", double the tempo difference. Misjudging this is the difference\nbetween premium and sluggish.\n\n### Duration\n\n```\nunmanned: T = 1.5 + N × beat + 1.0\nhand mode: T = 1.2 + N × beat + 1.4 beats = N + 2\n```\n\nIf T exceeds 15s, group elements two per beat or drop to unmanned. If N = 1, hand mode is\nforbidden: it produces a 3 second ad. Borrow environment beats instead.\n\n### The close\n\n**Never make the hold its own shot.** The final element's shot simply continues as the completed\ncomposition. No cut means no perceived freeze. 1.0 to 1.4s is enough to read it, and residual\nmotion is mandatory: drifting shadows, a swaying stem, the last settle. A frozen final frame\nreads amateur instantly.\n\n### Hand mode\n\n- Lock the hand spec once in Phase 1 and paste the **identical string** into every beat:\n skin tone, nail length and finish, rings, sleeve or cuff. Unspecified means a different hand\n every cut.\n- **The hand is never shown withdrawing.** It places, releases, and the shot cuts while the hand\n is still in frame. The cut does the exit. This removes the hardest motion entirely.\n- **Every element gets placed by hand, including the last one.** Then one final handless beat.\n Skipping the last placement so the object simply appears breaks the rule the ad established.\n- Final beat contains no hand, because the approved static contains no person.\n- Add the hand negative block: `one hand only, never two, five fingers, natural anatomy,\n identical hand in every shot, no extra hands or arms, no faces`.\n\n### SIMPLE constraints block\n\n```\nno morphing, no flickering, no added elements, no added text or logos,\nno warped typography, no camera movement, no zoom, no speed ramps,\nno reframing between shots, no scale change, no new subjects,\nno freeze on the final frame\n```\n\n---\n\n## CREATIVE\n\n### The idea slot\n\nCREATIVE fails when it is given a style instead of an idea. \"Macro texture montage\",\n\"light sweeps across\", \"the liquid keeps pouring\" are styles. They produce competent, anonymous\nwallpaper, which is worse than rough and memorable.\n\n**Test: state the concept in one sentence with no reference to camera or lighting.** If it\ncannot be said that way, it is not a concept. Reject it and generate another.\n\nPassing examples:\n- the fruit becomes the tint\n- the product is a monument\n- the drip becomes a lip\n- the routine builds itself in the order you use it\n\n### Concept axes\n\nPull from a real axis, not from the texture drawer.\n\n```\nmetamorphosis the ingredient becomes the product. The claim made literal.\nscale violation the product as architecture, or the world as miniature.\nimpossible physics gravity reverses, liquid climbs, the assembly runs backwards.\nmatch cut a shape in the static becomes the benefit: a drip becomes a glossy lip.\ncategory transplant shoot it as food film, nature documentary, jewellery, architecture.\nkinetic the arrangement collapses and reassembles.\n```\n\n### CREATIVE constraints block\n\nOnly three locks. Everything else is permitted, and **morph and speed ramps are tools here,\nnot failure modes.** A twelve-item negative block is why the creative branch comes out as\nwallpaper.\n\n```\n1. brand text spelled correctly in every frame, name the exact strings\n2. packaging geometry intact, never deformed or relabelled\n3. palette and lighting inherited from the reference\n```\n\n### The type protection trick\n\n`Products appear only in the first shot.` The product is on screen only while pixel-anchored to\nthe reference; every later beat is abstract or a different subject with no packaging type to\nmangle. This solves the packaging-text problem structurally, with no compositing, no layer\nseparation and no extra tools. Use it on any text-heavy static.\n\n---\n\n## PHASE 3 — Prompt format\n\nFixed order. **Word budget: under 100 for a single continuous shot, under 200 for multi-cut.**\nLonger prompts dilute. Front-load: the first 20-30 words carry the most weight.\n\n```\n1. FRAME LOCK one sentence. SIMPLE build-up: \"start on the reference scene with\n <the elements> absent, everything else identical\". CREATIVE: \"start exactly\n on the reference image, composition, lighting and colour preserved.\"\n Do not re-describe the image beyond this line.\n2. STYLE one dense sentence: register, light, palette inherited, depth of field, grain.\n3. EDITING LOGIC duration, number of hard cuts or \"one continuous shot\", zero transitions,\n zero morphing (SIMPLE only), palette lock, and for SIMPLE:\n \"every shot uses the identical locked-off framing\".\n4. TIMELINE one line per beat:\n 0.0s-1.5s | Visual: <one visible moment>. Camera: <one explicit move with\n speed and endpoint, or locked off>. Audio: <event or ambience>.\n - durations sum exactly to total\n - one action and one camera move per beat, maximum\n - every beat gets an explicit Camera command, no exceptions\n - prefix with CUT: when the beat opens a new shot\n - declare what holds still inside each beat\n5. CONSTRAINTS the mode-appropriate block. Never share one block across both modes.\n6. SOUND one sentence. Silence must be explicit: \"No audio. No music. Silent.\"\n7. FINAL TEXT list every visible string in exact quotes, or\n \"No on-screen text beyond what exists in the reference.\"\n```\n\nCamera vocabulary: locked off, slow push-in, slow pull-back, lateral dolly left/right, slow\ntilt, crane, orbit. One move per beat, always with speed and endpoint. Use **cuts, not camera\ntravel**, to change subject.\n\nNever push, zoom or rotate into packaging type. If the camera must move near a label, state that\nlabels stay sharp and unwarped.\n\n---\n\n## PHASE 4 — Render\n\n```\narcads_generate_video_seedance_20\n referenceImages: [\"videoassets/<assetId>.png\"]\n aspectRatio: 9:16 (or 16:9)\n duration: from the Phase 2 formula\n resolution: leave unset (the tool's default); 1080p is an offer on the kept result\n audioEnabled: true, unless the risk profile below applies\n nbGenerations: 1; hand mode and CREATIVE morphs offer a second take on the kept result\n```\n\n~7 minutes per call.\n\n---\n\n## PHASE 5 — QA gate\n\nBecause no parameter locks the frames, this gate is what replaces one.\n\n```\n1. last frame vs the static: composition drift?\n2. brand text: every string spelled correctly? name them and check each one\n3. packaging geometry: deformed?\n4. SIMPLE only: did anything move that was in static_locks?\n5. hand mode: same hand across cuts? final beat handless?\n6. final frame frozen? (should have residual motion)\n\nfail → reroll with nbGenerations 2, up to 3 attempts\nstill failing → report which static is incompatible with this mode. Do not ship.\n```\n\n---\n\n## Failure modes\n\n| Symptom | Cause | Fix |\n|---|---|---|\n| `INVALID_REFERENCE_IMAGES` | passed a temp upload path or local path to seedance | register the asset, use `videoassets/<id>.png` |\n| `File not found` on a local path | MCP runs remotely | upload and register first |\n| register fails on a path that just worked | temp upload consumed | re-upload, then register immediately |\n| `Output audio has sensitive content` | fal-side audio filter, fires **after** ~7 min. `refunded: true`, so free but slow | remove bathroom / shower / bath / bedroom from the Sound line; add `strictly no voices, no breathing, no whispering, no sighs, no humming`; on a second failure set `audioEnabled: false` and add sound in post |\n| S3 PUT `503 / DNS resolution failure` | egress transient | retry 3x, then do Phase 0 locally |\n| output is competent but anonymous | CREATIVE given a style, not an idea | apply the one-sentence test, regenerate the concept |\n| final frame reads as a freeze | hold made into its own shot | fold the hold into the last beat's tail, add residual motion |\n| shade names / long words misspelled | list-type static with generated type | apply `products appear only in the first shot`, or accept post-composited type |\n\n**High audio risk profile:** human skin in frame plus liquid plus a wet-room word. Set\n`audioEnabled: false` from the start rather than discovering it 7 minutes later.\n\n---\n\n## Never\n\n- Crop the sides of a static to hit an aspect ratio.\n- Overwrite original pixels during Phase 0.\n- Use `arcads_add_text_overlay` to restore brand type. It regenerates the letterforms and will\n not match the approved artwork.\n- Share one constraints block between SIMPLE and CREATIVE.\n- Call the same prompt repeatedly instead of using `nbGenerations`.\n- Ship a video whose last frame does not match the approved static, in SIMPLE mode.\n"
}SHA-256 of public snapshot: 77c1fbf72bcd5373601b0f625b5fea2b91c3319f1122d55dfb9772591b69f2db