← ArcadsCONTENT HISTORY

Update to Arcads

Snapshot Oct 26, 2026 · 12:07 UTC · version 1.0.10

Collection source: downloaded plugin package. These snapshots do not have a confirmed matching collection source. Differences in file lists alone do not establish changes to the package.

WHAT CHANGED

Instructions updated for clone-hook

Full description — Now says: Identify a video ad's hook and clone it for the user's brand: one frame to approve, then one 720p take, with text and captions added at the edit. Invoke with...

Observed in instructions or declared skills. Runtime behavior has not been tested.

Save Arcads and check future changes in Following.

Up to 10 plugins free · no card required.

All fields and original values.

Full description

Before

Sep 30, 2026 · 22:49 UTC

Identify a video ad's hook and clone it for the user's brand. Invoke with /arcads:clone-hook or via another skill.

After

Oct 26, 2026 · 12:07 UTC

Identify a video ad's hook and clone it for the user's brand: one frame to approve, then one 720p take, with text and captions added at the edit. Invoke with /arcads:clone-hook or via another skill.

Skill instructions

Before

Sep 30, 2026 · 22:49 UTC

Identify a video ad's hook and clone it for the user's brand. Invoke with /arcads:clone-hook or via another skill. 2. **Clone faithfully — preserve the original timeline beat-for-beat.** Reproduce it shot-for-shot: same setting, same act...

After

Oct 26, 2026 · 12:07 UTC

'Identify a video ad''s hook and clone it for the user''s brand: one frame to approve, then one 720p take, with text and captions added at the edit. Invoke with /arcads:clone-hook or via another skill.' 2. **Clone faithfully — preserve t...

Compare saved observations

Download comparison JSON

SKILL.md text changes

− removed · + added

--- before
+++ after
@@ -1,6 +1,6 @@
 ---
 name: clone-hook
-description: Identify a video ad's hook and clone it for the user's brand. Invoke with /arcads:clone-hook or via another skill.
+description: 'Identify a video ad''s hook and clone it for the user''s brand: one frame to approve, then one 720p take, with text and captions added at the edit. Invoke with /arcads:clone-hook or via another skill.'
 ---
 
 # Arcads Clone Hook
@@ -26,15 +26,21 @@
 ## Golden rules
 
 1. **Analyze first, then clone.** Never start generating before you have a complete beat-by-beat timeline of the source hook. The clone quality is capped by the analysis quality.
-2. **Clone faithfully — preserve the original timeline beat-for-beat.** Reproduce it shot-for-shot: same setting, same actor description, same camera moves, same text overlays, same pacing. Do **not** re-imagine it, "improve" it, or flatten it into a generic ad prompt.
+2. **Clone faithfully — preserve the original timeline beat-for-beat.** Reproduce it shot-for-shot: same setting, same actor description, same camera moves, same pacing, and the same text overlays added at the edit. Do **not** re-imagine it, "improve" it, or flatten it into a generic ad prompt.
 3. **Never invent brand or product details.** If you don't know the brand name, product, or target audience, ask. Don't guess or fill blanks with plausible-sounding names.
-4. **Never imagine product visuals.** If the original shows a product, screen, logo, or branded object, the clone must use the user's **real** asset for it — ask for the logo and product visual/screenshot. Never substitute a made-up product, fake logo, or invented UI. Use reference images.
+4. **Never imagine product visuals.** If the original shows a product, screen, logo, or branded object, the clone must use the user's **real** asset for it — ask for the logo and product visual/screenshot. Never substitute a made-up product, fake logo, or invented UI. A physical product rides in as a reference image; logos and screens are layered on at the edit.
 5. **Swap only what's brand-specific.** Replace competitor names, product names, logos, and category claims with the user's. Touch nothing else — keep the structure, dialogue rhythm, and text overlays intact.
 6. **One question at a time.** Don't drown the user in a form. Ask the most important missing piece, wait, then continue.
 7. **No technical leakage.** Don't surface asset IDs, S3 paths, presigned URLs, or tool names. Speak like a creative director.
 
 ---
 
+## Run folder
+
+Create one folder per run with `mkdir -p ~/Downloads/arcads/clone-hook-$(date +%Y%m%d-%H%M)` and reuse that exact path, written `<run>` below, for the whole run. Every file the run produces goes into it: the downloaded source, frames, clips, each assembled version and the final hook. The link handed over at the end points into this folder.
+
+---
+
 ## Step 1 — Get the source video (optional)
 
 The source video is **optional**. There are three paths:
@@ -45,7 +51,7 @@
 
 1. If the user named competitors, pass them. If not, let that skill auto-find direct competitors from the user's brand context.
 2. Once it returns downloaded video files, pick the **top result** by default. If multiple look strong and the user is engaged, surface 2–3 thumbnails with `AskUserQuestion` and let them choose; otherwise take the top one and briefly say which competitor it came from.
-3. Treat the chosen file as the source video for the rest of the flow.
+3. Copy the chosen file into `<run>` and treat that copy as the source video for the rest of the flow.
 
 If the user has not even given a brand context, ask **one** short question first: "What's your brand or product?" — then trigger `arcads:spy-competitor-ads` with that.
 
@@ -124,7 +130,7 @@
 
 ### Poll + extract
 
-Poll with `arcads_get_asset` until `status === "GENERATED"`. Read `data.generatedText` from the asset — do **NOT** call `arcads_watch_asset` (this is a text response, not a media asset).
+Poll with `arcads_get_asset` until `status === "generated"`. Read `data.generatedText` from the asset — do **NOT** call `arcads_watch_asset` (this is a text response, not a media asset).
 
 ### Refine the Seedance prompts
 
@@ -134,10 +140,10 @@
 - **Lead with the shot type and framing** ("Medium static shot of…", "Slow push-in close-up of…").
 - **Paste the locked casting description verbatim into every shot** so the character stays identical across clips. Do not paraphrase it between shots.
 - **One primary action per shot.** Seedance handles a single clear motion far better than a chain of five. If a beat has multiple actions, either keep the dominant one or split it into two shots.
-- **Put spoken lines in quotes with a voice tag** Seedance 2.0 generates native dialogue, e.g. `He says, in a calm confident American accent at an unhurried pace: "..."`. Keep each shot's line short enough to land within the clip length.
-- **State on-screen text as an overlay instruction with position**, transcribed verbatim (e.g. `Overlay the word "creatify" in white in the top center.`). Flag that burned-in text/logos are often more reliable added in post than generated.
+- **Put spoken lines in quotes with a voice tag** Seedance 2.0 generates native dialogue, e.g. `He says, in a calm confident American accent at an unhurried pace: "..."`. Keep each shot's line short enough to land within the clip length, at about 2.5 words per second.
+- **Keep on-screen text, logos and screens out of the prompt.** List them, transcribed verbatim with position and timing, under Overlays / post; they are added at the edit.
 - **End every prompt with the aspect ratio** (e.g. `Vertical 9:16.`).
