@kolbo/kolbo-code-linux-arm64-musl 2.3.0 → 2.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/bin/kolbo CHANGED
Binary file
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kolbo/kolbo-code-linux-arm64-musl",
3
- "version": "2.3.0",
3
+ "version": "2.4.1",
4
4
  "os": [
5
5
  "linux"
6
6
  ],
@@ -1,32 +1,22 @@
1
1
  ---
2
- version: 0.4.0
2
+ version: 0.5.1
3
3
  name: kolbo
4
4
  description: |
5
- Generate, edit, or analyze creative media via the Kolbo AI MCP server.
6
- Covers images (GPT Image 2, Nano Banana, Flux, ...), video (Seedance 2,
7
- Veo 3.1, Kling, Hailuo, ...), music (Suno), TTS (ElevenLabs), 3D,
8
- transcription, Visual DNA (character consistency), Marketing Studio
9
- (UGC + DTC ads + product photoshoot + marketplace cards),
10
- Creative Director (multi-scene batches), HTML artifact publishing
11
- (presentations, landing pages, dashboards), and the App Builder.
12
-
13
- Use when: "generate", "create", "make me a", "edit", "animate",
14
- "transcribe", "Visual DNA", "the same character", "UGC ad",
15
- "TikTok / Reels / Shorts", "unboxing", "product review", "TV spot",
16
- "Pinterest pin", "product photo", "lifestyle shot", "hero banner",
17
- "ad pack", "social carousel", "virtual try-on", "Amazon listing",
18
- "marketplace cards", "A+ content", "build a presentation/slide deck",
19
- "landing page", "dashboard / widget / game", "music / song / jingle",
20
- "TTS / voice", "sound effect", "3D model", "build me an app".
21
-
22
- Chain: train Visual DNA → use vdna_id in any DNA-aware tool;
23
- research-first → persist brand kit (.kolbo/brand-kits/) → DTC ads /
24
- product photoshoot / marketplace cards; generate frames (Creative
25
- Director) → animate each frame (generate_video_from_image).
26
-
27
- NOT for: video editing / FFmpeg work (use video-production skill),
28
- motion graphics (use remotion-best-practices skill), code editing,
29
- general chat outside media generation.
5
+ Generate, edit, or analyze creative media via the Kolbo AI MCP server:
6
+ images (GPT Image, Nano Banana, Flux), video (Seedance, Veo, Kling, Hailuo),
7
+ music (Suno), TTS (ElevenLabs), 3D, transcription, Visual DNA (character
8
+ consistency), Marketing Studio (UGC + DTC ads + product photoshoot +
9
+ marketplace cards), Creative Director (multi-scene batches), HTML artifact
10
+ publishing (presentations, landing pages, dashboards), and the App Builder.
11
+
12
+ Use when the user wants to generate, create, make, edit, animate, or
13
+ transcribe media: images, video, music, voice/TTS, sound effects, 3D models,
14
+ UGC or TV-spot ads, product / lifestyle / hero shots, Amazon or marketplace
15
+ listings, presentations, landing pages, dashboards, or 'build me an app';
16
+ or to reuse a character or brand (Visual DNA, brand kits).
17
+
18
+ NOT for: video editing / FFmpeg (use video-production), motion graphics
19
+ (use remotion-best-practices), code editing, or general chat.
30
20
  argument-hint: "[prompt-or-command] [--model <name>] [--image <path>] [--video <path>]"
31
21
  allowed-tools: Bash, Read, Write, Edit
32
22
  ---
@@ -45,10 +35,29 @@ Once per conversation, before any other Kolbo tool call:
45
35
 
46
36
  1. **Run `check_credits`.** If it fails with "Session expired" / "Not authenticated", ask the user to run `kolbo auth login` (or their branded CLI command like `sapir auth login`) and reload the editor.
47
37
  2. **If `list_models` returns empty**, MCP isn't wired — same fix.
48
- 3. Remember the credit balance for the session; don't re-check on every turn.
38
+ 3. Use the balance ONLY for the low-balance check at this moment. **Never quote a "credits remaining" number later in the session** — coding/chat usage also deducts credits, so any remembered or computed balance is stale. Report only what each generation cost (`credits_used`); if the user asks what's left, run `check_credits` fresh right then.
49
39
 
50
40
  If the user is on a whitelabel build (`sapir`, etc.), they must use their branded command — not `kolbo`. See `references/workflows/troubleshooting.md`.
