← SplitMetrics LyraCONTENT HISTORY

Update to SplitMetrics Lyra

Snapshot Oct 29, 2026 · 19:07 UTC · version 0.5.0

Collection source: downloaded plugin package.

WHAT CHANGED

Instructions updated for lyra-video-ad-generation

Skill instructions — Now says: **Canvas layout → `lyra-workflow-layout`.** Every workflow this skill builds or changes is laid out by `lyra-workflow-layout`: sections in reading order with...

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

Save SplitMetrics Lyra and check future changes in Following.

Up to 5 plugins free · no card required.

All fields and original values.

Skill instructions

Before

Oct 27, 2026 · 01:04 UTC

1. **Context.** Collect the app context and task inputs; make sure you have everything before proposing anything. 3. **Approval.** The user approves or corrects concept and plan. Nothing is created before this. 5. **Review on canvas.** T...

After

Oct 29, 2026 · 19:07 UTC

**Canvas layout → `lyra-workflow-layout`.** Every workflow this skill builds or changes is laid out by `lyra-workflow-layout`: sections in reading order with a STEP note above each one, the team's color code, clear node labels and the fi...

Compare saved observations

Download comparison JSON

SKILL.md text changes

− removed · + added

--- before
+++ after
@@ -9,6 +9,10 @@
 
 Part 1 is shared by every Lyra skill. Part 2 is what's specific to video ads. The Reference library at the end has the details (models, prompts, audio, UI, consistency, de-slop, errors, Meta app ads).
 
+**Canvas layout → `lyra-workflow-layout`.** Every workflow this skill builds or changes is laid out by `lyra-workflow-layout`: sections in reading order with a STEP note above each one, the team's color code, clear node labels and the final check. The layout lines in this file only say which sections this creative needs.
+
+**Assembly and captions → `lyra-video-editor`.** Stage 3 of every video (the Video Editor: edit, mix, end card, text, captions, render, cutdowns) follows `lyra-video-editor`. This file only says which pieces go into the edit.
+
 ---
 
 # Part 1. [SHARED] How every Lyra skill works
@@ -16,13 +20,13 @@
 **Deliverable:** a Lyra workflow in which every planned node has been generated. The user opens the canvas and finds the results, the prompts that produced them, and a graph they can edit and rerun for the next app, angle or market.
 
 A full creative always follows these steps, in order:
-1. **Context.** Collect the app context and task inputs; make sure you have everything before proposing anything.
+1. **Context.** Read the Brand Kit, then send the intake quiz (Step 1) so the user takes part in the key choices; make sure you have everything before proposing anything.
 2. **Concept and plan.** A very short concept plus a short plan of nodes, models and connections, based on "Best way to build it".
-3. **Approval.** The user approves or corrects concept and plan. Nothing is created before this.
+3. **Approval.** One message: concept, plan, open questions and the cost in credits; the user approves or corrects. Nothing is created before this; the yes also starts the run.
 4. **Build.** Create the workflow and nodes with the chosen models, write every prompt into the node's prompt field. Nothing runs yet.
-5. **Review on canvas.** The user checks the built workflow and prompts and edits anything.
-6. **Run options.** Offer ways to run (images first, audio first, everything) with the credits each costs. The user picks one.
-7. **Run and report.** Run the picked option, report, offer the next run.
+5. **Pre-run check.** Right before every run, read the workflow back and restore anything lost (connections, settings); keep the user's own edits.
+6. **Credits and run.** The cost is part of the plan; after the one yes, build and run everything without asking again.
+7. **Run and report.** Run, report with the right links (workflow, video or image) and the real spend, offer the next step.
 8. **Verify quality.** Check with the user against the quality gates.
 
 ## Whose instructions win
@@ -40,9 +44,25 @@
 3. Keep the result as an **app card** for the whole session:
    > App card: Calmly · 5-minute wind-down sessions for sleep · for students 18–25 · pain: can't switch off at night · may show: wind-down timer, sleep sounds · claims: none approved · tone: calm, a bit ironic · assets: logo, 3 screenshots · source: brand kit
 
-**Ask only what only the user knows.** Lyra's own nodes never ask and fill every gap with reasonable assumptions (System Preamble). This skill asks once, in Step 1, only for what can't be assumed (the app, the screenshots, the idea if they have one); for everything else it assumes, states the default in the plan and proceeds.
+**Intake quiz: involve the user before deciding.** When the user gives a task for a video (a brief, a TZ, "make a 15 s ad for my app"), don't decide everything yourself. After reading the Brand Kit, send **one short quiz** with every open question at once, so the user takes part in the key choices and understands what will be made and why. Lyra's own nodes never ask; this skill does, once, here.
+- **Format:** multiple choice. Use the client's question tool (a multiple-choice question card) if there is one; otherwise a numbered list, each question with 2–4 short options (a, b, c), the recommended option first and marked "(recommended)", plus "your own answer". The user can reply "1a 2c 3b".
+- **Size:** 4–8 questions, only the ones that matter for this video. Skip anything the task or the Brand Kit already answers; say in one line what you took from them ("From the Brand Kit: audience 25–40, offer 7 days free").
+- **Options come from the Brand Kit**, not generic: real pains, real personas, real features, the real offer.
+- **Question bank** (pick the relevant ones, in this order):
+  1. **Idea:** 2–3 short concept options built on different pains or angles (one line each, the hook in quotes) + "my own idea".
+  2. **Format:** person talking to camera (UGC) · a short story with scenes · animated / 3D · app screens in motion · POV.
+  3. **Who is on screen:** 2–3 personas from the audience (age, vibe, place) · no person.
+  4. **Length and placement:** 10 s · 15 s (recommended for Reels / TikTok) · 30 s · 60 s.
+  5. **Voice:** the person speaks on camera · voiceover · music and text only; language.
+  6. **Music:** 2–3 moods that fit the idea · no music.
+  7. **App on screen:** show real screens (then ask for screenshots) · no UI.
+  8. **CTA / offer:** the Brand Kit's offer · a plain "Download" · other.
+  9. **Captions:** yes (recommended when someone speaks) · no.
+  10. **Model and quality:** Seedance 2.5, 720p (recommended, ≈ X credits) · 1080p (sharper faces and details, ≈ 2.4× the price) · a cheaper model.
+- **Skip the quiz** only when the user says "just do it", "surprise me", or the task already answers everything: then state the choices in the plan in one line each.
+- After the answers, Step 2 explains the plan in plain words (below).
 
-**Task.** Ask for the inputs in Part 2 → Inputs and defaults; state the defaults instead of asking. Ask for everything missing in one message; never re-ask what the user said. Call `list_workspaces` (credits) and `list_node_configs` (models) now.
+**Task.** The intake quiz covers the inputs in Part 2 → Inputs and defaults; the defaults are its recommended options. Everything in one message; never re-ask what the user said. Call `list_workspaces` (credits) and `list_node_configs` (models) now.
 
 ## Step 2. Concept and plan
 
@@ -50,6 +70,8 @@
 
 **Concept:** 2–4 lines per deliverable (Part 2 → Concept). N deliverables = N distinct ideas; more takes of one idea is `count` on a node, not more nodes.
 
+**Explain it in plain words** before the node table, so a user who has never built a workflow understands what will happen: what the video will show, second by second (hook → middle → CTA) · what Claude will generate and in what order (e.g. "first the character photo, then the phone shot with your screen, then one 15 s clip, then voice and music, then the edit") · why this way (one line: e.g. "one clip keeps the person identical in every shot") · what the user gets at the end and what they can change on the canvas. Short and friendly, no node jargon; the node table follows for those who want it.
+
 **Plan:** name the matching row of Part 2 → Best way to build it in one line, then list the nodes:
 
 | # | Node label | Node · model · key settings | Inputs (role) | Stage |
@@ -60,64 +82,89 @@
 | 4 | Phone shot: timer | image · google/nano-banana-pro · 9:16 | 2, 3 (references) | 1 |
 | 5 | VO: full | audio · elevenlabs/v3 · voice | — | 1 |
 | 6 | Music | audio · elevenlabs/music · 20 s · instrumental | — | 1 |
-| 7 | Ad: 15 s, 3 shots | video · bytedance/seedance-2.5 · 15 s · 1080p · 9:16 · audio on (ambience only) | 2, 4 (references) | 2 |
+| 7 | Ad: 15 s, 3 shots | video · bytedance/seedance-2.5 · 15 s · 720p · 9:16 · audio on (ambience only) | 2, 4 (references) | 2 |
 | 8 | Video Editor | video_composer | 7, 5, 6 | 3 |
 
 **One clip by default.** A Seedance 2.5 clip holds up to 30 s and several shots ("cut to"), so one clip with the character and UI as references is the default. Split into separate clips only when: the ad is longer than 30 s · a UI moment needs its own insert (Reference D) · scenes need different models or exact frames · one shot failed and must be replaced · the user asks. Say in one line of the plan why you split or don't.
 
 Stages: **1** = sources (images, voiceover, music; fast and cheap) · **2** = built on finished images (video, lip-sync) · **3** = assembly (Video Editor / composer).
 
+**Cost:** the plan's total in credits, from Reference A → Credit prices (count and duration included), next to the balance: "≈ 500 credits · balance 47 424".
+
 ## Step 3. Approval
-Ask the user to approve or correct. On corrections, show only what changed and ask again. Don't create anything in Lyra before a clear yes.
+**One message, one question.** Everything the user has to decide goes into one message: the concept, the plan with models and quality, any question you still have, and the **cost in credits** with the balance (Step 6). It ends with one question that covers all of it, e.g. "Does the concept, Seedance 2.5 in 720p and ≈ 500 credits (of your 47 424) work for you? After your yes I build the workflow and run everything." (Answers already given in the intake quiz, captions included, are not asked again; if the quiz was skipped, videos with speech include the captions question, `lyra-video-editor` → Captions.) Never a separate question about money or about running.
+
+On corrections, show only what changed, with the new cost, and ask again. Don't create anything in Lyra before a clear yes. This yes also starts the run: after it, build and run everything without asking again (Step 6).
 
 ## Step 4. Build the workflow