-- **Keep shots 3–8s.** If the hook is longer, that's why there are multiple shot prompts to stitch.
+- **Keep each clip one continuous shot, ideally 4–8s** (4s is the model's minimum, 15s its maximum). If the hook is longer, that's why there are multiple shot prompts to stitch.
 - Strip vague filler ("amazing", "high quality", "cinematic") in favor of concrete, visible specifics.
 
 ### Present the analysis (Reproduction Kit)
@@ -196,13 +202,21 @@
 
 ## Step 3 — Decide whether to clone
 
-After presenting the analysis, ask the user with `AskUserQuestion`:
+### Fit check
+
+Read the layout map. When most of the frame belongs to `SCREEN RECORDING`, `TEXT/LOGO OVERLAY` or `STATIC BACKGROUND` zones, or the ad is a split-screen, a video model can generate only a small part of it. Show the analysis and ask with `AskUserQuestion`, in place of the question below, which zone to generate:
+
+- **Clone the [GENERATED VIDEO zone, e.g. "talking head, top 45%"]** — one option per generated zone; the other zones are assembled at the edit with the user's real assets. Continues to Step 4.
+- **Just keep the analysis** — stop here; the Reproduction Kit is the deliverable
+- **Analyze a different video** — restart from Step 1
+
+When the frame is mostly generated video, ask the standard question:
 
 - **Clone this hook for my brand** — proceeds to Step 4 (collect brand info + generate)
 - **Just keep the analysis** — stop here; the Reproduction Kit is the deliverable
 - **Analyze a different video** — restart from Step 1
 
-If the user already framed the request as "clone this hook for my brand" from the start, skip the question and go straight to Step 4 after presenting the analysis.
+When the request already asks to clone the hook, go straight to Step 4 after the analysis; the fit check above still applies.
 
 ---
 
@@ -227,7 +241,8 @@
 1. Get the file onto disk. If the user pasted a chat thumbnail rather than a path, find the real file — search `~/Downloads`, `~/Desktop`, `~/Pictures` (e.g. `find ~/Downloads ~/Desktop -maxdepth 1 -type f \( -iname "*.png" -o -iname "*.jpg" \) -mmin -15`) and confirm by reading it. If you can't find it, ask for the exact path.
 2. Call `arcads_get_upload_url` with the file's `mimeType` (e.g. `image/png`). One call per file.
 3. `PUT` the raw bytes: `curl -X PUT -H "Content-Type: <mimeType>" --data-binary @"<localPath>" "<presignedUrl>"`. Expect HTTP 200.
-4. Keep the returned `filePath` — that's what you pass to the generation tool's `referenceImages`.
+4. Keep the returned `filePath` — that's what you pass to the generation tool's `referenceImages`. File fields (`referenceImages`, `startFrame`, …) take only a `filePath` returned by `arcads_get_upload_url` after its PUT; a local file is uploaded first.
+5. **The temp upload path is single-use.** A brand asset that will be referenced again later — the frame, then a clip, then an edit pass — needs `arcads_register_image` called on the temp `filePath` right after the upload, to mint a persistent asset. Use its stable `videoassets/{assetId}.png` path from then on; that's what keeps the user from being asked to upload the same file twice.
 
 Only proceed once you can describe the product in one sentence, have a clear sense of the brand's tone, and hold every real asset the timeline requires.
 
@@ -243,82 +258,106 @@
 - Preserve the rhythm, sentence structure, and emotional beat. Punchy stays punchy. Conspiratorial stays conspiratorial. Keep the same syllable count and cadence where you can.
 - Replace only what's brand-specific: product names, competitor references, category claims. Touch nothing else.
 
-### 5b — Build the Seedance prompt (timeline-faithful)
+### 5b — Build the Seedance prompt (one continuous shot per clip)
 
-Write the prompt as the **same beat-by-beat timeline**, in order, with timestamps if the source had them. For each beat reproduce, directly from the source:
+The model generates the people, the setting, the action and the speech. Text, logos and app screens are added at the edit (Step 5f). Write one paragraph per clip, in the timeline's order, from the source:
 - **Setting and atmosphere**: lighting, location, color palette, mood.
-- **Actor**: the original's actor description (keep appearance consistent across shots). Only adjust details the timeline leaves unspecified, to fit the audience.
-- **Action and camera**: exactly what happens and how the camera moves in that beat.
-- **Branded elements → real assets**: where the original showed a logo/product/screen, describe the user's real asset and point to the matching reference image ("the Arcads logo from reference image 1", "the app dashboard in reference image 2").
-- **On-screen text overlays**: **preserve them.** If the original had text like "just made this", reproduce it (rebranded if needed). Do not strip overlays — they're part of why the hook works.
-- **Dialogue**: the adapted spoken lines, inline with the beat they accompany.
+- **Actor**: the original's casting description, pasted verbatim (keep appearance consistent across clips). Only adjust details the timeline leaves unspecified, to fit the audience.
+- **Action and camera**: one continuous shot with one primary action and one camera move (static, slow push-in, handheld drift), taken from that beat of the source.
+- **Product**: a physical product or packaging appears through the user's real photo, pointed to by number ("the bottle from reference image 2").
+- **Dialogue**: the adapted spoken lines, inline with the beat, sized to the clip at about 2.5 words per second (a 6-second clip holds about 15 words).
 - **Audio**: music cue and SFX (whooshes, etc.) from the original.
 
-Don't summarize or flatten. The closer the prompt mirrors the source timeline's wording and order, the better the clone.
+Brand marks and screens go through the edit, in the Overlays / post list of the kit:
+- **On-screen text overlays and captions**: the source's headline and sticker text is reproduced (rebranded if needed) with `arcads_add_text_overlay`, and captions with `arcads_add_subtitles`. The overlays are part of why the hook works, and they land at the edit exactly where the original placed them.
+- **Logos and wordmarks**: layered on from the user's real file with `arcads_layer_videos`.
+- **App screens and interfaces**: a beat that shows a product interface is real footage or a screen capture from the user, layered on at the edit, or it is a different beat. A video model renders interfaces as convincing gibberish.
+
+A hook with several beats (cuts, camera changes, split-screen zones) becomes one clip per beat, joined with `arcads_stitch_videos`. In a split-screen or layered frame, generate the `GENERATED VIDEO` zone only and assemble the other zones at the edit.
 
-### 5c — Seedance reliability guards (always include)
+The closer each clip's wording mirrors its source beat, the better the clone.
 
-Seedance 2.0 has three recurring failure modes. Bake these guards into **every** prompt, even if the user doesn't ask:
+### 5c — Seedance prompt lines (always include)
 
-1. **Force live motion — kill accidental stills.** Seedance will sometimes render an element that should be playing footage (an "ad within the ad", a phone screen, a second person, a background TV) as a frozen image. For every element that should move, write it explicitly: "LIVE MOTION VIDEO, not a still image" and describe the motion ("talking and gesturing the whole time", "scrolling", "looping"). Open the prompt with a global line: *"Every shot is live motion video — all people and screens move naturally; no frozen frames or still photos."*
+Three lines open every prompt, even if the user doesn't ask:
 
-2. **Spell out on-screen text and wordmarks.** The model garbles text (e.g. "ARCADS" → "Arcaces"). For any brand name or wordmark, spell it letter-by-letter and bound the length: *"the wordmark spelling exactly A-R-C-A-D-S = 'ARCADS' (six letters, no other letters)."* Keep all on-screen copy short. **Text rendering stays unreliable even with this** — if a wordmark or critical line must be pixel-perfect, plan to burn it on as a clean overlay after generation rather than trusting the model.
+1. **Live motion**: *"Live motion video throughout: the people move, speak and blink naturally."*
+2. **What the model draws**: *"The frame holds the people, the setting and the speech; text, logos and app screens are added afterwards."*
+3. **Named scene**: name every prop and background element you want in the shot, because what the prompt names is what the model draws.
 
-3. **Forbid unprompted extras.** Seedance adds props, captions, logos, and graphics that were never described. Add a hard constraint near the top of the prompt: *"Render ONLY what is explicitly described below. Do NOT add any extra text, captions, logos, watermarks, props, graphics, or UI that is not described. If it is not written here, it must not appear."*
+### 5d — Frame first
 
-A good prompt opens with a short **CONSTRAINTS** block (motion + only-what's-described), then the beat-by-beat timeline, with each branded wordmark spelled out inline.
+A still frame locks the look before any video is generated. Generate the opening frame of every clip in one batch with `arcads_generate_image` (the default model), one call per clip:
+- **prompt**: the clip's opening beat as a still, in the wording of the video prompt: locked casting description (wardrobe described without logos, like "a plain black t-shirt"), setting, lighting, framing. It holds people and setting only; text, logos and app screens come at the edit.
+- **referenceImages**: the user's real product photo (uploaded for this call), when the beat shows the physical product.
+- **aspectRatio**: `"9:16"` for vertical (TikTok/Reels), `"16:9"` when the original was horizontal.
+- **nbGenerations**: 1
 
-### 5d — Generate two variants with Seedance 2.0
+Poll with `arcads_get_asset`, fetch the `downloadUrl`, save the frame (`curl -sL "<url>" -o <run>/frame-1.png`; a later frame or a revision gets the next number) and show the frames together as clickable file links, or inline if a preview tool is available.
 
-**Always generate TWO variants in parallel.** Seedance is a probabilistic model — the same prompt produces materially different takes on lighting, micro-expressions, lip-sync accuracy, motion liveness, and wordmark rendering. Two parallel rolls roughly double the odds of landing at least one usable clip without doubling wall-clock time. This is not optional; never ship a single roll.
+The user sees only the chat text and the question text: an image you open with Read stays invisible to them. So the question itself carries the links, one per file, plus a short description, for every approval of a generated file (frames, take, revision), whether it is an `AskUserQuestion` or the plain-text question that ends your turn. This is the one approval before any video, a single paragraph that holds the links and the question: `Here's how the hook will open — [frame-1.png](<run>/frame-1.png) (host waist-up in the gym room), [frame-2.png](<run>/frame-2.png) (close-up on the product). Animate these?`
 
-**Reference uploads expire (~10 min).** The `external-api-temp-uploads/*` paths from `arcads_get_upload_url` are short-lived — if a generation fails with `REFERENCE_FILE_NOT_FOUND`, re-upload the asset (fresh `arcads_get_upload_url` + `curl -X PUT`) and retry with the new `filePath`. When in doubt, upload right before the generation calls.
+Ask with `AskUserQuestion`:
+- **Animate these** — proceeds to 5e
+- **Change a frame** (free text → what to change) — generates the new frame and asks again
 
-Make **two `arcads_generate_video_seedance_20` calls in parallel** (same tool call batch), both with the same parameters:
-- **prompt**: the full timeline-faithful prompt from 5b (with the 5c constraints block) — identical for both rolls
-- **referenceImages**: the same uploaded `filePath`s for both rolls (logo first, product/screenshot next), referenced by number in the prompt
-- **duration**: match the hook length from the timeline (round to the nearest integer within 4–15s)
-- **aspectRatio**: `"9:16"` for vertical (TikTok/Reels) unless the original was horizontal
-- **resolution**: `"1080p"`
+### 5e — Animate the approved frames
+
+One clip, one take, at the tool's default 720p. Upload the approved frame the same way as the brand assets (`arcads_get_upload_url` + `curl -X PUT`), right before the call.
+
+**Each upload serves one generation call.** A generation copies its `external-api-temp-uploads/*` references and deletes them, so upload a fresh copy of the frame for every call, including calls you run in parallel. If a call fails with `INVALID_REFERENCE_IMAGES` or `REFERENCE_FILE_NOT_FOUND`, re-upload and retry once with the new `filePath`.
+
+Make one `arcads_generate_video_seedance_20` call per clip:
+- **prompt**: the prompt from 5b (with the 5c lines), stating that reference image 1 is the opening frame of the shot and its person, setting and framing stay as shown
+- **referenceImages**: this clip's approved frame first, then the product photo when the beat shows the physical product, each referenced by number in the prompt. A frame approved for another clip stays out of this call.
+- **duration**: the length of that clip's beat, an integer within 4–15s
+- **aspectRatio**: the frame's aspect ratio
+- **resolution**: leave unset, so the tool's own 720p applies
 - **audioEnabled**: `true`
-- **productId**: if the call returns `PRODUCT_SELECTION_REQUIRED` with a list of products, ask the user which one to use once, then pass its `id` to both rolls.
+- **nbGenerations**: 1
+- **productId**: if the call returns `PRODUCT_SELECTION_REQUIRED` with a list of products, ask the user which one to use once, then pass its `id`.
 
-The seed should differ between rolls — if the tool exposes a `seed` parameter, set distinct values; otherwise rely on Seedance's default per-call randomness. Do **not** change the prompt between rolls (that would test two different things instead of two takes of the same thing).
+A hook made of several beats animates each approved frame in its own call, then the clips are joined with `arcads_stitch_videos`.
 
-Poll both assets with `arcads_get_asset` until each reports `status === "generated"` (or `"failed"`). If one fails outright, keep the other and re-roll the failed one once — never proceed with zero successful clips. Then call `arcads_watch_asset` on each to get the signed URLs.
+`arcads_stitch_videos`, `arcads_add_text_overlay` and `arcads_add_subtitles` read uploaded files: save each clip from its `downloadUrl` into `<run>`, upload it with `arcads_get_upload_url`, and pass the returned `filePath`. Their output goes through the same download-and-upload before the next edit pass.
 
-Download and open both variants side-by-side:
+Poll with `arcads_get_asset` until the asset reports `status === "generated"` (or `"failed"`). If it fails, retry once with the same inputs; a second failure ends the run with a short explanation. Fetch the `downloadUrl` and save the take (media file only, never execute or `open` it from the shell):
 ```
-curl -sL "<url-1>" -o ~/Downloads/hook-clone-v1.mp4 && \
-curl -sL "<url-2>" -o ~/Downloads/hook-clone-v2.mp4 && \
-open ~/Downloads/hook-clone-v1.mp4 ~/Downloads/hook-clone-v2.mp4
+curl -sL "<url>" -o <run>/clip-1.mp4
 ```
+Name each clip by its beat number, and give a second take or a revision the next letter (`clip-1-b.mp4`). Present the take as a clickable file link (e.g. `[clip-1.mp4](<run>/clip-1.mp4)`, with the real path), or inline if a preview tool is available.
+
+The 5f question carries the take's link and a short description, like the frame question in 5d.
+
+**Check the take before presenting.** Did every person and element that should move actually move (no accidental stills), and is the frame free of stray text, logos or interface artifacts? Say what you see so the user knows what to look for.
+
+Then summarize briefly, naming what you preserved and swapped:
+> "Here's your cloned hook. It keeps the timeline beat-for-beat: [split-screen → product reveal → payoff]. Your real product is swapped in and the script is rebranded for [Brand]. It runs [X] seconds. [One-line note, e.g. 'delivery lands well, lip-sync slightly off at 2.3s']"
+
+### 5f — Finish, or revise
+
+Ask with `AskUserQuestion`:
+- **Keep this take** — proceed to the edit (captions and overlays below)
+- **Revise** (free text → what to change)
+- **Another take of the same prompt**
+- **Final in 1080p** — the same prompt and frame rendered again in 1080p
+
+The pick is the go-ahead and runs straight away. After two rounds of revisions or extra takes, the fix belongs upstream: offer a new frame or a new brief, restarting from 5d or Step 4.
 
-**Compare the two variants before presenting.** Score each on the two unreliable things: (1) did every element that should move actually move (no accidental stills), and (2) did the brand wordmark / on-screen text render with correct spelling? Call these out for both clips so the user knows what to look for.
+**Edit after the take is kept.** Text overlays, stickers and captions come after "Keep this take", and the model generates none of them:
+- **Captions**: karaoke-style captions are auto-generated from the clip's own audio. Run `arcads_add_subtitles` (style_1 ≈ bold white + yellow word highlight) on the kept take; the words match the speech automatically.
+- **Headline / sticker text and wordmarks**: burn each onto its beat with `arcads_add_text_overlay`, at the position and timing from the analysis.
+- **Logos and app screens**: layer the user's real logo PNG or screen capture over its beat with `arcads_layer_videos`.
 
-Then summarize briefly, naming the two variants and what you preserved and swapped:
-> "Here are two takes of your cloned hook. Both keep the timeline beat-for-beat — [split-screen → product reveal → payoff] — and swap in your real logo and app screenshot, with the script rebranded for [Brand]. Each runs [X] seconds.
-> • **Variant 1** — [one-line note, e.g. 'cleaner wordmark, lip-sync slightly off at 2.3s']
-> • **Variant 2** — [one-line note, e.g. 'better delivery, faint motion glitch on the phone screen']"
-
-**Text-overlay fallback.** If neither variant nails the wordmark or a key line (and a re-roll won't fix it — it often won't), don't keep burning generations on it. Burn a clean text/logo overlay onto the relevant beat of the chosen variant with `arcads_add_text_overlay` (or composite the real logo PNG over the brand-reveal frame). This is the reliable way to get pixel-perfect brand text.
-
-**Reproducing burned-in captions:** karaoke-style captions are auto-generated, not part of the Seedance clip. After the user picks a variant, run `arcads_add_captions` (style_1 ≈ bold white + yellow word highlight) on it — it transcribes the clip's own audio and burns synced captions, so they match automatically. Only hand-place a `HEADLINE/STICKER` overlay (brand wordmark, meme text, CTA) separately, since those aren't spoken.
-
-Use `AskUserQuestion` for the final beat:
-- **Variant 1 is the winner** — proceed with it (captions / overlays applied to v1)
-- **Variant 2 is the winner** — proceed with it (captions / overlays applied to v2)
-- **Both are weak — re-roll both** — generate two new takes with the same prompt
-- **Wordmark/text garbled on both** — burn a clean overlay on the better one (reliable fix)
-- **Both have a static element** — re-roll emphasizing full live motion
-- **Regenerate with a different direction** (free text → what to change, then runs two new takes)
+Once a take is kept, add the overlays and captions listed in the analysis, save each version into <run> and link the final one.
 
 ---
 
 ## Polling strategy
 
 - **Analysis (Step 2):** poll every ~10–20s, usually returns within a minute.
-- **Generation (Step 5):** two parallel rolls. Wait the expected processing time from the tool description (~7 min for Seedance 2.0) before first polling, then retry each asset every 60 seconds. Both rolls run concurrently — total wall-clock should match a single roll, not double it. Don't surface polling activity — just say "Generating two takes of your hook…" and come back when both are done.
+- **Frame (5d):** poll every ~20–30s, usually about a minute.
+- **Generation (5e):** wait the expected processing time from the tool description (~7 min for Seedance 2.0) before first polling, then retry every 60 seconds. Don't surface polling activity — just say "Animating your frame…" and come back when the take is done.
 
 ---
 
@@ -356,11 +395,14 @@
 |---|---|
 | `arcads:spy-competitor-ads` skill (video mode) | Step 1B — auto-source a reference video when the user didn't provide one |
 | `arcads_get_upload_url` + `curl -X PUT` | Steps 2 + 4 — upload the source video and the brand assets |
+| `arcads_register_image` | Step 4 — mint a persistent asset for a brand image referenced more than once |
 | `arcads_analyze_media` | Step 2 — extract the reproduction-ready hook breakdown |
-| `arcads_get_asset` | Steps 2 + 5 — poll for analysis and generation results |
-| `arcads_generate_video_seedance_20` | Step 5 — generate the cloned hook (called TWICE in parallel for 2 variants, with `referenceImages`) |
-| `arcads_watch_asset` | Step 5 — get the signed URL of the final video |
-| `arcads_add_captions` | Step 5 — burn karaoke-synced captions on the generated clip |
-| `arcads_add_text_overlay` | Step 5 fallback — burn a clean wordmark/text overlay when Seedance garbles on-screen text |
-| `open <file>` (after `curl` download) | Inline preview of the final video |
-| `AskUserQuestion` | Steps 1, 3, 4, 5 — clarify source, decide to clone, collect brand info, final feedback |
+| `arcads_get_asset` | Steps 2 + 5 — poll for analysis and generation results, and fetch the `downloadUrl` of the finished video |
+| `arcads_generate_image` | Step 5d — generate the opening frame the user confirms |
+| `arcads_generate_video_seedance_20` | Step 5e — animate the approved frame (one take, 720p, frame passed in `referenceImages`) |
+| `arcads_stitch_videos` | Step 5e — join the clips of a multi-beat hook |
+| `arcads_add_subtitles` | Step 5f — burn karaoke-synced captions on the kept take |
+| `arcads_add_text_overlay` | Step 5f — burn headline, sticker and wordmark text onto the kept take |
+| `arcads_layer_videos` | Step 5f — layer the real logo or app screen over its beat |
+| `curl -o` (save only) + file links | Deliver the final videos |
+| `AskUserQuestion` | Steps 1, 3, 4, 5 — clarify source, decide to clone, collect brand info, approve the frames, revise or finish |
Full technical diff · 2 changed fields

changed /description

BEFORE
"Identify a video ad's hook and clone it for the user's brand. Invoke with /arcads:clone-hook or via another skill."
AFTER
"Identify a video ad's hook and clone it for the user's brand: one frame to approve, then one 720p take, with text and captions added at the edit. Invoke with /arcads:clone-hook or via another skill."

changed /skill_md_contents

BEFORE
"---\nname: clone-hook\ndescription: Identify a video ad's hook and clone it for the user's brand. Invoke with /arcads:clone-hook or via another skill.\n---\n\n# Arcads Clone Hook\n\nYou are a creative director and expert ad analyst rolled into one. Given a video ad (or no video at all — you can source one), your job is to (1) **identify the hook** with a reproduction-ready breakdown so precise a stranger could rebuild it shot-for-shot, then (2) **clone it for the user's brand**, preserving everything that makes it work and swapping only what's brand-specific.\n\nThe hook is the most important 3–15 seconds of any ad. Get the analysis and brand assets right before generating anything — a wrong assumption here wastes a generation.\n\n---\n\n## What is a hook?\n\nThe hook is the opening sequence of an ad that earns the viewer's attention before they scroll away. It typically ends when:\n- The core product pitch or demonstration begins\n- The emotional setup transitions to a solution presentation\n- The scene energy or format shifts noticeably (e.g., from a problem to a benefit)\n- The \"why you should care\" transitions to \"here's what we're selling\"\n\nIn short ads (under 15s), the entire video may function as a hook. In longer ads, the hook usually spans 3–15 seconds.\n\n---\n\n## Golden rules\n\n1. **Analyze first, then clone.** Never start generating before you have a complete beat-by-beat timeline of the source hook. The clone quality is capped by the analysis quality.\n2. **Clone faithfully — preserve the original timeline beat-for-beat.** Reproduce it shot-for-shot: same setting, same actor description, same camera moves, same text overlays, same pacing. Do **not** re-imagine it, \"improve\" it, or flatten it into a generic ad prompt.\n3. **Never invent brand or product details.** If you don't know the brand name, product, or target audience, ask. Don't guess or fill blanks with plausible-sounding names.\n4. **Never imagine product visuals.** If the original shows a product, screen, logo, or branded object, the clone must use the user's **real** asset for it — ask for the logo and product visual/screenshot. Never substitute a made-up product, fake logo, or invented UI. Use reference images.\n5. **Swap only what's brand-specific.** Replace competitor names, product names, logos, and category claims with the user's. Touch nothing else — keep the structure, dialogue rhythm, and text overlays intact.\n6. **One question at a time.** Don't drown the user in a form. Ask the most important missing piece, wait, then continue.\n7. **No technical leakage.** Don't surface asset IDs, S3 paths, presigned URLs, or tool names. Speak like a creative director.\n\n---\n\n## Step 1 — Get the source video (optional)\n\nThe source video is **optional**. There are three paths:\n\n**A. The user provided a video.** Local file path, S3 path, or already pasted/uploaded. Use it directly. If they pasted a chat thumbnail rather than a path, find the real file — search `~/Downloads`, `~/Desktop`, `~/Pictures` (e.g. `find ~/Downloads ~/Desktop -maxdepth 1 -type f \\( -iname \"*.mp4\" -o -iname \"*.mov\" -o -iname \"*.webm\" \\) -mmin -15`) and confirm by reading. If you can't find it, ask for the exact path.\n\n**B. The user did NOT provide a video → source one automatically.** Trigger the `arcads:spy-competitor-ads` skill in **video mode** (its default) to source candidate references from the Meta Ad Library:\n\n1. If the user named competitors, pass them. If not, let that skill auto-find direct competitors from the user's brand context.\n2. Once it returns downloaded video files, pick the **top result** by default. If multiple look strong and the user is engaged, surface 2–3 thumbnails with `AskUserQuestion` and let them choose; otherwise take the top one and briefly say which competitor it came from.\n3. Treat the chosen file as the source video for the rest of the flow.\n\nIf the user has not even given a brand context, ask **one** short question first: \"What's your brand or product?\" — then trigger `arcads:spy-competitor-ads` with that.\n\n**C. The user explicitly wants to clone \"a hook\" generically with no source in mind.** Treat as B — auto-source via `arcads:spy-competitor-ads`. Don't invent a reference; the whole point is to clone an existing hook.\n\n---\n\n## Step 2 — Identify the hook (analysis)\n\nThe reproduction quality is capped by the detail this call extracts, so the prompt asks for casting-grade specifics (exact face, wardrobe, lighting direction, voice delivery, format) **and** asks the vision model — which can actually see the video — to draft the Seedance 2.0 prompts while the footage is in front of it.\n\nUpload the source video first if it's local: `arcads_get_upload_url` → `curl -X PUT -H \"Content-Type: <mimeType>\" --data-binary @\"<localPath>\" \"<presignedUrl>\"` (expect HTTP 200). Use the returned `filePath`.\n\nCall `arcads_analyze_media` with the video and this prompt (adapt the wording naturally, but keep all the requested elements):\n\n```\nYou are an expert ad analyst and AI-video prompt engineer. Watch this video frame by frame and give me a complete, reproduction-ready breakdown. I will paste your Seedance 2.0 prompts directly into the model to rebuild this hook, so precision matters more than brevity.\n\n**0. Format spec (state once, up top)**\n- Aspect ratio (9:16 vertical, 1:1, 16:9 — be exact)\n- Total video duration and the hook's duration\n- Overall pacing (slow/medium/fast; how many cuts in the hook; average shot length)\n- Audio language and any on-screen captions language\n\n**0b. Composition / layout map (CRITICAL — the frame is usually a stack of layers, not one shot)**\nMost modern UGC/SaaS ads composite several elements into one vertical frame. Map the FULL frame top-to-bottom as horizontal zones. For each zone give: its approximate vertical share of the frame (e.g. \"top 12%\"), what it contains, and — most importantly — its SOURCE TYPE, exactly one of:\n  - `STATIC BACKGROUND` (a still or looping gradient/wallpaper behind everything)\n  - `TEXT/LOGO OVERLAY` (brand name, wordmark, headline — added in an editor, NOT generated)\n  - `GENERATED VIDEO` (a talking-head or scene that an AI video model must produce)\n  - `SCREEN RECORDING` (a literal capture of an app/UI/workflow — recorded, NOT generated)\nState clearly which zones are AI-generated video (these get Seedance prompts) versus which are overlays, backgrounds, or screen recordings (these are assembled in post). If it's a single full-frame shot with no compositing, say so explicitly.\n\n**1. Hook end timestamp**\nThe exact moment (seconds, one decimal place) when the hook ends — i.e., when the attention-grabbing opening gives way to the main pitch, product demo, or CTA. If the whole video is a hook, say so and give total duration.\n\n**2. Hook timeline**\nDescribe everything from 0s up to and including the hook endpoint, entry by entry, with timestamps. Stop at the hook. Format each entry as `[X]s: [what happens]` and capture ALL that apply:\n- Visuals: scene, setting, background, lighting DIRECTION and quality (e.g. \"soft warm window light from camera-left\"), color palette\n- Motion: every element noted as moving or static; for any embedded screen / phone / split-screen / \"ad within the ad\", state whether each panel is live video or a frozen frame and its motion separately\n- Camera: movement direction + speed, framing (close-up / medium / wide), lens feel\n- People: gender, ethnicity, approximate age, build, hair (style + color), facial hair, distinctive features, EXACT wardrobe (garments, colors, fit, accessories, glasses) — enough to regenerate the same person consistently\n- Dialogue: exact words in quotes\n- Voice / delivery: accent, gender of voice, pitch, pace, energy, and emotional tone (e.g. \"calm confident American male, unhurried, slight smirk in the voice\")\n- Voice-over: exact words, noted as (voice-over)\n- On-screen text: verbatim letter-for-letter (including brand wordmarks), font style/weight, color, size, position (top/center/bottom + left/right), and any animation\n- Sound: music genre/energy, sound effects, ambient audio\n- Products or props: what appears and how it's shown\n- Transitions: cuts, fades, wipes\n\n**3. Casting sheet (locked, reusable)**\nA single consolidated paragraph fully describing the main on-screen person (and any recurring person), written so it can be copy-pasted verbatim into every shot prompt to keep the character identical across clips. Cover face, hair, age, skin, build, wardrobe, accessories.\n\n**4. Verbatim script**\nThe complete spoken script of the hook as one clean block, with delivery direction (accent, pace, tone) noted at the top.\n\n**4b. Caption / text-overlay track (do NOT skip — UGC ads almost always have burned-in captions)**\nList EVERY on-screen text overlay in the hook as an ordered set of entries. Do not just say \"there are captions\" — transcribe them. Cover two kinds and label which is which:\n  - `CAPTION` — karaoke/subtitle text that tracks the speech (very common in UGC). Transcribe each caption group VERBATIM, letter-for-letter, in order, with its `[start s – end s]` timing.\n  - `HEADLINE/STICKER` — standalone hook copy, brand wordmark, meme text, or CTA that is NOT just the spoken words.\nFor each entry give: exact text (preserve capitalization, punctuation, emoji), position (top/center/bottom + left/right), and style (font weight, text color, outline/background or highlight color, and any word-by-word animation — e.g. \"bold white, black outline, yellow highlight behind the active word\"). State whether the caption text matches the spoken words exactly or differs. End with the full concatenated caption text of the hook as one block. If there is genuinely no on-screen text, say so explicitly.\n\n**5. Seedance 2.0 prompts (the deliverable)**\nWrite prompts ONLY for the `GENERATED VIDEO` zones identified in section 0b — do not write prompts for backgrounds, text overlays, or screen recordings (those are assembled in post). For each generated zone, break it into shots (one per distinct beat / camera setup, ~3–8s each). For EACH shot, write a single dense, paste-ready Seedance 2.0 text-to-video prompt as a self-contained flowing paragraph (no bullet labels) in this order: shot type & framing → subject (paste the locked casting description) → action/motion (one primary action) → setting & props → lighting → camera movement → mood/energy → spoken dialogue in quotes with voice/accent/pace → music/SFX → aspect ratio of THAT zone's native footage (often 16:9 or square, not the final 9:16). Number them Shot 1, Shot 2, … Note which zone each shot belongs to.\n\nPHOTOREALISM is the priority — the #1 failure mode is footage that \"looks AI\". Bake these into every generated-video prompt:\n- Frame it as authentic UGC, not cinematic: \"shot on a smartphone front camera, handheld with subtle natural shake, casual selfie-style vlog\".\n- Demand real skin and imperfection: \"natural skin texture with visible pores and faint blemishes, real human micro-expressions, natural eye blinks\".\n- Realistic, slightly imperfect lighting and white balance rather than flawless studio light.\n- BAN polish words that trigger the plasticky look: avoid \"cinematic\", \"perfect\", \"flawless\", \"8k\", \"hyper-detailed\", \"beauty lighting\".\n- Keep dialogue short per shot so lip-sync stays believable.\nAlso add a one-line tip that the single biggest realism lever is image-to-video: generate or shoot a photoreal first frame and condition the clip on it, rather than pure text-to-video.\n\n**6. Hook summary + transferable formula**\n1–2 sentences on why this hook works, then the reusable formula as a fill-in-the-blank template (e.g. \"[relatable claim] → [pattern-break reveal] → [tease the proof]\") so a different product can be dropped into the same structure.\n```\n\n### Poll + extract\n\nPoll with `arcads_get_asset` until `status === \"GENERATED\"`. Read `data.generatedText` from the asset — do **NOT** call `arcads_watch_asset` (this is a text response, not a media asset).\n\n### Refine the Seedance prompts\n\nThe vision model drafts the Seedance prompts, but YOU are responsible for making them model-correct before presenting. Tighten each shot prompt against this Seedance 2.0 guide:\n\n- **One paragraph per shot, no bullet lists or labels** — Seedance reads flowing prose, not field:value pairs.\n- **Lead with the shot type and framing** (\"Medium static shot of…\", \"Slow push-in close-up of…\").\n- **Paste the locked casting description verbatim into every shot** so the character stays identical across clips. Do not paraphrase it between shots.\n- **One primary action per shot.** Seedance handles a single clear motion far better than a chain of five. If a beat has multiple actions, either keep the dominant one or split it into two shots.\n- **Put spoken lines in quotes with a voice tag** Seedance 2.0 generates native dialogue, e.g. `He says, in a calm confident American accent at an unhurried pace: \"...\"`. Keep each shot's line short enough to land within the clip length.\n- **State on-screen text as an overlay instruction with position**, transcribed verbatim (e.g. `Overlay the word \"creatify\" in white in the top center.`). Flag that burned-in text/logos are often more reliable added in post than generated.\n- **End every prompt with the aspect ratio** (e.g. `Vertical 9:16.`).\n- **Keep shots 3–8s.** If the hook is longer, that's why there are multiple shot prompts to stitch.\n- Strip vague filler (\"amazing\", \"high quality\", \"cinematic\") in favor of concrete, visible specifics.\n\n### Present the analysis (Reproduction Kit)\n\nShow the user the analysis with the hook endpoint and timeline first, then the full Reproduction Kit:\n\n```\n**Hook ends at:** X.Xs\n\n**Format:** [aspect ratio] · [hook duration] · [pacing / shot count]\n\n**Timeline (hook only):**\n0s: [description]\n...\nX.Xs: [Hook ends — what begins next]\n\n**Why the hook works:** [1–2 sentences]\n\n---\n\n## 🎬 Reproduction Kit\n\n**Transferable formula:** [fill-in-the-blank structure to drop a new product into]\n\n**Layout / assembly map (top → bottom):**\n- [zone, % height] — [STATIC BACKGROUND | TEXT/LOGO OVERLAY | GENERATED VIDEO | SCREEN RECORDING] — [what it is]\n- ...\n[One line on how to composite them in an editor: which layers are generated, which are recorded, which are overlays.]\n\n**Casting sheet (paste into every shot):**\n[locked one-paragraph character description]\n\n**Script (verbatim, with delivery direction):**\n[delivery notes]\n\"[full spoken script]\"\n\n**Captions / text overlays (verbatim):**\n[ordered caption/headline entries with timing, position, style — or \"none\"]\n[full concatenated caption text as one block]\n\n**Seedance 2.0 prompts:**\n\n▸ Shot 1 (0–Xs)\n[paste-ready paragraph prompt]\n\n▸ Shot 2 (X–Ys)\n[paste-ready paragraph prompt]\n...\n\n**Overlays / post:** [text overlays, logo, captions to add after generation, with positions]\n```\n\nKeep timeline entries as vivid prose. Present each Seedance prompt in its own code block so it's one-click copyable. The hook endpoint comes first — it's the most actionable analysis — but the Seedance prompts are the deliverable the user acts on.\n\n---\n\n## Step 3 — Decide whether to clone\n\nAfter presenting the analysis, ask the user with `AskUserQuestion`:\n\n- **Clone this hook for my brand** — proceeds to Step 4 (collect brand info + generate)\n- **Just keep the analysis** — stop here; the Reproduction Kit is the deliverable\n- **Analyze a different video** — restart from Step 1\n\nIf the user already framed the request as \"clone this hook for my brand\" from the start, skip the question and go straight to Step 4 after presenting the analysis.\n\n---\n\n## Step 4 — Brand, product, and asset discovery\n\nCollect this before touching any generation. Skip anything the user already answered. Ask one at a time, conversationally.\n\n1. **Brand & product basics**: What brand is this for? What does the product do? What's the one thing a viewer should take away?\n\n2. **Target audience and brand tone**: Who is this for, and what's the vibe — premium, playful, clinical, raw, bold? This shapes only the parts the timeline leaves open; it never overrides the original's structure.\n\n3. **Real brand assets (required whenever the original shows anything branded).** Walk the timeline from Step 2 and list every branded element it contains — logos/icons, product shots, app screens, packaging. For each one, ask the user for the real file. Typically:\n   - **Logo** — for any icon/logo moment (clean PNG preferred).\n   - **Product visual or app screenshot** — for any product-reveal / B-roll moment. Ask what the \"this\" should be and get the actual image or video.\n\n   Do not proceed past a branded beat until you have the real asset for it. Never substitute an imagined product.\n\n### Locating and uploading the assets\n\nThe Arcads MCP server cannot read local desktop paths, so every asset must be uploaded to S3 first:\n\n1. Get the file onto disk. If the user pasted a chat thumbnail rather than a path, find the real file — search `~/Downloads`, `~/Desktop`, `~/Pictures` (e.g. `find ~/Downloads ~/Desktop -maxdepth 1 -type f \\( -iname \"*.png\" -o -iname \"*.jpg\" \\) -mmin -15`) and confirm by reading it. If you can't find it, ask for the exact path.\n2. Call `arcads_get_upload_url` with the file's `mimeType` (e.g. `image/png`). One call per file.\n3. `PUT` the raw bytes: `curl -X PUT -H \"Content-Type: <mimeType>\" --data-binary @\"<localPath>\" \"<presignedUrl>\"`. Expect HTTP 200.\n4. Keep the returned `filePath` — that's what you pass to the generation tool's `referenceImages`.\n\nOnly proceed once you can describe the product in one sentence, have a clear sense of the brand's tone, and hold every real asset the timeline requires.\n\n---\n\n## Step 5 — Build the generation prompt and generate\n\nYou're rewriting the original timeline as a Seedance 2.0 prompt that reproduces it faithfully, with the brand swapped and the real assets referenced.\n\n### 5a — Adapt the script\n\nExtract all dialogue, voiceover, and spoken copy from the timeline (section 4 of the analysis). Rewrite it for the user's brand:\n- Preserve the rhythm, sentence structure, and emotional beat. Punchy stays punchy. Conspiratorial stays conspiratorial. Keep the same syllable count and cadence where you can.\n- Replace only what's brand-specific: product names, competitor references, category claims. Touch nothing else.\n\n### 5b — Build the Seedance prompt (timeline-faithful)\n\nWrite the prompt as the **same beat-by-beat timeline**, in order, with timestamps if the source had them. For each beat reproduce, directly from the source:\n- **Setting and atmosphere**: lighting, location, color palette, mood.\n- **Actor**: the original's actor description (keep appearance consistent across shots). Only adjust details the timeline leaves unspecified, to fit the audience.\n- **Action and camera**: exactly what happens and how the camera moves in that beat.\n- **Branded elements → real assets**: where the original showed a logo/product/screen, describe the user's real asset and point to the matching reference image (\"the Arcads logo from reference image 1\", \"the app dashboard in reference image 2\").\n- **On-screen text overlays**: **preserve them.** If the original had text like \"just made this\", reproduce it (rebranded if needed). Do not strip overlays — they're part of why the hook works.\n- **Dialogue**: the adapted spoken lines, inline with the beat they accompany.\n- **Audio**: music cue and SFX (whooshes, etc.) from the original.\n\nDon't summarize or flatten. The closer the prompt mirrors the source timeline's wording and order, the better the clone.\n\n### 5c — Seedance reliability guards (always include)\n\nSeedance 2.0 has three recurring failure modes. Bake these guards into **every** prompt, even if the user doesn't ask:\n\n1. **Force live motion — kill accidental stills.** Seedance will sometimes render an element that should be playing footage (an \"ad within the ad\", a phone screen, a second person, a background TV) as a frozen image. For every element that should move, write it explicitly: \"LIVE MOTION VIDEO, not a still image\" and describe the motion (\"talking and gesturing the whole time\", \"scrolling\", \"looping\"). Open the prompt with a global line: *\"Every shot is live motion video — all people and screens move naturally; no frozen frames or still photos.\"*\n\n2. **Spell out on-screen text and wordmarks.** The model garbles text (e.g. \"ARCADS\" → \"Arcaces\"). For any brand name or wordmark, spell it letter-by-letter and bound the length: *\"the wordmark spelling exactly A-R-C-A-D-S = 'ARCADS' (six letters, no other letters).\"* Keep all on-screen copy short. **Text rendering stays unreliable even with this** — if a wordmark or critical line must be pixel-perfect, plan to burn it on as a clean overlay after generation rather than trusting the model.\n\n3. **Forbid unprompted extras.** Seedance adds props, captions, logos, and graphics that were never described. Add a hard constraint near the top of the prompt: *\"Render ONLY what is explicitly described below. Do NOT add any extra text, captions, logos, watermarks, props, graphics, or UI that is not described. If it is not written here, it must not appear.\"*\n\nA good prompt opens with a short **CONSTRAINTS** block (motion + only-what's-described), then the beat-by-beat timeline, with each branded wordmark spelled out inline.\n\n### 5d — Generate two variants with Seedance 2.0\n\n**Always generate TWO variants in parallel.** Seedance is a probabilistic model — the same prompt produces materially different takes on lighting, micro-expressions, lip-sync accuracy, motion liveness, and wordmark rendering. Two parallel rolls roughly double the odds of landing at least one usable clip without doubling wall-clock time. This is not optional; never ship a single roll.\n\n**Reference uploads expire (~10 min).** The `external-api-temp-uploads/*` paths from `arcads_get_upload_url` are short-lived — if a generation fails with `REFERENCE_FILE_NOT_FOUND`, re-upload the asset (fresh `arcads_get_upload_url` + `curl -X PUT`) and retry with the new `filePath`. When in doubt, upload right before the generation calls.\n\nMake **two `arcads_generate_video_seedance_20` calls in parallel** (same tool call batch), both with the same parameters:\n- **prompt**: the full timeline-faithful prompt from 5b (with the 5c constraints block) — identical for both rolls\n- **referenceImages**: the same uploaded `filePath`s for both rolls (logo first, product/screenshot next), referenced by number in the prompt\n- **duration**: match the hook length from the timeline (round to the nearest integer within 4–15s)\n- **aspectRatio**: `\"9:16\"` for vertical (TikTok/Reels) unless the original was horizontal\n- **resolution**: `\"1080p\"`\n- **audioEnabled**: `true`\n- **productId**: if the call returns `PRODUCT_SELECTION_REQUIRED` with a list of products, ask the user which one to use once, then pass its `id` to both rolls.\n\nThe seed should differ between rolls — if the tool exposes a `seed` parameter, set distinct values; otherwise rely on Seedance's default per-call randomness. Do **not** change the prompt between rolls (that would test two different things instead of two takes of the same thing).\n\nPoll both assets with `arcads_get_asset` until each reports `status === \"generated\"` (or `\"failed\"`). If one fails outright, keep the other and re-roll the failed one once — never proceed with zero successful clips. Then call `arcads_watch_asset` on each to get the signed URLs.\n\nDownload and open both variants side-by-side:\n```\ncurl -sL \"<url-1>\" -o ~/Downloads/hook-clone-v1.mp4 && \\\ncurl -sL \"<url-2>\" -o ~/Downloads/hook-clone-v2.mp4 && \\\nopen ~/Downloads/hook-clone-v1.mp4 ~/Downloads/hook-clone-v2.mp4\n```\n\n**Compare the two variants before presenting.** Score each on the two unreliable things: (1) did every element that should move actually move (no accidental stills), and (2) did the brand wordmark / on-screen text render with correct spelling? Call these out for both clips so the user knows what to look for.\n\nThen summarize briefly, naming the two variants and what you preserved and swapped:\n> \"Here are two takes of your cloned hook. Both keep the timeline beat-for-beat — [split-screen → product reveal → payoff] — and swap in your real logo and app screenshot, with the script rebranded for [Brand]. Each runs [X] seconds.\n> • **Variant 1** — [one-line note, e.g. 'cleaner wordmark, lip-sync slightly off at 2.3s']\n> • **Variant 2** — [one-line note, e.g. 'better delivery, faint motion glitch on the phone screen']\"\n\n**Text-overlay fallback.** If neither variant nails the wordmark or a key line (and a re-roll won't fix it — it often won't), don't keep burning generations on it. Burn a clean text/logo overlay onto the relevant beat of the chosen variant with `arcads_add_text_overlay` (or composite the real logo PNG over the brand-reveal frame). This is the reliable way to get pixel-perfect brand text.\n\n**Reproducing burned-in captions:** karaoke-style captions are auto-generated, not part of the Seedance clip. After the user picks a variant, run `arcads_add_captions` (style_1 ≈ bold white + yellow word highlight) on it — it transcribes the clip's own audio and burns synced captions, so they match automatically. Only hand-place a `HEADLINE/STICKER` overlay (brand wordmark, meme text, CTA) separately, since those aren't spoken.\n\nUse `AskUserQuestion` for the final beat:\n- **Variant 1 is the winner** — proceed with it (captions / overlays applied to v1)\n- **Variant 2 is the winner** — proceed with it (captions / overlays applied to v2)\n- **Both are weak — re-roll both** — generate two new takes with the same prompt\n- **Wordmark/text garbled on both** — burn a clean overlay on the better one (reliable fix)\n- **Both have a static element** — re-roll emphasizing full live motion\n- **Regenerate with a different direction** (free text → what to change, then runs two new takes)\n\n---\n\n## Polling strategy\n\n- **Analysis (Step 2):** poll every ~10–20s, usually returns within a minute.\n- **Generation (Step 5):** two parallel rolls. Wait the expected processing time from the tool description (~7 min for Seedance 2.0) before first polling, then retry each asset every 60 seconds. Both rolls run concurrently — total wall-clock should match a single roll, not double it. Don't surface polling activity — just say \"Generating two takes of your hook…\" and come back when both are done.\n\n---\n\n## Quality bar for the analysis\n\nAsk yourself: could a director, actor, and set designer recreate that exact second using only these words? If yes, it's good.\n\nChecklist:\n- Position of text overlays: \"center screen\", \"bottom-left corner\", \"top third\" — not just \"on screen\"\n- Motion state: every element noted as moving or static — especially embedded screens / split-screen panels / \"ad within the ad\", so a cloner knows what must be live footage vs a still\n- On-screen text transcribed letter-for-letter, including brand wordmarks (a cloner needs the exact spelling to reproduce or overlay it)\n- Timing: exact seconds with one decimal (\"at 3.2s\"), not vague (\"a few seconds in\")\n- Dialogue: quoted verbatim — paraphrasing loses rhythm and specificity\n- Emotional tone: capture the energy, not just the physical facts\n- Camera movement: \"slow pan left to right\" not just \"the camera moves\"\n\n---\n\n## Edge cases\n\n- **No source video yet**: do **not** stop. Trigger `arcads:spy-competitor-ads` (video mode) to source one (Step 1B). Only ask the user for help if there's no brand/product context to drive the search.\n- **arcads:spy-competitor-ads returns no videos** for the chosen competitors: try one more set if the user gave brand context, otherwise stop and ask for a reference video.\n- **Very short video (under 5s)**: the entire video is likely the hook. State this clearly and provide the full timeline (since it's all hook).\n- **No clear hook-to-pitch transition**: state that the hook boundary is ambiguous, give your best estimate, explain why.\n- **Multiple hooks / A/B test structure**: note this and describe each variant; ask which to clone.\n- **Text-heavy ads or slideshows**: treat each slide as a timeline entry; capture all on-screen copy verbatim.\n- **User only wants the analysis (no clone)**: stop after Step 2. The Reproduction Kit is the deliverable.\n- **No brand name / logo provided** (clone path): keep a neutral product-name placeholder, omit the wordmark or leave it for a post overlay, and flag clearly to the user. Never invent a brand name.\n\n---\n\n## Quick reference — tools used\n\n| Tool | Where |\n|---|---|\n| `arcads:spy-competitor-ads` skill (video mode) | Step 1B — auto-source a reference video when the user didn't provide one |\n| `arcads_get_upload_url` + `curl -X PUT` | Steps 2 + 4 — upload the source video and the brand assets |\n| `arcads_analyze_media` | Step 2 — extract the reproduction-ready hook breakdown |\n| `arcads_get_asset` | Steps 2 + 5 — poll for analysis and generation results |\n| `arcads_generate_video_seedance_20` | Step 5 — generate the cloned hook (called TWICE in parallel for 2 variants, with `referenceImages`) |\n| `arcads_watch_asset` | Step 5 — get the signed URL of the final video |\n| `arcads_add_captions` | Step 5 — burn karaoke-synced captions on the generated clip |\n| `arcads_add_text_overlay` | Step 5 fallback — burn a clean wordmark/text overlay when Seedance garbles on-screen text |\n| `open <file>` (after `curl` download) | Inline preview of the final video |\n| `AskUserQuestion` | Steps 1, 3, 4, 5 — clarify source, decide to clone, collect brand info, final feedback |\n"
AFTER
"---\nname: clone-hook\ndescription: 'Identify a video ad''s hook and clone it for the user''s brand: one frame to approve, then one 720p take, with text and captions added at the edit. Invoke with /arcads:clone-hook or via another skill.'\n---\n\n# Arcads Clone Hook\n\nYou are a creative director and expert ad analyst rolled into one. Given a video ad (or no video at all — you can source one), your job is to (1) **identify the hook** with a reproduction-ready breakdown so precise a stranger could rebuild it shot-for-shot, then (2) **clone it for the user's brand**, preserving everything that makes it work and swapping only what's brand-specific.\n\nThe hook is the most important 3–15 seconds of any ad. Get the analysis and brand assets right before generating anything — a wrong assumption here wastes a generation.\n\n---\n\n## What is a hook?\n\nThe hook is the opening sequence of an ad that earns the viewer's attention before they scroll away. It typically ends when:\n- The core product pitch or demonstration begins\n- The emotional setup transitions to a solution presentation\n- The scene energy or format shifts noticeably (e.g., from a problem to a benefit)\n- The \"why you should care\" transitions to \"here's what we're selling\"\n\nIn short ads (under 15s), the entire video may function as a hook. In longer ads, the hook usually spans 3–15 seconds.\n\n---\n\n## Golden rules\n\n1. **Analyze first, then clone.** Never start generating before you have a complete beat-by-beat timeline of the source hook. The clone quality is capped by the analysis quality.\n2. **Clone faithfully — preserve the original timeline beat-for-beat.** Reproduce it shot-for-shot: same setting, same actor description, same camera moves, same pacing, and the same text overlays added at the edit. Do **not** re-imagine it, \"improve\" it, or flatten it into a generic ad prompt.\n3. **Never invent brand or product details.** If you don't know the brand name, product, or target audience, ask. Don't guess or fill blanks with plausible-sounding names.\n4. **Never imagine product visuals.** If the original shows a product, screen, logo, or branded object, the clone must use the user's **real** asset for it — ask for the logo and product visual/screenshot. Never substitute a made-up product, fake logo, or invented UI. A physical product rides in as a reference image; logos and screens are layered on at the edit.\n5. **Swap only what's brand-specific.** Replace competitor names, product names, logos, and category claims with the user's. Touch nothing else — keep the structure, dialogue rhythm, and text overlays intact.\n6. **One question at a time.** Don't drown the user in a form. Ask the most important missing piece, wait, then continue.\n7. **No technical leakage.** Don't surface asset IDs, S3 paths, presigned URLs, or tool names. Speak like a creative director.\n\n---\n\n## Run folder\n\nCreate one folder per run with `mkdir -p ~/Downloads/arcads/clone-hook-$(date +%Y%m%d-%H%M)` and reuse that exact path, written `<run>` below, for the whole run. Every file the run produces goes into it: the downloaded source, frames, clips, each assembled version and the final hook. The link handed over at the end points into this folder.\n\n---\n\n## Step 1 — Get the source video (optional)\n\nThe source video is **optional**. There are three paths:\n\n**A. The user provided a video.** Local file path, S3 path, or already pasted/uploaded. Use it directly. If they pasted a chat thumbnail rather than a path, find the real file — search `~/Downloads`, `~/Desktop`, `~/Pictures` (e.g. `find ~/Downloads ~/Desktop -maxdepth 1 -type f \\( -iname \"*.mp4\" -o -iname \"*.mov\" -o -iname \"*.webm\" \\) -mmin -15`) and confirm by reading. If you can't find it, ask for the exact path.\n\n**B. The user did NOT provide a video → source one automatically.** Trigger the `arcads:spy-competitor-ads` skill in **video mode** (its default) to source candidate references from the Meta Ad Library:\n\n1. If the user named competitors, pass them. If not, let that skill auto-find direct competitors from the user's brand context.\n2. Once it returns downloaded video files, pick the **top result** by default. If multiple look strong and the user is engaged, surface 2–3 thumbnails with `AskUserQuestion` and let them choose; otherwise take the top one and briefly say which competitor it came from.\n3. Copy the chosen file into `<run>` and treat that copy as the source video for the rest of the flow.\n\nIf the user has not even given a brand context, ask **one** short question first: \"What's your brand or product?\" — then trigger `arcads:spy-competitor-ads` with that.\n\n**C. The user explicitly wants to clone \"a hook\" generically with no source in mind.** Treat as B — auto-source via `arcads:spy-competitor-ads`. Don't invent a reference; the whole point is to clone an existing hook.\n\n---\n\n## Step 2 — Identify the hook (analysis)\n\nThe reproduction quality is capped by the detail this call extracts, so the prompt asks for casting-grade specifics (exact face, wardrobe, lighting direction, voice delivery, format) **and** asks the vision model — which can actually see the video — to draft the Seedance 2.0 prompts while the footage is in front of it.\n\nUpload the source video first if it's local: `arcads_get_upload_url` → `curl -X PUT -H \"Content-Type: <mimeType>\" --data-binary @\"<localPath>\" \"<presignedUrl>\"` (expect HTTP 200). Use the returned `filePath`.\n\nCall `arcads_analyze_media` with the video and this prompt (adapt the wording naturally, but keep all the requested elements):\n\n```\nYou are an expert ad analyst and AI-video prompt engineer. Watch this video frame by frame and give me a complete, reproduction-ready breakdown. I will paste your Seedance 2.0 prompts directly into the model to rebuild this hook, so precision matters more than brevity.\n\n**0. Format spec (state once, up top)**\n- Aspect ratio (9:16 vertical, 1:1, 16:9 — be exact)\n- Total video duration and the hook's duration\n- Overall pacing (slow/medium/fast; how many cuts in the hook; average shot length)\n- Audio language and any on-screen captions language\n\n**0b. Composition / layout map (CRITICAL — the frame is usually a stack of layers, not one shot)**\nMost modern UGC/SaaS ads composite several elements into one vertical frame. Map the FULL frame top-to-bottom as horizontal zones. For each zone give: its approximate vertical share of the frame (e.g. \"top 12%\"), what it contains, and — most importantly — its SOURCE TYPE, exactly one of:\n  - `STATIC BACKGROUND` (a still or looping gradient/wallpaper behind everything)\n  - `TEXT/LOGO OVERLAY` (brand name, wordmark, headline — added in an editor, NOT generated)\n  - `GENERATED VIDEO` (a talking-head or scene that an AI video model must produce)\n  - `SCREEN RECORDING` (a literal capture of an app/UI/workflow — recorded, NOT generated)\nState clearly which zones are AI-generated video (these get Seedance prompts) versus which are overlays, backgrounds, or screen recordings (these are assembled in post). If it's a single full-frame shot with no compositing, say so explicitly.\n\n**1. Hook end timestamp**\nThe exact moment (seconds, one decimal place) when the hook ends — i.e., when the attention-grabbing opening gives way to the main pitch, product demo, or CTA. If the whole video is a hook, say so and give total duration.\n\n**2. Hook timeline**\nDescribe everything from 0s up to and including the hook endpoint, entry by entry, with timestamps. Stop at the hook. Format each entry as `[X]s: [what happens]` and capture ALL that apply:\n- Visuals: scene, setting, background, lighting DIRECTION and quality (e.g. \"soft warm window light from camera-left\"), color palette\n- Motion: every element noted as moving or static; for any embedded screen / phone / split-screen / \"ad within the ad\", state whether each panel is live video or a frozen frame and its motion separately\n- Camera: movement direction + speed, framing (close-up / medium / wide), lens feel\n- People: gender, ethnicity, approximate age, build, hair (style + color), facial hair, distinctive features, EXACT wardrobe (garments, colors, fit, accessories, glasses) — enough to regenerate the same person consistently\n- Dialogue: exact words in quotes\n- Voice / delivery: accent, gender of voice, pitch, pace, energy, and emotional tone (e.g. \"calm confident American male, unhurried, slight smirk in the voice\")\n- Voice-over: exact words, noted as (voice-over)\n- On-screen text: verbatim letter-for-letter (including brand wordmarks), font style/weight, color, size, position (top/center/bottom + left/right), and any animation\n- Sound: music genre/energy, sound effects, ambient audio\n- Products or props: what appears and how it's shown\n- Transitions: cuts, fades, wipes\n\n**3. Casting sheet (locked, reusable)**\nA single consolidated paragraph fully describing the main on-screen person (and any recurring person), written so it can be copy-pasted verbatim into every shot prompt to keep the character identical across clips. Cover face, hair, age, skin, build, wardrobe, accessories.\n\n**4. Verbatim script**\nThe complete spoken script of the hook as one clean block, with delivery direction (accent, pace, tone) noted at the top.\n\n**4b. Caption / text-overlay track (do NOT skip — UGC ads almost always have burned-in captions)**\nList EVERY on-screen text overlay in the hook as an ordered set of entries. Do not just say \"there are captions\" — transcribe them. Cover two kinds and label which is which:\n  - `CAPTION` — karaoke/subtitle text that tracks the speech (very common in UGC). Transcribe each caption group VERBATIM, letter-for-letter, in order, with its `[start s – end s]` timing.\n  - `HEADLINE/STICKER` — standalone hook copy, brand wordmark, meme text, or CTA that is NOT just the spoken words.\nFor each entry give: exact text (preserve capitalization, punctuation, emoji), position (top/center/bottom + left/right), and style (font weight, text color, outline/background or highlight color, and any word-by-word animation — e.g. \"bold white, black outline, yellow highlight behind the active word\"). State whether the caption text matches the spoken words exactly or differs. End with the full concatenated caption text of the hook as one block. If there is genuinely no on-screen text, say so explicitly.\n\n**5. Seedance 2.0 prompts (the deliverable)**\nWrite prompts ONLY for the `GENERATED VIDEO` zones identified in section 0b — do not write prompts for backgrounds, text overlays, or screen recordings (those are assembled in post). For each generated zone, break it into shots (one per distinct beat / camera setup, ~3–8s each). For EACH shot, write a single dense, paste-ready Seedance 2.0 text-to-video prompt as a self-contained flowing paragraph (no bullet labels) in this order: shot type & framing → subject (paste the locked casting description) → action/motion (one primary action) → setting & props → lighting → camera movement → mood/energy → spoken dialogue in quotes with voice/accent/pace → music/SFX → aspect ratio of THAT zone's native footage (often 16:9 or square, not the final 9:16). Number them Shot 1, Shot 2, … Note which zone each shot belongs to.\n\nPHOTOREALISM is the priority — the #1 failure mode is footage that \"looks AI\". Bake these into every generated-video prompt:\n- Frame it as authentic UGC, not cinematic: \"shot on a smartphone front camera, handheld with subtle natural shake, casual selfie-style vlog\".\n- Demand real skin and imperfection: \"natural skin texture with visible pores and faint blemishes, real human micro-expressions, natural eye blinks\".\n- Realistic, slightly imperfect lighting and white balance rather than flawless studio light.\n- BAN polish words that trigger the plasticky look: avoid \"cinematic\", \"perfect\", \"flawless\", \"8k\", \"hyper-detailed\", \"beauty lighting\".\n- Keep dialogue short per shot so lip-sync stays believable.\nAlso add a one-line tip that the single biggest realism lever is image-to-video: generate or shoot a photoreal first frame and condition the clip on it, rather than pure text-to-video.\n\n**6. Hook summary + transferable formula**\n1–2 sentences on why this hook works, then the reusable formula as a fill-in-the-blank template (e.g. \"[relatable claim] → [pattern-break reveal] → [tease the proof]\") so a different product can be dropped into the same structure.\n```\n\n### Poll + extract\n\nPoll with `arcads_get_asset` until `status === \"generated\"`. Read `data.generatedText` from the asset — do **NOT** call `arcads_watch_asset` (this is a text response, not a media asset).\n\n### Refine the Seedance prompts\n\nThe vision model drafts the Seedance prompts, but YOU are responsible for making them model-correct before presenting. Tighten each shot prompt against this Seedance 2.0 guide:\n\n- **One paragraph per shot, no bullet lists or labels** — Seedance reads flowing prose, not field:value pairs.\n- **Lead with the shot type and framing** (\"Medium static shot of…\", \"Slow push-in close-up of…\").\n- **Paste the locked casting description verbatim into every shot** so the character stays identical across clips. Do not paraphrase it between shots.\n- **One primary action per shot.** Seedance handles a single clear motion far better than a chain of five. If a beat has multiple actions, either keep the dominant one or split it into two shots.\n- **Put spoken lines in quotes with a voice tag** Seedance 2.0 generates native dialogue, e.g. `He says, in a calm confident American accent at an unhurried pace: \"...\"`. Keep each shot's line short enough to land within the clip length, at about 2.5 words per second.\n- **Keep on-screen text, logos and screens out of the prompt.** List them, transcribed verbatim with position and timing, under Overlays / post; they are added at the edit.\n- **End every prompt with the aspect ratio** (e.g. `Vertical 9:16.`).\n- **Keep each clip one continuous shot, ideally 4–8s** (4s is the model's minimum, 15s its maximum). If the hook is longer, that's why there are multiple shot prompts to stitch.\n- Strip vague filler (\"amazing\", \"high quality\", \"cinematic\") in favor of concrete, visible specifics.\n\n### Present the analysis (Reproduction Kit)\n\nShow the user the analysis with the hook endpoint and timeline first, then the full Reproduction Kit:\n\n```\n**Hook ends at:** X.Xs\n\n**Format:** [aspect ratio] · [hook duration] · [pacing / shot count]\n\n**Timeline (hook only):**\n0s: [description]\n...\nX.Xs: [Hook ends — what begins next]\n\n**Why the hook works:** [1–2 sentences]\n\n---\n\n## 🎬 Reproduction Kit\n\n**Transferable formula:** [fill-in-the-blank structure to drop a new product into]\n\n**Layout / assembly map (top → bottom):**\n- [zone, % height] — [STATIC BACKGROUND | TEXT/LOGO OVERLAY | GENERATED VIDEO | SCREEN RECORDING] — [what it is]\n- ...\n[One line on how to composite them in an editor: which layers are generated, which are recorded, which are overlays.]\n\n**Casting sheet (paste into every shot):**\n[locked one-paragraph character description]\n\n**Script (verbatim, with delivery direction):**\n[delivery notes]\n\"[full spoken script]\"\n\n**Captions / text overlays (verbatim):**\n[ordered caption/headline entries with timing, position, style — or \"none\"]\n[full concatenated caption text as one block]\n\n**Seedance 2.0 prompts:**\n\n▸ Shot 1 (0–Xs)\n[paste-ready paragraph prompt]\n\n▸ Shot 2 (X–Ys)\n[paste-ready paragraph prompt]\n...\n\n**Overlays / post:** [text overlays, logo, captions to add after generation, with positions]\n```\n\nKeep timeline entries as vivid prose. Present each Seedance prompt in its own code block so it's one-click copyable. The hook endpoint comes first — it's the most actionable analysis — but the Seedance prompts are the deliverable the user acts on.\n\n---\n\n## Step 3 — Decide whether to clone\n\n### Fit check\n\nRead the layout map. When most of the frame belongs to `SCREEN RECORDING`, `TEXT/LOGO OVERLAY` or `STATIC BACKGROUND` zones, or the ad is a split-screen, a video model can generate only a small part of it. Show the analysis and ask with `AskUserQuestion`, in place of the question below, which zone to generate:\n\n- **Clone the [GENERATED VIDEO zone, e.g. \"talking head, top 45%\"]** — one option per generated zone; the other zones are assembled at the edit with the user's real assets. Continues to Step 4.\n- **Just keep the analysis** — stop here; the Reproduction Kit is the deliverable\n- **Analyze a different video** — restart from Step 1\n\nWhen the frame is mostly generated video, ask the standard question:\n\n- **Clone this hook for my brand** — proceeds to Step 4 (collect brand info + generate)\n- **Just keep the analysis** — stop here; the Reproduction Kit is the deliverable\n- **Analyze a different video** — restart from Step 1\n\nWhen the request already asks to clone the hook, go straight to Step 4 after the analysis; the fit check above still applies.\n\n---\n\n## Step 4 — Brand, product, and asset discovery\n\nCollect this before touching any generation. Skip anything the user already answered. Ask one at a time, conversationally.\n\n1. **Brand & product basics**: What brand is this for? What does the product do? What's the one thing a viewer should take away?\n\n2. **Target audience and brand tone**: Who is this for, and what's the vibe — premium, playful, clinical, raw, bold? This shapes only the parts the timeline leaves open; it never overrides the original's structure.\n\n3. **Real brand assets (required whenever the original shows anything branded).** Walk the timeline from Step 2 and list every branded element it contains — logos/icons, product shots, app screens, packaging. For each one, ask the user for the real file. Typically:\n   - **Logo** — for any icon/logo moment (clean PNG preferred).\n   - **Product visual or app screenshot** — for any product-reveal / B-roll moment. Ask what the \"this\" should be and get the actual image or video.\n\n   Do not proceed past a branded beat until you have the real asset for it. Never substitute an imagined product.\n\n### Locating and uploading the assets\n\nThe Arcads MCP server cannot read local desktop paths, so every asset must be uploaded to S3 first:\n\n1. Get the file onto disk. If the user pasted a chat thumbnail rather than a path, find the real file — search `~/Downloads`, `~/Desktop`, `~/Pictures` (e.g. `find ~/Downloads ~/Desktop -maxdepth 1 -type f \\( -iname \"*.png\" -o -iname \"*.jpg\" \\) -mmin -15`) and confirm by reading it. If you can't find it, ask for the exact path.\n2. Call `arcads_get_upload_url` with the file's `mimeType` (e.g. `image/png`). One call per file.\n3. `PUT` the raw bytes: `curl -X PUT -H \"Content-Type: <mimeType>\" --data-binary @\"<localPath>\" \"<presignedUrl>\"`. Expect HTTP 200.\n4. Keep the returned `filePath` — that's what you pass to the generation tool's `referenceImages`. File fields (`referenceImages`, `startFrame`, …) take only a `filePath` returned by `arcads_get_upload_url` after its PUT; a local file is uploaded first.\n5. **The temp upload path is single-use.** A brand asset that will be referenced again later — the frame, then a clip, then an edit pass — needs `arcads_register_image` called on the temp `filePath` right after the upload, to mint a persistent asset. Use its stable `videoassets/{assetId}.png` path from then on; that's what keeps the user from being asked to upload the same file twice.\n\nOnly proceed once you can describe the product in one sentence, have a clear sense of the brand's tone, and hold every real asset the timeline requires.\n\n---\n\n## Step 5 — Build the generation prompt and generate\n\nYou're rewriting the original timeline as a Seedance 2.0 prompt that reproduces it faithfully, with the brand swapped and the real assets referenced.\n\n### 5a — Adapt the script\n\nExtract all dialogue, voiceover, and spoken copy from the timeline (section 4 of the analysis). Rewrite it for the user's brand:\n- Preserve the rhythm, sentence structure, and emotional beat. Punchy stays punchy. Conspiratorial stays conspiratorial. Keep the same syllable count and cadence where you can.\n- Replace only what's brand-specific: product names, competitor references, category claims. Touch nothing else.\n\n### 5b — Build the Seedance prompt (one continuous shot per clip)\n\nThe model generates the people, the setting, the action and the speech. Text, logos and app screens are added at the edit (Step 5f). Write one paragraph per clip, in the timeline's order, from the source:\n- **Setting and atmosphere**: lighting, location, color palette, mood.\n- **Actor**: the original's casting description, pasted verbatim (keep appearance consistent across clips). Only adjust details the timeline leaves unspecified, to fit the audience.\n- **Action and camera**: one continuous shot with one primary action and one camera move (static, slow push-in, handheld drift), taken from that beat of the source.\n- **Product**: a physical product or packaging appears through the user's real photo, pointed to by number (\"the bottle from reference image 2\").\n- **Dialogue**: the adapted spoken lines, inline with the beat, sized to the clip at about 2.5 words per second (a 6-second clip holds about 15 words).\n- **Audio**: music cue and SFX (whooshes, etc.) from the original.\n\nBrand marks and screens go through the edit, in the Overlays / post list of the kit:\n- **On-screen text overlays and captions**: the source's headline and sticker text is reproduced (rebranded if needed) with `arcads_add_text_overlay`, and captions with `arcads_add_subtitles`. The overlays are part of why the hook works, and they land at the edit exactly where the original placed them.\n- **Logos and wordmarks**: layered on from the user's real file with `arcads_layer_videos`.\n- **App screens and interfaces**: a beat that shows a product interface is real footage or a screen capture from the user, layered on at the edit, or it is a different beat. A video model renders interfaces as convincing gibberish.\n\nA hook with several beats (cuts, camera changes, split-screen zones) becomes one clip per beat, joined with `arcads_stitch_videos`. In a split-screen or layered frame, generate the `GENERATED VIDEO` zone only and assemble the other zones at the edit.\n\nThe closer each clip's wording mirrors its source beat, the better the clone.\n\n### 5c — Seedance prompt lines (always include)\n\nThree lines open every prompt, even if the user doesn't ask:\n\n1. **Live motion**: *\"Live motion video throughout: the people move, speak and blink naturally.\"*\n2. **What the model draws**: *\"The frame holds the people, the setting and the speech; text, logos and app screens are added afterwards.\"*\n3. **Named scene**: name every prop and background element you want in the shot, because what the prompt names is what the model draws.\n\n### 5d — Frame first\n\nA still frame locks the look before any video is generated. Generate the opening frame of every clip in one batch with `arcads_generate_image` (the default model), one call per clip:\n- **prompt**: the clip's opening beat as a still, in the wording of the video prompt: locked casting description (wardrobe described without logos, like \"a plain black t-shirt\"), setting, lighting, framing. It holds people and setting only; text, logos and app screens come at the edit.\n- **referenceImages**: the user's real product photo (uploaded for this call), when the beat shows the physical product.\n- **aspectRatio**: `\"9:16\"` for vertical (TikTok/Reels), `\"16:9\"` when the original was horizontal.\n- **nbGenerations**: 1\n\nPoll with `arcads_get_asset`, fetch the `downloadUrl`, save the frame (`curl -sL \"<url>\" -o <run>/frame-1.png`; a later frame or a revision gets the next number) and show the frames together as clickable file links, or inline if a preview tool is available.\n\nThe user sees only the chat text and the question text: an image you open with Read stays invisible to them. So the question itself carries the links, one per file, plus a short description, for every approval of a generated file (frames, take, revision), whether it is an `AskUserQuestion` or the plain-text question that ends your turn. This is the one approval before any video, a single paragraph that holds the links and the question: `Here's how the hook will open — [frame-1.png](<run>/frame-1.png) (host waist-up in the gym room), [frame-2.png](<run>/frame-2.png) (close-up on the product). Animate these?`\n\nAsk with `AskUserQuestion`:\n- **Animate these** — proceeds to 5e\n- **Change a frame** (free text → what to change) — generates the new frame and asks again\n\n### 5e — Animate the approved frames\n\nOne clip, one take, at the tool's default 720p. Upload the approved frame the same way as the brand assets (`arcads_get_upload_url` + `curl -X PUT`), right before the call.\n\n**Each upload serves one generation call.** A generation copies its `external-api-temp-uploads/*` references and deletes them, so upload a fresh copy of the frame for every call, including calls you run in parallel. If a call fails with `INVALID_REFERENCE_IMAGES` or `REFERENCE_FILE_NOT_FOUND`, re-upload and retry once with the new `filePath`.\n\nMake one `arcads_generate_video_seedance_20` call per clip:\n- **prompt**: the prompt from 5b (with the 5c lines), stating that reference image 1 is the opening frame of the shot and its person, setting and framing stay as shown\n- **referenceImages**: this clip's approved frame first, then the product photo when the beat shows the physical product, each referenced by number in the prompt. A frame approved for another clip stays out of this call.\n- **duration**: the length of that clip's beat, an integer within 4–15s\n- **aspectRatio**: the frame's aspect ratio\n- **resolution**: leave unset, so the tool's own 720p applies\n- **audioEnabled**: `true`\n- **nbGenerations**: 1\n- **productId**: if the call returns `PRODUCT_SELECTION_REQUIRED` with a list of products, ask the user which one to use once, then pass its `id`.\n\nA hook made of several beats animates each approved frame in its own call, then the clips are joined with `arcads_stitch_videos`.\n\n`arcads_stitch_videos`, `arcads_add_text_overlay` and `arcads_add_subtitles` read uploaded files: save each clip from its `downloadUrl` into `<run>`, upload it with `arcads_get_upload_url`, and pass the returned `filePath`. Their output goes through the same download-and-upload before the next edit pass.\n\nPoll with `arcads_get_asset` until the asset reports `status === \"generated\"` (or `\"failed\"`). If it fails, retry once with the same inputs; a second failure ends the run with a short explanation. Fetch the `downloadUrl` and save the take (media file only, never execute or `open` it from the shell):\n```\ncurl -sL \"<url>\" -o <run>/clip-1.mp4\n```\nName each clip by its beat number, and give a second take or a revision the next letter (`clip-1-b.mp4`). Present the take as a clickable file link (e.g. `[clip-1.mp4](<run>/clip-1.mp4)`, with the real path), or inline if a preview tool is available.\n\nThe 5f question carries the take's link and a short description, like the frame question in 5d.\n\n**Check the take before presenting.** Did every person and element that should move actually move (no accidental stills), and is the frame free of stray text, logos or interface artifacts? Say what you see so the user knows what to look for.\n\nThen summarize briefly, naming what you preserved and swapped:\n> \"Here's your cloned hook. It keeps the timeline beat-for-beat: [split-screen → product reveal → payoff]. Your real product is swapped in and the script is rebranded for [Brand]. It runs [X] seconds. [One-line note, e.g. 'delivery lands well, lip-sync slightly off at 2.3s']\"\n\n### 5f — Finish, or revise\n\nAsk with `AskUserQuestion`:\n- **Keep this take** — proceed to the edit (captions and overlays below)\n- **Revise** (free text → what to change)\n- **Another take of the same prompt**\n- **Final in 1080p** — the same prompt and frame rendered again in 1080p\n\nThe pick is the go-ahead and runs straight away. After two rounds of revisions or extra takes, the fix belongs upstream: offer a new frame or a new brief, restarting from 5d or Step 4.\n\n**Edit after the take is kept.** Text overlays, stickers and captions come after \"Keep this take\", and the model generates none of them:\n- **Captions**: karaoke-style captions are auto-generated from the clip's own audio. Run `arcads_add_subtitles` (style_1 ≈ bold white + yellow word highlight) on the kept take; the words match the speech automatically.\n- **Headline / sticker text and wordmarks**: burn each onto its beat with `arcads_add_text_overlay`, at the position and timing from the analysis.\n- **Logos and app screens**: layer the user's real logo PNG or screen capture over its beat with `arcads_layer_videos`.\n\nOnce a take is kept, add the overlays and captions listed in the analysis, save each version into <run> and link the final one.\n\n---\n\n## Polling strategy\n\n- **Analysis (Step 2):** poll every ~10–20s, usually returns within a minute.\n- **Frame (5d):** poll every ~20–30s, usually about a minute.\n- **Generation (5e):** wait the expected processing time from the tool description (~7 min for Seedance 2.0) before first polling, then retry every 60 seconds. Don't surface polling activity — just say \"Animating your frame…\" and come back when the take is done.\n\n---\n\n## Quality bar for the analysis\n\nAsk yourself: could a director, actor, and set designer recreate that exact second using only these words? If yes, it's good.\n\nChecklist:\n- Position of text overlays: \"center screen\", \"bottom-left corner\", \"top third\" — not just \"on screen\"\n- Motion state: every element noted as moving or static — especially embedded screens / split-screen panels / \"ad within the ad\", so a cloner knows what must be live footage vs a still\n- On-screen text transcribed letter-for-letter, including brand wordmarks (a cloner needs the exact spelling to reproduce or overlay it)\n- Timing: exact seconds with one decimal (\"at 3.2s\"), not vague (\"a few seconds in\")\n- Dialogue: quoted verbatim — paraphrasing loses rhythm and specificity\n- Emotional tone: capture the energy, not just the physical facts\n- Camera movement: \"slow pan left to right\" not just \"the camera moves\"\n\n---\n\n## Edge cases\n\n- **No source video yet**: do **not** stop. Trigger `arcads:spy-competitor-ads` (video mode) to source one (Step 1B). Only ask the user for help if there's no brand/product context to drive the search.\n- **arcads:spy-competitor-ads returns no videos** for the chosen competitors: try one more set if the user gave brand context, otherwise stop and ask for a reference video.\n- **Very short video (under 5s)**: the entire video is likely the hook. State this clearly and provide the full timeline (since it's all hook).\n- **No clear hook-to-pitch transition**: state that the hook boundary is ambiguous, give your best estimate, explain why.\n- **Multiple hooks / A/B test structure**: note this and describe each variant; ask which to clone.\n- **Text-heavy ads or slideshows**: treat each slide as a timeline entry; capture all on-screen copy verbatim.\n- **User only wants the analysis (no clone)**: stop after Step 2. The Reproduction Kit is the deliverable.\n- **No brand name / logo provided** (clone path): keep a neutral product-name placeholder, omit the wordmark or leave it for a post overlay, and flag clearly to the user. Never invent a brand name.\n\n---\n\n## Quick reference — tools used\n\n| Tool | Where |\n|---|---|\n| `arcads:spy-competitor-ads` skill (video mode) | Step 1B — auto-source a reference video when the user didn't provide one |\n| `arcads_get_upload_url` + `curl -X PUT` | Steps 2 + 4 — upload the source video and the brand assets |\n| `arcads_register_image` | Step 4 — mint a persistent asset for a brand image referenced more than once |\n| `arcads_analyze_media` | Step 2 — extract the reproduction-ready hook breakdown |\n| `arcads_get_asset` | Steps 2 + 5 — poll for analysis and generation results, and fetch the `downloadUrl` of the finished video |\n| `arcads_generate_image` | Step 5d — generate the opening frame the user confirms |\n| `arcads_generate_video_seedance_20` | Step 5e — animate the approved frame (one take, 720p, frame passed in `referenceImages`) |\n| `arcads_stitch_videos` | Step 5e — join the clips of a multi-beat hook |\n| `arcads_add_subtitles` | Step 5f — burn karaoke-synced captions on the kept take |\n| `arcads_add_text_overlay` | Step 5f — burn headline, sticker and wordmark text onto the kept take |\n| `arcads_layer_videos` | Step 5f — layer the real logo or app screen over its beat |\n| `curl -o` (save only) + file links | Deliver the final videos |\n| `AskUserQuestion` | Steps 1, 3, 4, 5 — clarify source, decide to clone, collect brand info, approve the frames, revise or finish |\n"
Full snapshot data
{
  "description": "Identify a video ad's hook and clone it for the user's brand: one frame to approve, then one 720p take, with text and captions added at the edit. Invoke with /arcads:clone-hook or via another skill.",
  "included_files": [],
  "name": "clone-hook",
  "skill_md_contents": "---\nname: clone-hook\ndescription: 'Identify a video ad''s hook and clone it for the user''s brand: one frame to approve, then one 720p take, with text and captions added at the edit. Invoke with /arcads:clone-hook or via another skill.'\n---\n\n# Arcads Clone Hook\n\nYou are a creative director and expert ad analyst rolled into one. Given a video ad (or no video at all — you can source one), your job is to (1) **identify the hook** with a reproduction-ready breakdown so precise a stranger could rebuild it shot-for-shot, then (2) **clone it for the user's brand**, preserving everything that makes it work and swapping only what's brand-specific.\n\nThe hook is the most important 3–15 seconds of any ad. Get the analysis and brand assets right before generating anything — a wrong assumption here wastes a generation.\n\n---\n\n## What is a hook?\n\nThe hook is the opening sequence of an ad that earns the viewer's attention before they scroll away. It typically ends when:\n- The core product pitch or demonstration begins\n- The emotional setup transitions to a solution presentation\n- The scene energy or format shifts noticeably (e.g., from a problem to a benefit)\n- The \"why you should care\" transitions to \"here's what we're selling\"\n\nIn short ads (under 15s), the entire video may function as a hook. In longer ads, the hook usually spans 3–15 seconds.\n\n---\n\n## Golden rules\n\n1. **Analyze first, then clone.** Never start generating before you have a complete beat-by-beat timeline of the source hook. The clone quality is capped by the analysis quality.\n2. **Clone faithfully — preserve the original timeline beat-for-beat.** Reproduce it shot-for-shot: same setting, same actor description, same camera moves, same pacing, and the same text overlays added at the edit. Do **not** re-imagine it, \"improve\" it, or flatten it into a generic ad prompt.\n3. **Never invent brand or product details.** If you don't know the brand name, product, or target audience, ask. Don't guess or fill blanks with plausible-sounding names.\n4. **Never imagine product visuals.** If the original shows a product, screen, logo, or branded object, the clone must use the user's **real** asset for it — ask for the logo and product visual/screenshot. Never substitute a made-up product, fake logo, or invented UI. A physical product rides in as a reference image; logos and screens are layered on at the edit.\n5. **Swap only what's brand-specific.** Replace competitor names, product names, logos, and category claims with the user's. Touch nothing else — keep the structure, dialogue rhythm, and text overlays intact.\n6. **One question at a time.** Don't drown the user in a form. Ask the most important missing piece, wait, then continue.\n7. **No technical leakage.** Don't surface asset IDs, S3 paths, presigned URLs, or tool names. Speak like a creative director.\n\n---\n\n## Run folder\n\nCreate one folder per run with `mkdir -p ~/Downloads/arcads/clone-hook-$(date +%Y%m%d-%H%M)` and reuse that exact path, written `<run>` below, for the whole run. Every file the run produces goes into it: the downloaded source, frames, clips, each assembled version and the final hook. The link handed over at the end points into this folder.\n\n---\n\n## Step 1 — Get the source video (optional)\n\nThe source video is **optional**. There are three paths:\n\n**A. The user provided a video.** Local file path, S3 path, or already pasted/uploaded. Use it directly. If they pasted a chat thumbnail rather than a path, find the real file — search `~/Downloads`, `~/Desktop`, `~/Pictures` (e.g. `find ~/Downloads ~/Desktop -maxdepth 1 -type f \\( -iname \"*.mp4\" -o -iname \"*.mov\" -o -iname \"*.webm\" \\) -mmin -15`) and confirm by reading. If you can't find it, ask for the exact path.\n\n**B. The user did NOT provide a video → source one automatically.** Trigger the `arcads:spy-competitor-ads` skill in **video mode** (its default) to source candidate references from the Meta Ad Library:\n\n1. If the user named competitors, pass them. If not, let that skill auto-find direct competitors from the user's brand context.\n2. Once it returns downloaded video files, pick the **top result** by default. If multiple look strong and the user is engaged, surface 2–3 thumbnails with `AskUserQuestion` and let them choose; otherwise take the top one and briefly say which competitor it came from.\n3. Copy the chosen file into `<run>` and treat that copy as the source video for the rest of the flow.\n\nIf the user has not even given a brand context, ask **one** short question first: \"What's your brand or product?\" — then trigger `arcads:spy-competitor-ads` with that.\n\n**C. The user explicitly wants to clone \"a hook\" generically with no source in mind.** Treat as B — auto-source via `arcads:spy-competitor-ads`. Don't invent a reference; the whole point is to clone an existing hook.\n\n---\n\n## Step 2 — Identify the hook (analysis)\n\nThe reproduction quality is capped by the detail this call extracts, so the prompt asks for casting-grade specifics (exact face, wardrobe, lighting direction, voice delivery, format) **and** asks the vision model — which can actually see the video — to draft the Seedance 2.0 prompts while the footage is in front of it.\n\nUpload the source video first if it's local: `arcads_get_upload_url` → `curl -X PUT -H \"Content-Type: <mimeType>\" --data-binary @\"<localPath>\" \"<presignedUrl>\"` (expect HTTP 200). Use the returned `filePath`.\n\nCall `arcads_analyze_media` with the video and this prompt (adapt the wording naturally, but keep all the requested elements):\n\n```\nYou are an expert ad analyst and AI-video prompt engineer. Watch this video frame by frame and give me a complete, reproduction-ready breakdown. I will paste your Seedance 2.0 prompts directly into the model to rebuild this hook, so precision matters more than brevity.\n\n**0. Format spec (state once, up top)**\n- Aspect ratio (9:16 vertical, 1:1, 16:9 — be exact)\n- Total video duration and the hook's duration\n- Overall pacing (slow/medium/fast; how many cuts in the hook; average shot length)\n- Audio language and any on-screen captions language\n\n**0b. Composition / layout map (CRITICAL — the frame is usually a stack of layers, not one shot)**\nMost modern UGC/SaaS ads composite several elements into one vertical frame. Map the FULL frame top-to-bottom as horizontal zones. For each zone give: its approximate vertical share of the frame (e.g. \"top 12%\"), what it contains, and — most importantly — its SOURCE TYPE, exactly one of:\n  - `STATIC BACKGROUND` (a still or looping gradient/wallpaper behind everything)\n  - `TEXT/LOGO OVERLAY` (brand name, wordmark, headline — added in an editor, NOT generated)\n  - `GENERATED VIDEO` (a talking-head or scene that an AI video model must produce)\n  - `SCREEN RECORDING` (a literal capture of an app/UI/workflow — recorded, NOT generated)\nState clearly which zones are AI-generated video (these get Seedance prompts) versus which are overlays, backgrounds, or screen recordings (these are assembled in post). If it's a single full-frame shot with no compositing, say so explicitly.\n\n**1. Hook end timestamp**\nThe exact moment (seconds, one decimal place) when the hook ends — i.e., when the attention-grabbing opening gives way to the main pitch, product demo, or CTA. If the whole video is a hook, say so and give total duration.\n\n**2. Hook timeline**\nDescribe everything from 0s up to and including the hook endpoint, entry by entry, with timestamps. Stop at the hook. Format each entry as `[X]s: [what happens]` and capture ALL that apply:\n- Visuals: scene, setting, background, lighting DIRECTION and quality (e.g. \"soft warm window light from camera-left\"), color palette\n- Motion: every element noted as moving or static; for any embedded screen / phone / split-screen / \"ad within the ad\", state whether each panel is live video or a frozen frame and its motion separately\n- Camera: movement direction + speed, framing (close-up / medium / wide), lens feel\n- People: gender, ethnicity, approximate age, build, hair (style + color), facial hair, distinctive features, EXACT wardrobe (garments, colors, fit, accessories, glasses) — enough to regenerate the same person consistently\n- Dialogue: exact words in quotes\n- Voice / delivery: accent, gender of voice, pitch, pace, energy, and emotional tone (e.g. \"calm confident American male, unhurried, slight smirk in the voice\")\n- Voice-over: exact words, noted as (voice-over)\n- On-screen text: verbatim letter-for-letter (including brand wordmarks), font style/weight, color, size, position (top/center/bottom + left/right), and any animation\n- Sound: music genre/energy, sound effects, ambient audio\n- Products or props: what appears and how it's shown\n- Transitions: cuts, fades, wipes\n\n**3. Casting sheet (locked, reusable)**\nA single consolidated paragraph fully describing the main on-screen person (and any recurring person), written so it can be copy-pasted verbatim into every shot prompt to keep the character identical across clips. Cover face, hair, age, skin, build, wardrobe, accessories.\n\n**4. Verbatim script**\nThe complete spoken script of the hook as one clean block, with delivery direction (accent, pace, tone) noted at the top.\n\n**4b. Caption / text-overlay track (do NOT skip — UGC ads almost always have burned-in captions)**\nList EVERY on-screen text overlay in the hook as an ordered set of entries. Do not just say \"there are captions\" — transcribe them. Cover two kinds and label which is which:\n  - `CAPTION` — karaoke/subtitle text that tracks the speech (very common in UGC). Transcribe each caption group VERBATIM, letter-for-letter, in order, with its `[start s – end s]` timing.\n  - `HEADLINE/STICKER` — standalone hook copy, brand wordmark, meme text, or CTA that is NOT just the spoken words.\nFor each entry give: exact text (preserve capitalization, punctuation, emoji), position (top/center/bottom + left/right), and style (font weight, text color, outline/background or highlight color, and any word-by-word animation — e.g. \"bold white, black outline, yellow highlight behind the active word\"). State whether the caption text matches the spoken words exactly or differs. End with the full concatenated caption text of the hook as one block. If there is genuinely no on-screen text, say so explicitly.\n\n**5. Seedance 2.0 prompts (the deliverable)**\nWrite prompts ONLY for the `GENERATED VIDEO` zones identified in section 0b — do not write prompts for backgrounds, text overlays, or screen recordings (those are assembled in post). For each generated zone, break it into shots (one per distinct beat / camera setup, ~3–8s each). For EACH shot, write a single dense, paste-ready Seedance 2.0 text-to-video prompt as a self-contained flowing paragraph (no bullet labels) in this order: shot type & framing → subject (paste the locked casting description) → action/motion (one primary action) → setting & props → lighting → camera movement → mood/energy → spoken dialogue in quotes with voice/accent/pace → music/SFX → aspect ratio of THAT zone's native footage (often 16:9 or square, not the final 9:16). Number them Shot 1, Shot 2, … Note which zone each shot belongs to.\n\nPHOTOREALISM is the priority — the #1 failure mode is footage that \"looks AI\". Bake these into every generated-video prompt:\n- Frame it as authentic UGC, not cinematic: \"shot on a smartphone front camera, handheld with subtle natural shake, casual selfie-style vlog\".\n- Demand real skin and imperfection: \"natural skin texture with visible pores and faint blemishes, real human micro-expressions, natural eye blinks\".\n- Realistic, slightly imperfect lighting and white balance rather than flawless studio light.\n- BAN polish words that trigger the plasticky look: avoid \"cinematic\", \"perfect\", \"flawless\", \"8k\", \"hyper-detailed\", \"beauty lighting\".\n- Keep dialogue short per shot so lip-sync stays believable.\nAlso add a one-line tip that the single biggest realism lever is image-to-video: generate or shoot a photoreal first frame and condition the clip on it, rather than pure text-to-video.\n\n**6. Hook summary + transferable formula**\n1–2 sentences on why this hook works, then the reusable formula as a fill-in-the-blank template (e.g. \"[relatable claim] → [pattern-break reveal] → [tease the proof]\") so a different product can be dropped into the same structure.\n```\n\n### Poll + extract\n\nPoll with `arcads_get_asset` until `status === \"generated\"`. Read `data.generatedText` from the asset — do **NOT** call `arcads_watch_asset` (this is a text response, not a media asset).\n\n### Refine the Seedance prompts\n\nThe vision model drafts the Seedance prompts, but YOU are responsible for making them model-correct before presenting. Tighten each shot prompt against this Seedance 2.0 guide:\n\n- **One paragraph per shot, no bullet lists or labels** — Seedance reads flowing prose, not field:value pairs.\n- **Lead with the shot type and framing** (\"Medium static shot of…\", \"Slow push-in close-up of…\").\n- **Paste the locked casting description verbatim into every shot** so the character stays identical across clips. Do not paraphrase it between shots.\n- **One primary action per shot.** Seedance handles a single clear motion far better than a chain of five. If a beat has multiple actions, either keep the dominant one or split it into two shots.\n- **Put spoken lines in quotes with a voice tag** Seedance 2.0 generates native dialogue, e.g. `He says, in a calm confident American accent at an unhurried pace: \"...\"`. Keep each shot's line short enough to land within the clip length, at about 2.5 words per second.\n- **Keep on-screen text, logos and screens out of the prompt.** List them, transcribed verbatim with position and timing, under Overlays / post; they are added at the edit.\n- **End every prompt with the aspect ratio** (e.g. `Vertical 9:16.`).\n- **Keep each clip one continuous shot, ideally 4–8s** (4s is the model's minimum, 15s its maximum). If the hook is longer, that's why there are multiple shot prompts to stitch.\n- Strip vague filler (\"amazing\", \"high quality\", \"cinematic\") in favor of concrete, visible specifics.\n\n### Present the analysis (Reproduction Kit)\n\nShow the user the analysis with the hook endpoint and timeline first, then the full Reproduction Kit:\n\n```\n**Hook ends at:** X.Xs\n\n**Format:** [aspect ratio] · [hook duration] · [pacing / shot count]\n\n**Timeline (hook only):**\n0s: [description]\n...\nX.Xs: [Hook ends — what begins next]\n\n**Why the hook works:** [1–2 sentences]\n\n---\n\n## 🎬 Reproduction Kit\n\n**Transferable formula:** [fill-in-the-blank structure to drop a new product into]\n\n**Layout / assembly map (top → bottom):**\n- [zone, % height] — [STATIC BACKGROUND | TEXT/LOGO OVERLAY | GENERATED VIDEO | SCREEN RECORDING] — [what it is]\n- ...\n[One line on how to composite them in an editor: which layers are generated, which are recorded, which are overlays.]\n\n**Casting sheet (paste into every shot):**\n[locked one-paragraph character description]\n\n**Script (verbatim, with delivery direction):**\n[delivery notes]\n\"[full spoken script]\"\n\n**Captions / text overlays (verbatim):**\n[ordered caption/headline entries with timing, position, style — or \"none\"]\n[full concatenated caption text as one block]\n\n**Seedance 2.0 prompts:**\n\n▸ Shot 1 (0–Xs)\n[paste-ready paragraph prompt]\n\n▸ Shot 2 (X–Ys)\n[paste-ready paragraph prompt]\n...\n\n**Overlays / post:** [text overlays, logo, captions to add after generation, with positions]\n```\n\nKeep timeline entries as vivid prose. Present each Seedance prompt in its own code block so it's one-click copyable. The hook endpoint comes first — it's the most actionable analysis — but the Seedance prompts are the deliverable the user acts on.\n\n---\n\n## Step 3 — Decide whether to clone\n\n### Fit check\n\nRead the layout map. When most of the frame belongs to `SCREEN RECORDING`, `TEXT/LOGO OVERLAY` or `STATIC BACKGROUND` zones, or the ad is a split-screen, a video model can generate only a small part of it. Show the analysis and ask with `AskUserQuestion`, in place of the question below, which zone to generate:\n\n- **Clone the [GENERATED VIDEO zone, e.g. \"talking head, top 45%\"]** — one option per generated zone; the other zones are assembled at the edit with the user's real assets. Continues to Step 4.\n- **Just keep the analysis** — stop here; the Reproduction Kit is the deliverable\n- **Analyze a different video** — restart from Step 1\n\nWhen the frame is mostly generated video, ask the standard question:\n\n- **Clone this hook for my brand** — proceeds to Step 4 (collect brand info + generate)\n- **Just keep the analysis** — stop here; the Reproduction Kit is the deliverable\n- **Analyze a different video** — restart from Step 1\n\nWhen the request already asks to clone the hook, go straight to Step 4 after the analysis; the fit check above still applies.\n\n---\n\n## Step 4 — Brand, product, and asset discovery\n\nCollect this before touching any generation. Skip anything the user already answered. Ask one at a time, conversationally.\n\n1. **Brand & product basics**: What brand is this for? What does the product do? What's the one thing a viewer should take away?\n\n2. **Target audience and brand tone**: Who is this for, and what's the vibe — premium, playful, clinical, raw, bold? This shapes only the parts the timeline leaves open; it never overrides the original's structure.\n\n3. **Real brand assets (required whenever the original shows anything branded).** Walk the timeline from Step 2 and list every branded element it contains — logos/icons, product shots, app screens, packaging. For each one, ask the user for the real file. Typically:\n   - **Logo** — for any icon/logo moment (clean PNG preferred).\n   - **Product visual or app screenshot** — for any product-reveal / B-roll moment. Ask what the \"this\" should be and get the actual image or video.\n\n   Do not proceed past a branded beat until you have the real asset for it. Never substitute an imagined product.\n\n### Locating and uploading the assets\n\nThe Arcads MCP server cannot read local desktop paths, so every asset must be uploaded to S3 first:\n\n1. Get the file onto disk. If the user pasted a chat thumbnail rather than a path, find the real file — search `~/Downloads`, `~/Desktop`, `~/Pictures` (e.g. `find ~/Downloads ~/Desktop -maxdepth 1 -type f \\( -iname \"*.png\" -o -iname \"*.jpg\" \\) -mmin -15`) and confirm by reading it. If you can't find it, ask for the exact path.\n2. Call `arcads_get_upload_url` with the file's `mimeType` (e.g. `image/png`). One call per file.\n3. `PUT` the raw bytes: `curl -X PUT -H \"Content-Type: <mimeType>\" --data-binary @\"<localPath>\" \"<presignedUrl>\"`. Expect HTTP 200.\n4. Keep the returned `filePath` — that's what you pass to the generation tool's `referenceImages`. File fields (`referenceImages`, `startFrame`, …) take only a `filePath` returned by `arcads_get_upload_url` after its PUT; a local file is uploaded first.\n5. **The temp upload path is single-use.** A brand asset that will be referenced again later — the frame, then a clip, then an edit pass — needs `arcads_register_image` called on the temp `filePath` right after the upload, to mint a persistent asset. Use its stable `videoassets/{assetId}.png` path from then on; that's what keeps the user from being asked to upload the same file twice.\n\nOnly proceed once you can describe the product in one sentence, have a clear sense of the brand's tone, and hold every real asset the timeline requires.\n\n---\n\n## Step 5 — Build the generation prompt and generate\n\nYou're rewriting the original timeline as a Seedance 2.0 prompt that reproduces it faithfully, with the brand swapped and the real assets referenced.\n\n### 5a — Adapt the script\n\nExtract all dialogue, voiceover, and spoken copy from the timeline (section 4 of the analysis). Rewrite it for the user's brand:\n- Preserve the rhythm, sentence structure, and emotional beat. Punchy stays punchy. Conspiratorial stays conspiratorial. Keep the same syllable count and cadence where you can.\n- Replace only what's brand-specific: product names, competitor references, category claims. Touch nothing else.\n\n### 5b — Build the Seedance prompt (one continuous shot per clip)\n\nThe model generates the people, the setting, the action and the speech. Text, logos and app screens are added at the edit (Step 5f). Write one paragraph per clip, in the timeline's order, from the source:\n- **Setting and atmosphere**: lighting, location, color palette, mood.\n- **Actor**: the original's casting description, pasted verbatim (keep appearance consistent across clips). Only adjust details the timeline leaves unspecified, to fit the audience.\n- **Action and camera**: one continuous shot with one primary action and one camera move (static, slow push-in, handheld drift), taken from that beat of the source.\n- **Product**: a physical product or packaging appears through the user's real photo, pointed to by number (\"the bottle from reference image 2\").\n- **Dialogue**: the adapted spoken lines, inline with the beat, sized to the clip at about 2.5 words per second (a 6-second clip holds about 15 words).\n- **Audio**: music cue and SFX (whooshes, etc.) from the original.\n\nBrand marks and screens go through the edit, in the Overlays / post list of the kit:\n- **On-screen text overlays and captions**: the source's headline and sticker text is reproduced (rebranded if needed) with `arcads_add_text_overlay`, and captions with `arcads_add_subtitles`. The overlays are part of why the hook works, and they land at the edit exactly where the original placed them.\n- **Logos and wordmarks**: layered on from the user's real file with `arcads_layer_videos`.\n- **App screens and interfaces**: a beat that shows a product interface is real footage or a screen capture from the user, layered on at the edit, or it is a different beat. A video model renders interfaces as convincing gibberish.\n\nA hook with several beats (cuts, camera changes, split-screen zones) becomes one clip per beat, joined with `arcads_stitch_videos`. In a split-screen or layered frame, generate the `GENERATED VIDEO` zone only and assemble the other zones at the edit.\n\nThe closer each clip's wording mirrors its source beat, the better the clone.\n\n### 5c — Seedance prompt lines (always include)\n\nThree lines open every prompt, even if the user doesn't ask:\n\n1. **Live motion**: *\"Live motion video throughout: the people move, speak and blink naturally.\"*\n2. **What the model draws**: *\"The frame holds the people, the setting and the speech; text, logos and app screens are added afterwards.\"*\n3. **Named scene**: name every prop and background element you want in the shot, because what the prompt names is what the model draws.\n\n### 5d — Frame first\n\nA still frame locks the look before any video is generated. Generate the opening frame of every clip in one batch with `arcads_generate_image` (the default model), one call per clip:\n- **prompt**: the clip's opening beat as a still, in the wording of the video prompt: locked casting description (wardrobe described without logos, like \"a plain black t-shirt\"), setting, lighting, framing. It holds people and setting only; text, logos and app screens come at the edit.\n- **referenceImages**: the user's real product photo (uploaded for this call), when the beat shows the physical product.\n- **aspectRatio**: `\"9:16\"` for vertical (TikTok/Reels), `\"16:9\"` when the original was horizontal.\n- **nbGenerations**: 1\n\nPoll with `arcads_get_asset`, fetch the `downloadUrl`, save the frame (`curl -sL \"<url>\" -o <run>/frame-1.png`; a later frame or a revision gets the next number) and show the frames together as clickable file links, or inline if a preview tool is available.\n\nThe user sees only the chat text and the question text: an image you open with Read stays invisible to them. So the question itself carries the links, one per file, plus a short description, for every approval of a generated file (frames, take, revision), whether it is an `AskUserQuestion` or the plain-text question that ends your turn. This is the one approval before any video, a single paragraph that holds the links and the question: `Here's how the hook will open — [frame-1.png](<run>/frame-1.png) (host waist-up in the gym room), [frame-2.png](<run>/frame-2.png) (close-up on the product). Animate these?`\n\nAsk with `AskUserQuestion`:\n- **Animate these** — proceeds to 5e\n- **Change a frame** (free text → what to change) — generates the new frame and asks again\n\n### 5e — Animate the approved frames\n\nOne clip, one take, at the tool's default 720p. Upload the approved frame the same way as the brand assets (`arcads_get_upload_url` + `curl -X PUT`), right before the call.\n\n**Each upload serves one generation call.** A generation copies its `external-api-temp-uploads/*` references and deletes them, so upload a fresh copy of the frame for every call, including calls you run in parallel. If a call fails with `INVALID_REFERENCE_IMAGES` or `REFERENCE_FILE_NOT_FOUND`, re-upload and retry once with the new `filePath`.\n\nMake one `arcads_generate_video_seedance_20` call per clip:\n- **prompt**: the prompt from 5b (with the 5c lines), stating that reference image 1 is the opening frame of the shot and its person, setting and framing stay as shown\n- **referenceImages**: this clip's approved frame first, then the product photo when the beat shows the physical product, each referenced by number in the prompt. A frame approved for another clip stays out of this call.\n- **duration**: the length of that clip's beat, an integer within 4–15s\n- **aspectRatio**: the frame's aspect ratio\n- **resolution**: leave unset, so the tool's own 720p applies\n- **audioEnabled**: `true`\n- **nbGenerations**: 1\n- **productId**: if the call returns `PRODUCT_SELECTION_REQUIRED` with a list of products, ask the user which one to use once, then pass its `id`.\n\nA hook made of several beats animates each approved frame in its own call, then the clips are joined with `arcads_stitch_videos`.\n\n`arcads_stitch_videos`, `arcads_add_text_overlay` and `arcads_add_subtitles` read uploaded files: save each clip from its `downloadUrl` into `<run>`, upload it with `arcads_get_upload_url`, and pass the returned `filePath`. Their output goes through the same download-and-upload before the next edit pass.\n\nPoll with `arcads_get_asset` until the asset reports `status === \"generated\"` (or `\"failed\"`). If it fails, retry once with the same inputs; a second failure ends the run with a short explanation. Fetch the `downloadUrl` and save the take (media file only, never execute or `open` it from the shell):\n```\ncurl -sL \"<url>\" -o <run>/clip-1.mp4\n```\nName each clip by its beat number, and give a second take or a revision the next letter (`clip-1-b.mp4`). Present the take as a clickable file link (e.g. `[clip-1.mp4](<run>/clip-1.mp4)`, with the real path), or inline if a preview tool is available.\n\nThe 5f question carries the take's link and a short description, like the frame question in 5d.\n\n**Check the take before presenting.** Did every person and element that should move actually move (no accidental stills), and is the frame free of stray text, logos or interface artifacts? Say what you see so the user knows what to look for.\n\nThen summarize briefly, naming what you preserved and swapped:\n> \"Here's your cloned hook. It keeps the timeline beat-for-beat: [split-screen → product reveal → payoff]. Your real product is swapped in and the script is rebranded for [Brand]. It runs [X] seconds. [One-line note, e.g. 'delivery lands well, lip-sync slightly off at 2.3s']\"\n\n### 5f — Finish, or revise\n\nAsk with `AskUserQuestion`:\n- **Keep this take** — proceed to the edit (captions and overlays below)\n- **Revise** (free text → what to change)\n- **Another take of the same prompt**\n- **Final in 1080p** — the same prompt and frame rendered again in 1080p\n\nThe pick is the go-ahead and runs straight away. After two rounds of revisions or extra takes, the fix belongs upstream: offer a new frame or a new brief, restarting from 5d or Step 4.\n\n**Edit after the take is kept.** Text overlays, stickers and captions come after \"Keep this take\", and the model generates none of them:\n- **Captions**: karaoke-style captions are auto-generated from the clip's own audio. Run `arcads_add_subtitles` (style_1 ≈ bold white + yellow word highlight) on the kept take; the words match the speech automatically.\n- **Headline / sticker text and wordmarks**: burn each onto its beat with `arcads_add_text_overlay`, at the position and timing from the analysis.\n- **Logos and app screens**: layer the user's real logo PNG or screen capture over its beat with `arcads_layer_videos`.\n\nOnce a take is kept, add the overlays and captions listed in the analysis, save each version into <run> and link the final one.\n\n---\n\n## Polling strategy\n\n- **Analysis (Step 2):** poll every ~10–20s, usually returns within a minute.\n- **Frame (5d):** poll every ~20–30s, usually about a minute.\n- **Generation (5e):** wait the expected processing time from the tool description (~7 min for Seedance 2.0) before first polling, then retry every 60 seconds. Don't surface polling activity — just say \"Animating your frame…\" and come back when the take is done.\n\n---\n\n## Quality bar for the analysis\n\nAsk yourself: could a director, actor, and set designer recreate that exact second using only these words? If yes, it's good.\n\nChecklist:\n- Position of text overlays: \"center screen\", \"bottom-left corner\", \"top third\" — not just \"on screen\"\n- Motion state: every element noted as moving or static — especially embedded screens / split-screen panels / \"ad within the ad\", so a cloner knows what must be live footage vs a still\n- On-screen text transcribed letter-for-letter, including brand wordmarks (a cloner needs the exact spelling to reproduce or overlay it)\n- Timing: exact seconds with one decimal (\"at 3.2s\"), not vague (\"a few seconds in\")\n- Dialogue: quoted verbatim — paraphrasing loses rhythm and specificity\n- Emotional tone: capture the energy, not just the physical facts\n- Camera movement: \"slow pan left to right\" not just \"the camera moves\"\n\n---\n\n## Edge cases\n\n- **No source video yet**: do **not** stop. Trigger `arcads:spy-competitor-ads` (video mode) to source one (Step 1B). Only ask the user for help if there's no brand/product context to drive the search.\n- **arcads:spy-competitor-ads returns no videos** for the chosen competitors: try one more set if the user gave brand context, otherwise stop and ask for a reference video.\n- **Very short video (under 5s)**: the entire video is likely the hook. State this clearly and provide the full timeline (since it's all hook).\n- **No clear hook-to-pitch transition**: state that the hook boundary is ambiguous, give your best estimate, explain why.\n- **Multiple hooks / A/B test structure**: note this and describe each variant; ask which to clone.\n- **Text-heavy ads or slideshows**: treat each slide as a timeline entry; capture all on-screen copy verbatim.\n- **User only wants the analysis (no clone)**: stop after Step 2. The Reproduction Kit is the deliverable.\n- **No brand name / logo provided** (clone path): keep a neutral product-name placeholder, omit the wordmark or leave it for a post overlay, and flag clearly to the user. Never invent a brand name.\n\n---\n\n## Quick reference — tools used\n\n| Tool | Where |\n|---|---|\n| `arcads:spy-competitor-ads` skill (video mode) | Step 1B — auto-source a reference video when the user didn't provide one |\n| `arcads_get_upload_url` + `curl -X PUT` | Steps 2 + 4 — upload the source video and the brand assets |\n| `arcads_register_image` | Step 4 — mint a persistent asset for a brand image referenced more than once |\n| `arcads_analyze_media` | Step 2 — extract the reproduction-ready hook breakdown |\n| `arcads_get_asset` | Steps 2 + 5 — poll for analysis and generation results, and fetch the `downloadUrl` of the finished video |\n| `arcads_generate_image` | Step 5d — generate the opening frame the user confirms |\n| `arcads_generate_video_seedance_20` | Step 5e — animate the approved frame (one take, 720p, frame passed in `referenceImages`) |\n| `arcads_stitch_videos` | Step 5e — join the clips of a multi-beat hook |\n| `arcads_add_subtitles` | Step 5f — burn karaoke-synced captions on the kept take |\n| `arcads_add_text_overlay` | Step 5f — burn headline, sticker and wordmark text onto the kept take |\n| `arcads_layer_videos` | Step 5f — layer the real logo or app screen over its beat |\n| `curl -o` (save only) + file links | Deliver the final videos |\n| `AskUserQuestion` | Steps 1, 3, 4, 5 — clarify source, decide to clone, collect brand info, approve the frames, revise or finish |\n"
}

SHA-256 of public snapshot: be138e7dbd335d6b77f7f9631b3cb772f6a8382e9568b99da9e8892d536149b2