51
41
 
42
+ ## 🎬 Confirm the Creative Brief BEFORE Generating (CRITICAL — read first)
43
+
44
+ Never fire a paid generation the moment the user says "make X". First **present the brief back as a confirmation the user can change** — this is the single most important interaction. It gives the user control over what gets created and what it costs, instead of silently spending credits on defaults.
45
+
46
+ **Before ANY paid image / video / music / speech / 3D generation**, unless the user has *explicitly* dictated every key parameter in this message, ask ONE labeled question (the UI renders it as an options card) confirming:
47
+
48
+ - **Model** — your recommended pick as the default option, plus 1–2 alternatives (with their credit cost).
49
+ - **Aspect ratio** — e.g. `1:1 / 9:16 / 16:9` (offer the sensible default first).
50
+ - **Count** — how many (1 / 4 / …).
51
+ - **Resolution / quality / duration** — where the model supports it.
52
+ - **Creative direction** — style / mood / scene, when the user was vague ("4 cats" → offer style options: photoreal / illustrated / cinematic / surprise-me).
53
+ - **Credit cost** — state the total (`✦ N credits`) right in the question so cost is never a surprise.
54
+
55
+ Then generate **only** with the confirmed parameters. If the user changes an option, use the change. This mirrors the approval-card flow: propose → let them adjust → confirm → generate.
56
+
57
+ **Only skip the brief confirmation when** the user's message already pins model + aspect + count + creative direction (e.g. "generate 4 photoreal tabby cats, 1:1, z-image/turbo") — then just state the cost one-liner and fire. A low credit cost is **not** a reason to skip: cheap ≠ no-confirmation. What matters is whether the user actually chose the parameters.
58
+
59
+ For multi-scene / batch work this pairs with `generate_creative_director` (see below) — still confirm the brief first.
60
+
52
61
  ## Routing Index — Read These Files on Demand
53
62
 
54
63
  | If the user wants to… | Read first |