-1. `create_workflow` (or `use_template`, or the user's own workflow), then `assign_brand_kit`.
-2. Write every prompt (Part 2 → Prompt rules): brief, script, image and video prompts, voiceover text, music prompt. The script can go into a user text node (`create_user_text_node`) as a note for the user. A text node does **not** affect generation: never claim it keeps the character consistent or that it feeds other nodes. Consistency comes only from the character image connected as a reference, plus the anchors written into every prompt.
+1. `create_workflow` (or `use_template`, or the user's own workflow, or a variation of an existing one: Variations below), then `assign_brand_kit`.
+2. Write every prompt (Part 2 → Prompt rules): brief, script, image and video prompts, voiceover text, music prompt. The script can go into a user text node (`create_user_text_node`) as a note for the user, connected to nothing. A user text node feeds its text into any node it is connected to, so keep this one unconnected (a Note on the canvas can't be connected at all, but the tools can't create one). The text doesn't keep the character consistent: consistency comes only from the character image connected as a reference, plus the anchors written into every prompt.
 3. Create every node from the plan with its prompt, its model and settings from `list_node_configs`, and a label that says what it's for ("Scene 2: app demo", "VO: hook"), never "Image 1".
 4. **Connect the whole graph now** (`connect_nodes`), so the workflow can run on its own with "run all": character → every image and video node that shows the person (reference) · screenshot upload → the phone image · images → video · clips, voiceover, music → Video Editor **in playback order**. Never leave connections "for after the user approves an image". **References** connect before anything is generated (checked in Lyra). **First / last frame** from a generated image needs that image to have a result first (an uploaded image can be a frame right away): on frame models, say in the plan that the frame link is made right after the image runs, and make it automatically before running the clip.
-5. Lay out the canvas in run order, left to right, with one Section (frame node) per stage: **Sources** (script note, character, screenshot uploads) → **Images** → **Clips** → **Audio** → **Video Editor**. Put an upload next to the node it feeds, never at the end of the canvas. Don't put the whole graph in one Section.
+5. Lay out the canvas by `lyra-workflow-layout` (STEP notes, sections in reading order, colors, check), one section per stage: **Sources** (script note, character, screenshot uploads) → **Images** → **Clips** → **Audio** → **Video Editor**. Put an upload next to the node it feeds, never at the end of the canvas. Don't put the whole graph in one Section.
 6. Check `is_valid` and `validation_error` on every node; fix with `update_node` using listed values.
 
-## Step 5. Review on canvas
-Tell the user the workflow is built and ready to check in Lyra; ask them to review it and say, or edit on the canvas, what to change. If they edited, `get_workflow` before running and use their prompts as they are now. Never overwrite their edits.
-
-## Step 6. Run options and costs
-Offer 2–3 ways to run, each with its credits, so the user sees what a run will spend before it starts. Lyra shows an estimated credit cost per node (the number next to **Run**): read it for every node in the option and report per option. Never guess a price; if the price isn't available to you, ask the user to read it off the nodes.
-
-| Option | Runs | Results | Credits | Time |
-|---|---|---|---|---|
-| **A. Images first (recommended)** | character + keyframes | N images | {x} | ~1 min |
-| B. Images + voiceover + music | stage 1 | N images, VO, track | {x} | ~1 min |
-| C. Everything | images → clips → Video Editor | 1 final video | {x} total | ~5–10 min |
-
-Balance: {X} credits.
-- Recommend the option that decides the look (character, keyframes). The user picks the best result before more credits go on it.
-- Option C has no pause to pick: the graph is already connected, so each stage uses the selected result of the previous one. Keep count 1 on image nodes when the user picks C.
-- If the full plan costs more than the balance, say so and offer a cheaper build (fewer ideas, lower count, a cheaper model per Reference A).
-- A pick authorises that option only. Each next stage needs a new pick, shown with its credits.
+## Variations, not new workflows
+A new version of something that already lives in a workflow goes into a **variation of that workflow** (Lyra's **Create variation**), never into a new workflow, unless the user asks for a new one.
+- **When:** a new version of a video (another story with the same characters, another angle, hook, person, setting, length or language, a remake of a failed take), more room for another round, splitting the work, or the user asks for several variations.
+- **How:** `create_variation` (it copies the whole canvas: nodes, connections and results) with a clear title ("D2 · Dan's turn") → `switch_variation` to it (the tools and runs work on the main variation; Lyra also renames the workflow after it) → `delete_node` the nodes this version doesn't need → update the prompts and add the new nodes → connect → pre-run check → run. Nodes kept as they are keep their results and cost nothing (characters, places, the end card clip). The variation keeps the canvas layout: update the section titles and labels that name what changed (`lyra-workflow-layout`).
+- **Check the Video Editor right after `create_variation`:** in a new variation the edit can come out empty or pointing to old results (opening the editor there deletes the tracks), and pinned first / last frame results can be cleared. Read the composition and the frame pins, and rebuild them by `lyra-video-editor` before any render.
+- Deleting inside a variation you just made for this version is part of the build and needs no extra ask. Never delete in the original variation or in one the user made.
+- **Report:** the workflow link, the name of the variation with the new version, and that the original is untouched in its own variation (to show it again: `switch_variation`, which renames the workflow back).
+- **Images:** new statics, sizes or languages can stay in the same variation as new nodes, one Section per set, unless the user asks for a separate workflow or the canvas gets crowded; then a variation, as for video.
+- **Open canvas:** before editing an existing workflow through the tools, ask the user to close its tab or switch away (an open canvas can write its old state over the tool edits), and tell them when it's safe to open it again.
+
+## Step 5. Pre-run check
+Right before **every** `run_node` (the first run, each next stage, reruns, follow-ups). The canvas changes between build and run: the user edits it, and an edit on the canvas can drop or overwrite connections. A run with a missing input spends credits for nothing, so never trust what you built a few minutes ago.
+1. `get_workflow` now, not from memory.
+2. Compare it with the plan: every planned edge (source → target) is there · every node that takes images has them as planned (`image_inputs_usage`: references or frames; a frame points to an existing result) · every node `is_valid`, no `validation_error` · no empty prompt · settings as planned (model, ratio, duration, resolution, count).
+3. Lost or changed by accident → restore it (`connect_nodes`, `update_node`) and say it in one line ("the link Character → Clip 1 was gone, reconnected"). Changed by the user on purpose (their prompt, model, a node they added) → keep it and use the workflow as it is now; never overwrite their edits. Not sure which → ask before running.
+4. Inputs ready: a node runs only when every node it takes from has a result. Never run a node with a missing input.
+
+After the build, tell the user once that the workflow is built and running and that they can edit any prompt on the canvas and rerun.
+
+## Step 6. Credits and run
+**Where the prices are.** `get_workflow` returns `credits` on every node: the estimated credits of one run of it (null = free: uploads, Video Editor, notes, user text; a Section shows the sum of its nodes; null on a paid node means a setting is missing, e.g. no resolution on Nano Banana 2: set it). Before the build, estimate with Reference A → Credit prices; after the build, read the real numbers off the nodes.
+
+1. **In the plan (Steps 2–3):** the estimated total and the balance (`list_workspaces`), inside the one approval message.
+2. **After the build, before running:** add up `credits` of every node that will run. Within ~15% of the approved estimate and within the balance → run everything, stage by stage (sources → images → clips → Video Editor, Step 7), with no question. More than ~15% over, or over the balance → one short message: the new total, why, and a cheaper option (fewer ideas, lower count, 720p, a cheaper model per Reference A); run after the answer.
+3. **Reruns and follow-ups:** give the rerun's credits in the same message as the change ("Changed the prompt; rerunning Clip 1 and the Video Editor, 428 credits") and run, unless the user asked to check first.
+4. **After the run:** the real spend (balance before − after) and the new balance.
+5. A source image with count 2 (a character, a persona) feeds the next stage with its selected result; say in the report which one went on and that the user can switch (Step 7).
+6. The smaller skills' **Run options** sections give the run order and what each stage holds: run all of it in that order, without offering the options. A staged run (the look first, then the rest) only when the user asks for it, or when the plan is expensive and the look should be approved first: then say so in the approval message, with each stage's credits, and run the next stage on the user's yes to the look.
+7. No `credits` on the nodes at all (the field is gone): estimate with Reference A, say it's an estimate, and keep the same one-question flow.
 
 ## Step 7. Run and report
-1. `run_node` on every node of the picked option whose inputs are ready; keep each `run_uuid` and `variation_uuid`; call `get_run_results`; while `in_progress`, call it again. **Never call run_node on a running node** (second paid run).
-2. After images: if a node made several results, ask the user to select one in Lyra before running the next stage (connections already exist; frames and references use the selected result).
+1. `run_node` on every node whose inputs are ready stage by stage: sources → images → clips → Video Editor last. Pre-run check (Step 5) before each stage. Keep each `run_uuid` and `variation_uuid`; call `get_run_results`; while `in_progress`, call it again. **Never call run_node on a running node** (second paid run).
+2. **Picking a result.** A node with several results: when the user names one ("take the second", "the first one"), set it yourself on every node that uses it; don't send the user to tick it in Lyra. On a node with `image_inputs_usage` (video nodes): `update_node` with its whole `image_inputs_usage` from `get_workflow` and one field changed: references → `reference_result_image_uuids: [picked uuid]` (or the other results in `exclude_reference_result_image_uuids`); frames → `first_frame` / `last_frame` = `{"node_uuid": source node, "image_result_uuid": picked uuid}`. The results' uuids and their order (first, second…) come from `get_run_results` of the source node's run. Then `get_workflow` to check it held, and rerun what comes after it (pre-run check first). Only when the node has no such setting or the tool refuses: ask the user to tick it in Lyra and say why. Without a pick, the next stage uses Lyra's selected result; say which one went on.
 3. Run a stage only after its inputs have results; the Video Editor runs last.
 
+**Links in every report.** Never only file links. Two kinds of link, nothing else:
+- **Workflow:** `https://lyra.splitmetrics.com/workflows/{workflow_uuid}` (opens for anyone signed in to Lyra with access to the workspace; results in a variation: name the variation to open).
+- **Result:** the `url` from `get_run_results`, exactly as returned.
+- one video → the video link + the workflow link
+- several videos → the workflow link only
+- one image → the image link + the workflow link
+- several images → the workflow link only
+A video ad's final is the Video Editor result; clip links only when the user asks.
+
 Report:
-> Calmly · video ad · "2 am": stage 1 done. Open it in Lyra to review, edit any prompt and rerun. Workflow: {link}. Spent {x} credits · balance {X}. Next run: B. clips for the frames you pick, about {x} credits.
+> Calmly · video ad · "2 am": done. Video: {video url} · Workflow: https://lyra.splitmetrics.com/workflows/{uuid}. Spent {x} credits · balance {X}. Character: result 1 went into the clip; say "take the second" to switch. Open the workflow to edit any prompt and rerun.
 
 - Name failed nodes: label, what it was asked to do, why if known, the fix you suggest.
 - When every node has a result, offer 2–3 next steps (new angle on the same concept, other sizes, other languages).
-- You can't open result links (they need a Lyra sign-in): don't describe or grade results; send the stage checklist (Part 2 → Quality gates) and ask what works and what doesn't. Refer to nodes by label, never by uuid.
+- After the final result, run `lyra-result-check` straight away, without asking (free): it opens the result in a browser, checks the frames and measures the sound, and reports the problems with pictures and fixes. Never describe or grade a result you haven't seen; without a browser send the stage checklist (Part 2 → Quality gates) and ask what works and what doesn't. Refer to nodes by label, never by uuid.
 
 ## Step 8. Verify output quality
 Check final assets, not only job status: completeness (outputs, order, scenes, CTA) · message (hook, value, claims, language match the brief) · visuals (continuity, correct UI, no major defects) · audio (words, voice, pronunciation, sync, no clipping) · delivery (duration, 9:16, resolution, final render) · variations (intended differences visible) · reusability (inputs editable). Use Part 2 → Quality gates. Suggest fixes only for identified defects, within authorized scope and cost.
 
 ## Follow-ups
-- One change ("make her older", "faster music"): `update_node` on that node, show the new prompt, give the credits to rerun it and the nodes that depend on it, rerun after a yes.
+- One change ("make her older", "faster music"): `update_node` on that node, show the new prompt, pre-run check, rerun it and the nodes that depend on it (the rerun's credits in the same message, Step 6).
 - A new angle, persona, size or language: hand over to the matching skill.
-- Never delete or overwrite results the user may want; add a node or a variation. `delete_node` only when the user asks.
+- Never delete or overwrite results the user may want: a new version goes into a variation (Variations above). `delete_node` only inside a variation you just made for this version, or when the user asks.
 
 ## Runtime failures
-See Reference G. In short: validation_error → fix with listed values · run failed → name it, one retry with a changed prompt or model and its credits · in_progress → poll again · not enough credits → stop, show balance and cost, offer cheaper · model refused content → tell the user, don't rephrase around it · file without public link → ask for a link or upload in Lyra.
+See Reference G. In short: validation_error → fix with listed values · run failed → name it, one retry with a changed prompt or model and its credits · in_progress → poll again · not enough credits → stop, show the balance and what's missing, offer cheaper (Step 6) · model refused content → tell the user, don't rephrase around it · file without public link → ask for a link or upload in Lyra.
 
 ## Base prompt rules
 You write every prompt, and each lives in its node's prompt field, where the user reads, edits and reruns it. Write for the model and for the person.
@@ -132,9 +179,13 @@
 | Mistake | Prevention |
 |---|---|
 | Builds or runs before concept and plan are approved | Steps 1–3 first, always |
-| Runs without a picked option, or run_node on a running node | Step 6; poll get_run_results |
-| One total cost instead of a cost per run option | Step 6 table, every time |
-| Runs over the user's canvas edits | get_workflow before running |
+| Asks about the price or the run as a separate question | Cost goes into the one approval message; the yes starts the run (Steps 3, 6) |
+| run_node on a running node | Poll get_run_results |
+| Plan without a cost, or a run without reading the nodes' credits | Reference A → Credit prices in the plan; node `credits` before the run |
+| Runs with lost connections, or over the user's canvas edits | Step 5 pre-run check before every run |
+| Sends the user to tick a result in Lyra | Step 7: set the picked result yourself |
+| A new workflow for a new version of the same ad | Create variation of the same workflow, delete what this version doesn't need (Variations) |
+| Only file links, or no workflow link | Step 7 links |
 | Invents app features, UI, numbers or reviews | Only the app card; without screenshots keep the screen out of view |
 | Swaps the user's explicit choice for a default | Instruction order; mention the trade-off once |
 | On-screen text or captions in video prompts | Text in the script, marked for post |
@@ -164,8 +215,8 @@
 
 ## Inputs and defaults
 **Required (ask if missing):** the app (brand kit or app card) · what the ad is about or the idea, if the user has one · app screenshots, if the ad shows the app.
-**Defaults (don't ask; state them in the plan):** Reels / TikTok · **9:16** (16:9 only if asked) · **15 s** · English · voiceover on · music on (instrumental) · **Seedance 2.5** recommended for real people, **Seedance 2.0** for illustration / UI-heavy · **1080p** (set it: Seedance defaults to 720p) · in the plan, always ask which model and quality the user prefers, with your recommendation and why · **sound on** at generation (mute in the Video Editor if needed) · Nano Banana Pro for keyframes · 1 result per node.
-**Recommended first run:** A. Images first.
+**Defaults (the recommended options in the intake quiz; if the quiz is skipped, state them in the plan):** Reels / TikTok · **9:16** (16:9 only if asked) · **15 s** · English · voiceover on · music on (instrumental, its own music node in the Video Editor; never inside a clip where someone speaks) · **Seedance 2.5** recommended for real people, **Seedance 2.0** for illustration / UI-heavy · **720p** by default (1080p only when the user picks it, with its price) · ask which model and quality the user prefers in the intake quiz, with your recommendation and why · **sound on** at generation (mute in the Video Editor if needed) · Nano Banana Pro for keyframes · 1 result per node.
+**Run:** everything after the one yes, in stage order (Step 6).
 
 ## Concept
 A good concept names one pain the audience recognises, in their words, and shows the app solving it with one real feature, one beat per scene, CTA at the end. It also says **why** it should work: the user is trying to learn what works and why (System Preamble). Write it as the hypothesis + beats:
@@ -195,7 +246,7 @@
 |---|---|---|
 | Image (keyframe) | concept in 2–3 words → subject → action → setting → framing → light → color/lens → mood → style → visible details → exclusions in plain words. ≤500 chars. The moment it shows (start of the motion if used as first frame). | abstract adjectives; text; drawing the user's logo or UI |
 | Video with a frame | motion only: what moves, camera move, pacing, end state; spoken line in quotes if the model speaks | re-describing the look; on-screen text |
-| Sound line (every clip) | what the clip should sound like. Separate music: "Sound: only natural ambience and action sounds (…); no music, no soundtrack, no score". Separate voiceover and nobody speaks on camera: add "no speech, no voice" | leaving sound unspecified (the model adds its own music) |
+| Sound line (every clip) | **no music in a clip where someone speaks** (Reference C). With speech: "Sound: dialogue and the natural sounds of the scene only (room tone, steps, a door, a cup on the table); no music, no background music, no soundtrack, no score, no song, no humming". Add "background music" to the Avoid line too. Without speech: no music ban needed (music from the generator can be muted in the Video Editor); with a separate voiceover and nobody speaking on camera: "no speech, no voice" | a clip with speech and no sound line (the model adds its own music under the voice) |
 | Video with references | who is who first ("[Image1] is the character's face and outfit, [Image2] is the phone screen"), then scene and motion; must-keep identity early | mixing frames and references on Seedance; unassigned references |
 | Video without image | full scene as for an image, then the motion | more than one scene per clip unless multi-shot with "cut to" |
 | Voiceover | exact words only, one continuous text, numbers as spoken, sized to the video at the right pace, ~1 s shorter than the video | stage directions, labels, brackets; lines longer than the clip |
@@ -213,26 +264,28 @@
 | Image connected as first/last frame on Seedance 2.5 (error) | Seedance 2.5 = references only |
 | Character's face changes between scenes | Character image first, passed as reference to every scene; same model for all clips |
 | UI on the phone garbled or invented | Real screenshots only; phone image + UI insert (Reference D) |
-| Clips come out 720p | Set 1080p explicitly on Seedance |
+| 1080p used without the user choosing it | 720p by default; 1080p only when the user picks it in the quiz or asks, with its price |
+| Decides the idea, person, voice and music alone | Step 1 intake quiz with options from the Brand Kit; explain the plan in plain words |
 | Music fades out early / has vocals under the voice | Generate ~5 s longer, instrumental, trim in Video Editor |
 | Voiceover runs over the video | Words for (video − 1 s) at a calm pace; shorten text or faster voice, never regenerate video |
 | Artist name in the music brief (error) | Describe genre, tempo, mood |
 | Sound turned off at generation | Keep sound on; mute in Video Editor |
 | Kling or Veo offered for UGC | Seedance 2.5 always for UGC |
-| Claims a text brief/script node keeps the character consistent | Text nodes are notes; consistency = character image as reference + anchors |
-| Clip comes with its own music next to the generated track | Sound line in every clip prompt: ambience only, no music |
-| Whole graph in one Section, uploads at the end | One Section per stage, left to right, uploads next to the node they feed |
+| Claims a text brief/script node keeps the character consistent | A text doesn't make the character consistent; consistency = character image as reference + anchors |
+| Clips where someone speaks come with their own background music under the voice, a different track in each | The no-music sound line in every clip with speech + "background music" in Avoid; our music only as its own node in the Video Editor; a clip with speech that still has music is rerun |
+| Whole graph in one Section, uploads at the end | One Section per stage, left to right, uploads next to the node they feed (`lyra-workflow-layout`) |
 | Clips out of order in the Video Editor | Connect in playback order; after results check and set `startMs` |
-| Price guessed | Read the price on the nodes; per option |
+| Price guessed | Reference A rates in the plan, node `credits` before the run |
 | Too many references "because the model allows it" | Small, purposeful set; video/audio refs only on request |
+| Captions added without asking, too big, or over a face | Ask in the approval message; `lyra-video-editor` → Captions: size 80, y = 1440 (75%), under the face |
 | A 1-minute clip promised | Hard limit; two halves or split, joined in Video Editor |
 | Same prompt rerun after a failure | Change the prompt, reference or model; after two fails rewrite the scene |
 
 ## Quality gates
-Claude can't see the results, so after each stage it sends the stage checklist and asks the user what they like and what they don't (Reference H has the full slop list):
+After each intermediate stage Claude sends the stage checklist (the final result is checked by `lyra-result-check`) and asks the user what they like and what they don't (Reference H has the full slop list):
 - **Stage 1 (images):** same person in every keyframe · hands and phone natural · screen exactly like the screenshot · style right (phone-real for UGC) · nothing plastic or over-glossy.
-- **Stage 2 (clips):** face and outfit stable within and across clips · no morphing, flicker, warped hands · natural motion · UI correct while tapping · ends on the planned frame.
-- **Stage 3 (final):** hook in 1.5–3 s · scenes in order, CTA at the end · voiceover not rushed, ends before the video, app name pronounced right · music instrumental under speech, trimmed with a fade · 9:16, 1080p, planned length · text inside the safe zone.
+- **Stage 2 (clips):** no music inside any clip where someone speaks (ask the user to listen, Claude can't hear) · face and outfit stable within and across clips · no morphing, flicker, warped hands · natural motion · UI correct while tapping · ends on the planned frame.
+- **Stage 3 (final):** hook in 1.5–3 s · scenes in order, CTA at the end · voiceover not rushed, ends before the video, app name pronounced right · under speech only our music from the Video Editor, instrumental, trimmed with a fade · 9:16, planned resolution (720p by default), planned length · captions (only if the user said yes) size 80, at 75% of the height, never over a face (`lyra-video-editor` → Captions) · other text inside the safe zone.
 Pass = the user is happy with every point that applies. Fix only what fails, within the agreed budget, with its credits.
 
 ---
@@ -243,15 +296,15 @@
 
 Always call `list_node_configs` first: it is the live source of models, durations, resolutions and limits.
 
-**How to offer a model.** Recommend **Seedance 2.5** (real people) or **Seedance 2.0** (illustration, stylized, UI/UX). Say plainly: "This is the more expensive option, but it gives the best quality for this video." Give the price per node and per run option (step 6). Always ask which model the user prefers before building (in the plan, step 2–3). Seedance 2.5 and 2.0 always come before any Kling. **UGC and real people talking: always Seedance 2.5, never Kling or Veo**; if the user wants cheaper, say the quality on faces and speech will drop and let them decide.
+**How to offer a model.** Recommend **Seedance 2.5** (real people) or **Seedance 2.0** (illustration, stylized, UI/UX). Say plainly: "This is the more expensive option, but it gives the best quality for this video." Give the cost in the plan (Credit prices below). Always ask which model the user prefers before building (in the plan, step 2–3). Seedance 2.5 and 2.0 always come before any Kling. **UGC and real people talking: always Seedance 2.5, never Kling or Veo**; if the user wants cheaper, say the quality on faces and speech will drop and let them decide.
 
 **Cheaper ladder** (one step at a time, show the new price, skip models bad at the task): Seedance 2.5 / 2.0 → Veo 3.1 (only clips ≤8 s) → Kling 4.0 (only once it is in Lyra's list) → Kling 3.0 Pro → Kling 3.0 Standard → Veo 3.1 Fast → Seedance 1.5 Pro (short lip-sync only) → Seedance 2.0 Fast → Kling 2.6 → Kling 2.5 Turbo Pro → Veo 3.1 Lite / Seedance 2.0 Mini. Drafts first, final later: test ideas on a draft model, rerun only the winner on the recommended one.
 
 **Task → model:** real people, UGC → Seedance 2.5 · illustration, cartoon, UI/UX, moving text → Seedance 2.0 · product / nature realism, ≤8 s → Veo 3.1 · exact first + last frame, complex multi-shot → Kling 3.0 Pro · motion transfer → Kling 3.0 Motion Control Pro (Standard cheaper) · same character with video and voice refs → Kling Video 3.0 Omni · short lip-sync with synced audio → Seedance 1.5 Pro · campaign character consistency → Runway Gen-4.5 · strong physics → Sora 2 Pro (Sora 2 for drafts) · edit an existing video by chat → Gemini Omni · talking head (face + audio) → veed/fabric-1.0 (720p).
 
 **Model cards (Lyra, Oct 2026)**
-- **Seedance 2.5** (flagship, real people): 4–30 s or `adaptive` (fits length to the dialogue/script); the only Lyra model up to 30 s. **References only: never first/last frame (the fields exist but error out).** Technical max 30 images / 10 videos / 10 audio, never pushed (see reference policy). Refs are named [Image1], [Image2]… in the prompt. Default 720p → set 1080p. Angle and details can shift.
-- **Seedance 2.0** (illustration, UI/UX): 4–15 s, `-1` = intelligent duration. Image as **frame** (start/end; picture kept exactly) or **reference** (looser), never both in one node. Rule: image with UI or any text → frame; no text and exactness not important → reference; unsure → ask. Technical max (per list_node_configs) 9 image / 3 video / 3 audio refs, never pushed. Default 720p → set 1080p. Fast and Mini: cheaper, max 720p, drafts.
+- **Seedance 2.5** (flagship, real people): 4–30 s or `adaptive` (fits length to the dialogue/script); the only Lyra model up to 30 s. **References only: never first/last frame (the fields exist but error out).** Technical max 30 images / 10 videos / 10 audio, never pushed (see reference policy). Refs are named [Image1], [Image2]… in the prompt. Default 720p (our default too; 1080p only on the user's choice). Angle and details can shift.
+- **Seedance 2.0** (illustration, UI/UX): 4–15 s, `-1` = intelligent duration. Image as **frame** (start/end; picture kept exactly) or **reference** (looser), never both in one node. Rule: image with UI or any text → frame; no text and exactness not important → reference; unsure → ask. Technical max (per list_node_configs) 9 image / 3 video / 3 audio refs, never pushed. Default 720p (ours too; 1080p on the user's choice). Fast and Mini: cheaper, max 720p, drafts.
 - **Veo 3.1:** 4/6/8 s (max 8), references (≤3) like the others, 9:16 default. Best realism, product, nature. Used rarely, only very short clips. Fast / Lite: cheaper, frames only.
 - **Kling 3.0 Pro / Standard:** 3–15 s, first frame and/or last frame only, no references. Multi-shot, complex scenes, cartoon/stylized; weaker than Seedance on faces and human motion; cheaper than Seedance.
 - **Kling 3.0 Motion Control Pro / Standard:** image + reference video 3–30 s (`character_orientation: video` up to 30 s, `image` up to 10 s). References with clear hands, head and body; avoid complex angles and blocked limbs.
@@ -261,17 +314,34 @@
 - **Kling 4.0** (launched 16 Oct 2026): 3–30 s, up to 10 keyframes, stereo audio, cheaper than Seedance. Not in Lyra yet; offer only when list_node_configs shows it, and never ahead of Seedance for people.
 - **Images:** Nano Banana Pro for finals (text, UI, people, realism, sharp), Nano Banana 2 for drafts.
 
-**Settings in the Video Generation node:** model → seconds (or adaptive) → aspect ratio 9:16 (confirm) → quality 1080p (tell the user it keeps details and faces best; they may choose otherwise) → sound **on** → how images connect (frame or reference, by model).
+**Settings in the Video Generation node:** model → seconds (or adaptive) → aspect ratio 9:16 (confirm) → quality **720p by default** (offer 1080p in the quiz: sharper faces and details, ≈ 2.4× the price) → sound **on** → how images connect (frame or reference, by model).
 
 **Reference policy.** Limits are a technical maximum, not a target: many extras make the model unpredictable. Never tell the user how many references a model takes or suggest adding many. Default references = the images you generated (character, keyframe, product, UI). Write the montage yourself in the script; a video reference only when the user asks or the brief requires copying an edit (it works only as an editing reference). An audio reference only when the user brings a track (the video is fitted to it).
 
 **Longer than a model allows (e.g. 1 minute).** Say honestly no model makes it in one clip (30 s Seedance 2.5, 15 s others, 8 s Veo). Offer: (A) two 30 s videos from the same idea and image, joined in the Video Editor; or (B) the full 60 s script split into two 30 s parts (check each part's length), the same reference(s) or a few style references for both, two videos in one style, joined in the Video Editor. Same model, character, style anchor, voice and music in both halves. Always tell the user first that this is possible and how.
 
-**Price.** Lyra shows an estimated credit cost per node (number with the coin icon next to Run). Read it for every node that will run and warn the user before running, per node and per option. Never guess. After a run, report what it cost (credits before − after, `list_workspaces`).
+**Credit prices** (Lyra, Oct 2026; credits per run, rounded up; a node's `credits` in `get_workflow` is always the final word):
+
+| Node | Price |
+|---|---|
+| Seedance 2.5 | 720p: 28.5 per second · 1080p: 67.5 per second · `adaptive` counts as 30 s |
+| Seedance 2.0 | 720p: 27 per second · 1080p: 67.5 per second |
+| Seedance 2.0 Fast | 720p: 22.5 per second |
+| Kling 3.0 Pro / Standard | 50.4 / 37.8 per second |
+| Kling 3.0 Motion Control | ≈ 54 per second |
+| Kling 2.5 Turbo Pro | ≈ 10.5 per second |
+| Veo 3.1 | 1080p: ≈ 60 per second |
+| Nano Banana Pro 2K / Nano Banana 2 1K | 23 / 11 per image |
+| GPT Image 2 / Ideogram 3.0 Turbo | 20 / 5 per image |
+| Music (ElevenLabs) | 1.25 per second of the track |
+| Voiceover · AI text node | ≈ 2 · 1 |
+| Video Editor, uploads, notes | 0 |
+
+Count multiplies the price; ratio, sound on or off and frames vs references don't change it. Example (default build): character 23 + phone shot 23 + 15 s Seedance 2.5 720p 428 + 20 s music 25 + VO 2 ≈ **500 credits** (at 1080p the clip is 1 013, total ≈ 1 090). Models or settings not in the table: build, read the node, then tell the user.
 
 **Text nodes.** Claude writes brief, script, voiceover script and music brief itself into user text nodes (the AI text nodes can't be created with the tools). Exception: **Creative Analysis** (`pattern_import`): when the user brings a reference video and the node is available, use Upload Video → Creative Analysis and write the script from its output.
 
-**Video Editor** = the `video_composer` node (no credits). Connect clips, voiceover, music and images in playback order at build time (it lays clips out in connection order; to reorder, disconnect and reconnect). After the clips have results, read the composition with get_workflow and check the order; if it's wrong, set each clip's `startMs` with update_node. Pick a transition, run. Its edit lives in `video_rendering_composition` (get_workflow / update_node): `canvas` (fps, width, height, durationMs) and `tracks` (video / audio layers; clips with `startMs`, `durationMs`, `trim.sourceStartMs/sourceEndMs`, `volume`, `position`; track `volume`, `muted`). Trims, music volume under the voice (e.g. 0.25), muting a clip's own sound and overlay layers (a UI insert above the main video) are set there. Read the existing composition first and change only what's needed; captions are added in the editor UI.
+**Video Editor and captions → `lyra-video-editor`.** The Video Editor is the `video_composer` node (0 credits). Assembly (order, trims, layers), the mix (VO, music volume, trim, fade-out, clip sound), the end card, on-screen text, captions (ask first; size 80, 75% of the height, word check), speed, freeze frame, effects, transitions, safe zones, export, the pre-render check, the render and the 59 / 30 / 15 s cutdowns all live in `lyra-video-editor`; follow it for stage 3.
 
 ## B. Brief, script and scenes
 
@@ -293,7 +363,7 @@
 
 ## C. Audio: voiceover and music
 
-**Voiceover.** Write it yourself (from the script and Brand Kit) into a "VO script" text node, then an audio voiceover node (`elevenlabs/v3`, voice from `list_voices`).
+**Voiceover.** Write it yourself (from the script and Brand Kit) into a "VO script" text node, then an audio voiceover node (`elevenlabs/v4`, Lyra's recommended voiceover model; `elevenlabs/v3` also listed; voice from `list_voices`).
 - Exact spoken words only: no scene labels, timestamps, "Hook:", "VO:", "[pause]", "(upbeat)", brackets, asterisks, slashes, markdown, separator dashes. Allowed: comma, period, ellipsis, ?, !. Pause = comma or ellipsis.
 - One continuous text joining the per-scene lines; rhythm shows the pace; the words carry the tone (never describe it).
 - No invented claims. The user's direction wins (tone, length, focus, language, style).
@@ -308,9 +378,14 @@
 - **Length = video + ~5 s** (10 s video → 15 s track, `music_length_ms`), trimmed in the Video Editor, because the fade starts early.
 - **No artist names** (they can error). Check the script too.
 
-**Clip sound:** sound stays on at generation, but say in every clip prompt what it should be. With separate music: "only natural ambience and action sounds, no music, no soundtrack, no score". With a separate voiceover and nobody speaking on camera: also "no speech". Otherwise the model adds its own music and the clip audio can't be used next to the track.
+**No music in a clip where someone speaks (fixed rule).** Video models, Seedance above all, add their own background music when the prompt leaves room: some clips get it, some don't, and every clip gets a different track. When a person speaks on camera that music is baked into the voice: it can't be removed or muted without losing the dialogue, and under our score it becomes two tracks playing at once. So:
+- **Every clip with speech** (dialogue, a person talking to camera, a line in the clip, an in-clip narrator) gets this sound line: "Sound: dialogue and the natural sounds of the scene only (room tone, steps, a door, a cup on the table); no music, no background music, no soundtrack, no score, no song, no humming". And "background music, soundtrack" in its Avoid line.
+- **Clips without speech:** no ban needed. If the generator adds music, that's fine: in the Video Editor the clip's sound can simply be muted and our music laid instead. With a separate voiceover and nobody speaking on camera, write "no speech, no voice".
+- **Allowed in a clip with speech:** the voices, the sounds of the action (a door opening, steps, a phone buzz, a kettle, a crash), room tone and ambience. Not allowed: any music, song, humming or jingle under the voice.
+- **Our music is its own music node** (instrumental when anyone speaks), on its own track in the Video Editor, under the dialogue.
+- **Sound stays on at generation** (the voices and scene sounds are needed), so the prompt is the only guard. After the clips run, ask the user to listen for music inside the clips where someone speaks. Such a clip that came back with music anyway is rerun with the same sound line (its credits in the same message): muting it would mute the voice too.
 
-**Mix in the Video Editor:** voice is the main sound; music clearly under it; trim music to the video and fade on the last frame; mute or lower clip sound that clashes (sound stays on at generation).
+**Mix in the Video Editor:** `lyra-video-editor` → Audio (voice first, music under speech, trim and fade, which clips are muted).
 
 ## D. App UI in the video
 
@@ -326,7 +401,7 @@
 - **Anchors** defined once and repeated word for word in every prompt: character (age, face, hair, skin, outfit, accessories), environment (place, time of day, light direction and color), style (palette from the Brand Kit, grading, look, lens), product/phone (device, case, screen from the screenshot).
 - Per scene: **source scene** (earliest that set the element) · **must match** · **allowed to change**.
 - One image model for all keyframes, **one video model for the whole ad**, one ratio and resolution.
-- **Character first, connected everywhere:** the character image is generated in stage 1 and **connected at build time as a reference to every image and video node that shows the person**, so the graph stays consistent even with "run all". If the user wants to choose between several characters, they run stage 1 alone and select one; the connections are already there. A text brief alone never makes images consistent. Two characters for A/B: one script, two character images, two videos.
+- **Character first, connected everywhere:** the character image is generated in stage 1 and **connected at build time as a reference to every image and video node that shows the person**, so the graph stays consistent even with "run all". If the user wants to choose between several characters, run stage 1 first; they name one and Claude pins it on every node that uses it (Step 7); the connections are already there. A text brief alone never makes images consistent. Two characters for A/B: one script, two character images, two videos.
 - **By model:** Seedance 2.5 references (roles per [ImageN]); Seedance 2.0 frame for exactness / UI, reference for looser; Kling first/last frame; Omni references + video ref.
 - Frames pin to the **selected** result; reconnect after regenerating a keyframe.
 - **Hand-off:** write each clip's end state; the next scene starts from it; keep motion direction across cuts; match cuts, whip pans and cuts on action hide small differences.
@@ -362,12 +437,13 @@
 | Video ignores the script or image | Connect both to the video node |
 | Video stays on the old image | Keyframe regenerated → reconnect it |
 | Duration rejected | Use a listed value (model first, then seconds) |
-| Clip is 720p | Set 1080p; Seedance 2.0 Fast/Mini can't do 1080p |
+| User wants 1080p | Set `resolution: 1080p` (Seedance 2.5 / 2.0); 2.0 Fast / Mini can't do 1080p |
 | Music node error | Artist name → describe genre, tempo, mood |
 | Vocals under the voice | Instrumental only, force_instrumental on |
 | Music fades early | Generate ~5 s longer, trim |
 | Voiceover too long | Shorten to (video − 1 s) or faster voice |
-| Clip audio clashes | Mute/lower in Video Editor |
+| Clip audio clashes | Clip without speech: mute/lower in Video Editor |
+| Music inside a clip with speech | Can't be removed: rerun the clip with the no-music sound line (Reference C) |
 | Clips in wrong order | Disconnect and reconnect in playback order |
 | UI garbled | Phone image + UI insert (D) |
 | Face drifts | E → "When it breaks" |
@@ -393,7 +469,7 @@
 - Formats that convert: UGC style (phone-shot, person to camera) beats polished brand video on cold traffic · problem → agitate → demo → CTA ending on the key screen · real people using the app · one simple key screen, not a walkthrough · before/after of the situation · specific, plausible social proof from the Brand Kit.
 - Hook in ~1.5 s (Reels/TikTok), by 3 s (Feed); no dead air; no logo intro. Hook rate (3-s views ÷ impressions) >30% good, <20% weak.
 - Length: Reels 6–30 s (15–20 s safe), Stories 6–15 s, Feed 15–30 s (4:5 or 1:1 as a later variant).
-- Sound off: most viewers watch muted → captions for all speech, key message also on screen, same words as the VO; large, high-contrast, one consistent place; added in the Video Editor.
-- Safe zone: subject and text in the central 65% of 9:16, away from the top bar and the bottom caption/CTA area.
+- Sound off: most viewers watch muted → recommend captions for all speech when asking the user (`lyra-video-editor` → Captions: ask first), key message also on screen, same words as the VO; high-contrast, one consistent place, size 80, at 75% of the height under the faces; added in the Video Editor.
+- Safe zone: faces, the subject and headline text in the central 65% of 9:16, away from the top bar and the bottom CTA area. Captions are the exception: at 75% of the height, under the faces (`lyra-video-editor` → Captions).
 - CTA: a concrete offer ("Try free for 7 days") beats "Download now"; in VO and on screen in the last 2–3 s.
 - Judge creatives by trials, payers and day-7 retention, not only cost per install; give a test 2–3 weeks.
Full technical diff · 1 changed fields

changed /skill_md_contents

BEFORE
"---\nname: lyra-video-ad-generation\ndescription: \"Base skill for video ads in Lyra. Builds a mobile app video ad end to end (brief, script, scenes, keyframes, clips, voiceover, music, Video Editor assembly) with scene consistency, de-slop and error handling. Use for \\\"a 15-second video ad for my app\\\", \\\"a 30 s / 1 min ad\\\", \\\"a sequence of scenes\\\", \\\"stitch these clips\\\", or a script or storyboard to produce. Holds the core video rules the smaller lyra video skills point to.\"\n---\n\n# lyra-video-ad-generation\n\nThe main video skill for Lyra. It holds the core rules for every video ad: script, scenes, music, voiceover, consistency between scenes, de-slop and error handling. Smaller video skills (UGC, hooks, templates) point here for these rules.\n\nPart 1 is shared by every Lyra skill. Part 2 is what's specific to video ads. The Reference library at the end has the details (models, prompts, audio, UI, consistency, de-slop, errors, Meta app ads).\n\n---\n\n# Part 1. [SHARED] How every Lyra skill works\n\n**Deliverable:** a Lyra workflow in which every planned node has been generated. The user opens the canvas and finds the results, the prompts that produced them, and a graph they can edit and rerun for the next app, angle or market.\n\nA full creative always follows these steps, in order:\n1. **Context.** Collect the app context and task inputs; make sure you have everything before proposing anything.\n2. **Concept and plan.** A very short concept plus a short plan of nodes, models and connections, based on \"Best way to build it\".\n3. **Approval.** The user approves or corrects concept and plan. Nothing is created before this.\n4. **Build.** Create the workflow and nodes with the chosen models, write every prompt into the node's prompt field. Nothing runs yet.\n5. **Review on canvas.** The user checks the built workflow and prompts and edits anything.\n6. **Run options.** Offer ways to run (images first, audio first, everything) with the credits each costs. The user picks one.\n7. **Run and report.** Run the picked option, report, offer the next run.\n8. **Verify quality.** Check with the user against the quality gates.\n\n## Whose instructions win\n1. The user's explicit instructions in this chat.\n2. This skill's best practices and defaults.\n3. The brand kit: real app facts, claims, value proposition, features, audience.\n\nBest practices are defaults, not rules for the user. When a user's choice will likely hurt the result, follow it and say once in the plan what you'd do instead and why; don't argue twice. When a choice breaks a hard limit (a 60 s clip from a model capped at 30 s), explain and offer the closest build that works.\n\n## Step 1. Context\n\n**App.** Every concept starts from the app. Generic ads come from missing product context, so never fill gaps from imagination.\n1. Brand kit given in the chat → use it. Otherwise `list_brand_kits`: one kit → \"Make this for {kit name}?\"; several → ask which. The user may add or override details in chat.\n2. No kit → ask once: send it here, or should I check / connect one of the kits already in your workspace? If the user prefers to type it: app name, what it does, who it's for, the pain it solves, 2–3 features the ad may show, approved claims and offer, forbidden claims, tone, assets (logo, **screenshots only**; never ask for a screen recording).\n3. Keep the result as an **app card** for the whole session:\n   > App card: Calmly · 5-minute wind-down sessions for sleep · for students 18–25 · pain: can't switch off at night · may show: wind-down timer, sleep sounds · claims: none approved · tone: calm, a bit ironic · assets: logo, 3 screenshots · source: brand kit\n\n**Ask only what only the user knows.** Lyra's own nodes never ask and fill every gap with reasonable assumptions (System Preamble). This skill asks once, in Step 1, only for what can't be assumed (the app, the screenshots, the idea if they have one); for everything else it assumes, states the default in the plan and proceeds.\n\n**Task.** Ask for the inputs in Part 2 → Inputs and defaults; state the defaults instead of asking. Ask for everything missing in one message; never re-ask what the user said. Call `list_workspaces` (credits) and `list_node_configs` (models) now.\n\n## Step 2. Concept and plan\n\nShort: readable in under a minute.\n\n**Concept:** 2–4 lines per deliverable (Part 2 → Concept). N deliverables = N distinct ideas; more takes of one idea is `count` on a node, not more nodes.\n\n**Plan:** name the matching row of Part 2 → Best way to build it in one line, then list the nodes:\n\n| # | Node label | Node · model · key settings | Inputs (role) | Stage |\n|---|---|---|---|---|\n| 1 | Script (note for the user) | user text | — | — |\n| 2 | Character: Mia | image · google/nano-banana-pro · 9:16 · count 1 | — | 1 |\n| 3 | Screenshot: timer | upload image | — | 1 |\n| 4 | Phone shot: timer | image · google/nano-banana-pro · 9:16 | 2, 3 (references) | 1 |\n| 5 | VO: full | audio · elevenlabs/v3 · voice | — | 1 |\n| 6 | Music | audio · elevenlabs/music · 20 s · instrumental | — | 1 |\n| 7 | Ad: 15 s, 3 shots | video · bytedance/seedance-2.5 · 15 s · 1080p · 9:16 · audio on (ambience only) | 2, 4 (references) | 2 |\n| 8 | Video Editor | video_composer | 7, 5, 6 | 3 |\n\n**One clip by default.** A Seedance 2.5 clip holds up to 30 s and several shots (\"cut to\"), so one clip with the character and UI as references is the default. Split into separate clips only when: the ad is longer than 30 s · a UI moment needs its own insert (Reference D) · scenes need different models or exact frames · one shot failed and must be replaced · the user asks. Say in one line of the plan why you split or don't.\n\nStages: **1** = sources (images, voiceover, music; fast and cheap) · **2** = built on finished images (video, lip-sync) · **3** = assembly (Video Editor / composer).\n\n## Step 3. Approval\nAsk the user to approve or correct. On corrections, show only what changed and ask again. Don't create anything in Lyra before a clear yes.\n\n## Step 4. Build the workflow\n1. `create_workflow` (or `use_template`, or the user's own workflow), then `assign_brand_kit`.\n2. Write every prompt (Part 2 → Prompt rules): brief, script, image and video prompts, voiceover text, music prompt. The script can go into a user text node (`create_user_text_node`) as a note for the user. A text node does **not** affect generation: never claim it keeps the character consistent or that it feeds other nodes. Consistency comes only from the character image connected as a reference, plus the anchors written into every prompt.\n3. Create every node from the plan with its prompt, its model and settings from `list_node_configs`, and a label that says what it's for (\"Scene 2: app demo\", \"VO: hook\"), never \"Image 1\".\n4. **Connect the whole graph now** (`connect_nodes`), so the workflow can run on its own with \"run all\": character → every image and video node that shows the person (reference) · screenshot upload → the phone image · images → video · clips, voiceover, music → Video Editor **in playback order**. Never leave connections \"for after the user approves an image\". **References** connect before anything is generated (checked in Lyra). **First / last frame** from a generated image needs that image to have a result first (an uploaded image can be a frame right away): on frame models, say in the plan that the frame link is made right after the image runs, and make it automatically before running the clip.\n5. Lay out the canvas in run order, left to right, with one Section (frame node) per stage: **Sources** (script note, character, screenshot uploads) → **Images** → **Clips** → **Audio** → **Video Editor**. Put an upload next to the node it feeds, never at the end of the canvas. Don't put the whole graph in one Section.\n6. Check `is_valid` and `validation_error` on every node; fix with `update_node` using listed values.\n\n## Step 5. Review on canvas\nTell the user the workflow is built and ready to check in Lyra; ask them to review it and say, or edit on the canvas, what to change. If they edited, `get_workflow` before running and use their prompts as they are now. Never overwrite their edits.\n\n## Step 6. Run options and costs\nOffer 2–3 ways to run, each with its credits, so the user sees what a run will spend before it starts. Lyra shows an estimated credit cost per node (the number next to **Run**): read it for every node in the option and report per option. Never guess a price; if the price isn't available to you, ask the user to read it off the nodes.\n\n| Option | Runs | Results | Credits | Time |\n|---|---|---|---|---|\n| **A. Images first (recommended)** | character + keyframes | N images | {x} | ~1 min |\n| B. Images + voiceover + music | stage 1 | N images, VO, track | {x} | ~1 min |\n| C. Everything | images → clips → Video Editor | 1 final video | {x} total | ~5–10 min |\n\nBalance: {X} credits.\n- Recommend the option that decides the look (character, keyframes). The user picks the best result before more credits go on it.\n- Option C has no pause to pick: the graph is already connected, so each stage uses the selected result of the previous one. Keep count 1 on image nodes when the user picks C.\n- If the full plan costs more than the balance, say so and offer a cheaper build (fewer ideas, lower count, a cheaper model per Reference A).\n- A pick authorises that option only. Each next stage needs a new pick, shown with its credits.\n\n## Step 7. Run and report\n1. `run_node` on every node of the picked option whose inputs are ready; keep each `run_uuid` and `variation_uuid`; call `get_run_results`; while `in_progress`, call it again. **Never call run_node on a running node** (second paid run).\n2. After images: if a node made several results, ask the user to select one in Lyra before running the next stage (connections already exist; frames and references use the selected result).\n3. Run a stage only after its inputs have results; the Video Editor runs last.\n\nReport:\n> Calmly · video ad · \"2 am\": stage 1 done. Open it in Lyra to review, edit any prompt and rerun. Workflow: {link}. Spent {x} credits · balance {X}. Next run: B. clips for the frames you pick, about {x} credits.\n\n- Name failed nodes: label, what it was asked to do, why if known, the fix you suggest.\n- When every node has a result, offer 2–3 next steps (new angle on the same concept, other sizes, other languages).\n- You can't open result links (they need a Lyra sign-in): don't describe or grade results; send the stage checklist (Part 2 → Quality gates) and ask what works and what doesn't. Refer to nodes by label, never by uuid.\n\n## Step 8. Verify output quality\nCheck final assets, not only job status: completeness (outputs, order, scenes, CTA) · message (hook, value, claims, language match the brief) · visuals (continuity, correct UI, no major defects) · audio (words, voice, pronunciation, sync, no clipping) · delivery (duration, 9:16, resolution, final render) · variations (intended differences visible) · reusability (inputs editable). Use Part 2 → Quality gates. Suggest fixes only for identified defects, within authorized scope and cost.\n\n## Follow-ups\n- One change (\"make her older\", \"faster music\"): `update_node` on that node, show the new prompt, give the credits to rerun it and the nodes that depend on it, rerun after a yes.\n- A new angle, persona, size or language: hand over to the matching skill.\n- Never delete or overwrite results the user may want; add a node or a variation. `delete_node` only when the user asks.\n\n## Runtime failures\nSee Reference G. In short: validation_error → fix with listed values · run failed → name it, one retry with a changed prompt or model and its credits · in_progress → poll again · not enough credits → stop, show balance and cost, offer cheaper · model refused content → tell the user, don't rephrase around it · file without public link → ask for a link or upload in Lyra.\n\n## Base prompt rules\nYou write every prompt, and each lives in its node's prompt field, where the user reads, edits and reruns it. Write for the model and for the person.\n- Self-contained: no \"same as above\", no references to the chat.\n- Concrete and renderable: things the model can show or say, not marketing concepts.\n- The user's own words for the subject and anything they specified stay as given.\n- Settings (ratio, duration, resolution, voice, audio) go in node settings, not in the prose.\n- English, unless text must appear or be spoken in another language. Exact on-image or spoken text in quotes.\n- No placeholders, alternatives or \"if\" branches in a final prompt.\n\n## Common mistakes (every skill)\n| Mistake | Prevention |\n|---|---|\n| Builds or runs before concept and plan are approved | Steps 1–3 first, always |\n| Runs without a picked option, or run_node on a running node | Step 6; poll get_run_results |\n| One total cost instead of a cost per run option | Step 6 table, every time |\n| Runs over the user's canvas edits | get_workflow before running |\n| Invents app features, UI, numbers or reviews | Only the app card; without screenshots keep the screen out of view |\n| Swaps the user's explicit choice for a default | Instruction order; mention the trade-off once |\n| On-screen text or captions in video prompts | Text in the script, marked for post |\n| Re-describes the look in a video prompt with a first frame | Motion only; the frame sets the look |\n| Leaves connections for later, so \"run all\" breaks | Connect the full graph in step 4; frames at the video's ratio |\n| Splits a short ad into a node per micro-scene | One clip by default; split only for the listed reasons |\n| Voiceover longer than its clip | Reference C pacing; VO ~1 s shorter than the video |\n| Values the model doesn't list | Copy from list_node_configs |\n| Nodes for takes of one idea, or count for different ideas | Ideas → nodes; takes → count |\n| Prompts that point back to the chat | Self-contained prompts |\n| Reruns an unchanged prompt as a fix | Change prompt or model; say what changed |\n| Describes or grades results it can't see | Ask the user with the stage checklist |\n| A forbidden claim from the Brand Kit, a political line or a dig at a competitor | Brand safety (Reference B): forbidden claims enforced absolutely |\n\n---\n\n# Part 2. Video ad generation: what's specific\n\n## Description\nCreates multi-scene video ads for mobile app paid ads in Lyra, SplitMetrics' node-based creative canvas, leaving a generated, reusable workflow on the canvas.\nUse when the user asks for \"a 15-second video ad for my app\", \"a 30 s / 1 minute ad\", \"a sequence of scenes\", \"stitch these clips together\", or hands over a script or storyboard.\nWorks from a Lyra brand kit or app details in chat, app screenshots, a script, a reference ad (through the Creative Analysis node), or an existing workflow.\nNot for: a UGC creator video (the UGC skill), a hook only (the hook skill), static images (the image skills). Those skills use this skill's rules for scripts, scenes, audio, consistency and de-slop.\n\n## Quality bar\nStops the scroll in the first 1.5–3 s, shows only real app features and real screens, reads as one consistent film (same person, place, light), sounds natural (voice not rushed, music without vocals under speech), no AI-slop look, and works with sound off.\n\n## Inputs and defaults\n**Required (ask if missing):** the app (brand kit or app card) · what the ad is about or the idea, if the user has one · app screenshots, if the ad shows the app.\n**Defaults (don't ask; state them in the plan):** Reels / TikTok · **9:16** (16:9 only if asked) · **15 s** · English · voiceover on · music on (instrumental) · **Seedance 2.5** recommended for real people, **Seedance 2.0** for illustration / UI-heavy · **1080p** (set it: Seedance defaults to 720p) · in the plan, always ask which model and quality the user prefers, with your recommendation and why · **sound on** at generation (mute in the Video Editor if needed) · Nano Banana Pro for keyframes · 1 result per node.\n**Recommended first run:** A. Images first.\n\n## Concept\nA good concept names one pain the audience recognises, in their words, and shows the app solving it with one real feature, one beat per scene, CTA at the end. It also says **why** it should work: the user is trying to learn what works and why (System Preamble). Write it as the hypothesis + beats:\n> Video, 15 s. We believe students who can't switch off at night will start a trial because a relatable 2 am POV shows the wind-down timer working. 0–3 s hook: \"POV: 2 am, brain won't stop\", tired face in phone light · 3–11 s she starts the timer (real screenshot), shoulders drop · 11–15 s eyes close, CTA \"Try it tonight\". Voice: tired, warm. Music: soft lo-fi, instrumental.\n\nBrief, structure, scene fields, timing and montage rules: Reference B.\n\n## Best way to build it\nThe user's explicit choices override any column. Model choice and price rules: Reference A.\n\n| If the request has | Best approach (graph) | Models | Why |\n|---|---|---|---|\n| **Nothing specific (default)**, real people, ≤30 s | character image (+ phone image with the real screenshot if the app is shown) → **one** multi-shot clip ≤30 s with both as **references** → VO + music → Video Editor | seedance-2.5 · nano-banana-pro | fewest nodes, one consistent look; Seedance holds identity from references |\n| UGC / creator talking to camera | hand over to the UGC skill; if it runs here: Seedance 2.5 only, never Kling or Veo | seedance-2.5 | Seedance is clearly better at people |\n| 60 s or longer than 30 s | full script → two 30 s parts (or split text) with the same character and style references → two clips → Video Editor | seedance-2.5 | no model makes 60 s in one clip |\n| Illustration, cartoon, stylized, moving text | keyframe per scene → clip with image as **frame** | seedance-2.0 | holds style; frames keep the picture exact |\n| The app's UI on screen | user screenshots → phone image (character + screenshot) → short clip, or UI insert laid over in Video Editor (Reference D) | seedance-2.0 (frames) or seedance-2.5 (refs) | models break UI in long busy clips |\n| Exact start and end frame, complex multi-shot | first + last frame per clip | kling-v3-video (Pro) | precise frame control (not for UGC) |\n| Very short product / nature shot, ≤8 s | references → one clip | veo-3.1 | realism; max 8 s, used rarely |\n| Copy a movement from a reference video | character image + motion video | kling-v3-motion-control | motion transfer |\n| A reference ad to adapt | Upload Video → Creative Analysis → script (written by you from its output) → as default row | as default row | keeps the mechanism, not the identity |\n| Many drafts / tight budget | draft model for tries, rerun the winner on the recommended model | seedance-2.0-fast, veo-3.1-lite | spend on the winner only |\n\n## Prompt rules\n\n| Node | Write | Avoid |\n|---|---|---|\n| Image (keyframe) | concept in 2–3 words → subject → action → setting → framing → light → color/lens → mood → style → visible details → exclusions in plain words. ≤500 chars. The moment it shows (start of the motion if used as first frame). | abstract adjectives; text; drawing the user's logo or UI |\n| Video with a frame | motion only: what moves, camera move, pacing, end state; spoken line in quotes if the model speaks | re-describing the look; on-screen text |\n| Sound line (every clip) | what the clip should sound like. Separate music: \"Sound: only natural ambience and action sounds (…); no music, no soundtrack, no score\". Separate voiceover and nobody speaks on camera: add \"no speech, no voice\" | leaving sound unspecified (the model adds its own music) |\n| Video with references | who is who first (\"[Image1] is the character's face and outfit, [Image2] is the phone screen\"), then scene and motion; must-keep identity early | mixing frames and references on Seedance; unassigned references |\n| Video without image | full scene as for an image, then the motion | more than one scene per clip unless multi-shot with \"cut to\" |\n| Voiceover | exact words only, one continuous text, numbers as spoken, sized to the video at the right pace, ~1 s shorter than the video | stage directions, labels, brackets; lines longer than the clip |\n| Music | genre, era, BPM, instruments, energy curve (hook hit → build → CTA resolve), \"instrumental only, no vocals\" when anyone speaks, length = video + ~5 s | artist names; vocals under speech; length equal to the ad |\n\n**Prompt length:** one shot 60–150 words (sweet spot 80–120); image-to-video 40–60% shorter; over ~300 words later instructions get ignored. Non-negotiables first.\n\n**The 5 rules that matter most here:** (1) one scene, one main action, one camera move; (2) anchors repeated word for word in every prompt (Reference E); (3) no generated text or UI, ever; (4) style from the brief, phone-real for UGC, no \"stunning 8K\" adjectives; (5) plan the end frame of every clip.\n\nFull prompt craft (nine blocks, video formula, camera, light, materials, physics, phrase bank, worked example, checklist): Reference F.\n\n## Common mistakes (this skill)\n| Mistake | Prevention |\n|---|---|\n| Image connected as first/last frame on Seedance 2.5 (error) | Seedance 2.5 = references only |\n| Character's face changes between scenes | Character image first, passed as reference to every scene; same model for all clips |\n| UI on the phone garbled or invented | Real screenshots only; phone image + UI insert (Reference D) |\n| Clips come out 720p | Set 1080p explicitly on Seedance |\n| Music fades out early / has vocals under the voice | Generate ~5 s longer, instrumental, trim in Video Editor |\n| Voiceover runs over the video | Words for (video − 1 s) at a calm pace; shorten text or faster voice, never regenerate video |\n| Artist name in the music brief (error) | Describe genre, tempo, mood |\n| Sound turned off at generation | Keep sound on; mute in Video Editor |\n| Kling or Veo offered for UGC | Seedance 2.5 always for UGC |\n| Claims a text brief/script node keeps the character consistent | Text nodes are notes; consistency = character image as reference + anchors |\n| Clip comes with its own music next to the generated track | Sound line in every clip prompt: ambience only, no music |\n| Whole graph in one Section, uploads at the end | One Section per stage, left to right, uploads next to the node they feed |\n| Clips out of order in the Video Editor | Connect in playback order; after results check and set `startMs` |\n| Price guessed | Read the price on the nodes; per option |\n| Too many references \"because the model allows it\" | Small, purposeful set; video/audio refs only on request |\n| A 1-minute clip promised | Hard limit; two halves or split, joined in Video Editor |\n| Same prompt rerun after a failure | Change the prompt, reference or model; after two fails rewrite the scene |\n\n## Quality gates\nClaude can't see the results, so after each stage it sends the stage checklist and asks the user what they like and what they don't (Reference H has the full slop list):\n- **Stage 1 (images):** same person in every keyframe · hands and phone natural · screen exactly like the screenshot · style right (phone-real for UGC) · nothing plastic or over-glossy.\n- **Stage 2 (clips):** face and outfit stable within and across clips · no morphing, flicker, warped hands · natural motion · UI correct while tapping · ends on the planned frame.\n- **Stage 3 (final):** hook in 1.5–3 s · scenes in order, CTA at the end · voiceover not rushed, ends before the video, app name pronounced right · music instrumental under speech, trimmed with a fade · 9:16, 1080p, planned length · text inside the safe zone.\nPass = the user is happy with every point that applies. Fix only what fails, within the agreed budget, with its credits.\n\n---\n\n# Reference library\n\n## A. Models, prices and settings\n\nAlways call `list_node_configs` first: it is the live source of models, durations, resolutions and limits.\n\n**How to offer a model.** Recommend **Seedance 2.5** (real people) or **Seedance 2.0** (illustration, stylized, UI/UX). Say plainly: \"This is the more expensive option, but it gives the best quality for this video.\" Give the price per node and per run option (step 6). Always ask which model the user prefers before building (in the plan, step 2–3). Seedance 2.5 and 2.0 always come before any Kling. **UGC and real people talking: always Seedance 2.5, never Kling or Veo**; if the user wants cheaper, say the quality on faces and speech will drop and let them decide.\n\n**Cheaper ladder** (one step at a time, show the new price, skip models bad at the task): Seedance 2.5 / 2.0 → Veo 3.1 (only clips ≤8 s) → Kling 4.0 (only once it is in Lyra's list) → Kling 3.0 Pro → Kling 3.0 Standard → Veo 3.1 Fast → Seedance 1.5 Pro (short lip-sync only) → Seedance 2.0 Fast → Kling 2.6 → Kling 2.5 Turbo Pro → Veo 3.1 Lite / Seedance 2.0 Mini. Drafts first, final later: test ideas on a draft model, rerun only the winner on the recommended one.\n\n**Task → model:** real people, UGC → Seedance 2.5 · illustration, cartoon, UI/UX, moving text → Seedance 2.0 · product / nature realism, ≤8 s → Veo 3.1 · exact first + last frame, complex multi-shot → Kling 3.0 Pro · motion transfer → Kling 3.0 Motion Control Pro (Standard cheaper) · same character with video and voice refs → Kling Video 3.0 Omni · short lip-sync with synced audio → Seedance 1.5 Pro · campaign character consistency → Runway Gen-4.5 · strong physics → Sora 2 Pro (Sora 2 for drafts) · edit an existing video by chat → Gemini Omni · talking head (face + audio) → veed/fabric-1.0 (720p).\n\n**Model cards (Lyra, Oct 2026)**\n- **Seedance 2.5** (flagship, real people): 4–30 s or `adaptive` (fits length to the dialogue/script); the only Lyra model up to 30 s. **References only: never first/last frame (the fields exist but error out).** Technical max 30 images / 10 videos / 10 audio, never pushed (see reference policy). Refs are named [Image1], [Image2]… in the prompt. Default 720p → set 1080p. Angle and details can shift.\n- **Seedance 2.0** (illustration, UI/UX): 4–15 s, `-1` = intelligent duration. Image as **frame** (start/end; picture kept exactly) or **reference** (looser), never both in one node. Rule: image with UI or any text → frame; no text and exactness not important → reference; unsure → ask. Technical max (per list_node_configs) 9 image / 3 video / 3 audio refs, never pushed. Default 720p → set 1080p. Fast and Mini: cheaper, max 720p, drafts.\n- **Veo 3.1:** 4/6/8 s (max 8), references (≤3) like the others, 9:16 default. Best realism, product, nature. Used rarely, only very short clips. Fast / Lite: cheaper, frames only.\n- **Kling 3.0 Pro / Standard:** 3–15 s, first frame and/or last frame only, no references. Multi-shot, complex scenes, cartoon/stylized; weaker than Seedance on faces and human motion; cheaper than Seedance.\n- **Kling 3.0 Motion Control Pro / Standard:** image + reference video 3–30 s (`character_orientation: video` up to 30 s, `image` up to 10 s). References with clear hands, head and body; avoid complex angles and blocked limbs.\n- **Kling Video 3.0 Omni:** up to 7 reference images (4 with a video ref), first/last frame, 3–15 s; native audio can't be combined with a reference video.\n- **Kling 2.6:** 5/10 s, first frame, native audio. **Kling 2.5 Turbo Pro:** 5/10 s, fast, cheap, no audio. **Seedance 1.5 Pro:** 5/10 s, lip-sync, dialogue.\n- **Sora 2 / 2 Pro:** 4/8/12 s, first frame only. **Runway Gen-4.5:** 5/10 s, first frame.\n- **Kling 4.0** (launched 16 Oct 2026): 3–30 s, up to 10 keyframes, stereo audio, cheaper than Seedance. Not in Lyra yet; offer only when list_node_configs shows it, and never ahead of Seedance for people.\n- **Images:** Nano Banana Pro for finals (text, UI, people, realism, sharp), Nano Banana 2 for drafts.\n\n**Settings in the Video Generation node:** model → seconds (or adaptive) → aspect ratio 9:16 (confirm) → quality 1080p (tell the user it keeps details and faces best; they may choose otherwise) → sound **on** → how images connect (frame or reference, by model).\n\n**Reference policy.** Limits are a technical maximum, not a target: many extras make the model unpredictable. Never tell the user how many references a model takes or suggest adding many. Default references = the images you generated (character, keyframe, product, UI). Write the montage yourself in the script; a video reference only when the user asks or the brief requires copying an edit (it works only as an editing reference). An audio reference only when the user brings a track (the video is fitted to it).\n\n**Longer than a model allows (e.g. 1 minute).** Say honestly no model makes it in one clip (30 s Seedance 2.5, 15 s others, 8 s Veo). Offer: (A) two 30 s videos from the same idea and image, joined in the Video Editor; or (B) the full 60 s script split into two 30 s parts (check each part's length), the same reference(s) or a few style references for both, two videos in one style, joined in the Video Editor. Same model, character, style anchor, voice and music in both halves. Always tell the user first that this is possible and how.\n\n**Price.** Lyra shows an estimated credit cost per node (number with the coin icon next to Run). Read it for every node that will run and warn the user before running, per node and per option. Never guess. After a run, report what it cost (credits before − after, `list_workspaces`).\n\n**Text nodes.** Claude writes brief, script, voiceover script and music brief itself into user text nodes (the AI text nodes can't be created with the tools). Exception: **Creative Analysis** (`pattern_import`): when the user brings a reference video and the node is available, use Upload Video → Creative Analysis and write the script from its output.\n\n**Video Editor** = the `video_composer` node (no credits). Connect clips, voiceover, music and images in playback order at build time (it lays clips out in connection order; to reorder, disconnect and reconnect). After the clips have results, read the composition with get_workflow and check the order; if it's wrong, set each clip's `startMs` with update_node. Pick a transition, run. Its edit lives in `video_rendering_composition` (get_workflow / update_node): `canvas` (fps, width, height, durationMs) and `tracks` (video / audio layers; clips with `startMs`, `durationMs`, `trim.sourceStartMs/sourceEndMs`, `volume`, `position`; track `volume`, `muted`). Trims, music volume under the voice (e.g. 0.25), muting a clip's own sound and overlay layers (a UI insert above the main video) are set there. Read the existing composition first and change only what's needed; captions are added in the editor UI.\n\n## B. Brief, script and scenes\n\n**Brief header:** app · platform · aspect ratio · length · language · voiceover · music · audience (Brand Kit).\n**Hypothesis:** \"We believe [audience] will [action] because [concept] addresses [pain] through [mechanism]\" (a whole concept, not one variable).\n**Then:** angle (≤100 chars) · summary (≤200) · hook mechanism · hook line (≤80; on-screen version ≤40) · value proposition (≤150) · proof point (Brand Kit or user only) · tone · offer · CTA (≤30) · format · image style · palette · must include / exclude · reference notes.\n**Competitor references:** keep the idea (concept, structure, hook, format); never their logo, colors, visuals or text.\n**Claims:** never invented, pricing included: no price, discount or offer that isn't listed in the Brand Kit or given by the user. AI people are never presented as real customers; testimonials only from real reviews. No body before/after for health or weight-loss apps. **Brand safety** (Lyra's System Preamble): nothing that could damage the advertiser's reputation; no profanity, no political statements, no unsubstantiated health claims, no competitor disparagement. The Brand Kit's **forbidden claims are enforced absolutely**: never in a line, a caption, a visual or the VO; if the user asks for one, say once that it is on the kit's forbidden list and leave it out unless the user confirms the kit is outdated.\n\n**Structures:** problem → agitate → demo → CTA (default) · hook → solution → social proof → CTA · POV / relatable moment → app as the fix → CTA · before/after of the situation · single continuous shot. Scene types: hook, problem, solution, social proof, offer, cta, logo end card. Brand only at the end.\n\n**Scene fields:** number + type · duration · visual direction (like an image brief: subject, setting, framing, angle, light, palette, mood, style, texture; no text; style per brief) · motion (one main action) · VO line · on-screen text ≤40 chars with position and animation, **marked for post** · music/SFX cue · transition · consistency (source scene, must match, allowed to change) · asset (screenshot, logo) · generation note · end state. Mark the hook scenes; give them the most detail.\n\n**Timing:** scene durations add up exactly to the total. A beat on screen is 1.5–5 s; a clip is generated at a length the model allows and trimmed in the Video Editor. UI clips ~4 s. Hook within ~1.5 s (Reels/TikTok) to 3 s (Feed). 5 s clip beats: 0–1 establish · 1–3 action · 3–4 peak · 4–5 resolve.\n\n**Montage:** written by Claude in the script (shots, order, length, cuts). Default: the shots live inside one clip with explicit \"cut to\" markers. Separate clips joined in the Video Editor only for the reasons in Step 2 (over 30 s, UI insert, different models or frames, a failed shot, the user asks).\n\n**Keyframe:** the frame that starts the scene (start of the motion when used as first frame; the peak goes in as last frame on frame models). Generated at the video's ratio.\n\n## C. Audio: voiceover and music\n\n**Voiceover.** Write it yourself (from the script and Brand Kit) into a \"VO script\" text node, then an audio voiceover node (`elevenlabs/v3`, voice from `list_voices`).\n- Exact spoken words only: no scene labels, timestamps, \"Hook:\", \"VO:\", \"[pause]\", \"(upbeat)\", brackets, asterisks, slashes, markdown, separator dashes. Allowed: comma, period, ellipsis, ?, !. Pause = comma or ellipsis.\n- One continuous text joining the per-scene lines; rhythm shows the pace; the words carry the tone (never describe it).\n- No invented claims. The user's direction wins (tone, length, focus, language, style).\n- **Pace (English):** 2.5 words/s conversational (default), 3.0 fast/energetic, 2.0 slow/emotional.\n- **Always ~1 s shorter than the video** (15 s video → 14 s VO ≈ 35 words, calm, not rushed). Check the real audio length after generating. Too long → cut words or a faster voice; never regenerate the video for the voiceover.\n- **Voice:** filter by language, accent, gender, age, use case; pick by the voice description to fit the audience and tone; play a sample; reuse the same saved voice across a campaign.\n- **Languages:** same script, new VO script \"Speak in <language>\" + its own voiceover node with a voice in that language; run in parallel; match each in the Video Editor; check each language's length (translations run longer).\n\n**Music.** Write the music brief from the script's mood; music node `elevenlabs/music` by default (Lyria 3 / Lyria 3 Pro if asked).\n- Prompt: genre, era, BPM, key/mood shift, instruments, sync points (hit on the hook, lift on the reveal, resolve on the CTA), hook in the first 2 s, fade-out. Example: \"Dark-to-hopeful cinematic electronic underscore, 110 BPM, D minor shifting to F major at the CTA; pulsing synth bass, metallic percussion, risers and impacts on the press, resolving into clean uplifting synth chords. Instrumental only, polished modern mix, smooth 1 s fade-out.\"\n- **Anyone speaks in the video → instrumental only, no vocals, no singing, no humming.** Keep `force_instrumental` on.\n- **Length = video + ~5 s** (10 s video → 15 s track, `music_length_ms`), trimmed in the Video Editor, because the fade starts early.\n- **No artist names** (they can error). Check the script too.\n\n**Clip sound:** sound stays on at generation, but say in every clip prompt what it should be. With separate music: \"only natural ambience and action sounds, no music, no soundtrack, no score\". With a separate voiceover and nobody speaking on camera: also \"no speech\". Otherwise the model adds its own music and the clip audio can't be used next to the track.\n\n**Mix in the Video Editor:** voice is the main sound; music clearly under it; trim music to the video and fade on the last frame; mute or lower clip sound that clashes (sound stays on at generation).\n\n## D. App UI in the video\n\n- Use as little UI in video as possible; **never invent UI**. Seedance 2.5 / 2.0 often break UI in long busy clips.\n- If the screen is needed, ask: \"Please send screenshots of the app screens you want in the ad.\" Screenshots only, never a screen recording. No screenshots → screen dark, blurred or turned away.\n- **Phone image:** a second image node: \"the same character holds the phone close to camera, screen facing us\"; connect the main character image and the user's screenshot. Run it, then ask the user: \"Is the UI exactly like your screenshot (layout, text, colors, logo)? Same person, hands and light?\" Rerun the image before any video if not.\n- **Way 1, one clip** (about 10 s, max 15 s): connect the character image and the phone image to the video node (Seedance 2.5 as references; Seedance 2.0 as frames, because there is text; Kling as first/last frame).\n- **Way 2, UI insert:** if the UI came out bad but the rest is fine, make a short clip from the phone image (screen + finger tapping or scrolling, a few seconds) and lay it over the broken part in the Video Editor (layer above, trimmed to the moment). Plan Way 2 from the start when the UI moment is long or important.\n- Show one key screen or \"aha moment\", not a full walkthrough. Ask after every UI result; fix only the broken part.\n\n## E. Consistency between scenes\n\n- **Anchors** defined once and repeated word for word in every prompt: character (age, face, hair, skin, outfit, accessories), environment (place, time of day, light direction and color), style (palette from the Brand Kit, grading, look, lens), product/phone (device, case, screen from the screenshot).\n- Per scene: **source scene** (earliest that set the element) · **must match** · **allowed to change**.\n- One image model for all keyframes, **one video model for the whole ad**, one ratio and resolution.\n- **Character first, connected everywhere:** the character image is generated in stage 1 and **connected at build time as a reference to every image and video node that shows the person**, so the graph stays consistent even with \"run all\". If the user wants to choose between several characters, they run stage 1 alone and select one; the connections are already there. A text brief alone never makes images consistent. Two characters for A/B: one script, two character images, two videos.\n- **By model:** Seedance 2.5 references (roles per [ImageN]); Seedance 2.0 frame for exactness / UI, reference for looser; Kling first/last frame; Omni references + video ref.\n- Frames pin to the **selected** result; reconnect after regenerating a keyframe.\n- **Hand-off:** write each clip's end state; the next scene starts from it; keep motion direction across cuts; match cuts, whip pans and cuts on action hide small differences.\n- **When it breaks:** strengthen the reference and move the anchor earlier, shorten the prompt, reduce motion; a reference leaking light or framing → state its job or drop it; two failed tries → simplify the scene in the script.\n\n## F. Prompt craft\n\n**Image, nine blocks:** concept (2–3 words) → main subject and what it does → context → lighting → color and technique (palette, lens) → mood → composition (front, back, sides) → style (if you name a director, also describe the look) → visible details.\n\n**Video formula:** SUBJECT → ACTION → CAMERA → ENVIRONMENT → LIGHT → MATERIALS → PACE → EMOTION → ENDING → CONSTRAINTS. A framework, not a template; one coherent direction, not a stack of tags.\n- **Action:** one clear change of state + a few natural secondary moves. Weak: \"a woman with a phone\". Strong: \"she glances at the notification, her eyebrows lift, and a small smile spreads as she turns the phone toward the camera.\"\n- **Camera:** a move for a reason: static (control), slow push-in (intimacy), pull-out (scale), tracking (follow), orbit, pan, tilt, crane, handheld (UGC presence), whip pan (energy), rack focus. Subject motion and camera motion stated separately.\n- **Framing:** eye level (natural), low (power), high (distance), overhead (geometry), three-quarter (volume), profile (silhouette); shot size; subject placement in the central 65% of 9:16.\n- **Light:** one main approach + 1–2 supporting (soft diffused, hard directional, Rembrandt, backlight, rim, golden hour, blue hour, volumetric).\n- **Palette:** one dominant, from the Brand Kit, kept across scenes; shift only if the shift is the story.\n- **Materials:** how they react to light and motion (glass reflections stay coherent; heavy fabric doesn't float).\n- **Physics:** cause and result (fabric settles, hair follows the head, a thumb really presses the screen).\n- **Pace:** slow deliberate, fluid, sharp, energetic, weightless; matched to the scene.\n- **Lens and focus:** 24mm wide, 35mm environmental, 50mm natural, 85mm tight, macro; say what is sharp at each key moment. Guidance, not guarantees.\n- **Finish:** clean digital (precise detail, natural skin) or analog (fine grain, halation); UGC = phone camera, natural light, slight handheld.\n- **Ending:** plan the final frame (eye contact, product centered, phone to camera, brief hold).\n- **Image-to-video:** bring the image to life, don't replace it; preserve composition, face, outfit, light; limited movement (blink, breath, gaze, small head turn, restrained push-in); \"no new objects, no scene transition, no wardrobe changes\".\n- **Rules:** one scene one idea · action beats adjectives · camera move needs a reason · complexity fits duration · light interacts with materials · no conflicting styles · constraints short and prioritized · clarity beats length · plan the final frame · consistency before spectacle when identity, product or UI matter.\n- **Phrase bank:** smooth: \"fluid motion, slow deliberate movement, graceful follow-through\" · identity: \"preserved facial features, consistent wardrobe, stable character appearance\" · realism: \"natural inertia, believable body mechanics\" · product: \"precision product cinematography, controlled reflections, macro detail\" · light: \"soft directional lighting, subtle rim light\" · UGC: \"shot on phone front camera, natural window light, slight handheld wobble, casual, unpolished\" · ending: \"controlled final pose, brief visual hold\".\n- **Pre-generation check:** subject clear · identity preserved where needed · main action explicit · camera defined · composition and location fit · light and palette coherent · hands, hair, objects plausible · pace fits duration · final frame intentional · key unwanted changes constrained · settings match the model · nothing contradictory.\n\n## G. Errors\n\n| Problem | Fix |\n|---|---|\n| Seedance 2.5 errors with an image | It was a frame → reconnect as reference |\n| Seedance rejects inputs | Frames and references mixed → pick one |\n| Video ignores the script or image | Connect both to the video node |\n| Video stays on the old image | Keyframe regenerated → reconnect it |\n| Duration rejected | Use a listed value (model first, then seconds) |\n| Clip is 720p | Set 1080p; Seedance 2.0 Fast/Mini can't do 1080p |\n| Music node error | Artist name → describe genre, tempo, mood |\n| Vocals under the voice | Instrumental only, force_instrumental on |\n| Music fades early | Generate ~5 s longer, trim |\n| Voiceover too long | Shorten to (video − 1 s) or faster voice |\n| Clip audio clashes | Mute/lower in Video Editor |\n| Clips in wrong order | Disconnect and reconnect in playback order |\n| UI garbled | Phone image + UI insert (D) |\n| Face drifts | E → \"When it breaks\" |\n| Text appears in video | Remove it from the prompt; text goes on in the Video Editor |\n| Longer than the model allows | Two halves or split script (A) |\n| Kling 4.0 asked for | Not in Lyra yet; offer Seedance 2.5 |\n| Two failed tries | Rewrite the scene in the script; if the image confuses the model, use it as a reference instead of a frame (where allowed); never rerun unchanged |\n\n## H. De-slop\n\n**Prevent:** style from the brief (UGC phone-real, not \"premium cinematic\") · real skin (\"natural skin texture, visible pores\"), never \"flawless\" · lived-in places with 2–3 specific details · no \"stunning, 8K, masterpiece, hyper-realistic\" · simple hand actions, one object in hand, hands visibly touching · faces frontal or three-quarter, one person in focus · one action, one camera move, physical cause and result · no generated text, UI or logos · a short constraints line. Images: \"text overlays, captions, watermark, blurry, low quality, distorted faces, extra limbs\". Video: \"text generation, on-screen captions, morphing faces, identity drift, outfit change, flickering, jitter, warped hands, unstable geometry, sudden camera jumps\" + 1–3 scene risks. If the model has no negative field, put a short \"Avoid …\" line at the end of the prompt.\n\n**Slop signs:** faces (plastic skin, identity change, morphing, dead eyes) · hands (extra or merged fingers, passing through objects, floating phone) · motion (rubber limbs, sliding feet, floaty movement, jitter) · text/UI (garbled letters, invented or changing screens, warped logo) · scene (flicker, objects popping, melting background, warped lines) · look (over-glossy, over-saturated, stock vibe, wrong style) · audio (robotic or rushed voice, wrong app name, VO over the video, vocals under speech, abrupt music end) · edit (mismatched cuts, wrong order, CTA cut off, text outside the safe zone).\n\n## I. Brand Kit\n\nEvery brief, script, prompt, voice and music direction is built on the Brand Kit: audience first, then product, value, tone, colors, claims, forbidden claims (enforced absolutely), must include / exclude. Source order: the chat → the kit connected to the workspace / workflow → ask (send it, or check and connect one of the workspace's kits). The user's chat request always wins; the kit fills everything they didn't say; mention a conflict in one line.\n\n## J. App ads on Meta (what works)\n\n- Vertical 9:16 video first (Reels and Stories carry most app-install volume); 15–30 s; a hook that shows the app working, not a logo.\n- 3–5 hook variants per concept; test one variable at a time; 2–3 new concepts a month (creatives fatigue in days to weeks); Advantage+ app campaigns need several different concepts.\n- Formats that convert: UGC style (phone-shot, person to camera) beats polished brand video on cold traffic · problem → agitate → demo → CTA ending on the key screen · real people using the app · one simple key screen, not a walkthrough · before/after of the situation · specific, plausible social proof from the Brand Kit.\n- Hook in ~1.5 s (Reels/TikTok), by 3 s (Feed); no dead air; no logo intro. Hook rate (3-s views ÷ impressions) >30% good, <20% weak.\n- Length: Reels 6–30 s (15–20 s safe), Stories 6–15 s, Feed 15–30 s (4:5 or 1:1 as a later variant).\n- Sound off: most viewers watch muted → captions for all speech, key message also on screen, same words as the VO; large, high-contrast, one consistent place; added in the Video Editor.\n- Safe zone: subject and text in the central 65% of 9:16, away from the top bar and the bottom caption/CTA area.\n- CTA: a concrete offer (\"Try free for 7 days\") beats \"Download now\"; in VO and on screen in the last 2–3 s.\n- Judge creatives by trials, payers and day-7 retention, not only cost per install; give a test 2–3 weeks.\n"
AFTER
"---\nname: lyra-video-ad-generation\ndescription: \"Base skill for video ads in Lyra. Builds a mobile app video ad end to end (brief, script, scenes, keyframes, clips, voiceover, music, Video Editor assembly) with scene consistency, de-slop and error handling. Use for \\\"a 15-second video ad for my app\\\", \\\"a 30 s / 1 min ad\\\", \\\"a sequence of scenes\\\", \\\"stitch these clips\\\", or a script or storyboard to produce. Holds the core video rules the smaller lyra video skills point to.\"\n---\n\n# lyra-video-ad-generation\n\nThe main video skill for Lyra. It holds the core rules for every video ad: script, scenes, music, voiceover, consistency between scenes, de-slop and error handling. Smaller video skills (UGC, hooks, templates) point here for these rules.\n\nPart 1 is shared by every Lyra skill. Part 2 is what's specific to video ads. The Reference library at the end has the details (models, prompts, audio, UI, consistency, de-slop, errors, Meta app ads).\n\n**Canvas layout → `lyra-workflow-layout`.** Every workflow this skill builds or changes is laid out by `lyra-workflow-layout`: sections in reading order with a STEP note above each one, the team's color code, clear node labels and the final check. The layout lines in this file only say which sections this creative needs.\n\n**Assembly and captions → `lyra-video-editor`.** Stage 3 of every video (the Video Editor: edit, mix, end card, text, captions, render, cutdowns) follows `lyra-video-editor`. This file only says which pieces go into the edit.\n\n---\n\n# Part 1. [SHARED] How every Lyra skill works\n\n**Deliverable:** a Lyra workflow in which every planned node has been generated. The user opens the canvas and finds the results, the prompts that produced them, and a graph they can edit and rerun for the next app, angle or market.\n\nA full creative always follows these steps, in order:\n1. **Context.** Read the Brand Kit, then send the intake quiz (Step 1) so the user takes part in the key choices; make sure you have everything before proposing anything.\n2. **Concept and plan.** A very short concept plus a short plan of nodes, models and connections, based on \"Best way to build it\".\n3. **Approval.** One message: concept, plan, open questions and the cost in credits; the user approves or corrects. Nothing is created before this; the yes also starts the run.\n4. **Build.** Create the workflow and nodes with the chosen models, write every prompt into the node's prompt field. Nothing runs yet.\n5. **Pre-run check.** Right before every run, read the workflow back and restore anything lost (connections, settings); keep the user's own edits.\n6. **Credits and run.** The cost is part of the plan; after the one yes, build and run everything without asking again.\n7. **Run and report.** Run, report with the right links (workflow, video or image) and the real spend, offer the next step.\n8. **Verify quality.** Check with the user against the quality gates.\n\n## Whose instructions win\n1. The user's explicit instructions in this chat.\n2. This skill's best practices and defaults.\n3. The brand kit: real app facts, claims, value proposition, features, audience.\n\nBest practices are defaults, not rules for the user. When a user's choice will likely hurt the result, follow it and say once in the plan what you'd do instead and why; don't argue twice. When a choice breaks a hard limit (a 60 s clip from a model capped at 30 s), explain and offer the closest build that works.\n\n## Step 1. Context\n\n**App.** Every concept starts from the app. Generic ads come from missing product context, so never fill gaps from imagination.\n1. Brand kit given in the chat → use it. Otherwise `list_brand_kits`: one kit → \"Make this for {kit name}?\"; several → ask which. The user may add or override details in chat.\n2. No kit → ask once: send it here, or should I check / connect one of the kits already in your workspace? If the user prefers to type it: app name, what it does, who it's for, the pain it solves, 2–3 features the ad may show, approved claims and offer, forbidden claims, tone, assets (logo, **screenshots only**; never ask for a screen recording).\n3. Keep the result as an **app card** for the whole session:\n   > App card: Calmly · 5-minute wind-down sessions for sleep · for students 18–25 · pain: can't switch off at night · may show: wind-down timer, sleep sounds · claims: none approved · tone: calm, a bit ironic · assets: logo, 3 screenshots · source: brand kit\n\n**Intake quiz: involve the user before deciding.** When the user gives a task for a video (a brief, a TZ, \"make a 15 s ad for my app\"), don't decide everything yourself. After reading the Brand Kit, send **one short quiz** with every open question at once, so the user takes part in the key choices and understands what will be made and why. Lyra's own nodes never ask; this skill does, once, here.\n- **Format:** multiple choice. Use the client's question tool (a multiple-choice question card) if there is one; otherwise a numbered list, each question with 2–4 short options (a, b, c), the recommended option first and marked \"(recommended)\", plus \"your own answer\". The user can reply \"1a 2c 3b\".\n- **Size:** 4–8 questions, only the ones that matter for this video. Skip anything the task or the Brand Kit already answers; say in one line what you took from them (\"From the Brand Kit: audience 25–40, offer 7 days free\").\n- **Options come from the Brand Kit**, not generic: real pains, real personas, real features, the real offer.\n- **Question bank** (pick the relevant ones, in this order):\n  1. **Idea:** 2–3 short concept options built on different pains or angles (one line each, the hook in quotes) + \"my own idea\".\n  2. **Format:** person talking to camera (UGC) · a short story with scenes · animated / 3D · app screens in motion · POV.\n  3. **Who is on screen:** 2–3 personas from the audience (age, vibe, place) · no person.\n  4. **Length and placement:** 10 s · 15 s (recommended for Reels / TikTok) · 30 s · 60 s.\n  5. **Voice:** the person speaks on camera · voiceover · music and text only; language.\n  6. **Music:** 2–3 moods that fit the idea · no music.\n  7. **App on screen:** show real screens (then ask for screenshots) · no UI.\n  8. **CTA / offer:** the Brand Kit's offer · a plain \"Download\" · other.\n  9. **Captions:** yes (recommended when someone speaks) · no.\n  10. **Model and quality:** Seedance 2.5, 720p (recommended, ≈ X credits) · 1080p (sharper faces and details, ≈ 2.4× the price) · a cheaper model.\n- **Skip the quiz** only when the user says \"just do it\", \"surprise me\", or the task already answers everything: then state the choices in the plan in one line each.\n- After the answers, Step 2 explains the plan in plain words (below).\n\n**Task.** The intake quiz covers the inputs in Part 2 → Inputs and defaults; the defaults are its recommended options. Everything in one message; never re-ask what the user said. Call `list_workspaces` (credits) and `list_node_configs` (models) now.\n\n## Step 2. Concept and plan\n\nShort: readable in under a minute.\n\n**Concept:** 2–4 lines per deliverable (Part 2 → Concept). N deliverables = N distinct ideas; more takes of one idea is `count` on a node, not more nodes.\n\n**Explain it in plain words** before the node table, so a user who has never built a workflow understands what will happen: what the video will show, second by second (hook → middle → CTA) · what Claude will generate and in what order (e.g. \"first the character photo, then the phone shot with your screen, then one 15 s clip, then voice and music, then the edit\") · why this way (one line: e.g. \"one clip keeps the person identical in every shot\") · what the user gets at the end and what they can change on the canvas. Short and friendly, no node jargon; the node table follows for those who want it.\n\n**Plan:** name the matching row of Part 2 → Best way to build it in one line, then list the nodes:\n\n| # | Node label | Node · model · key settings | Inputs (role) | Stage |\n|---|---|---|---|---|\n| 1 | Script (note for the user) | user text | — | — |\n| 2 | Character: Mia | image · google/nano-banana-pro · 9:16 · count 1 | — | 1 |\n| 3 | Screenshot: timer | upload image | — | 1 |\n| 4 | Phone shot: timer | image · google/nano-banana-pro · 9:16 | 2, 3 (references) | 1 |\n| 5 | VO: full | audio · elevenlabs/v3 · voice | — | 1 |\n| 6 | Music | audio · elevenlabs/music · 20 s · instrumental | — | 1 |\n| 7 | Ad: 15 s, 3 shots | video · bytedance/seedance-2.5 · 15 s · 720p · 9:16 · audio on (ambience only) | 2, 4 (references) | 2 |\n| 8 | Video Editor | video_composer | 7, 5, 6 | 3 |\n\n**One clip by default.** A Seedance 2.5 clip holds up to 30 s and several shots (\"cut to\"), so one clip with the character and UI as references is the default. Split into separate clips only when: the ad is longer than 30 s · a UI moment needs its own insert (Reference D) · scenes need different models or exact frames · one shot failed and must be replaced · the user asks. Say in one line of the plan why you split or don't.\n\nStages: **1** = sources (images, voiceover, music; fast and cheap) · **2** = built on finished images (video, lip-sync) · **3** = assembly (Video Editor / composer).\n\n**Cost:** the plan's total in credits, from Reference A → Credit prices (count and duration included), next to the balance: \"≈ 500 credits · balance 47 424\".\n\n## Step 3. Approval\n**One message, one question.** Everything the user has to decide goes into one message: the concept, the plan with models and quality, any question you still have, and the **cost in credits** with the balance (Step 6). It ends with one question that covers all of it, e.g. \"Does the concept, Seedance 2.5 in 720p and ≈ 500 credits (of your 47 424) work for you? After your yes I build the workflow and run everything.\" (Answers already given in the intake quiz, captions included, are not asked again; if the quiz was skipped, videos with speech include the captions question, `lyra-video-editor` → Captions.) Never a separate question about money or about running.\n\nOn corrections, show only what changed, with the new cost, and ask again. Don't create anything in Lyra before a clear yes. This yes also starts the run: after it, build and run everything without asking again (Step 6).\n\n## Step 4. Build the workflow\n1. `create_workflow` (or `use_template`, or the user's own workflow, or a variation of an existing one: Variations below), then `assign_brand_kit`.\n2. Write every prompt (Part 2 → Prompt rules): brief, script, image and video prompts, voiceover text, music prompt. The script can go into a user text node (`create_user_text_node`) as a note for the user, connected to nothing. A user text node feeds its text into any node it is connected to, so keep this one unconnected (a Note on the canvas can't be connected at all, but the tools can't create one). The text doesn't keep the character consistent: consistency comes only from the character image connected as a reference, plus the anchors written into every prompt.\n3. Create every node from the plan with its prompt, its model and settings from `list_node_configs`, and a label that says what it's for (\"Scene 2: app demo\", \"VO: hook\"), never \"Image 1\".\n4. **Connect the whole graph now** (`connect_nodes`), so the workflow can run on its own with \"run all\": character → every image and video node that shows the person (reference) · screenshot upload → the phone image · images → video · clips, voiceover, music → Video Editor **in playback order**. Never leave connections \"for after the user approves an image\". **References** connect before anything is generated (checked in Lyra). **First / last frame** from a generated image needs that image to have a result first (an uploaded image can be a frame right away): on frame models, say in the plan that the frame link is made right after the image runs, and make it automatically before running the clip.\n5. Lay out the canvas by `lyra-workflow-layout` (STEP notes, sections in reading order, colors, check), one section per stage: **Sources** (script note, character, screenshot uploads) → **Images** → **Clips** → **Audio** → **Video Editor**. Put an upload next to the node it feeds, never at the end of the canvas. Don't put the whole graph in one Section.\n6. Check `is_valid` and `validation_error` on every node; fix with `update_node` using listed values.\n\n## Variations, not new workflows\nA new version of something that already lives in a workflow goes into a **variation of that workflow** (Lyra's **Create variation**), never into a new workflow, unless the user asks for a new one.\n- **When:** a new version of a video (another story with the same characters, another angle, hook, person, setting, length or language, a remake of a failed take), more room for another round, splitting the work, or the user asks for several variations.\n- **How:** `create_variation` (it copies the whole canvas: nodes, connections and results) with a clear title (\"D2 · Dan's turn\") → `switch_variation` to it (the tools and runs work on the main variation; Lyra also renames the workflow after it) → `delete_node` the nodes this version doesn't need → update the prompts and add the new nodes → connect → pre-run check → run. Nodes kept as they are keep their results and cost nothing (characters, places, the end card clip). The variation keeps the canvas layout: update the section titles and labels that name what changed (`lyra-workflow-layout`).\n- **Check the Video Editor right after `create_variation`:** in a new variation the edit can come out empty or pointing to old results (opening the editor there deletes the tracks), and pinned first / last frame results can be cleared. Read the composition and the frame pins, and rebuild them by `lyra-video-editor` before any render.\n- Deleting inside a variation you just made for this version is part of the build and needs no extra ask. Never delete in the original variation or in one the user made.\n- **Report:** the workflow link, the name of the variation with the new version, and that the original is untouched in its own variation (to show it again: `switch_variation`, which renames the workflow back).\n- **Images:** new statics, sizes or languages can stay in the same variation as new nodes, one Section per set, unless the user asks for a separate workflow or the canvas gets crowded; then a variation, as for video.\n- **Open canvas:** before editing an existing workflow through the tools, ask the user to close its tab or switch away (an open canvas can write its old state over the tool edits), and tell them when it's safe to open it again.\n\n## Step 5. Pre-run check\nRight before **every** `run_node` (the first run, each next stage, reruns, follow-ups). The canvas changes between build and run: the user edits it, and an edit on the canvas can drop or overwrite connections. A run with a missing input spends credits for nothing, so never trust what you built a few minutes ago.\n1. `get_workflow` now, not from memory.\n2. Compare it with the plan: every planned edge (source → target) is there · every node that takes images has them as planned (`image_inputs_usage`: references or frames; a frame points to an existing result) · every node `is_valid`, no `validation_error` · no empty prompt · settings as planned (model, ratio, duration, resolution, count).\n3. Lost or changed by accident → restore it (`connect_nodes`, `update_node`) and say it in one line (\"the link Character → Clip 1 was gone, reconnected\"). Changed by the user on purpose (their prompt, model, a node they added) → keep it and use the workflow as it is now; never overwrite their edits. Not sure which → ask before running.\n4. Inputs ready: a node runs only when every node it takes from has a result. Never run a node with a missing input.\n\nAfter the build, tell the user once that the workflow is built and running and that they can edit any prompt on the canvas and rerun.\n\n## Step 6. Credits and run\n**Where the prices are.** `get_workflow` returns `credits` on every node: the estimated credits of one run of it (null = free: uploads, Video Editor, notes, user text; a Section shows the sum of its nodes; null on a paid node means a setting is missing, e.g. no resolution on Nano Banana 2: set it). Before the build, estimate with Reference A → Credit prices; after the build, read the real numbers off the nodes.\n\n1. **In the plan (Steps 2–3):** the estimated total and the balance (`list_workspaces`), inside the one approval message.\n2. **After the build, before running:** add up `credits` of every node that will run. Within ~15% of the approved estimate and within the balance → run everything, stage by stage (sources → images → clips → Video Editor, Step 7), with no question. More than ~15% over, or over the balance → one short message: the new total, why, and a cheaper option (fewer ideas, lower count, 720p, a cheaper model per Reference A); run after the answer.\n3. **Reruns and follow-ups:** give the rerun's credits in the same message as the change (\"Changed the prompt; rerunning Clip 1 and the Video Editor, 428 credits\") and run, unless the user asked to check first.\n4. **After the run:** the real spend (balance before − after) and the new balance.\n5. A source image with count 2 (a character, a persona) feeds the next stage with its selected result; say in the report which one went on and that the user can switch (Step 7).\n6. The smaller skills' **Run options** sections give the run order and what each stage holds: run all of it in that order, without offering the options. A staged run (the look first, then the rest) only when the user asks for it, or when the plan is expensive and the look should be approved first: then say so in the approval message, with each stage's credits, and run the next stage on the user's yes to the look.\n7. No `credits` on the nodes at all (the field is gone): estimate with Reference A, say it's an estimate, and keep the same one-question flow.\n\n## Step 7. Run and report\n1. `run_node` on every node whose inputs are ready stage by stage: sources → images → clips → Video Editor last. Pre-run check (Step 5) before each stage. Keep each `run_uuid` and `variation_uuid`; call `get_run_results`; while `in_progress`, call it again. **Never call run_node on a running node** (second paid run).\n2. **Picking a result.** A node with several results: when the user names one (\"take the second\", \"the first one\"), set it yourself on every node that uses it; don't send the user to tick it in Lyra. On a node with `image_inputs_usage` (video nodes): `update_node` with its whole `image_inputs_usage` from `get_workflow` and one field changed: references → `reference_result_image_uuids: [picked uuid]` (or the other results in `exclude_reference_result_image_uuids`); frames → `first_frame` / `last_frame` = `{\"node_uuid\": source node, \"image_result_uuid\": picked uuid}`. The results' uuids and their order (first, second…) come from `get_run_results` of the source node's run. Then `get_workflow` to check it held, and rerun what comes after it (pre-run check first). Only when the node has no such setting or the tool refuses: ask the user to tick it in Lyra and say why. Without a pick, the next stage uses Lyra's selected result; say which one went on.\n3. Run a stage only after its inputs have results; the Video Editor runs last.\n\n**Links in every report.** Never only file links. Two kinds of link, nothing else:\n- **Workflow:** `https://lyra.splitmetrics.com/workflows/{workflow_uuid}` (opens for anyone signed in to Lyra with access to the workspace; results in a variation: name the variation to open).\n- **Result:** the `url` from `get_run_results`, exactly as returned.\n- one video → the video link + the workflow link\n- several videos → the workflow link only\n- one image → the image link + the workflow link\n- several images → the workflow link only\nA video ad's final is the Video Editor result; clip links only when the user asks.\n\nReport:\n> Calmly · video ad · \"2 am\": done. Video: {video url} · Workflow: https://lyra.splitmetrics.com/workflows/{uuid}. Spent {x} credits · balance {X}. Character: result 1 went into the clip; say \"take the second\" to switch. Open the workflow to edit any prompt and rerun.\n\n- Name failed nodes: label, what it was asked to do, why if known, the fix you suggest.\n- When every node has a result, offer 2–3 next steps (new angle on the same concept, other sizes, other languages).\n- After the final result, run `lyra-result-check` straight away, without asking (free): it opens the result in a browser, checks the frames and measures the sound, and reports the problems with pictures and fixes. Never describe or grade a result you haven't seen; without a browser send the stage checklist (Part 2 → Quality gates) and ask what works and what doesn't. Refer to nodes by label, never by uuid.\n\n## Step 8. Verify output quality\nCheck final assets, not only job status: completeness (outputs, order, scenes, CTA) · message (hook, value, claims, language match the brief) · visuals (continuity, correct UI, no major defects) · audio (words, voice, pronunciation, sync, no clipping) · delivery (duration, 9:16, resolution, final render) · variations (intended differences visible) · reusability (inputs editable). Use Part 2 → Quality gates. Suggest fixes only for identified defects, within authorized scope and cost.\n\n## Follow-ups\n- One change (\"make her older\", \"faster music\"): `update_node` on that node, show the new prompt, pre-run check, rerun it and the nodes that depend on it (the rerun's credits in the same message, Step 6).\n- A new angle, persona, size or language: hand over to the matching skill.\n- Never delete or overwrite results the user may want: a new version goes into a variation (Variations above). `delete_node` only inside a variation you just made for this version, or when the user asks.\n\n## Runtime failures\nSee Reference G. In short: validation_error → fix with listed values · run failed → name it, one retry with a changed prompt or model and its credits · in_progress → poll again · not enough credits → stop, show the balance and what's missing, offer cheaper (Step 6) · model refused content → tell the user, don't rephrase around it · file without public link → ask for a link or upload in Lyra.\n\n## Base prompt rules\nYou write every prompt, and each lives in its node's prompt field, where the user reads, edits and reruns it. Write for the model and for the person.\n- Self-contained: no \"same as above\", no references to the chat.\n- Concrete and renderable: things the model can show or say, not marketing concepts.\n- The user's own words for the subject and anything they specified stay as given.\n- Settings (ratio, duration, resolution, voice, audio) go in node settings, not in the prose.\n- English, unless text must appear or be spoken in another language. Exact on-image or spoken text in quotes.\n- No placeholders, alternatives or \"if\" branches in a final prompt.\n\n## Common mistakes (every skill)\n| Mistake | Prevention |\n|---|---|\n| Builds or runs before concept and plan are approved | Steps 1–3 first, always |\n| Asks about the price or the run as a separate question | Cost goes into the one approval message; the yes starts the run (Steps 3, 6) |\n| run_node on a running node | Poll get_run_results |\n| Plan without a cost, or a run without reading the nodes' credits | Reference A → Credit prices in the plan; node `credits` before the run |\n| Runs with lost connections, or over the user's canvas edits | Step 5 pre-run check before every run |\n| Sends the user to tick a result in Lyra | Step 7: set the picked result yourself |\n| A new workflow for a new version of the same ad | Create variation of the same workflow, delete what this version doesn't need (Variations) |\n| Only file links, or no workflow link | Step 7 links |\n| Invents app features, UI, numbers or reviews | Only the app card; without screenshots keep the screen out of view |\n| Swaps the user's explicit choice for a default | Instruction order; mention the trade-off once |\n| On-screen text or captions in video prompts | Text in the script, marked for post |\n| Re-describes the look in a video prompt with a first frame | Motion only; the frame sets the look |\n| Leaves connections for later, so \"run all\" breaks | Connect the full graph in step 4; frames at the video's ratio |\n| Splits a short ad into a node per micro-scene | One clip by default; split only for the listed reasons |\n| Voiceover longer than its clip | Reference C pacing; VO ~1 s shorter than the video |\n| Values the model doesn't list | Copy from list_node_configs |\n| Nodes for takes of one idea, or count for different ideas | Ideas → nodes; takes → count |\n| Prompts that point back to the chat | Self-contained prompts |\n| Reruns an unchanged prompt as a fix | Change prompt or model; say what changed |\n| Describes or grades results it can't see | Ask the user with the stage checklist |\n| A forbidden claim from the Brand Kit, a political line or a dig at a competitor | Brand safety (Reference B): forbidden claims enforced absolutely |\n\n---\n\n# Part 2. Video ad generation: what's specific\n\n## Description\nCreates multi-scene video ads for mobile app paid ads in Lyra, SplitMetrics' node-based creative canvas, leaving a generated, reusable workflow on the canvas.\nUse when the user asks for \"a 15-second video ad for my app\", \"a 30 s / 1 minute ad\", \"a sequence of scenes\", \"stitch these clips together\", or hands over a script or storyboard.\nWorks from a Lyra brand kit or app details in chat, app screenshots, a script, a reference ad (through the Creative Analysis node), or an existing workflow.\nNot for: a UGC creator video (the UGC skill), a hook only (the hook skill), static images (the image skills). Those skills use this skill's rules for scripts, scenes, audio, consistency and de-slop.\n\n## Quality bar\nStops the scroll in the first 1.5–3 s, shows only real app features and real screens, reads as one consistent film (same person, place, light), sounds natural (voice not rushed, music without vocals under speech), no AI-slop look, and works with sound off.\n\n## Inputs and defaults\n**Required (ask if missing):** the app (brand kit or app card) · what the ad is about or the idea, if the user has one · app screenshots, if the ad shows the app.\n**Defaults (the recommended options in the intake quiz; if the quiz is skipped, state them in the plan):** Reels / TikTok · **9:16** (16:9 only if asked) · **15 s** · English · voiceover on · music on (instrumental, its own music node in the Video Editor; never inside a clip where someone speaks) · **Seedance 2.5** recommended for real people, **Seedance 2.0** for illustration / UI-heavy · **720p** by default (1080p only when the user picks it, with its price) · ask which model and quality the user prefers in the intake quiz, with your recommendation and why · **sound on** at generation (mute in the Video Editor if needed) · Nano Banana Pro for keyframes · 1 result per node.\n**Run:** everything after the one yes, in stage order (Step 6).\n\n## Concept\nA good concept names one pain the audience recognises, in their words, and shows the app solving it with one real feature, one beat per scene, CTA at the end. It also says **why** it should work: the user is trying to learn what works and why (System Preamble). Write it as the hypothesis + beats:\n> Video, 15 s. We believe students who can't switch off at night will start a trial because a relatable 2 am POV shows the wind-down timer working. 0–3 s hook: \"POV: 2 am, brain won't stop\", tired face in phone light · 3–11 s she starts the timer (real screenshot), shoulders drop · 11–15 s eyes close, CTA \"Try it tonight\". Voice: tired, warm. Music: soft lo-fi, instrumental.\n\nBrief, structure, scene fields, timing and montage rules: Reference B.\n\n## Best way to build it\nThe user's explicit choices override any column. Model choice and price rules: Reference A.\n\n| If the request has | Best approach (graph) | Models | Why |\n|---|---|---|---|\n| **Nothing specific (default)**, real people, ≤30 s | character image (+ phone image with the real screenshot if the app is shown) → **one** multi-shot clip ≤30 s with both as **references** → VO + music → Video Editor | seedance-2.5 · nano-banana-pro | fewest nodes, one consistent look; Seedance holds identity from references |\n| UGC / creator talking to camera | hand over to the UGC skill; if it runs here: Seedance 2.5 only, never Kling or Veo | seedance-2.5 | Seedance is clearly better at people |\n| 60 s or longer than 30 s | full script → two 30 s parts (or split text) with the same character and style references → two clips → Video Editor | seedance-2.5 | no model makes 60 s in one clip |\n| Illustration, cartoon, stylized, moving text | keyframe per scene → clip with image as **frame** | seedance-2.0 | holds style; frames keep the picture exact |\n| The app's UI on screen | user screenshots → phone image (character + screenshot) → short clip, or UI insert laid over in Video Editor (Reference D) | seedance-2.0 (frames) or seedance-2.5 (refs) | models break UI in long busy clips |\n| Exact start and end frame, complex multi-shot | first + last frame per clip | kling-v3-video (Pro) | precise frame control (not for UGC) |\n| Very short product / nature shot, ≤8 s | references → one clip | veo-3.1 | realism; max 8 s, used rarely |\n| Copy a movement from a reference video | character image + motion video | kling-v3-motion-control | motion transfer |\n| A reference ad to adapt | Upload Video → Creative Analysis → script (written by you from its output) → as default row | as default row | keeps the mechanism, not the identity |\n| Many drafts / tight budget | draft model for tries, rerun the winner on the recommended model | seedance-2.0-fast, veo-3.1-lite | spend on the winner only |\n\n## Prompt rules\n\n| Node | Write | Avoid |\n|---|---|---|\n| Image (keyframe) | concept in 2–3 words → subject → action → setting → framing → light → color/lens → mood → style → visible details → exclusions in plain words. ≤500 chars. The moment it shows (start of the motion if used as first frame). | abstract adjectives; text; drawing the user's logo or UI |\n| Video with a frame | motion only: what moves, camera move, pacing, end state; spoken line in quotes if the model speaks | re-describing the look; on-screen text |\n| Sound line (every clip) | **no music in a clip where someone speaks** (Reference C). With speech: \"Sound: dialogue and the natural sounds of the scene only (room tone, steps, a door, a cup on the table); no music, no background music, no soundtrack, no score, no song, no humming\". Add \"background music\" to the Avoid line too. Without speech: no music ban needed (music from the generator can be muted in the Video Editor); with a separate voiceover and nobody speaking on camera: \"no speech, no voice\" | a clip with speech and no sound line (the model adds its own music under the voice) |\n| Video with references | who is who first (\"[Image1] is the character's face and outfit, [Image2] is the phone screen\"), then scene and motion; must-keep identity early | mixing frames and references on Seedance; unassigned references |\n| Video without image | full scene as for an image, then the motion | more than one scene per clip unless multi-shot with \"cut to\" |\n| Voiceover | exact words only, one continuous text, numbers as spoken, sized to the video at the right pace, ~1 s shorter than the video | stage directions, labels, brackets; lines longer than the clip |\n| Music | genre, era, BPM, instruments, energy curve (hook hit → build → CTA resolve), \"instrumental only, no vocals\" when anyone speaks, length = video + ~5 s | artist names; vocals under speech; length equal to the ad |\n\n**Prompt length:** one shot 60–150 words (sweet spot 80–120); image-to-video 40–60% shorter; over ~300 words later instructions get ignored. Non-negotiables first.\n\n**The 5 rules that matter most here:** (1) one scene, one main action, one camera move; (2) anchors repeated word for word in every prompt (Reference E); (3) no generated text or UI, ever; (4) style from the brief, phone-real for UGC, no \"stunning 8K\" adjectives; (5) plan the end frame of every clip.\n\nFull prompt craft (nine blocks, video formula, camera, light, materials, physics, phrase bank, worked example, checklist): Reference F.\n\n## Common mistakes (this skill)\n| Mistake | Prevention |\n|---|---|\n| Image connected as first/last frame on Seedance 2.5 (error) | Seedance 2.5 = references only |\n| Character's face changes between scenes | Character image first, passed as reference to every scene; same model for all clips |\n| UI on the phone garbled or invented | Real screenshots only; phone image + UI insert (Reference D) |\n| 1080p used without the user choosing it | 720p by default; 1080p only when the user picks it in the quiz or asks, with its price |\n| Decides the idea, person, voice and music alone | Step 1 intake quiz with options from the Brand Kit; explain the plan in plain words |\n| Music fades out early / has vocals under the voice | Generate ~5 s longer, instrumental, trim in Video Editor |\n| Voiceover runs over the video | Words for (video − 1 s) at a calm pace; shorten text or faster voice, never regenerate video |\n| Artist name in the music brief (error) | Describe genre, tempo, mood |\n| Sound turned off at generation | Keep sound on; mute in Video Editor |\n| Kling or Veo offered for UGC | Seedance 2.5 always for UGC |\n| Claims a text brief/script node keeps the character consistent | A text doesn't make the character consistent; consistency = character image as reference + anchors |\n| Clips where someone speaks come with their own background music under the voice, a different track in each | The no-music sound line in every clip with speech + \"background music\" in Avoid; our music only as its own node in the Video Editor; a clip with speech that still has music is rerun |\n| Whole graph in one Section, uploads at the end | One Section per stage, left to right, uploads next to the node they feed (`lyra-workflow-layout`) |\n| Clips out of order in the Video Editor | Connect in playback order; after results check and set `startMs` |\n| Price guessed | Reference A rates in the plan, node `credits` before the run |\n| Too many references \"because the model allows it\" | Small, purposeful set; video/audio refs only on request |\n| Captions added without asking, too big, or over a face | Ask in the approval message; `lyra-video-editor` → Captions: size 80, y = 1440 (75%), under the face |\n| A 1-minute clip promised | Hard limit; two halves or split, joined in Video Editor |\n| Same prompt rerun after a failure | Change the prompt, reference or model; after two fails rewrite the scene |\n\n## Quality gates\nAfter each intermediate stage Claude sends the stage checklist (the final result is checked by `lyra-result-check`) and asks the user what they like and what they don't (Reference H has the full slop list):\n- **Stage 1 (images):** same person in every keyframe · hands and phone natural · screen exactly like the screenshot · style right (phone-real for UGC) · nothing plastic or over-glossy.\n- **Stage 2 (clips):** no music inside any clip where someone speaks (ask the user to listen, Claude can't hear) · face and outfit stable within and across clips · no morphing, flicker, warped hands · natural motion · UI correct while tapping · ends on the planned frame.\n- **Stage 3 (final):** hook in 1.5–3 s · scenes in order, CTA at the end · voiceover not rushed, ends before the video, app name pronounced right · under speech only our music from the Video Editor, instrumental, trimmed with a fade · 9:16, planned resolution (720p by default), planned length · captions (only if the user said yes) size 80, at 75% of the height, never over a face (`lyra-video-editor` → Captions) · other text inside the safe zone.\nPass = the user is happy with every point that applies. Fix only what fails, within the agreed budget, with its credits.\n\n---\n\n# Reference library\n\n## A. Models, prices and settings\n\nAlways call `list_node_configs` first: it is the live source of models, durations, resolutions and limits.\n\n**How to offer a model.** Recommend **Seedance 2.5** (real people) or **Seedance 2.0** (illustration, stylized, UI/UX). Say plainly: \"This is the more expensive option, but it gives the best quality for this video.\" Give the cost in the plan (Credit prices below). Always ask which model the user prefers before building (in the plan, step 2–3). Seedance 2.5 and 2.0 always come before any Kling. **UGC and real people talking: always Seedance 2.5, never Kling or Veo**; if the user wants cheaper, say the quality on faces and speech will drop and let them decide.\n\n**Cheaper ladder** (one step at a time, show the new price, skip models bad at the task): Seedance 2.5 / 2.0 → Veo 3.1 (only clips ≤8 s) → Kling 4.0 (only once it is in Lyra's list) → Kling 3.0 Pro → Kling 3.0 Standard → Veo 3.1 Fast → Seedance 1.5 Pro (short lip-sync only) → Seedance 2.0 Fast → Kling 2.6 → Kling 2.5 Turbo Pro → Veo 3.1 Lite / Seedance 2.0 Mini. Drafts first, final later: test ideas on a draft model, rerun only the winner on the recommended one.\n\n**Task → model:** real people, UGC → Seedance 2.5 · illustration, cartoon, UI/UX, moving text → Seedance 2.0 · product / nature realism, ≤8 s → Veo 3.1 · exact first + last frame, complex multi-shot → Kling 3.0 Pro · motion transfer → Kling 3.0 Motion Control Pro (Standard cheaper) · same character with video and voice refs → Kling Video 3.0 Omni · short lip-sync with synced audio → Seedance 1.5 Pro · campaign character consistency → Runway Gen-4.5 · strong physics → Sora 2 Pro (Sora 2 for drafts) · edit an existing video by chat → Gemini Omni · talking head (face + audio) → veed/fabric-1.0 (720p).\n\n**Model cards (Lyra, Oct 2026)**\n- **Seedance 2.5** (flagship, real people): 4–30 s or `adaptive` (fits length to the dialogue/script); the only Lyra model up to 30 s. **References only: never first/last frame (the fields exist but error out).** Technical max 30 images / 10 videos / 10 audio, never pushed (see reference policy). Refs are named [Image1], [Image2]… in the prompt. Default 720p (our default too; 1080p only on the user's choice). Angle and details can shift.\n- **Seedance 2.0** (illustration, UI/UX): 4–15 s, `-1` = intelligent duration. Image as **frame** (start/end; picture kept exactly) or **reference** (looser), never both in one node. Rule: image with UI or any text → frame; no text and exactness not important → reference; unsure → ask. Technical max (per list_node_configs) 9 image / 3 video / 3 audio refs, never pushed. Default 720p (ours too; 1080p on the user's choice). Fast and Mini: cheaper, max 720p, drafts.\n- **Veo 3.1:** 4/6/8 s (max 8), references (≤3) like the others, 9:16 default. Best realism, product, nature. Used rarely, only very short clips. Fast / Lite: cheaper, frames only.\n- **Kling 3.0 Pro / Standard:** 3–15 s, first frame and/or last frame only, no references. Multi-shot, complex scenes, cartoon/stylized; weaker than Seedance on faces and human motion; cheaper than Seedance.\n- **Kling 3.0 Motion Control Pro / Standard:** image + reference video 3–30 s (`character_orientation: video` up to 30 s, `image` up to 10 s). References with clear hands, head and body; avoid complex angles and blocked limbs.\n- **Kling Video 3.0 Omni:** up to 7 reference images (4 with a video ref), first/last frame, 3–15 s; native audio can't be combined with a reference video.\n- **Kling 2.6:** 5/10 s, first frame, native audio. **Kling 2.5 Turbo Pro:** 5/10 s, fast, cheap, no audio. **Seedance 1.5 Pro:** 5/10 s, lip-sync, dialogue.\n- **Sora 2 / 2 Pro:** 4/8/12 s, first frame only. **Runway Gen-4.5:** 5/10 s, first frame.\n- **Kling 4.0** (launched 16 Oct 2026): 3–30 s, up to 10 keyframes, stereo audio, cheaper than Seedance. Not in Lyra yet; offer only when list_node_configs shows it, and never ahead of Seedance for people.\n- **Images:** Nano Banana Pro for finals (text, UI, people, realism, sharp), Nano Banana 2 for drafts.\n\n**Settings in the Video Generation node:** model → seconds (or adaptive) → aspect ratio 9:16 (confirm) → quality **720p by default** (offer 1080p in the quiz: sharper faces and details, ≈ 2.4× the price) → sound **on** → how images connect (frame or reference, by model).\n\n**Reference policy.** Limits are a technical maximum, not a target: many extras make the model unpredictable. Never tell the user how many references a model takes or suggest adding many. Default references = the images you generated (character, keyframe, product, UI). Write the montage yourself in the script; a video reference only when the user asks or the brief requires copying an edit (it works only as an editing reference). An audio reference only when the user brings a track (the video is fitted to it).\n\n**Longer than a model allows (e.g. 1 minute).** Say honestly no model makes it in one clip (30 s Seedance 2.5, 15 s others, 8 s Veo). Offer: (A) two 30 s videos from the same idea and image, joined in the Video Editor; or (B) the full 60 s script split into two 30 s parts (check each part's length), the same reference(s) or a few style references for both, two videos in one style, joined in the Video Editor. Same model, character, style anchor, voice and music in both halves. Always tell the user first that this is possible and how.\n\n**Credit prices** (Lyra, Oct 2026; credits per run, rounded up; a node's `credits` in `get_workflow` is always the final word):\n\n| Node | Price |\n|---|---|\n| Seedance 2.5 | 720p: 28.5 per second · 1080p: 67.5 per second · `adaptive` counts as 30 s |\n| Seedance 2.0 | 720p: 27 per second · 1080p: 67.5 per second |\n| Seedance 2.0 Fast | 720p: 22.5 per second |\n| Kling 3.0 Pro / Standard | 50.4 / 37.8 per second |\n| Kling 3.0 Motion Control | ≈ 54 per second |\n| Kling 2.5 Turbo Pro | ≈ 10.5 per second |\n| Veo 3.1 | 1080p: ≈ 60 per second |\n| Nano Banana Pro 2K / Nano Banana 2 1K | 23 / 11 per image |\n| GPT Image 2 / Ideogram 3.0 Turbo | 20 / 5 per image |\n| Music (ElevenLabs) | 1.25 per second of the track |\n| Voiceover · AI text node | ≈ 2 · 1 |\n| Video Editor, uploads, notes | 0 |\n\nCount multiplies the price; ratio, sound on or off and frames vs references don't change it. Example (default build): character 23 + phone shot 23 + 15 s Seedance 2.5 720p 428 + 20 s music 25 + VO 2 ≈ **500 credits** (at 1080p the clip is 1 013, total ≈ 1 090). Models or settings not in the table: build, read the node, then tell the user.\n\n**Text nodes.** Claude writes brief, script, voiceover script and music brief itself into user text nodes (the AI text nodes can't be created with the tools). Exception: **Creative Analysis** (`pattern_import`): when the user brings a reference video and the node is available, use Upload Video → Creative Analysis and write the script from its output.\n\n**Video Editor and captions → `lyra-video-editor`.** The Video Editor is the `video_composer` node (0 credits). Assembly (order, trims, layers), the mix (VO, music volume, trim, fade-out, clip sound), the end card, on-screen text, captions (ask first; size 80, 75% of the height, word check), speed, freeze frame, effects, transitions, safe zones, export, the pre-render check, the render and the 59 / 30 / 15 s cutdowns all live in `lyra-video-editor`; follow it for stage 3.\n\n## B. Brief, script and scenes\n\n**Brief header:** app · platform · aspect ratio · length · language · voiceover · music · audience (Brand Kit).\n**Hypothesis:** \"We believe [audience] will [action] because [concept] addresses [pain] through [mechanism]\" (a whole concept, not one variable).\n**Then:** angle (≤100 chars) · summary (≤200) · hook mechanism · hook line (≤80; on-screen version ≤40) · value proposition (≤150) · proof point (Brand Kit or user only) · tone · offer · CTA (≤30) · format · image style · palette · must include / exclude · reference notes.\n**Competitor references:** keep the idea (concept, structure, hook, format); never their logo, colors, visuals or text.\n**Claims:** never invented, pricing included: no price, discount or offer that isn't listed in the Brand Kit or given by the user. AI people are never presented as real customers; testimonials only from real reviews. No body before/after for health or weight-loss apps. **Brand safety** (Lyra's System Preamble): nothing that could damage the advertiser's reputation; no profanity, no political statements, no unsubstantiated health claims, no competitor disparagement. The Brand Kit's **forbidden claims are enforced absolutely**: never in a line, a caption, a visual or the VO; if the user asks for one, say once that it is on the kit's forbidden list and leave it out unless the user confirms the kit is outdated.\n\n**Structures:** problem → agitate → demo → CTA (default) · hook → solution → social proof → CTA · POV / relatable moment → app as the fix → CTA · before/after of the situation · single continuous shot. Scene types: hook, problem, solution, social proof, offer, cta, logo end card. Brand only at the end.\n\n**Scene fields:** number + type · duration · visual direction (like an image brief: subject, setting, framing, angle, light, palette, mood, style, texture; no text; style per brief) · motion (one main action) · VO line · on-screen text ≤40 chars with position and animation, **marked for post** · music/SFX cue · transition · consistency (source scene, must match, allowed to change) · asset (screenshot, logo) · generation note · end state. Mark the hook scenes; give them the most detail.\n\n**Timing:** scene durations add up exactly to the total. A beat on screen is 1.5–5 s; a clip is generated at a length the model allows and trimmed in the Video Editor. UI clips ~4 s. Hook within ~1.5 s (Reels/TikTok) to 3 s (Feed). 5 s clip beats: 0–1 establish · 1–3 action · 3–4 peak · 4–5 resolve.\n\n**Montage:** written by Claude in the script (shots, order, length, cuts). Default: the shots live inside one clip with explicit \"cut to\" markers. Separate clips joined in the Video Editor only for the reasons in Step 2 (over 30 s, UI insert, different models or frames, a failed shot, the user asks).\n\n**Keyframe:** the frame that starts the scene (start of the motion when used as first frame; the peak goes in as last frame on frame models). Generated at the video's ratio.\n\n## C. Audio: voiceover and music\n\n**Voiceover.** Write it yourself (from the script and Brand Kit) into a \"VO script\" text node, then an audio voiceover node (`elevenlabs/v4`, Lyra's recommended voiceover model; `elevenlabs/v3` also listed; voice from `list_voices`).\n- Exact spoken words only: no scene labels, timestamps, \"Hook:\", \"VO:\", \"[pause]\", \"(upbeat)\", brackets, asterisks, slashes, markdown, separator dashes. Allowed: comma, period, ellipsis, ?, !. Pause = comma or ellipsis.\n- One continuous text joining the per-scene lines; rhythm shows the pace; the words carry the tone (never describe it).\n- No invented claims. The user's direction wins (tone, length, focus, language, style).\n- **Pace (English):** 2.5 words/s conversational (default), 3.0 fast/energetic, 2.0 slow/emotional.\n- **Always ~1 s shorter than the video** (15 s video → 14 s VO ≈ 35 words, calm, not rushed). Check the real audio length after generating. Too long → cut words or a faster voice; never regenerate the video for the voiceover.\n- **Voice:** filter by language, accent, gender, age, use case; pick by the voice description to fit the audience and tone; play a sample; reuse the same saved voice across a campaign.\n- **Languages:** same script, new VO script \"Speak in <language>\" + its own voiceover node with a voice in that language; run in parallel; match each in the Video Editor; check each language's length (translations run longer).\n\n**Music.** Write the music brief from the script's mood; music node `elevenlabs/music` by default (Lyria 3 / Lyria 3 Pro if asked).\n- Prompt: genre, era, BPM, key/mood shift, instruments, sync points (hit on the hook, lift on the reveal, resolve on the CTA), hook in the first 2 s, fade-out. Example: \"Dark-to-hopeful cinematic electronic underscore, 110 BPM, D minor shifting to F major at the CTA; pulsing synth bass, metallic percussion, risers and impacts on the press, resolving into clean uplifting synth chords. Instrumental only, polished modern mix, smooth 1 s fade-out.\"\n- **Anyone speaks in the video → instrumental only, no vocals, no singing, no humming.** Keep `force_instrumental` on.\n- **Length = video + ~5 s** (10 s video → 15 s track, `music_length_ms`), trimmed in the Video Editor, because the fade starts early.\n- **No artist names** (they can error). Check the script too.\n\n**No music in a clip where someone speaks (fixed rule).** Video models, Seedance above all, add their own background music when the prompt leaves room: some clips get it, some don't, and every clip gets a different track. When a person speaks on camera that music is baked into the voice: it can't be removed or muted without losing the dialogue, and under our score it becomes two tracks playing at once. So:\n- **Every clip with speech** (dialogue, a person talking to camera, a line in the clip, an in-clip narrator) gets this sound line: \"Sound: dialogue and the natural sounds of the scene only (room tone, steps, a door, a cup on the table); no music, no background music, no soundtrack, no score, no song, no humming\". And \"background music, soundtrack\" in its Avoid line.\n- **Clips without speech:** no ban needed. If the generator adds music, that's fine: in the Video Editor the clip's sound can simply be muted and our music laid instead. With a separate voiceover and nobody speaking on camera, write \"no speech, no voice\".\n- **Allowed in a clip with speech:** the voices, the sounds of the action (a door opening, steps, a phone buzz, a kettle, a crash), room tone and ambience. Not allowed: any music, song, humming or jingle under the voice.\n- **Our music is its own music node** (instrumental when anyone speaks), on its own track in the Video Editor, under the dialogue.\n- **Sound stays on at generation** (the voices and scene sounds are needed), so the prompt is the only guard. After the clips run, ask the user to listen for music inside the clips where someone speaks. Such a clip that came back with music anyway is rerun with the same sound line (its credits in the same message): muting it would mute the voice too.\n\n**Mix in the Video Editor:** `lyra-video-editor` → Audio (voice first, music under speech, trim and fade, which clips are muted).\n\n## D. App UI in the video\n\n- Use as little UI in video as possible; **never invent UI**. Seedance 2.5 / 2.0 often break UI in long busy clips.\n- If the screen is needed, ask: \"Please send screenshots of the app screens you want in the ad.\" Screenshots only, never a screen recording. No screenshots → screen dark, blurred or turned away.\n- **Phone image:** a second image node: \"the same character holds the phone close to camera, screen facing us\"; connect the main character image and the user's screenshot. Run it, then ask the user: \"Is the UI exactly like your screenshot (layout, text, colors, logo)? Same person, hands and light?\" Rerun the image before any video if not.\n- **Way 1, one clip** (about 10 s, max 15 s): connect the character image and the phone image to the video node (Seedance 2.5 as references; Seedance 2.0 as frames, because there is text; Kling as first/last frame).\n- **Way 2, UI insert:** if the UI came out bad but the rest is fine, make a short clip from the phone image (screen + finger tapping or scrolling, a few seconds) and lay it over the broken part in the Video Editor (layer above, trimmed to the moment). Plan Way 2 from the start when the UI moment is long or important.\n- Show one key screen or \"aha moment\", not a full walkthrough. Ask after every UI result; fix only the broken part.\n\n## E. Consistency between scenes\n\n- **Anchors** defined once and repeated word for word in every prompt: character (age, face, hair, skin, outfit, accessories), environment (place, time of day, light direction and color), style (palette from the Brand Kit, grading, look, lens), product/phone (device, case, screen from the screenshot).\n- Per scene: **source scene** (earliest that set the element) · **must match** · **allowed to change**.\n- One image model for all keyframes, **one video model for the whole ad**, one ratio and resolution.\n- **Character first, connected everywhere:** the character image is generated in stage 1 and **connected at build time as a reference to every image and video node that shows the person**, so the graph stays consistent even with \"run all\". If the user wants to choose between several characters, run stage 1 first; they name one and Claude pins it on every node that uses it (Step 7); the connections are already there. A text brief alone never makes images consistent. Two characters for A/B: one script, two character images, two videos.\n- **By model:** Seedance 2.5 references (roles per [ImageN]); Seedance 2.0 frame for exactness / UI, reference for looser; Kling first/last frame; Omni references + video ref.\n- Frames pin to the **selected** result; reconnect after regenerating a keyframe.\n- **Hand-off:** write each clip's end state; the next scene starts from it; keep motion direction across cuts; match cuts, whip pans and cuts on action hide small differences.\n- **When it breaks:** strengthen the reference and move the anchor earlier, shorten the prompt, reduce motion; a reference leaking light or framing → state its job or drop it; two failed tries → simplify the scene in the script.\n\n## F. Prompt craft\n\n**Image, nine blocks:** concept (2–3 words) → main subject and what it does → context → lighting → color and technique (palette, lens) → mood → composition (front, back, sides) → style (if you name a director, also describe the look) → visible details.\n\n**Video formula:** SUBJECT → ACTION → CAMERA → ENVIRONMENT → LIGHT → MATERIALS → PACE → EMOTION → ENDING → CONSTRAINTS. A framework, not a template; one coherent direction, not a stack of tags.\n- **Action:** one clear change of state + a few natural secondary moves. Weak: \"a woman with a phone\". Strong: \"she glances at the notification, her eyebrows lift, and a small smile spreads as she turns the phone toward the camera.\"\n- **Camera:** a move for a reason: static (control), slow push-in (intimacy), pull-out (scale), tracking (follow), orbit, pan, tilt, crane, handheld (UGC presence), whip pan (energy), rack focus. Subject motion and camera motion stated separately.\n- **Framing:** eye level (natural), low (power), high (distance), overhead (geometry), three-quarter (volume), profile (silhouette); shot size; subject placement in the central 65% of 9:16.\n- **Light:** one main approach + 1–2 supporting (soft diffused, hard directional, Rembrandt, backlight, rim, golden hour, blue hour, volumetric).\n- **Palette:** one dominant, from the Brand Kit, kept across scenes; shift only if the shift is the story.\n- **Materials:** how they react to light and motion (glass reflections stay coherent; heavy fabric doesn't float).\n- **Physics:** cause and result (fabric settles, hair follows the head, a thumb really presses the screen).\n- **Pace:** slow deliberate, fluid, sharp, energetic, weightless; matched to the scene.\n- **Lens and focus:** 24mm wide, 35mm environmental, 50mm natural, 85mm tight, macro; say what is sharp at each key moment. Guidance, not guarantees.\n- **Finish:** clean digital (precise detail, natural skin) or analog (fine grain, halation); UGC = phone camera, natural light, slight handheld.\n- **Ending:** plan the final frame (eye contact, product centered, phone to camera, brief hold).\n- **Image-to-video:** bring the image to life, don't replace it; preserve composition, face, outfit, light; limited movement (blink, breath, gaze, small head turn, restrained push-in); \"no new objects, no scene transition, no wardrobe changes\".\n- **Rules:** one scene one idea · action beats adjectives · camera move needs a reason · complexity fits duration · light interacts with materials · no conflicting styles · constraints short and prioritized · clarity beats length · plan the final frame · consistency before spectacle when identity, product or UI matter.\n- **Phrase bank:** smooth: \"fluid motion, slow deliberate movement, graceful follow-through\" · identity: \"preserved facial features, consistent wardrobe, stable character appearance\" · realism: \"natural inertia, believable body mechanics\" · product: \"precision product cinematography, controlled reflections, macro detail\" · light: \"soft directional lighting, subtle rim light\" · UGC: \"shot on phone front camera, natural window light, slight handheld wobble, casual, unpolished\" · ending: \"controlled final pose, brief visual hold\".\n- **Pre-generation check:** subject clear · identity preserved where needed · main action explicit · camera defined · composition and location fit · light and palette coherent · hands, hair, objects plausible · pace fits duration · final frame intentional · key unwanted changes constrained · settings match the model · nothing contradictory.\n\n## G. Errors\n\n| Problem | Fix |\n|---|---|\n| Seedance 2.5 errors with an image | It was a frame → reconnect as reference |\n| Seedance rejects inputs | Frames and references mixed → pick one |\n| Video ignores the script or image | Connect both to the video node |\n| Video stays on the old image | Keyframe regenerated → reconnect it |\n| Duration rejected | Use a listed value (model first, then seconds) |\n| User wants 1080p | Set `resolution: 1080p` (Seedance 2.5 / 2.0); 2.0 Fast / Mini can't do 1080p |\n| Music node error | Artist name → describe genre, tempo, mood |\n| Vocals under the voice | Instrumental only, force_instrumental on |\n| Music fades early | Generate ~5 s longer, trim |\n| Voiceover too long | Shorten to (video − 1 s) or faster voice |\n| Clip audio clashes | Clip without speech: mute/lower in Video Editor |\n| Music inside a clip with speech | Can't be removed: rerun the clip with the no-music sound line (Reference C) |\n| Clips in wrong order | Disconnect and reconnect in playback order |\n| UI garbled | Phone image + UI insert (D) |\n| Face drifts | E → \"When it breaks\" |\n| Text appears in video | Remove it from the prompt; text goes on in the Video Editor |\n| Longer than the model allows | Two halves or split script (A) |\n| Kling 4.0 asked for | Not in Lyra yet; offer Seedance 2.5 |\n| Two failed tries | Rewrite the scene in the script; if the image confuses the model, use it as a reference instead of a frame (where allowed); never rerun unchanged |\n\n## H. De-slop\n\n**Prevent:** style from the brief (UGC phone-real, not \"premium cinematic\") · real skin (\"natural skin texture, visible pores\"), never \"flawless\" · lived-in places with 2–3 specific details · no \"stunning, 8K, masterpiece, hyper-realistic\" · simple hand actions, one object in hand, hands visibly touching · faces frontal or three-quarter, one person in focus · one action, one camera move, physical cause and result · no generated text, UI or logos · a short constraints line. Images: \"text overlays, captions, watermark, blurry, low quality, distorted faces, extra limbs\". Video: \"text generation, on-screen captions, morphing faces, identity drift, outfit change, flickering, jitter, warped hands, unstable geometry, sudden camera jumps\" + 1–3 scene risks. If the model has no negative field, put a short \"Avoid …\" line at the end of the prompt.\n\n**Slop signs:** faces (plastic skin, identity change, morphing, dead eyes) · hands (extra or merged fingers, passing through objects, floating phone) · motion (rubber limbs, sliding feet, floaty movement, jitter) · text/UI (garbled letters, invented or changing screens, warped logo) · scene (flicker, objects popping, melting background, warped lines) · look (over-glossy, over-saturated, stock vibe, wrong style) · audio (robotic or rushed voice, wrong app name, VO over the video, vocals under speech, abrupt music end) · edit (mismatched cuts, wrong order, CTA cut off, text outside the safe zone).\n\n## I. Brand Kit\n\nEvery brief, script, prompt, voice and music direction is built on the Brand Kit: audience first, then product, value, tone, colors, claims, forbidden claims (enforced absolutely), must include / exclude. Source order: the chat → the kit connected to the workspace / workflow → ask (send it, or check and connect one of the workspace's kits). The user's chat request always wins; the kit fills everything they didn't say; mention a conflict in one line.\n\n## J. App ads on Meta (what works)\n\n- Vertical 9:16 video first (Reels and Stories carry most app-install volume); 15–30 s; a hook that shows the app working, not a logo.\n- 3–5 hook variants per concept; test one variable at a time; 2–3 new concepts a month (creatives fatigue in days to weeks); Advantage+ app campaigns need several different concepts.\n- Formats that convert: UGC style (phone-shot, person to camera) beats polished brand video on cold traffic · problem → agitate → demo → CTA ending on the key screen · real people using the app · one simple key screen, not a walkthrough · before/after of the situation · specific, plausible social proof from the Brand Kit.\n- Hook in ~1.5 s (Reels/TikTok), by 3 s (Feed); no dead air; no logo intro. Hook rate (3-s views ÷ impressions) >30% good, <20% weak.\n- Length: Reels 6–30 s (15–20 s safe), Stories 6–15 s, Feed 15–30 s (4:5 or 1:1 as a later variant).\n- Sound off: most viewers watch muted → recommend captions for all speech when asking the user (`lyra-video-editor` → Captions: ask first), key message also on screen, same words as the VO; high-contrast, one consistent place, size 80, at 75% of the height under the faces; added in the Video Editor.\n- Safe zone: faces, the subject and headline text in the central 65% of 9:16, away from the top bar and the bottom CTA area. Captions are the exception: at 75% of the height, under the faces (`lyra-video-editor` → Captions).\n- CTA: a concrete offer (\"Try free for 7 days\") beats \"Download now\"; in VO and on screen in the last 2–3 s.\n- Judge creatives by trials, payers and day-7 retention, not only cost per install; give a test 2–3 weeks.\n"
Full snapshot data
{
  "description": "Base skill for video ads in Lyra. Builds a mobile app video ad end to end (brief, script, scenes, keyframes, clips, voiceover, music, Video Editor assembly) with scene consistency, de-slop and error handling. Use for \"a 15-second video ad for my app\", \"a 30 s / 1 min ad\", \"a sequence of scenes\", \"stitch these clips\", or a script or storyboard to produce. Holds the core video rules the smaller lyra video skills point to.",
  "included_files": [],
  "name": "lyra-video-ad-generation",
  "skill_md_contents": "---\nname: lyra-video-ad-generation\ndescription: \"Base skill for video ads in Lyra. Builds a mobile app video ad end to end (brief, script, scenes, keyframes, clips, voiceover, music, Video Editor assembly) with scene consistency, de-slop and error handling. Use for \\\"a 15-second video ad for my app\\\", \\\"a 30 s / 1 min ad\\\", \\\"a sequence of scenes\\\", \\\"stitch these clips\\\", or a script or storyboard to produce. Holds the core video rules the smaller lyra video skills point to.\"\n---\n\n# lyra-video-ad-generation\n\nThe main video skill for Lyra. It holds the core rules for every video ad: script, scenes, music, voiceover, consistency between scenes, de-slop and error handling. Smaller video skills (UGC, hooks, templates) point here for these rules.\n\nPart 1 is shared by every Lyra skill. Part 2 is what's specific to video ads. The Reference library at the end has the details (models, prompts, audio, UI, consistency, de-slop, errors, Meta app ads).\n\n**Canvas layout → `lyra-workflow-layout`.** Every workflow this skill builds or changes is laid out by `lyra-workflow-layout`: sections in reading order with a STEP note above each one, the team's color code, clear node labels and the final check. The layout lines in this file only say which sections this creative needs.\n\n**Assembly and captions → `lyra-video-editor`.** Stage 3 of every video (the Video Editor: edit, mix, end card, text, captions, render, cutdowns) follows `lyra-video-editor`. This file only says which pieces go into the edit.\n\n---\n\n# Part 1. [SHARED] How every Lyra skill works\n\n**Deliverable:** a Lyra workflow in which every planned node has been generated. The user opens the canvas and finds the results, the prompts that produced them, and a graph they can edit and rerun for the next app, angle or market.\n\nA full creative always follows these steps, in order:\n1. **Context.** Read the Brand Kit, then send the intake quiz (Step 1) so the user takes part in the key choices; make sure you have everything before proposing anything.\n2. **Concept and plan.** A very short concept plus a short plan of nodes, models and connections, based on \"Best way to build it\".\n3. **Approval.** One message: concept, plan, open questions and the cost in credits; the user approves or corrects. Nothing is created before this; the yes also starts the run.\n4. **Build.** Create the workflow and nodes with the chosen models, write every prompt into the node's prompt field. Nothing runs yet.\n5. **Pre-run check.** Right before every run, read the workflow back and restore anything lost (connections, settings); keep the user's own edits.\n6. **Credits and run.** The cost is part of the plan; after the one yes, build and run everything without asking again.\n7. **Run and report.** Run, report with the right links (workflow, video or image) and the real spend, offer the next step.\n8. **Verify quality.** Check with the user against the quality gates.\n\n## Whose instructions win\n1. The user's explicit instructions in this chat.\n2. This skill's best practices and defaults.\n3. The brand kit: real app facts, claims, value proposition, features, audience.\n\nBest practices are defaults, not rules for the user. When a user's choice will likely hurt the result, follow it and say once in the plan what you'd do instead and why; don't argue twice. When a choice breaks a hard limit (a 60 s clip from a model capped at 30 s), explain and offer the closest build that works.\n\n## Step 1. Context\n\n**App.** Every concept starts from the app. Generic ads come from missing product context, so never fill gaps from imagination.\n1. Brand kit given in the chat → use it. Otherwise `list_brand_kits`: one kit → \"Make this for {kit name}?\"; several → ask which. The user may add or override details in chat.\n2. No kit → ask once: send it here, or should I check / connect one of the kits already in your workspace? If the user prefers to type it: app name, what it does, who it's for, the pain it solves, 2–3 features the ad may show, approved claims and offer, forbidden claims, tone, assets (logo, **screenshots only**; never ask for a screen recording).\n3. Keep the result as an **app card** for the whole session:\n   > App card: Calmly · 5-minute wind-down sessions for sleep · for students 18–25 · pain: can't switch off at night · may show: wind-down timer, sleep sounds · claims: none approved · tone: calm, a bit ironic · assets: logo, 3 screenshots · source: brand kit\n\n**Intake quiz: involve the user before deciding.** When the user gives a task for a video (a brief, a TZ, \"make a 15 s ad for my app\"), don't decide everything yourself. After reading the Brand Kit, send **one short quiz** with every open question at once, so the user takes part in the key choices and understands what will be made and why. Lyra's own nodes never ask; this skill does, once, here.\n- **Format:** multiple choice. Use the client's question tool (a multiple-choice question card) if there is one; otherwise a numbered list, each question with 2–4 short options (a, b, c), the recommended option first and marked \"(recommended)\", plus \"your own answer\". The user can reply \"1a 2c 3b\".\n- **Size:** 4–8 questions, only the ones that matter for this video. Skip anything the task or the Brand Kit already answers; say in one line what you took from them (\"From the Brand Kit: audience 25–40, offer 7 days free\").\n- **Options come from the Brand Kit**, not generic: real pains, real personas, real features, the real offer.\n- **Question bank** (pick the relevant ones, in this order):\n  1. **Idea:** 2–3 short concept options built on different pains or angles (one line each, the hook in quotes) + \"my own idea\".\n  2. **Format:** person talking to camera (UGC) · a short story with scenes · animated / 3D · app screens in motion · POV.\n  3. **Who is on screen:** 2–3 personas from the audience (age, vibe, place) · no person.\n  4. **Length and placement:** 10 s · 15 s (recommended for Reels / TikTok) · 30 s · 60 s.\n  5. **Voice:** the person speaks on camera · voiceover · music and text only; language.\n  6. **Music:** 2–3 moods that fit the idea · no music.\n  7. **App on screen:** show real screens (then ask for screenshots) · no UI.\n  8. **CTA / offer:** the Brand Kit's offer · a plain \"Download\" · other.\n  9. **Captions:** yes (recommended when someone speaks) · no.\n  10. **Model and quality:** Seedance 2.5, 720p (recommended, ≈ X credits) · 1080p (sharper faces and details, ≈ 2.4× the price) · a cheaper model.\n- **Skip the quiz** only when the user says \"just do it\", \"surprise me\", or the task already answers everything: then state the choices in the plan in one line each.\n- After the answers, Step 2 explains the plan in plain words (below).\n\n**Task.** The intake quiz covers the inputs in Part 2 → Inputs and defaults; the defaults are its recommended options. Everything in one message; never re-ask what the user said. Call `list_workspaces` (credits) and `list_node_configs` (models) now.\n\n## Step 2. Concept and plan\n\nShort: readable in under a minute.\n\n**Concept:** 2–4 lines per deliverable (Part 2 → Concept). N deliverables = N distinct ideas; more takes of one idea is `count` on a node, not more nodes.\n\n**Explain it in plain words** before the node table, so a user who has never built a workflow understands what will happen: what the video will show, second by second (hook → middle → CTA) · what Claude will generate and in what order (e.g. \"first the character photo, then the phone shot with your screen, then one 15 s clip, then voice and music, then the edit\") · why this way (one line: e.g. \"one clip keeps the person identical in every shot\") · what the user gets at the end and what they can change on the canvas. Short and friendly, no node jargon; the node table follows for those who want it.\n\n**Plan:** name the matching row of Part 2 → Best way to build it in one line, then list the nodes:\n\n| # | Node label | Node · model · key settings | Inputs (role) | Stage |\n|---|---|---|---|---|\n| 1 | Script (note for the user) | user text | — | — |\n| 2 | Character: Mia | image · google/nano-banana-pro · 9:16 · count 1 | — | 1 |\n| 3 | Screenshot: timer | upload image | — | 1 |\n| 4 | Phone shot: timer | image · google/nano-banana-pro · 9:16 | 2, 3 (references) | 1 |\n| 5 | VO: full | audio · elevenlabs/v3 · voice | — | 1 |\n| 6 | Music | audio · elevenlabs/music · 20 s · instrumental | — | 1 |\n| 7 | Ad: 15 s, 3 shots | video · bytedance/seedance-2.5 · 15 s · 720p · 9:16 · audio on (ambience only) | 2, 4 (references) | 2 |\n| 8 | Video Editor | video_composer | 7, 5, 6 | 3 |\n\n**One clip by default.** A Seedance 2.5 clip holds up to 30 s and several shots (\"cut to\"), so one clip with the character and UI as references is the default. Split into separate clips only when: the ad is longer than 30 s · a UI moment needs its own insert (Reference D) · scenes need different models or exact frames · one shot failed and must be replaced · the user asks. Say in one line of the plan why you split or don't.\n\nStages: **1** = sources (images, voiceover, music; fast and cheap) · **2** = built on finished images (video, lip-sync) · **3** = assembly (Video Editor / composer).\n\n**Cost:** the plan's total in credits, from Reference A → Credit prices (count and duration included), next to the balance: \"≈ 500 credits · balance 47 424\".\n\n## Step 3. Approval\n**One message, one question.** Everything the user has to decide goes into one message: the concept, the plan with models and quality, any question you still have, and the **cost in credits** with the balance (Step 6). It ends with one question that covers all of it, e.g. \"Does the concept, Seedance 2.5 in 720p and ≈ 500 credits (of your 47 424) work for you? After your yes I build the workflow and run everything.\" (Answers already given in the intake quiz, captions included, are not asked again; if the quiz was skipped, videos with speech include the captions question, `lyra-video-editor` → Captions.) Never a separate question about money or about running.\n\nOn corrections, show only what changed, with the new cost, and ask again. Don't create anything in Lyra before a clear yes. This yes also starts the run: after it, build and run everything without asking again (Step 6).\n\n## Step 4. Build the workflow\n1. `create_workflow` (or `use_template`, or the user's own workflow, or a variation of an existing one: Variations below), then `assign_brand_kit`.\n2. Write every prompt (Part 2 → Prompt rules): brief, script, image and video prompts, voiceover text, music prompt. The script can go into a user text node (`create_user_text_node`) as a note for the user, connected to nothing. A user text node feeds its text into any node it is connected to, so keep this one unconnected (a Note on the canvas can't be connected at all, but the tools can't create one). The text doesn't keep the character consistent: consistency comes only from the character image connected as a reference, plus the anchors written into every prompt.\n3. Create every node from the plan with its prompt, its model and settings from `list_node_configs`, and a label that says what it's for (\"Scene 2: app demo\", \"VO: hook\"), never \"Image 1\".\n4. **Connect the whole graph now** (`connect_nodes`), so the workflow can run on its own with \"run all\": character → every image and video node that shows the person (reference) · screenshot upload → the phone image · images → video · clips, voiceover, music → Video Editor **in playback order**. Never leave connections \"for after the user approves an image\". **References** connect before anything is generated (checked in Lyra). **First / last frame** from a generated image needs that image to have a result first (an uploaded image can be a frame right away): on frame models, say in the plan that the frame link is made right after the image runs, and make it automatically before running the clip.\n5. Lay out the canvas by `lyra-workflow-layout` (STEP notes, sections in reading order, colors, check), one section per stage: **Sources** (script note, character, screenshot uploads) → **Images** → **Clips** → **Audio** → **Video Editor**. Put an upload next to the node it feeds, never at the end of the canvas. Don't put the whole graph in one Section.\n6. Check `is_valid` and `validation_error` on every node; fix with `update_node` using listed values.\n\n## Variations, not new workflows\nA new version of something that already lives in a workflow goes into a **variation of that workflow** (Lyra's **Create variation**), never into a new workflow, unless the user asks for a new one.\n- **When:** a new version of a video (another story with the same characters, another angle, hook, person, setting, length or language, a remake of a failed take), more room for another round, splitting the work, or the user asks for several variations.\n- **How:** `create_variation` (it copies the whole canvas: nodes, connections and results) with a clear title (\"D2 · Dan's turn\") → `switch_variation` to it (the tools and runs work on the main variation; Lyra also renames the workflow after it) → `delete_node` the nodes this version doesn't need → update the prompts and add the new nodes → connect → pre-run check → run. Nodes kept as they are keep their results and cost nothing (characters, places, the end card clip). The variation keeps the canvas layout: update the section titles and labels that name what changed (`lyra-workflow-layout`).\n- **Check the Video Editor right after `create_variation`:** in a new variation the edit can come out empty or pointing to old results (opening the editor there deletes the tracks), and pinned first / last frame results can be cleared. Read the composition and the frame pins, and rebuild them by `lyra-video-editor` before any render.\n- Deleting inside a variation you just made for this version is part of the build and needs no extra ask. Never delete in the original variation or in one the user made.\n- **Report:** the workflow link, the name of the variation with the new version, and that the original is untouched in its own variation (to show it again: `switch_variation`, which renames the workflow back).\n- **Images:** new statics, sizes or languages can stay in the same variation as new nodes, one Section per set, unless the user asks for a separate workflow or the canvas gets crowded; then a variation, as for video.\n- **Open canvas:** before editing an existing workflow through the tools, ask the user to close its tab or switch away (an open canvas can write its old state over the tool edits), and tell them when it's safe to open it again.\n\n## Step 5. Pre-run check\nRight before **every** `run_node` (the first run, each next stage, reruns, follow-ups). The canvas changes between build and run: the user edits it, and an edit on the canvas can drop or overwrite connections. A run with a missing input spends credits for nothing, so never trust what you built a few minutes ago.\n1. `get_workflow` now, not from memory.\n2. Compare it with the plan: every planned edge (source → target) is there · every node that takes images has them as planned (`image_inputs_usage`: references or frames; a frame points to an existing result) · every node `is_valid`, no `validation_error` · no empty prompt · settings as planned (model, ratio, duration, resolution, count).\n3. Lost or changed by accident → restore it (`connect_nodes`, `update_node`) and say it in one line (\"the link Character → Clip 1 was gone, reconnected\"). Changed by the user on purpose (their prompt, model, a node they added) → keep it and use the workflow as it is now; never overwrite their edits. Not sure which → ask before running.\n4. Inputs ready: a node runs only when every node it takes from has a result. Never run a node with a missing input.\n\nAfter the build, tell the user once that the workflow is built and running and that they can edit any prompt on the canvas and rerun.\n\n## Step 6. Credits and run\n**Where the prices are.** `get_workflow` returns `credits` on every node: the estimated credits of one run of it (null = free: uploads, Video Editor, notes, user text; a Section shows the sum of its nodes; null on a paid node means a setting is missing, e.g. no resolution on Nano Banana 2: set it). Before the build, estimate with Reference A → Credit prices; after the build, read the real numbers off the nodes.\n\n1. **In the plan (Steps 2–3):** the estimated total and the balance (`list_workspaces`), inside the one approval message.\n2. **After the build, before running:** add up `credits` of every node that will run. Within ~15% of the approved estimate and within the balance → run everything, stage by stage (sources → images → clips → Video Editor, Step 7), with no question. More than ~15% over, or over the balance → one short message: the new total, why, and a cheaper option (fewer ideas, lower count, 720p, a cheaper model per Reference A); run after the answer.\n3. **Reruns and follow-ups:** give the rerun's credits in the same message as the change (\"Changed the prompt; rerunning Clip 1 and the Video Editor, 428 credits\") and run, unless the user asked to check first.\n4. **After the run:** the real spend (balance before − after) and the new balance.\n5. A source image with count 2 (a character, a persona) feeds the next stage with its selected result; say in the report which one went on and that the user can switch (Step 7).\n6. The smaller skills' **Run options** sections give the run order and what each stage holds: run all of it in that order, without offering the options. A staged run (the look first, then the rest) only when the user asks for it, or when the plan is expensive and the look should be approved first: then say so in the approval message, with each stage's credits, and run the next stage on the user's yes to the look.\n7. No `credits` on the nodes at all (the field is gone): estimate with Reference A, say it's an estimate, and keep the same one-question flow.\n\n## Step 7. Run and report\n1. `run_node` on every node whose inputs are ready stage by stage: sources → images → clips → Video Editor last. Pre-run check (Step 5) before each stage. Keep each `run_uuid` and `variation_uuid`; call `get_run_results`; while `in_progress`, call it again. **Never call run_node on a running node** (second paid run).\n2. **Picking a result.** A node with several results: when the user names one (\"take the second\", \"the first one\"), set it yourself on every node that uses it; don't send the user to tick it in Lyra. On a node with `image_inputs_usage` (video nodes): `update_node` with its whole `image_inputs_usage` from `get_workflow` and one field changed: references → `reference_result_image_uuids: [picked uuid]` (or the other results in `exclude_reference_result_image_uuids`); frames → `first_frame` / `last_frame` = `{\"node_uuid\": source node, \"image_result_uuid\": picked uuid}`. The results' uuids and their order (first, second…) come from `get_run_results` of the source node's run. Then `get_workflow` to check it held, and rerun what comes after it (pre-run check first). Only when the node has no such setting or the tool refuses: ask the user to tick it in Lyra and say why. Without a pick, the next stage uses Lyra's selected result; say which one went on.\n3. Run a stage only after its inputs have results; the Video Editor runs last.\n\n**Links in every report.** Never only file links. Two kinds of link, nothing else:\n- **Workflow:** `https://lyra.splitmetrics.com/workflows/{workflow_uuid}` (opens for anyone signed in to Lyra with access to the workspace; results in a variation: name the variation to open).\n- **Result:** the `url` from `get_run_results`, exactly as returned.\n- one video → the video link + the workflow link\n- several videos → the workflow link only\n- one image → the image link + the workflow link\n- several images → the workflow link only\nA video ad's final is the Video Editor result; clip links only when the user asks.\n\nReport:\n> Calmly · video ad · \"2 am\": done. Video: {video url} · Workflow: https://lyra.splitmetrics.com/workflows/{uuid}. Spent {x} credits · balance {X}. Character: result 1 went into the clip; say \"take the second\" to switch. Open the workflow to edit any prompt and rerun.\n\n- Name failed nodes: label, what it was asked to do, why if known, the fix you suggest.\n- When every node has a result, offer 2–3 next steps (new angle on the same concept, other sizes, other languages).\n- After the final result, run `lyra-result-check` straight away, without asking (free): it opens the result in a browser, checks the frames and measures the sound, and reports the problems with pictures and fixes. Never describe or grade a result you haven't seen; without a browser send the stage checklist (Part 2 → Quality gates) and ask what works and what doesn't. Refer to nodes by label, never by uuid.\n\n## Step 8. Verify output quality\nCheck final assets, not only job status: completeness (outputs, order, scenes, CTA) · message (hook, value, claims, language match the brief) · visuals (continuity, correct UI, no major defects) · audio (words, voice, pronunciation, sync, no clipping) · delivery (duration, 9:16, resolution, final render) · variations (intended differences visible) · reusability (inputs editable). Use Part 2 → Quality gates. Suggest fixes only for identified defects, within authorized scope and cost.\n\n## Follow-ups\n- One change (\"make her older\", \"faster music\"): `update_node` on that node, show the new prompt, pre-run check, rerun it and the nodes that depend on it (the rerun's credits in the same message, Step 6).\n- A new angle, persona, size or language: hand over to the matching skill.\n- Never delete or overwrite results the user may want: a new version goes into a variation (Variations above). `delete_node` only inside a variation you just made for this version, or when the user asks.\n\n## Runtime failures\nSee Reference G. In short: validation_error → fix with listed values · run failed → name it, one retry with a changed prompt or model and its credits · in_progress → poll again · not enough credits → stop, show the balance and what's missing, offer cheaper (Step 6) · model refused content → tell the user, don't rephrase around it · file without public link → ask for a link or upload in Lyra.\n\n## Base prompt rules\nYou write every prompt, and each lives in its node's prompt field, where the user reads, edits and reruns it. Write for the model and for the person.\n- Self-contained: no \"same as above\", no references to the chat.\n- Concrete and renderable: things the model can show or say, not marketing concepts.\n- The user's own words for the subject and anything they specified stay as given.\n- Settings (ratio, duration, resolution, voice, audio) go in node settings, not in the prose.\n- English, unless text must appear or be spoken in another language. Exact on-image or spoken text in quotes.\n- No placeholders, alternatives or \"if\" branches in a final prompt.\n\n## Common mistakes (every skill)\n| Mistake | Prevention |\n|---|---|\n| Builds or runs before concept and plan are approved | Steps 1–3 first, always |\n| Asks about the price or the run as a separate question | Cost goes into the one approval message; the yes starts the run (Steps 3, 6) |\n| run_node on a running node | Poll get_run_results |\n| Plan without a cost, or a run without reading the nodes' credits | Reference A → Credit prices in the plan; node `credits` before the run |\n| Runs with lost connections, or over the user's canvas edits | Step 5 pre-run check before every run |\n| Sends the user to tick a result in Lyra | Step 7: set the picked result yourself |\n| A new workflow for a new version of the same ad | Create variation of the same workflow, delete what this version doesn't need (Variations) |\n| Only file links, or no workflow link | Step 7 links |\n| Invents app features, UI, numbers or reviews | Only the app card; without screenshots keep the screen out of view |\n| Swaps the user's explicit choice for a default | Instruction order; mention the trade-off once |\n| On-screen text or captions in video prompts | Text in the script, marked for post |\n| Re-describes the look in a video prompt with a first frame | Motion only; the frame sets the look |\n| Leaves connections for later, so \"run all\" breaks | Connect the full graph in step 4; frames at the video's ratio |\n| Splits a short ad into a node per micro-scene | One clip by default; split only for the listed reasons |\n| Voiceover longer than its clip | Reference C pacing; VO ~1 s shorter than the video |\n| Values the model doesn't list | Copy from list_node_configs |\n| Nodes for takes of one idea, or count for different ideas | Ideas → nodes; takes → count |\n| Prompts that point back to the chat | Self-contained prompts |\n| Reruns an unchanged prompt as a fix | Change prompt or model; say what changed |\n| Describes or grades results it can't see | Ask the user with the stage checklist |\n| A forbidden claim from the Brand Kit, a political line or a dig at a competitor | Brand safety (Reference B): forbidden claims enforced absolutely |\n\n---\n\n# Part 2. Video ad generation: what's specific\n\n## Description\nCreates multi-scene video ads for mobile app paid ads in Lyra, SplitMetrics' node-based creative canvas, leaving a generated, reusable workflow on the canvas.\nUse when the user asks for \"a 15-second video ad for my app\", \"a 30 s / 1 minute ad\", \"a sequence of scenes\", \"stitch these clips together\", or hands over a script or storyboard.\nWorks from a Lyra brand kit or app details in chat, app screenshots, a script, a reference ad (through the Creative Analysis node), or an existing workflow.\nNot for: a UGC creator video (the UGC skill), a hook only (the hook skill), static images (the image skills). Those skills use this skill's rules for scripts, scenes, audio, consistency and de-slop.\n\n## Quality bar\nStops the scroll in the first 1.5–3 s, shows only real app features and real screens, reads as one consistent film (same person, place, light), sounds natural (voice not rushed, music without vocals under speech), no AI-slop look, and works with sound off.\n\n## Inputs and defaults\n**Required (ask if missing):** the app (brand kit or app card) · what the ad is about or the idea, if the user has one · app screenshots, if the ad shows the app.\n**Defaults (the recommended options in the intake quiz; if the quiz is skipped, state them in the plan):** Reels / TikTok · **9:16** (16:9 only if asked) · **15 s** · English · voiceover on · music on (instrumental, its own music node in the Video Editor; never inside a clip where someone speaks) · **Seedance 2.5** recommended for real people, **Seedance 2.0** for illustration / UI-heavy · **720p** by default (1080p only when the user picks it, with its price) · ask which model and quality the user prefers in the intake quiz, with your recommendation and why · **sound on** at generation (mute in the Video Editor if needed) · Nano Banana Pro for keyframes · 1 result per node.\n**Run:** everything after the one yes, in stage order (Step 6).\n\n## Concept\nA good concept names one pain the audience recognises, in their words, and shows the app solving it with one real feature, one beat per scene, CTA at the end. It also says **why** it should work: the user is trying to learn what works and why (System Preamble). Write it as the hypothesis + beats:\n> Video, 15 s. We believe students who can't switch off at night will start a trial because a relatable 2 am POV shows the wind-down timer working. 0–3 s hook: \"POV: 2 am, brain won't stop\", tired face in phone light · 3–11 s she starts the timer (real screenshot), shoulders drop · 11–15 s eyes close, CTA \"Try it tonight\". Voice: tired, warm. Music: soft lo-fi, instrumental.\n\nBrief, structure, scene fields, timing and montage rules: Reference B.\n\n## Best way to build it\nThe user's explicit choices override any column. Model choice and price rules: Reference A.\n\n| If the request has | Best approach (graph) | Models | Why |\n|---|---|---|---|\n| **Nothing specific (default)**, real people, ≤30 s | character image (+ phone image with the real screenshot if the app is shown) → **one** multi-shot clip ≤30 s with both as **references** → VO + music → Video Editor | seedance-2.5 · nano-banana-pro | fewest nodes, one consistent look; Seedance holds identity from references |\n| UGC / creator talking to camera | hand over to the UGC skill; if it runs here: Seedance 2.5 only, never Kling or Veo | seedance-2.5 | Seedance is clearly better at people |\n| 60 s or longer than 30 s | full script → two 30 s parts (or split text) with the same character and style references → two clips → Video Editor | seedance-2.5 | no model makes 60 s in one clip |\n| Illustration, cartoon, stylized, moving text | keyframe per scene → clip with image as **frame** | seedance-2.0 | holds style; frames keep the picture exact |\n| The app's UI on screen | user screenshots → phone image (character + screenshot) → short clip, or UI insert laid over in Video Editor (Reference D) | seedance-2.0 (frames) or seedance-2.5 (refs) | models break UI in long busy clips |\n| Exact start and end frame, complex multi-shot | first + last frame per clip | kling-v3-video (Pro) | precise frame control (not for UGC) |\n| Very short product / nature shot, ≤8 s | references → one clip | veo-3.1 | realism; max 8 s, used rarely |\n| Copy a movement from a reference video | character image + motion video | kling-v3-motion-control | motion transfer |\n| A reference ad to adapt | Upload Video → Creative Analysis → script (written by you from its output) → as default row | as default row | keeps the mechanism, not the identity |\n| Many drafts / tight budget | draft model for tries, rerun the winner on the recommended model | seedance-2.0-fast, veo-3.1-lite | spend on the winner only |\n\n## Prompt rules\n\n| Node | Write | Avoid |\n|---|---|---|\n| Image (keyframe) | concept in 2–3 words → subject → action → setting → framing → light → color/lens → mood → style → visible details → exclusions in plain words. ≤500 chars. The moment it shows (start of the motion if used as first frame). | abstract adjectives; text; drawing the user's logo or UI |\n| Video with a frame | motion only: what moves, camera move, pacing, end state; spoken line in quotes if the model speaks | re-describing the look; on-screen text |\n| Sound line (every clip) | **no music in a clip where someone speaks** (Reference C). With speech: \"Sound: dialogue and the natural sounds of the scene only (room tone, steps, a door, a cup on the table); no music, no background music, no soundtrack, no score, no song, no humming\". Add \"background music\" to the Avoid line too. Without speech: no music ban needed (music from the generator can be muted in the Video Editor); with a separate voiceover and nobody speaking on camera: \"no speech, no voice\" | a clip with speech and no sound line (the model adds its own music under the voice) |\n| Video with references | who is who first (\"[Image1] is the character's face and outfit, [Image2] is the phone screen\"), then scene and motion; must-keep identity early | mixing frames and references on Seedance; unassigned references |\n| Video without image | full scene as for an image, then the motion | more than one scene per clip unless multi-shot with \"cut to\" |\n| Voiceover | exact words only, one continuous text, numbers as spoken, sized to the video at the right pace, ~1 s shorter than the video | stage directions, labels, brackets; lines longer than the clip |\n| Music | genre, era, BPM, instruments, energy curve (hook hit → build → CTA resolve), \"instrumental only, no vocals\" when anyone speaks, length = video + ~5 s | artist names; vocals under speech; length equal to the ad |\n\n**Prompt length:** one shot 60–150 words (sweet spot 80–120); image-to-video 40–60% shorter; over ~300 words later instructions get ignored. Non-negotiables first.\n\n**The 5 rules that matter most here:** (1) one scene, one main action, one camera move; (2) anchors repeated word for word in every prompt (Reference E); (3) no generated text or UI, ever; (4) style from the brief, phone-real for UGC, no \"stunning 8K\" adjectives; (5) plan the end frame of every clip.\n\nFull prompt craft (nine blocks, video formula, camera, light, materials, physics, phrase bank, worked example, checklist): Reference F.\n\n## Common mistakes (this skill)\n| Mistake | Prevention |\n|---|---|\n| Image connected as first/last frame on Seedance 2.5 (error) | Seedance 2.5 = references only |\n| Character's face changes between scenes | Character image first, passed as reference to every scene; same model for all clips |\n| UI on the phone garbled or invented | Real screenshots only; phone image + UI insert (Reference D) |\n| 1080p used without the user choosing it | 720p by default; 1080p only when the user picks it in the quiz or asks, with its price |\n| Decides the idea, person, voice and music alone | Step 1 intake quiz with options from the Brand Kit; explain the plan in plain words |\n| Music fades out early / has vocals under the voice | Generate ~5 s longer, instrumental, trim in Video Editor |\n| Voiceover runs over the video | Words for (video − 1 s) at a calm pace; shorten text or faster voice, never regenerate video |\n| Artist name in the music brief (error) | Describe genre, tempo, mood |\n| Sound turned off at generation | Keep sound on; mute in Video Editor |\n| Kling or Veo offered for UGC | Seedance 2.5 always for UGC |\n| Claims a text brief/script node keeps the character consistent | A text doesn't make the character consistent; consistency = character image as reference + anchors |\n| Clips where someone speaks come with their own background music under the voice, a different track in each | The no-music sound line in every clip with speech + \"background music\" in Avoid; our music only as its own node in the Video Editor; a clip with speech that still has music is rerun |\n| Whole graph in one Section, uploads at the end | One Section per stage, left to right, uploads next to the node they feed (`lyra-workflow-layout`) |\n| Clips out of order in the Video Editor | Connect in playback order; after results check and set `startMs` |\n| Price guessed | Reference A rates in the plan, node `credits` before the run |\n| Too many references \"because the model allows it\" | Small, purposeful set; video/audio refs only on request |\n| Captions added without asking, too big, or over a face | Ask in the approval message; `lyra-video-editor` → Captions: size 80, y = 1440 (75%), under the face |\n| A 1-minute clip promised | Hard limit; two halves or split, joined in Video Editor |\n| Same prompt rerun after a failure | Change the prompt, reference or model; after two fails rewrite the scene |\n\n## Quality gates\nAfter each intermediate stage Claude sends the stage checklist (the final result is checked by `lyra-result-check`) and asks the user what they like and what they don't (Reference H has the full slop list):\n- **Stage 1 (images):** same person in every keyframe · hands and phone natural · screen exactly like the screenshot · style right (phone-real for UGC) · nothing plastic or over-glossy.\n- **Stage 2 (clips):** no music inside any clip where someone speaks (ask the user to listen, Claude can't hear) · face and outfit stable within and across clips · no morphing, flicker, warped hands · natural motion · UI correct while tapping · ends on the planned frame.\n- **Stage 3 (final):** hook in 1.5–3 s · scenes in order, CTA at the end · voiceover not rushed, ends before the video, app name pronounced right · under speech only our music from the Video Editor, instrumental, trimmed with a fade · 9:16, planned resolution (720p by default), planned length · captions (only if the user said yes) size 80, at 75% of the height, never over a face (`lyra-video-editor` → Captions) · other text inside the safe zone.\nPass = the user is happy with every point that applies. Fix only what fails, within the agreed budget, with its credits.\n\n---\n\n# Reference library\n\n## A. Models, prices and settings\n\nAlways call `list_node_configs` first: it is the live source of models, durations, resolutions and limits.\n\n**How to offer a model.** Recommend **Seedance 2.5** (real people) or **Seedance 2.0** (illustration, stylized, UI/UX). Say plainly: \"This is the more expensive option, but it gives the best quality for this video.\" Give the cost in the plan (Credit prices below). Always ask which model the user prefers before building (in the plan, step 2–3). Seedance 2.5 and 2.0 always come before any Kling. **UGC and real people talking: always Seedance 2.5, never Kling or Veo**; if the user wants cheaper, say the quality on faces and speech will drop and let them decide.\n\n**Cheaper ladder** (one step at a time, show the new price, skip models bad at the task): Seedance 2.5 / 2.0 → Veo 3.1 (only clips ≤8 s) → Kling 4.0 (only once it is in Lyra's list) → Kling 3.0 Pro → Kling 3.0 Standard → Veo 3.1 Fast → Seedance 1.5 Pro (short lip-sync only) → Seedance 2.0 Fast → Kling 2.6 → Kling 2.5 Turbo Pro → Veo 3.1 Lite / Seedance 2.0 Mini. Drafts first, final later: test ideas on a draft model, rerun only the winner on the recommended one.\n\n**Task → model:** real people, UGC → Seedance 2.5 · illustration, cartoon, UI/UX, moving text → Seedance 2.0 · product / nature realism, ≤8 s → Veo 3.1 · exact first + last frame, complex multi-shot → Kling 3.0 Pro · motion transfer → Kling 3.0 Motion Control Pro (Standard cheaper) · same character with video and voice refs → Kling Video 3.0 Omni · short lip-sync with synced audio → Seedance 1.5 Pro · campaign character consistency → Runway Gen-4.5 · strong physics → Sora 2 Pro (Sora 2 for drafts) · edit an existing video by chat → Gemini Omni · talking head (face + audio) → veed/fabric-1.0 (720p).\n\n**Model cards (Lyra, Oct 2026)**\n- **Seedance 2.5** (flagship, real people): 4–30 s or `adaptive` (fits length to the dialogue/script); the only Lyra model up to 30 s. **References only: never first/last frame (the fields exist but error out).** Technical max 30 images / 10 videos / 10 audio, never pushed (see reference policy). Refs are named [Image1], [Image2]… in the prompt. Default 720p (our default too; 1080p only on the user's choice). Angle and details can shift.\n- **Seedance 2.0** (illustration, UI/UX): 4–15 s, `-1` = intelligent duration. Image as **frame** (start/end; picture kept exactly) or **reference** (looser), never both in one node. Rule: image with UI or any text → frame; no text and exactness not important → reference; unsure → ask. Technical max (per list_node_configs) 9 image / 3 video / 3 audio refs, never pushed. Default 720p (ours too; 1080p on the user's choice). Fast and Mini: cheaper, max 720p, drafts.\n- **Veo 3.1:** 4/6/8 s (max 8), references (≤3) like the others, 9:16 default. Best realism, product, nature. Used rarely, only very short clips. Fast / Lite: cheaper, frames only.\n- **Kling 3.0 Pro / Standard:** 3–15 s, first frame and/or last frame only, no references. Multi-shot, complex scenes, cartoon/stylized; weaker than Seedance on faces and human motion; cheaper than Seedance.\n- **Kling 3.0 Motion Control Pro / Standard:** image + reference video 3–30 s (`character_orientation: video` up to 30 s, `image` up to 10 s). References with clear hands, head and body; avoid complex angles and blocked limbs.\n- **Kling Video 3.0 Omni:** up to 7 reference images (4 with a video ref), first/last frame, 3–15 s; native audio can't be combined with a reference video.\n- **Kling 2.6:** 5/10 s, first frame, native audio. **Kling 2.5 Turbo Pro:** 5/10 s, fast, cheap, no audio. **Seedance 1.5 Pro:** 5/10 s, lip-sync, dialogue.\n- **Sora 2 / 2 Pro:** 4/8/12 s, first frame only. **Runway Gen-4.5:** 5/10 s, first frame.\n- **Kling 4.0** (launched 16 Oct 2026): 3–30 s, up to 10 keyframes, stereo audio, cheaper than Seedance. Not in Lyra yet; offer only when list_node_configs shows it, and never ahead of Seedance for people.\n- **Images:** Nano Banana Pro for finals (text, UI, people, realism, sharp), Nano Banana 2 for drafts.\n\n**Settings in the Video Generation node:** model → seconds (or adaptive) → aspect ratio 9:16 (confirm) → quality **720p by default** (offer 1080p in the quiz: sharper faces and details, ≈ 2.4× the price) → sound **on** → how images connect (frame or reference, by model).\n\n**Reference policy.** Limits are a technical maximum, not a target: many extras make the model unpredictable. Never tell the user how many references a model takes or suggest adding many. Default references = the images you generated (character, keyframe, product, UI). Write the montage yourself in the script; a video reference only when the user asks or the brief requires copying an edit (it works only as an editing reference). An audio reference only when the user brings a track (the video is fitted to it).\n\n**Longer than a model allows (e.g. 1 minute).** Say honestly no model makes it in one clip (30 s Seedance 2.5, 15 s others, 8 s Veo). Offer: (A) two 30 s videos from the same idea and image, joined in the Video Editor; or (B) the full 60 s script split into two 30 s parts (check each part's length), the same reference(s) or a few style references for both, two videos in one style, joined in the Video Editor. Same model, character, style anchor, voice and music in both halves. Always tell the user first that this is possible and how.\n\n**Credit prices** (Lyra, Oct 2026; credits per run, rounded up; a node's `credits` in `get_workflow` is always the final word):\n\n| Node | Price |\n|---|---|\n| Seedance 2.5 | 720p: 28.5 per second · 1080p: 67.5 per second · `adaptive` counts as 30 s |\n| Seedance 2.0 | 720p: 27 per second · 1080p: 67.5 per second |\n| Seedance 2.0 Fast | 720p: 22.5 per second |\n| Kling 3.0 Pro / Standard | 50.4 / 37.8 per second |\n| Kling 3.0 Motion Control | ≈ 54 per second |\n| Kling 2.5 Turbo Pro | ≈ 10.5 per second |\n| Veo 3.1 | 1080p: ≈ 60 per second |\n| Nano Banana Pro 2K / Nano Banana 2 1K | 23 / 11 per image |\n| GPT Image 2 / Ideogram 3.0 Turbo | 20 / 5 per image |\n| Music (ElevenLabs) | 1.25 per second of the track |\n| Voiceover · AI text node | ≈ 2 · 1 |\n| Video Editor, uploads, notes | 0 |\n\nCount multiplies the price; ratio, sound on or off and frames vs references don't change it. Example (default build): character 23 + phone shot 23 + 15 s Seedance 2.5 720p 428 + 20 s music 25 + VO 2 ≈ **500 credits** (at 1080p the clip is 1 013, total ≈ 1 090). Models or settings not in the table: build, read the node, then tell the user.\n\n**Text nodes.** Claude writes brief, script, voiceover script and music brief itself into user text nodes (the AI text nodes can't be created with the tools). Exception: **Creative Analysis** (`pattern_import`): when the user brings a reference video and the node is available, use Upload Video → Creative Analysis and write the script from its output.\n\n**Video Editor and captions → `lyra-video-editor`.** The Video Editor is the `video_composer` node (0 credits). Assembly (order, trims, layers), the mix (VO, music volume, trim, fade-out, clip sound), the end card, on-screen text, captions (ask first; size 80, 75% of the height, word check), speed, freeze frame, effects, transitions, safe zones, export, the pre-render check, the render and the 59 / 30 / 15 s cutdowns all live in `lyra-video-editor`; follow it for stage 3.\n\n## B. Brief, script and scenes\n\n**Brief header:** app · platform · aspect ratio · length · language · voiceover · music · audience (Brand Kit).\n**Hypothesis:** \"We believe [audience] will [action] because [concept] addresses [pain] through [mechanism]\" (a whole concept, not one variable).\n**Then:** angle (≤100 chars) · summary (≤200) · hook mechanism · hook line (≤80; on-screen version ≤40) · value proposition (≤150) · proof point (Brand Kit or user only) · tone · offer · CTA (≤30) · format · image style · palette · must include / exclude · reference notes.\n**Competitor references:** keep the idea (concept, structure, hook, format); never their logo, colors, visuals or text.\n**Claims:** never invented, pricing included: no price, discount or offer that isn't listed in the Brand Kit or given by the user. AI people are never presented as real customers; testimonials only from real reviews. No body before/after for health or weight-loss apps. **Brand safety** (Lyra's System Preamble): nothing that could damage the advertiser's reputation; no profanity, no political statements, no unsubstantiated health claims, no competitor disparagement. The Brand Kit's **forbidden claims are enforced absolutely**: never in a line, a caption, a visual or the VO; if the user asks for one, say once that it is on the kit's forbidden list and leave it out unless the user confirms the kit is outdated.\n\n**Structures:** problem → agitate → demo → CTA (default) · hook → solution → social proof → CTA · POV / relatable moment → app as the fix → CTA · before/after of the situation · single continuous shot. Scene types: hook, problem, solution, social proof, offer, cta, logo end card. Brand only at the end.\n\n**Scene fields:** number + type · duration · visual direction (like an image brief: subject, setting, framing, angle, light, palette, mood, style, texture; no text; style per brief) · motion (one main action) · VO line · on-screen text ≤40 chars with position and animation, **marked for post** · music/SFX cue · transition · consistency (source scene, must match, allowed to change) · asset (screenshot, logo) · generation note · end state. Mark the hook scenes; give them the most detail.\n\n**Timing:** scene durations add up exactly to the total. A beat on screen is 1.5–5 s; a clip is generated at a length the model allows and trimmed in the Video Editor. UI clips ~4 s. Hook within ~1.5 s (Reels/TikTok) to 3 s (Feed). 5 s clip beats: 0–1 establish · 1–3 action · 3–4 peak · 4–5 resolve.\n\n**Montage:** written by Claude in the script (shots, order, length, cuts). Default: the shots live inside one clip with explicit \"cut to\" markers. Separate clips joined in the Video Editor only for the reasons in Step 2 (over 30 s, UI insert, different models or frames, a failed shot, the user asks).\n\n**Keyframe:** the frame that starts the scene (start of the motion when used as first frame; the peak goes in as last frame on frame models). Generated at the video's ratio.\n\n## C. Audio: voiceover and music\n\n**Voiceover.** Write it yourself (from the script and Brand Kit) into a \"VO script\" text node, then an audio voiceover node (`elevenlabs/v4`, Lyra's recommended voiceover model; `elevenlabs/v3` also listed; voice from `list_voices`).\n- Exact spoken words only: no scene labels, timestamps, \"Hook:\", \"VO:\", \"[pause]\", \"(upbeat)\", brackets, asterisks, slashes, markdown, separator dashes. Allowed: comma, period, ellipsis, ?, !. Pause = comma or ellipsis.\n- One continuous text joining the per-scene lines; rhythm shows the pace; the words carry the tone (never describe it).\n- No invented claims. The user's direction wins (tone, length, focus, language, style).\n- **Pace (English):** 2.5 words/s conversational (default), 3.0 fast/energetic, 2.0 slow/emotional.\n- **Always ~1 s shorter than the video** (15 s video → 14 s VO ≈ 35 words, calm, not rushed). Check the real audio length after generating. Too long → cut words or a faster voice; never regenerate the video for the voiceover.\n- **Voice:** filter by language, accent, gender, age, use case; pick by the voice description to fit the audience and tone; play a sample; reuse the same saved voice across a campaign.\n- **Languages:** same script, new VO script \"Speak in <language>\" + its own voiceover node with a voice in that language; run in parallel; match each in the Video Editor; check each language's length (translations run longer).\n\n**Music.** Write the music brief from the script's mood; music node `elevenlabs/music` by default (Lyria 3 / Lyria 3 Pro if asked).\n- Prompt: genre, era, BPM, key/mood shift, instruments, sync points (hit on the hook, lift on the reveal, resolve on the CTA), hook in the first 2 s, fade-out. Example: \"Dark-to-hopeful cinematic electronic underscore, 110 BPM, D minor shifting to F major at the CTA; pulsing synth bass, metallic percussion, risers and impacts on the press, resolving into clean uplifting synth chords. Instrumental only, polished modern mix, smooth 1 s fade-out.\"\n- **Anyone speaks in the video → instrumental only, no vocals, no singing, no humming.** Keep `force_instrumental` on.\n- **Length = video + ~5 s** (10 s video → 15 s track, `music_length_ms`), trimmed in the Video Editor, because the fade starts early.\n- **No artist names** (they can error). Check the script too.\n\n**No music in a clip where someone speaks (fixed rule).** Video models, Seedance above all, add their own background music when the prompt leaves room: some clips get it, some don't, and every clip gets a different track. When a person speaks on camera that music is baked into the voice: it can't be removed or muted without losing the dialogue, and under our score it becomes two tracks playing at once. So:\n- **Every clip with speech** (dialogue, a person talking to camera, a line in the clip, an in-clip narrator) gets this sound line: \"Sound: dialogue and the natural sounds of the scene only (room tone, steps, a door, a cup on the table); no music, no background music, no soundtrack, no score, no song, no humming\". And \"background music, soundtrack\" in its Avoid line.\n- **Clips without speech:** no ban needed. If the generator adds music, that's fine: in the Video Editor the clip's sound can simply be muted and our music laid instead. With a separate voiceover and nobody speaking on camera, write \"no speech, no voice\".\n- **Allowed in a clip with speech:** the voices, the sounds of the action (a door opening, steps, a phone buzz, a kettle, a crash), room tone and ambience. Not allowed: any music, song, humming or jingle under the voice.\n- **Our music is its own music node** (instrumental when anyone speaks), on its own track in the Video Editor, under the dialogue.\n- **Sound stays on at generation** (the voices and scene sounds are needed), so the prompt is the only guard. After the clips run, ask the user to listen for music inside the clips where someone speaks. Such a clip that came back with music anyway is rerun with the same sound line (its credits in the same message): muting it would mute the voice too.\n\n**Mix in the Video Editor:** `lyra-video-editor` → Audio (voice first, music under speech, trim and fade, which clips are muted).\n\n## D. App UI in the video\n\n- Use as little UI in video as possible; **never invent UI**. Seedance 2.5 / 2.0 often break UI in long busy clips.\n- If the screen is needed, ask: \"Please send screenshots of the app screens you want in the ad.\" Screenshots only, never a screen recording. No screenshots → screen dark, blurred or turned away.\n- **Phone image:** a second image node: \"the same character holds the phone close to camera, screen facing us\"; connect the main character image and the user's screenshot. Run it, then ask the user: \"Is the UI exactly like your screenshot (layout, text, colors, logo)? Same person, hands and light?\" Rerun the image before any video if not.\n- **Way 1, one clip** (about 10 s, max 15 s): connect the character image and the phone image to the video node (Seedance 2.5 as references; Seedance 2.0 as frames, because there is text; Kling as first/last frame).\n- **Way 2, UI insert:** if the UI came out bad but the rest is fine, make a short clip from the phone image (screen + finger tapping or scrolling, a few seconds) and lay it over the broken part in the Video Editor (layer above, trimmed to the moment). Plan Way 2 from the start when the UI moment is long or important.\n- Show one key screen or \"aha moment\", not a full walkthrough. Ask after every UI result; fix only the broken part.\n\n## E. Consistency between scenes\n\n- **Anchors** defined once and repeated word for word in every prompt: character (age, face, hair, skin, outfit, accessories), environment (place, time of day, light direction and color), style (palette from the Brand Kit, grading, look, lens), product/phone (device, case, screen from the screenshot).\n- Per scene: **source scene** (earliest that set the element) · **must match** · **allowed to change**.\n- One image model for all keyframes, **one video model for the whole ad**, one ratio and resolution.\n- **Character first, connected everywhere:** the character image is generated in stage 1 and **connected at build time as a reference to every image and video node that shows the person**, so the graph stays consistent even with \"run all\". If the user wants to choose between several characters, run stage 1 first; they name one and Claude pins it on every node that uses it (Step 7); the connections are already there. A text brief alone never makes images consistent. Two characters for A/B: one script, two character images, two videos.\n- **By model:** Seedance 2.5 references (roles per [ImageN]); Seedance 2.0 frame for exactness / UI, reference for looser; Kling first/last frame; Omni references + video ref.\n- Frames pin to the **selected** result; reconnect after regenerating a keyframe.\n- **Hand-off:** write each clip's end state; the next scene starts from it; keep motion direction across cuts; match cuts, whip pans and cuts on action hide small differences.\n- **When it breaks:** strengthen the reference and move the anchor earlier, shorten the prompt, reduce motion; a reference leaking light or framing → state its job or drop it; two failed tries → simplify the scene in the script.\n\n## F. Prompt craft\n\n**Image, nine blocks:** concept (2–3 words) → main subject and what it does → context → lighting → color and technique (palette, lens) → mood → composition (front, back, sides) → style (if you name a director, also describe the look) → visible details.\n\n**Video formula:** SUBJECT → ACTION → CAMERA → ENVIRONMENT → LIGHT → MATERIALS → PACE → EMOTION → ENDING → CONSTRAINTS. A framework, not a template; one coherent direction, not a stack of tags.\n- **Action:** one clear change of state + a few natural secondary moves. Weak: \"a woman with a phone\". Strong: \"she glances at the notification, her eyebrows lift, and a small smile spreads as she turns the phone toward the camera.\"\n- **Camera:** a move for a reason: static (control), slow push-in (intimacy), pull-out (scale), tracking (follow), orbit, pan, tilt, crane, handheld (UGC presence), whip pan (energy), rack focus. Subject motion and camera motion stated separately.\n- **Framing:** eye level (natural), low (power), high (distance), overhead (geometry), three-quarter (volume), profile (silhouette); shot size; subject placement in the central 65% of 9:16.\n- **Light:** one main approach + 1–2 supporting (soft diffused, hard directional, Rembrandt, backlight, rim, golden hour, blue hour, volumetric).\n- **Palette:** one dominant, from the Brand Kit, kept across scenes; shift only if the shift is the story.\n- **Materials:** how they react to light and motion (glass reflections stay coherent; heavy fabric doesn't float).\n- **Physics:** cause and result (fabric settles, hair follows the head, a thumb really presses the screen).\n- **Pace:** slow deliberate, fluid, sharp, energetic, weightless; matched to the scene.\n- **Lens and focus:** 24mm wide, 35mm environmental, 50mm natural, 85mm tight, macro; say what is sharp at each key moment. Guidance, not guarantees.\n- **Finish:** clean digital (precise detail, natural skin) or analog (fine grain, halation); UGC = phone camera, natural light, slight handheld.\n- **Ending:** plan the final frame (eye contact, product centered, phone to camera, brief hold).\n- **Image-to-video:** bring the image to life, don't replace it; preserve composition, face, outfit, light; limited movement (blink, breath, gaze, small head turn, restrained push-in); \"no new objects, no scene transition, no wardrobe changes\".\n- **Rules:** one scene one idea · action beats adjectives · camera move needs a reason · complexity fits duration · light interacts with materials · no conflicting styles · constraints short and prioritized · clarity beats length · plan the final frame · consistency before spectacle when identity, product or UI matter.\n- **Phrase bank:** smooth: \"fluid motion, slow deliberate movement, graceful follow-through\" · identity: \"preserved facial features, consistent wardrobe, stable character appearance\" · realism: \"natural inertia, believable body mechanics\" · product: \"precision product cinematography, controlled reflections, macro detail\" · light: \"soft directional lighting, subtle rim light\" · UGC: \"shot on phone front camera, natural window light, slight handheld wobble, casual, unpolished\" · ending: \"controlled final pose, brief visual hold\".\n- **Pre-generation check:** subject clear · identity preserved where needed · main action explicit · camera defined · composition and location fit · light and palette coherent · hands, hair, objects plausible · pace fits duration · final frame intentional · key unwanted changes constrained · settings match the model · nothing contradictory.\n\n## G. Errors\n\n| Problem | Fix |\n|---|---|\n| Seedance 2.5 errors with an image | It was a frame → reconnect as reference |\n| Seedance rejects inputs | Frames and references mixed → pick one |\n| Video ignores the script or image | Connect both to the video node |\n| Video stays on the old image | Keyframe regenerated → reconnect it |\n| Duration rejected | Use a listed value (model first, then seconds) |\n| User wants 1080p | Set `resolution: 1080p` (Seedance 2.5 / 2.0); 2.0 Fast / Mini can't do 1080p |\n| Music node error | Artist name → describe genre, tempo, mood |\n| Vocals under the voice | Instrumental only, force_instrumental on |\n| Music fades early | Generate ~5 s longer, trim |\n| Voiceover too long | Shorten to (video − 1 s) or faster voice |\n| Clip audio clashes | Clip without speech: mute/lower in Video Editor |\n| Music inside a clip with speech | Can't be removed: rerun the clip with the no-music sound line (Reference C) |\n| Clips in wrong order | Disconnect and reconnect in playback order |\n| UI garbled | Phone image + UI insert (D) |\n| Face drifts | E → \"When it breaks\" |\n| Text appears in video | Remove it from the prompt; text goes on in the Video Editor |\n| Longer than the model allows | Two halves or split script (A) |\n| Kling 4.0 asked for | Not in Lyra yet; offer Seedance 2.5 |\n| Two failed tries | Rewrite the scene in the script; if the image confuses the model, use it as a reference instead of a frame (where allowed); never rerun unchanged |\n\n## H. De-slop\n\n**Prevent:** style from the brief (UGC phone-real, not \"premium cinematic\") · real skin (\"natural skin texture, visible pores\"), never \"flawless\" · lived-in places with 2–3 specific details · no \"stunning, 8K, masterpiece, hyper-realistic\" · simple hand actions, one object in hand, hands visibly touching · faces frontal or three-quarter, one person in focus · one action, one camera move, physical cause and result · no generated text, UI or logos · a short constraints line. Images: \"text overlays, captions, watermark, blurry, low quality, distorted faces, extra limbs\". Video: \"text generation, on-screen captions, morphing faces, identity drift, outfit change, flickering, jitter, warped hands, unstable geometry, sudden camera jumps\" + 1–3 scene risks. If the model has no negative field, put a short \"Avoid …\" line at the end of the prompt.\n\n**Slop signs:** faces (plastic skin, identity change, morphing, dead eyes) · hands (extra or merged fingers, passing through objects, floating phone) · motion (rubber limbs, sliding feet, floaty movement, jitter) · text/UI (garbled letters, invented or changing screens, warped logo) · scene (flicker, objects popping, melting background, warped lines) · look (over-glossy, over-saturated, stock vibe, wrong style) · audio (robotic or rushed voice, wrong app name, VO over the video, vocals under speech, abrupt music end) · edit (mismatched cuts, wrong order, CTA cut off, text outside the safe zone).\n\n## I. Brand Kit\n\nEvery brief, script, prompt, voice and music direction is built on the Brand Kit: audience first, then product, value, tone, colors, claims, forbidden claims (enforced absolutely), must include / exclude. Source order: the chat → the kit connected to the workspace / workflow → ask (send it, or check and connect one of the workspace's kits). The user's chat request always wins; the kit fills everything they didn't say; mention a conflict in one line.\n\n## J. App ads on Meta (what works)\n\n- Vertical 9:16 video first (Reels and Stories carry most app-install volume); 15–30 s; a hook that shows the app working, not a logo.\n- 3–5 hook variants per concept; test one variable at a time; 2–3 new concepts a month (creatives fatigue in days to weeks); Advantage+ app campaigns need several different concepts.\n- Formats that convert: UGC style (phone-shot, person to camera) beats polished brand video on cold traffic · problem → agitate → demo → CTA ending on the key screen · real people using the app · one simple key screen, not a walkthrough · before/after of the situation · specific, plausible social proof from the Brand Kit.\n- Hook in ~1.5 s (Reels/TikTok), by 3 s (Feed); no dead air; no logo intro. Hook rate (3-s views ÷ impressions) >30% good, <20% weak.\n- Length: Reels 6–30 s (15–20 s safe), Stories 6–15 s, Feed 15–30 s (4:5 or 1:1 as a later variant).\n- Sound off: most viewers watch muted → recommend captions for all speech when asking the user (`lyra-video-editor` → Captions: ask first), key message also on screen, same words as the VO; high-contrast, one consistent place, size 80, at 75% of the height under the faces; added in the Video Editor.\n- Safe zone: faces, the subject and headline text in the central 65% of 9:16, away from the top bar and the bottom CTA area. Captions are the exception: at 75% of the height, under the faces (`lyra-video-editor` → Captions).\n- CTA: a concrete offer (\"Try free for 7 days\") beats \"Download now\"; in VO and on screen in the last 2–3 s.\n- Judge creatives by trials, payers and day-7 retention, not only cost per install; give a test 2–3 weeks.\n"
}

SHA-256 of public snapshot: 80f4b1cbd54347bf6e7ec07e36cd6b588b2e44df584d7fa1976ecd12e240f2de