@@ -104,6 +113,7 @@ Each `references/models/*.md` mirrors the matching skill prompt in `kolbo-api/sr
104
113
  | `upload_media` / `list_media` / `get_media` / `get_media_stats` / `favorite_media` / `unfavorite_media` / `delete_media` / `restore_media` / `permanently_delete_media` / `move_media` / `bulk_*_media` / `*_media_folder` | Media library — see `workflows/media-library.md` |
105
114
  | `create_visual_dna` / `list_visual_dnas` / `get_visual_dna` / `delete_visual_dna` | Visual DNA — see `workflows/visual-dna.md` |
106
115
  | `list_moodboards` / `get_moodboard` / `list_presets` | Style overlays |
116
+ | `search_stock_media` / `get_stock_sources` / `get_stock_categories` / `get_stock_collections` / `get_stock_asset` / `analyze_script_for_stock` / `import_stock_asset` | Stock library (free, no credits) — EXISTING photos / videos / 3D / SFX / music. For stock **music** use `search_stock_media` with `mediaType: "music"` (semantic vibe query, e.g. "uplifting corporate background") → `get_stock_asset` for downloads. The older `*_music_library` tools are deprecated adapters over this — prefer the stock tools. |
107
117
  | `chat_send_message` / `chat_list_conversations` / `chat_get_messages` | Kolbo chat with optional `media_urls` (up to 10 per call) |
108
118
  | `app_builder_*` (9 tools) | Full React app generation — see `workflows/app-builder.md` |
109
119
  | `publish_html_artifact` | Publish HTML / SVG / Mermaid to `sites.kolbo.ai`. Server dedupes by content hash. Strict CSP. |
@@ -140,12 +150,13 @@ A user-named tool — in any language — overrides every other rule. Recognized
140
150
  1. **Check credits** ONCE per conversation (Step 0). Skip if already checked.
141
151
  2. **Discover models** with `list_models` using a `type` filter — but **skip when the user names a specific model**.
142
152
  3. **Pick the model**:
143
- - User named one → use it.
153
+ - User named one → use it. Model identifiers resolve leniently — shorthand like `"z-image"` or `"nano banana 2"` auto-resolves to the exact identifier, so don't over-engineer exact-id lookups (`list_models` is still authoritative for constraints, caps, and pricing).
144
154
  - Auto-select → only from "Auto-selectable" section (models with a `summary`). Cheapest fit. Prefer `[RECOMMENDED]` when cost is similar.
145
155
  - Never auto-select from "Named-only" section.
146
156
  4. **Validate inputs** against model caps — see `references/workflows/cost-and-validation.md`.
147
- 5. **How calls work**: each tool blocks until generation is fully complete. Images: seconds. Video: minutes. Multiple tool calls in one response run concurrently. If a call times out, use `get_generation_status` with the returned generation ID.
148
- 6. **Share the URL** after success. Never fabricate URLs.
157
+ 5. **How calls work**: each tool blocks until generation is fully complete. Images: seconds. Video: minutes. Multiple tool calls in one response run concurrently. On hosts with live widgets the tool instead returns `submitted` instantly — the card updates on its own; you only need `get_generation_status` when a follow-up step needs the output URLs.
158
+ 6. **Checking status NEVER poll in a loop**: `get_generation_status` takes `wait=true` (blocks server-side until done, ~3 min) and `generation_ids` (check MANY generations in ONE call — returns `all_done` + which are still running). One `wait=true` call replaces any polling loop. If it comes back with some still processing, call it ONCE more with `wait=true` and the remaining ids.
159
+ 7. **Share the URL** after success. Never fabricate URLs.
149
160
 
150
161
  Model types for `list_models`: `text_to_img`, `image_editing`, `text_to_video`, `img_to_video`, `draw_to_video`, `video_to_video`, `elements`, `firstlastgenerations`, `lipsync-image`, `lipsync-video`, `music_gen`, `text_to_speech`, `text_to_sound`, `stt`, `text`, `3d_text_to_model`, `3d_image_to_model`, `3d_multi_image_to_model`, `3d_world`.
151
162
 
@@ -153,15 +164,17 @@ Model types for `list_models`: `text_to_img`, `image_editing`, `text_to_video`,
153
164
 
154
165
  Full tables + formulas in `references/workflows/cost-and-validation.md`. Quick rules:
155
166
 
156
- - **Skip cost confirmation** when the user already specified model + count + duration, OR when a single generation costs < 5 credits.
157
- - **Required cost confirmation** otherwise: one-line summary, suggest cheaper alternative if available, wait for confirm.
167
+ - **Skip the brief/cost confirmation ONLY** when the user's message already pins model + count + aspect + creative direction (see "Confirm the Creative Brief" above). Low cost alone is **not** a reason to skip cheap generations still get the one labeled confirmation unless the user chose the parameters.
168
+ - **Otherwise confirm** via the labeled-question card: the parameters + the credit cost, suggest a cheaper alternative if one fits, wait for the user's pick. Never fire on defaults the user didn't choose.
158
169
  - **Batch totalling 100+ credits**: run `check_credits` first.
159
170
  - **Quote real cost**: after firing, log `credits_used` (from the tool result) to `.kolbo/production.md` — never `base × count`.
171
+ - **Never state "credits remaining" from arithmetic** (opening balance − generation costs). Coding/chat usage deducts credits too, so the math is always wrong. Report cost only; if the user asks for their balance, call `check_credits` fresh at that moment.
160
172
 
161
173
  ## Rate Limiting & Batch Generation
162
174
 
163
175
  - `generate_image`: 30/min. All other generation tools: 10/min per type. 300/min global. `upload_media`: 300/min, no credit cost.
164
- - **⚠️ NEVER re-fire a generation you already called.** Aborted / timed-out calls still process server-side. Run `get_generation_status` before retrying.
176
+ - **⚠️ NEVER re-fire a generation you already called.** Aborted / timed-out calls still process server-side. Run `get_generation_status` (with `wait=true`) before retrying.
177
+ - **Tracking a batch**: check ALL in-flight ids in ONE `get_generation_status` call with `generation_ids` + `wait=true`. Read `all_done` / `still_processing` from the response — do not check ids one by one, and never re-call without `wait`.
165
178
  - **Batch ≤10 items**: output ALL tool calls in one response — they run concurrently.
166
179
  - **Bulk >10 items**: real-world ceilings — `generate_image` 8–10 in-flight, image-edit 5–8, video tools 3–5, `generate_video_from_video` 3, music/speech/sound 5–8. Fire one batch → wait → fire next. Persist every `generation_id` in `.kolbo/production.md`.
167
180
  - **`upload_media` external URLs first.** `files`/`source_images`/`image_url` only accept Kolbo-hosted URLs reliably; external URLs cause `400`.
@@ -194,6 +207,8 @@ Existing video → modify → **single `generate_video_from_video` call** with s
194
207
 
195
208
  **Use a TRUE video-to-video model.** Image-to-video models reject with `WRONG_MODEL_TYPE`. Valid: `wan/2-7-videoedit`, `happyhorse/video-edit`, `kling-video/o3-video-to-video`, or any model whose DB `type` includes `video_to_video` (use `list_models({ type: "video_to_video" })`).
196
209
 
210
+ **Motion-control / animate-move models invert the inputs**: `reference_images[0]` = the CHARACTER IMAGE to animate, `source_video` = the driving/reference video whose motion is transferred. Omitting the character image returns a `MOTION_CONTROL_INPUTS` error.
211
+
197
212
  **Do NOT** decompose into frames. **Do NOT** re-fire if the first call returned URLs.
198
213
 
199
214
  ## ⚠️ Character-Driven Video — Frames First, Then Animate (CRITICAL)
@@ -212,7 +227,7 @@ A generation can fail three ways. Treat ALL as failure:
212
227
 
213
228
  1. **Tool returns `error`** — explicit. Surface, suggest retry, log `generation_id`.
214
229
  2. **Tool returns `completed` but `urls` is empty** — silent failure (NSFW filter, model OOM, upstream 5xx). Tell user "completed without an output — retrying" and re-fire ONCE. Do NOT log to `.kolbo/production.md`. Do NOT claim it worked.
215
- 3. **Tool hangs / never returns** — MCP poll timed out. Call `get_generation_status(generation_id)` IMMEDIATELY. The server might be done.
230
+ 3. **Tool hangs / never returns** — MCP poll timed out. Call `get_generation_status(generation_id, wait=true)` IMMEDIATELY. The server might be done.
216
231
 
217
232
  **Always:**
218
233
  - Don't celebrate before reading the result. Verify `urls` is non-empty.
@@ -1 +1 @@
1
- 0.4.0
1
+ 0.5.1
@@ -8,9 +8,12 @@ Load this file when the user wants AI-generated **music** — full songs, lyrics
8
8
 
9
9
  **Kolbo MCP routing:** call `generate_music`. Suno is a model option — use `list_models({ type: "music_gen" })` to see versions. Pass `instrumental` and `duration` as separate params; pass the Style/Description text as `style` and the Lyrics as `lyrics`.
10
10
 
11
+ **Wants an EXISTING track, not a new song?** ("background music", "stock music", "royalty-free track") → don't generate. Use `search_stock_media` with `mediaType: "music"` (semantic vibe query — "tense cinematic pulse", "uplifting corporate background") → `get_stock_asset` for download URLs. Free, no credits. The older `*_music_library` tools are deprecated adapters over the stock library — prefer the stock tools.
12
+
11
13
  ## CRITICAL Kolbo Platform Rules
12
14
 
13
15
  - **Model version, duration, and instrumental toggle are MCP-tool params.** Don't write `v4.5`, `30 seconds`, or `instrumental: true` inside the prompt fields themselves.
16
+ - **Exact track length = `duration_seconds`** (clamped 5–300s). Only length-controllable models honor it (e.g. ElevenLabs Music, `music-v1`) — without it those models default to a ~10s track, so ALWAYS pass it for jingles/beds on those models. Suno ignores it and picks its own length.
14
17
  - Suno generations have **two separate input fields**: a **Style / Description** field (`style` param) and a **Lyrics** field (`lyrics` param). Output your prompt as **TWO separate fenced code blocks** so the user (and the tool call) know exactly what goes where.
15
18
  - Tell the user to run the prompt multiple times — Suno output varies significantly between generations, that's a feature. Use `num_generations` if the tool supports it, or fire 2–4 parallel `generate_music` calls.
16
19
 
@@ -85,7 +88,7 @@ Use Suno's section tags to control structure. Each tag goes on its own line, con
85
88
  ### Jingle / ad music (15–30s)
86
89
  - `style`: short, punchy descriptor (`upbeat retail pop jingle, female vocal, claps, glossy production, summer energy`)
87
90
  - `lyrics`: 2–4 short lines max, often just chorus
88
- - Pass the shortest `duration` the tool supports.
91
+ - Pass the shortest `duration` the tool supports — or, on a length-controllable model (ElevenLabs Music), pass the exact `duration_seconds` (e.g. `15` or `30`).
89
92
 
90
93
  ### Cinematic trailer / score
91
94
  - `style`: `cinematic orchestral trailer, swelling strings, taiko drums, hybrid choir, dramatic build, modern hybrid score`
@@ -13,18 +13,18 @@ Load this file when the user wants a **Seedance 2 / Seedance 2.0** (ByteDance) v
13
13
 
14
14
  - **First line ALWAYS declares shot structure**: total duration, shot count, aspect ratio. Example: `Total: 15s / 6 shots / 16:9`. Put it at the BOTTOM of the prompt too.
15
15
  - **Order inside each shot**: Subject → Action → Camera → Style → Constraints → (Audio/SFX if relevant).
16
- - **Prompt length**: aim for ~120–280 words TOTAL across all shots combined (not per shot). Shorter than ~120 words = random output. Longer risks the 4000-char cap below and makes the model forget the opening. For 6-shot prompts, keep each shot 1–2 tight sentences.
16
+ - **Prompt length**: aim for ~120–280 words TOTAL across all shots combined (not per shot). Shorter than ~120 words = random output. Longer risks the 8000-char cap below and makes the model forget the opening. For 6-shot prompts, keep each shot 1–2 tight sentences.
17
17
  - **Character lock**: if a character recurs, open with `same character throughout all shots` to stop identity drift.
18
18
  - **Max 3 shots per single-shot prompt; max 6 shots in a multi-shot montage.** More causes drift.
19
19
  - **Always describe at least one camera movement per shot.**
20
20
  - **Tell Seedance what the camera is NOT doing** (e.g. `no cuts, no zoom, natural head movement`) — this is what locks POV.
21
21
  - **Final prompt is always English**, wrapped in a copy-ready code block. Detect intent in any language and reply in the user's language, but the prompt itself is English.
22
- - **HARD CAP: 4000 characters TOTAL for the ENTIRE prompt** — measured as one single string, including ALL shots, ALL boilerplate, ALL SFX lines, the opening style block, the closing `Total: …` line, every newline, every space, every punctuation mark. This is non-negotiable.
23
- - Applies to ANY prompt: 1 shot or 6 shots, single POV or full montage — the WHOLE thing must fit under 4000 chars combined.
24
- - It is NOT 4000 chars per shot. It is 4000 chars per prompt.
25
- - If your draft exceeds 4000 chars, trim aggressively in this order: (1) cut redundant adjectives, (2) collapse the opening cinematic boilerplate, (3) shorten SFX lists, (4) merge or drop shots — keep escalation beats and cut filler beats, (5) tighten action descriptions to verb-led essentials.
22
+ - **HARD CAP: 8000 characters TOTAL for the ENTIRE prompt** — measured as one single string, including ALL shots, ALL boilerplate, ALL SFX lines, the opening style block, the closing `Total: …` line, every newline, every space, every punctuation mark. This is non-negotiable.
23
+ - Applies to ANY prompt: 1 shot or 6 shots, single POV or full montage — the WHOLE thing must fit under 8000 chars combined.
24
+ - It is NOT 8000 chars per shot. It is 8000 chars per prompt.
25
+ - If your draft exceeds 8000 chars, trim aggressively in this order: (1) cut redundant adjectives, (2) collapse the opening cinematic boilerplate, (3) shorten SFX lists, (4) merge or drop shots — keep escalation beats and cut filler beats, (5) tighten action descriptions to verb-led essentials.
26
26
  - **Never** split into multiple prompts, multiple code blocks, or "part 1 / part 2" to evade the cap.
27
- - Before outputting, internally count the characters of the final prompt as a single string. If > 4000, rewrite tighter and re-count. Repeat until ≤ 4000. Only then show the user.
27
+ - Before outputting, internally count the characters of the final prompt as a single string. If > 8000, rewrite tighter and re-count. Repeat until ≤ 8000. Only then show the user.
28
28
 
29
29
  ## The 5 Formats
30
30
 
@@ -83,7 +83,7 @@ When the user uploads a 3×3 grid image and asks for Seedance prompts, switch to
83
83
  - Final prompt(s) ALWAYS in a fenced code block ready to paste into the Seedance `prompt` field (or pass as `prompt` on `generate_video` / `generate_elements`).
84
84
  - After the code block, give a 1-line "why this works" note (camera/escalation/physics choice).
85
85
  - If user asked in any language other than English, write your explanation in their language but keep the prompt itself English.
86
- - **Never exceed 4000 characters TOTAL** for the entire prompt as one string — that is the WHOLE prompt including every shot, every line of boilerplate, every SFX list, every newline. NOT 4000 per shot — 4000 for the prompt as one combined unit. Count before output. If over, rewrite tighter (cut adjectives, collapse boilerplate, merge or drop shots). NEVER split into multiple prompts / multiple code blocks / "part 1 / part 2" to work around the limit.
86
+ - **Never exceed 8000 characters TOTAL** for the entire prompt as one string — that is the WHOLE prompt including every shot, every line of boilerplate, every SFX list, every newline. NOT 8000 per shot — 8000 for the prompt as one combined unit. Count before output. If over, rewrite tighter (cut adjectives, collapse boilerplate, merge or drop shots). NEVER split into multiple prompts / multiple code blocks / "part 1 / part 2" to work around the limit.
87
87
 
88
88
  ## Seedance + Visual DNA / References
89
89
 
@@ -48,6 +48,8 @@ Apply when confirming cost before firing:
48
48
 
49
49
  **Batch totalling 100+ credits:** run `check_credits` first and include the available balance in the summary.
50
50
 
51
+ **After generating, report cost only — never "credits remaining".** Coding/chat usage also deducts credits, so any balance you compute (opening balance − generation costs) is wrong by the time you say it. Quote `credits_used` per generation / batch total; if the user asks what's left, run `check_credits` fresh at that moment and quote that number.
52
+
51
53
  ## ⚠️ Quote Real Cost, Never Estimates (CRITICAL)
52
54
 
53
55
  Pre-flight formulas above are for **preview only**. After firing, every generation returns `credits_used` (multiplier-adjusted total) and `credits_breakdown` (per-model attribution).
@@ -119,6 +119,68 @@ For ads that feature a specific product:
119
119
 
120
120
  If the user gives a **product URL** instead of a photo, see `workflows/research-first.md` — scrape, extract images, re-host via `upload_media`, persist as a brand kit at `.kolbo/brand-kits/<slug>.md`.
121
121
 
122
+ <!-- SKILL-ONLY: no server parity — UGC output routes through the creative-director / veo / seedance enhancers, so any server-side rule lives in those parity files, not here. -->
123
+
124
+ ## Multi-Slot Board Method (structured shot specs + character consistency)
125
+
126
+ For any multi-shot UGC / review / how-to where the SAME presenter must stay identical across shots, compose the prompt as explicit **slots** and lock identity with a **board-first** pass. This is a prompt-only convention — no special MCP mode; it uses `generate_image` (board) + `generate_elements` / `generate_video_from_image` (per-slot animate) that already exist.
127
+
128
+ ### 1. Structured input slots
129
+
130
+ Define each shot as one row. Fill every column before generating — blanks are where identity/quality drift creeps in.
131
+
132
+ | Slot | Arc role | POV / framing | Presenter action | Product visibility | Aspect | Audio |
133
+ |---|---|---|---|:-:|:-:|:-:|
134
+ | 1 | hook | selfie arm, chest-up, eye contact | states the problem / grabs attention | held up to camera | 9:16 | monologue seg 1 |
135
+ | 2 | demo | slightly wider, hands in frame | uses / demonstrates the product | in active use | 9:16 | monologue seg 2 |
136
+ | 3 | payoff | back to selfie framing | reaction + soft CTA | resting in hand / on surface | 9:16 | monologue seg 3 |
137
+
138
+ Scale to 2–6 slots. Keep `hook → demo → payoff` as the minimum arc; add `tension` / `proof` slots between demo and payoff for longer reviews.
139
+
140
+ ### 2. Rendering rules (hard invariants — apply to EVERY slot)
141
+
142
+ - One aspect ratio across all slots (UGC = `9:16`). Never mix.
143
+ - **No on-image text**, captions, subtitles, watermarks, or lower-thirds (users add captions in post).
144
+ - **Identity lock**: same presenter, same wardrobe, same lighting environment across all slots — open the prompt with `same character throughout all shots`.
145
+ - Hands and product must read cleanly — no deformed hands, no floating / clipping product, product logo legible when held.
146
+ - Phone-shot aesthetic (handheld sway, window/screen key) unless the mode is polished (`tv_spot`, `product_showcase`).
147
+
148
+ ### 3. Board-first consistency (the grid technique)
149
+
150
+ Before animating, generate ONE composite board image that locks the presenter's identity, then animate each panel:
151
+
152
+ 1. `generate_image` a labeled N-panel grid (2×2 or 1×N) of the presenter across the slot poses — front hook pose, hands-on-product demo pose, reaction pose — locked to `visual_dna_ids` (the presenter's Visual DNA). Aspect `16:9` for the board sheet.
153
+ 2. Treat that board image's CDN URL as the **`board_media_id`** — the single source of truth for identity.
154
+ 3. Animate each slot with `generate_video_from_image` / `generate_elements`, passing the board panel (and product) as `reference_images` and tagging `@image1`, so every clip inherits the same face/wardrobe.
155
+
156
+ This mirrors how the best UGC pipelines keep a character consistent: lock once as a board, then move each shot — not N independent generations that drift.
157
+
158
+ ### 4. Structured parameters (what to carry per generation)
159
+
160
+ Track these so each slot's call is reproducible and the arc stays coherent:
161
+
162
+ | Param | Meaning | Maps to |
163
+ |---|---|---|
164
+ | `arc_role` | hook / tension / demo / proof / payoff | prompt framing + shot order |
165
+ | `board_media_id` | the locked board image URL | `reference_images` (`@image1`) |
166
+ | `character_media_id` / `visual_dna_id` | presenter identity | `visual_dna_ids` (`@<dna-name>`) |
167
+ | `product_media_id` | product photo URL | `reference_images` (`@image2`) |
168
+ | `input_tier` | `draft` (fast preview) vs `hero` (final) | model + resolution choice |
169
+ | `monologue_segment` | the spoken line for this slot | prompt audio/dialogue line |
170
+ | `aspect_ratio` / `duration` / `sound_enabled` | per UGC Family Defaults above | MCP call args |
171
+
172
+ ### 5. Worked example (brief → slots → board → clips)
173
+
174
+ Brief: *"15s UGC review of a skincare serum, tech-savvy woman creator."*
175
+
176
+ 1. Ensure/create presenter Visual DNA (tech-savvy woman) → `visual_dna_id`.
177
+ 2. Board: `generate_image` a 3-panel `16:9` sheet — (a) chest-up hook holding the serum, (b) hands applying it, (c) thumbs-up reaction — `same character throughout all shots`, locked to the DNA. → `board_media_id`.
178
+ 3. Slots (each `9:16`, ~5s, sound OFF, animate from the matching board panel + product `@image2`):
179
+ - Slot 1 (hook): "Before this serum my routine was five products…" holding it to camera.
180
+ - Slot 2 (demo): hands applying, product in active use.
181
+ - Slot 3 (payoff): reaction + "…now it's just one step." soft CTA.
182
+ 4. Deliver as a structured message (setup + monologue + media), humanized refs (names/thumbnails, not raw IDs).
183
+
122
184
  ## UX Rules
123
185
 
124
186
  1. **Always pick a mode explicitly.** Don't auto-pick from one ambiguous word. If the user said "make me an ad" with no other signal, offer labeled options: `[UGC / TV Spot / Product Showcase / Surprise me]`.
@@ -30,6 +30,10 @@ This re-wires the MCP configuration automatically. Then restart the session.
30
30
 
31
31
  Wait 60s for the window to reset, retry only the failed calls. For batch image work prefer `generate_creative_director` over multiple `generate_image` calls. Full rate-limit details + retry sequence: see SKILL.md "Rate Limiting & Batch Generation".
32
32
 
33
+ ## Checking generation status without spinning
34
+
35
+ `get_generation_status` supports `wait=true` (blocks server-side until the generation reaches a final state, up to ~3 min) and `generation_ids` (many ids in one call → returns `all_done`, `still_processing`, and per-generation results). **Never call it repeatedly in a loop** — one `wait=true` call replaces the loop. If some generations are still running after the wait window, call it ONCE more with `wait=true` and only the `still_processing` ids.
36
+
33
37
  ## Failure envelope from `get_generation_status`
34
38
 
35
39
  When a generation fails, `get_generation_status` returns a structured `failure` field alongside `error`: