@kolbo/mcp 1.81.1 → 1.81.4

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/README.md CHANGED
@@ -58,9 +58,12 @@ Or add the config by hand — this block is identical for every MCP client and c
58
58
 
59
59
  Restart your app, then ask it to generate something. The first time, a Kolbo login opens in your browser — click **Allow** (no API key to create). _Prefer an API key? Create one at [app.kolbo.ai/developer](https://app.kolbo.ai/developer) and add `"env": { "KOLBO_API_KEY": "kolbo_live_..." }` to the block above._
60
60
 
61
- ### Browser-only (claude.ai / ChatGPT): the connector
61
+ ### Browser-only (claude.ai / ChatGPT / Codex): connector + zip
62
62
 
63
- No install at all — add the custom connector **`https://api.kolbo.ai/mcp`** under Settings → Connectors, then Connect → log in → Allow. Great for generating from text or URLs; to upload your own local files, use the config install above (it runs on your machine).
63
+ 1. Add the custom connector **`https://api.kolbo.ai/mcp`** under Settings → Connectors, then Connect → log in → Allow.
64
+ 2. Download **[`kolbo.zip`](https://github.com/Zoharvan12/kolbo-skills/raw/main/kolbo.zip)** and upload it as a skill (Claude.ai: Settings → Features → Skills; ChatGPT/Codex: Settings → Skills). Codex CLI: unzip into `~/.codex/skills/`.
65
+
66
+ The zip is the canonical routing skill. Without it the tools still work, but the model will not load Seedance / Visual DNA / filmmaking rules.
64
67
 
65
68
  ### Optional upgrade: add the Kolbo skill for slash-commands + smart routing
66
69
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kolbo/mcp",
3
- "version": "1.81.1",
3
+ "version": "1.81.4",
4
4
  "description": "Kolbo AI MCP Server - Generate images, videos, music, speech, and sound effects from Claude Code",
5
5
  "main": "src/index.js",
6
6
  "bin": {
@@ -1,6 +1,6 @@
1
1
  # AUTO-GENERATED — do not edit
2
2
 
3
- This tree is mirrored from kolbo-code@00aade6, the single source of truth.
3
+ This tree is mirrored from kolbo-code@a463d99, the single source of truth.
4
4
  Canonical source: packages/opencode/skills/kolbo/
5
5
  Distribution: .github/workflows/sync-skill-to-plugin.yml
6
6
 
package/skill/SKILL.md CHANGED
@@ -1,5 +1,5 @@
1
1
  ---
2
- version: 0.9.3
2
+ version: 0.9.7
3
3
  name: kolbo
4
4
  description: |
5
5
  Generate, edit, analyze, and direct creative media through Kolbo AI: images,
@@ -20,11 +20,9 @@ allowed-tools: Bash, Read, Write, Edit
20
20
 
21
21
  You have direct access to the Kolbo AI creative platform via MCP tools (auto-configured by `kolbo auth login`). Use them to generate and deliver real content — do NOT just describe what you would create.
22
22
 
23
- > 🚫 **Don't dump generated URLs as bare text or markdown links in chat** — the UI already renders artifacts as a gallery tile + canvas. Refer by description ("the rainy scene"), store URLs in `.kolbo/production.md`. INLINE `![](url)` images ARE allowed for catalog-style replies (per-item thumbs in numbered lists).
23
+ > 🚫 **Don't dump generated URLs as bare text or markdown links in chat** — the UI already shows results in **Library** (right panel) and on the generation card. Refer by description ("the rainy scene"), store URLs in `.kolbo/production.md`. INLINE `![](url)` images ARE allowed for catalog-style replies (per-item thumbs in numbered lists).
24
24
 
25
- This file is the **always-loaded core**: tool inventory + universal hard rules + routing index. For any model-specific prompt rules, Visual DNA workflow, production log format, marketing workflow, cost validation, etc., **Read the matching `references/` file from the index below**. Don't try to remember the rulesload the file when you need them.
26
-
27
- Users never see the bundled prompting skills. If you skip them, they get a lazy one-line prompt. **Loading is mandatory, not optional flavor.**
25
+ This file is the **always-loaded core**: tool inventory + universal hard rules + routing index for model-specific prompt rules, workflows, cost validation, etc., Read the matching `references/` file from the index below; loading is mandatory, not optional flavor (users never invoke the bundled skills themselves skipping them yields a lazy one-line prompt).
28
26
 
29
27
  ## Step 0 — Bootstrap
30
28
 
@@ -32,26 +30,33 @@ Once per conversation, before any other Kolbo tool call:
32
30
 
33
31
  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.
34
32
  2. **If `list_models` returns empty**, MCP isn't wired — same fix.
35
- 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.
33
+ 3. Use the balance ONLY for the low-balance check at this moment (see the "credits remaining" rule in the brief section below).
36
34
 
37
35
  If the user is on a whitelabel build (`sapir`, etc.), they must use their branded command — not `kolbo`. See `references/workflows/troubleshooting.md`.
38
36
 
39
- ## 🎬 Confirm the Creative Brief BEFORE Generating (CRITICAL — read first)
37
+ ## 🎬 Confirm the Creative Brief & Cost BEFORE Generating (CRITICAL — read first)
40
38
 
41
39
  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.
42
40
 
43
41
  **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:
44
42
 
45
- - **Model** — your recommended pick as the default option, plus 1–2 alternatives (with their credit cost).
43
+ - **Model** — your recommended pick as the default option, plus 1–2 alternatives (with their credit cost). Suggest a cheaper alternative if one fits.
46
44
  - **Aspect ratio** — e.g. `1:1 / 9:16 / 16:9` (offer the sensible default first).
47
45
  - **Count** — how many (1 / 4 / …).
48
46
  - **Resolution / quality / duration** — where the model supports it.
49
47
  - **Creative direction** — style / mood / scene, when the user was vague ("4 cats" → offer style options: photoreal / illustrated / cinematic / surprise-me).
50
48
  - **Credit cost** — state the total (`✦ N credits`) right in the question so cost is never a surprise.
51
49
 
52
- 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.
50
+ 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. Never fire on defaults the user didn't choose.
51
+
52
+ **Only skip the brief/cost 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.
53
53
 
54
- **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.
54
+ **Cost rules** (full tables + formulas in `references/workflows/cost-and-validation.md`):
55
+
56
+ - **Video/lipsync `credit` is per-SECOND, not per-clip**: `total = credit × duration`. This is the universal rule for video/firstlast/elements/motion_graphic/cast types, not a per-model exception — `list_models` states it inline now. The one carve-out is a model with `flat_credit_by_resolution` set.
57
+ - **Batch totalling 100+ credits**: run `check_credits` first.
58
+ - **Quote real cost**: after firing, log `credits_used` (from the tool result) to `.kolbo/production.md` — never `base × count`.
59
+ - **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.
55
60
 
56
61
  For multi-scene / batch work this pairs with `generate_creative_director` (see below) — still confirm the brief first.
57
62
 
@@ -80,11 +85,13 @@ For multi-scene / batch work this pairs with `generate_creative_director` (see b
80
85
  | Generate **brand product imagery** (studio shot, lifestyle, Pinterest pin, hero banner, carousel, ad pack, virtual try-on, conceptual, restyle) | `references/workflows/product-photoshoot.md` |
81
86
  | Generate **marketplace listing cards** (Amazon main + secondary + A+ content) | `references/workflows/marketplace-cards.md` |
82
87
  | Use **Visual DNA** / character consistency / `@name` syntax | `references/workflows/visual-dna.md` |
88
+ | Use **Color DNA** / brand palette grading | `references/workflows/color-dna.md` |
83
89
  | Start or continue a **multi-step production** (storyboard → scenes → final cut) | `references/workflows/production-log.md` |
84
90
  | **Transcribe** or **analyze** audio/video | `references/workflows/transcription.md` |
85
91
  | **Split a soundtrack into layers** — remove/isolate speech, strip narration, instrumental bed, stems for dubbing | `references/workflows/audio-stems.md` |
86
92
  | **Scrape brand/product info** before generating + persist as `.kolbo/brand-kits/<slug>.md` | `references/workflows/research-first.md` |
87
93
  | Browse, manage, or present existing **media library** items | `references/workflows/media-library.md` |
94
+ | Run a **client review / approval loop** — share a cut for feedback, timestamped comments, versions (v1→v2), approve / request-changes, guest links | `references/workflows/review-collections.md` |
88
95
  | Confirm **cost** or validate **resolution / aspect / duration** against model caps | `references/workflows/cost-and-validation.md` |
89
96
  | Hit an **auth / MCP / 429** issue | `references/workflows/troubleshooting.md` |
90
97
 
@@ -118,13 +125,13 @@ Each `references/models/*.md` mirrors the matching skill prompt in `kolbo-api/sr
118
125
  | `list_models` / `list_voices` / `check_credits` / `get_generation_status` / `cancel_generation` / `get_session_usage` | Discovery + status. `list_models` with no args returns the recommended shortlist out of ~428 — pass `type` for a full category with per-model caps. `cancel_generation` stops an in-flight job and refunds what it can: use it when the user changes their mind mid-generation instead of letting it run. |
119
126
  | `upload_media` / `create_upload_ticket` / `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`. Getting a LOCAL file in depends on where the server runs: `upload_media` with a path only works on a local (stdio) install; over a remote connector use `create_upload_ticket` and POST the file yourself. |
120
127
  | `create_visual_dna` / `update_visual_dna` / `generate_character_sheet` / `list_visual_dnas` / `get_visual_dna` / `delete_visual_dna` / `*_visual_dna_folder` (5 folder tools) | Visual DNA (+ character sheet, character folders) — see `workflows/visual-dna.md`. Edit with `update_visual_dna`; never delete+recreate. |
121
- | `list_moodboards` / `get_moodboard` / `list_presets` | Style overlays + sheet presets. Always pass `search` when you know the name that is a silent id lookup, not a catalog to show. Never omit `preset_id` after claiming a preset was used. |
122
- | `list_color_palettes` / `analyze_color_palette` / `create_color_palette` / `update_color_palette` / `delete_color_palette` / `activate_color_palette` / `deactivate_color_palette` | **Color DNA — sticky and account-wide.** At most one palette is active at a time; while it is, it strict-grades **every** image and video generation automatically, with no per-call argument. `analyze_color_palette` pulls colors out of 1-5 image URLs for free and does NOT save. `create_color_palette` defaults `is_active: true`, which activates it and deactivates any other. Per-generation opt-out: `skip_color_palette: true` on `generate_image` / `generate_image_edit` / `generate_video` / `generate_video_from_image`. |
128
+ | `list_moodboards` / `get_moodboard` / `list_presets` | Style overlays + sheet presets — see **Preset contract** in Core Workflow. Never omit `preset_id` after claiming a preset was used. |
129
+ | `list_color_palettes` / `analyze_color_palette` / `create_color_palette` / `update_color_palette` / `delete_color_palette` / `activate_color_palette` / `deactivate_color_palette` | **Color DNA — sticky + account-wide; at most one palette active at a time**, and while active it strict-grades **every** image and video generation automatically. Per-generation opt-out: `skip_color_palette: true`. Details: `workflows/color-dna.md`. |
123
130
  | `list_agents` / `create_agent` / `update_agent` / `delete_agent` | Custom chat agents — reusable named personas for `chat_send_message`. The agent's `description` IS the system instruction. Resolve a name the user mentions ("use my SEO agent") to an id with `list_agents`, then pass `agent_id`. Global/preset agents are read-only; only the user's own can be updated or deleted. |
124
131
  | `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, except for the licensed-catalog tools in the next row. |
125
- | `search_music_library` / `browse_music_library` / `get_music_library_facets` / `get_music_track_audio` / `get_music_track_lyrics` / `get_music_track_related` / `analyze_script_for_music` / `acquire_clean_music_track` / `import_music_track_to_library` | **SYNCI licensed music** — a commercially licensed catalog, not free stock. Discovery and previews are free but **watermarked**; there is no unwatermarked URL until you pay. `acquire_clean_music_track` (or `import_music_track_to_library`, which also copies it to the media library) **CHARGES CREDITS** for the clean master — confirm with the user first, and pass a stable `requestId` so a retry doesn't buy it twice. `analyze_script_for_music` turns a script into search terms for `search_music_library`. Use this family when the user needs music cleared for commercial use; use `search_stock_media` with `mediaType: "music"` when free stock will do. |
126
- | `list_projects` / `get_project` / `move_session` | Projects: resolve a project NAME → the `project_id` you pass on generation/upload/doc calls; `get_project` returns the full description (list clips it). `move_session` relocates a whole session + its media when work landed in the wrong project. See "Projects — Where Work Lands" below. |
127
- | `create_project` / `update_project` / `archive_project` / `unarchive_project` / `list_sessions` / `rename_session` / `delete_session` / `restore_session` | Project lifecycle + session inventory. Edit name/description with `update_project` (read via `get_project` first). Rename sessions with `rename_session` — never delete+recreate. `list_sessions` returns `project_id` + `types[]` on every row. Soft-delete leftover empty sessions after a move; `restore_session` undoes trash. Create a project when the user starts new work, then pass its id on EVERY call. |
132
+ | `search_music_library` / `browse_music_library` / `get_music_library_facets` / `get_music_track_audio` / `get_music_track_lyrics` / `get_music_track_related` / `analyze_script_for_music` / `acquire_clean_music_track` / `import_music_track_to_library` | **SYNCI licensed music** — commercially licensed catalog, not free stock; previews are **watermarked**. `acquire_clean_music_track` / `import_music_track_to_library` **CHARGES CREDITS** for the clean master — confirm with the user first + pass a stable `requestId`. Details: `workflows/media-library.md` "SYNCI licensed music". |
133
+ | `list_projects` / `get_project` / `move_session` | Projects: resolve a project NAME → the `project_id` you pass on generation/upload/doc calls (`get_project` returns the full description list clips it); `move_session` relocates a whole session + its media. See "Projects — Where Work Lands" below. |
134
+ | `create_project` / `update_project` / `archive_project` / `unarchive_project` / `list_sessions` / `rename_session` / `delete_session` / `restore_session` | Project lifecycle + session inventory. Edit name/description with `update_project` (read via `get_project` first); rename sessions with `rename_session` — never delete+recreate. `list_sessions` returns `project_id` + `types[]` on every row. |
128
135
  | `bulk_move_sessions` / `list_session_generations` / `move_generations_to_session` / `split_session` / `undo_session_organization` | Reorganize many sessions or generations. `list_session_generations` is an inventory (not a live generation card). |
129
136
  | `add_project_context` / `list_project_context` / `delete_project_context` / `get_project_profile` / `regenerate_project_profile` | Project knowledge base (RAG): feed scripts/URLs/notes; `get_project_profile` = the living brief — read it to ground work in the project |
130
137
  | `list_project_assets` / `link_project_asset` / `unlink_project_asset` / `update_project_asset` | Project CAST roster: the Visual DNAs and moodboards tagged onto a project (`@Name` / `#Name`). `update_project_asset` writes each tagged DNA's identity description and/or its project-scoped purpose note. Never unlink+relink to edit. |
@@ -133,6 +140,7 @@ Each `references/models/*.md` mirrors the matching skill prompt in `kolbo-api/sr
133
140
  | `trim_video` | Frame-accurate trim of a Kolbo-hosted video (tool waits and returns the URL). `edit_video` also gained `remove_background`. |
134
141
  | `create_doc` / `list_docs` / `get_doc` / `update_doc` / `share_doc` / `delete_doc` | AI Docs (Magic Pad): YOU author full HTML documents (plans, briefs, scripts, research) saved into the user's project, editable in the Kolbo app. `share_doc` returns a public link. `update_doc` content replaces the WHOLE doc — `get_doc` first. |
135
142
  | `chat_send_message` / `chat_list_conversations` / `chat_get_messages` | Kolbo chat with optional `media_urls` (up to 10 per call) |
143
+ | `create_review_asset` / `add_review_version` / `set_review_status` / `create_review_comment` / `reply_review_comment` / `resolve_review_comment` / `unresolve_review_comment` / `create_review_collection` / `create_review_share_link` / `revoke_review_share_link` / `get_review_storage_usage` (+ list/get/update/delete siblings) | **Kolbo Review** — Frame.io-style client review: asset = media + appended versions (new cut = `add_review_version`, never delete+recreate), timecoded comments per version, approve/request-changes status, guest share links (no Kolbo account; comment-only unless `canSetStatus`). 5GB review storage cap. See `workflows/review-collections.md`. |
136
144
  | `publish_html_artifact` | Publish HTML / SVG / Mermaid to `sites.kolbo.ai`. Server dedupes by content hash. Strict CSP. |
137
145
 
138
146
  ## ⚠️ Edit in place — never delete+recreate (HARD RULE — always on)
@@ -187,7 +195,7 @@ first, so the model renders *different words than the ones the user wrote*.
187
195
  A URL from `generate_*`, `list_media`, `get_media`, or a prior `upload_media` is **already on Kolbo CDN**. Pass that exact URL to the next tool (`reference_images` / `source_images` / `image_url` / `files`). Do **not** call `upload_media`, `create_upload_ticket`, or `media_upload_widget` on it — that copies the file a second time and wastes storage.
188
196
 
189
197
  - Hosts that are already hosted: `media.kolbo.ai`, any `*.kolbo.ai`, Kolbo DigitalOcean Spaces.
190
- - `upload_media` is only for a **local disk path** or an **external** (non-Kolbo) URL that the tools would 400 on.
198
+ - `upload_media` is only for a **local disk path** or an **external** (non-Kolbo) URL `files`/`source_images`/`image_url` reject unknown hosts with `400`; a Kolbo URL passes through as-is.
191
199
  - Same rule after compaction: pull the URL from `.kolbo/production.md` and reuse it. Never download-then-reupload.
192
200
 
193
201
  ## ⚠️ Assets Before Shots (HARD RULE)
@@ -218,7 +226,7 @@ Do **not** call `generate_*` / `generate_elements` / `generate_image_edit` until
218
226
 
219
227
  `generate_elements`, Seedance 2 / 2.5, WAN, MiniMax H3, Gemini, and any Visual DNA video share **one** compile shape — the Locked Intro in `references/models/seedance.md`. Load `elements-prompting` first (craft, `@Image N` mapping, eight elements), then compile:
220
228
 
221
- `Total: Xs / N shots / AR` → `[GLOBAL LOOK – LOCKED, APPLIES TO EVERY SHOT]` → `[CAST – IDENTICAL IN EVERY SHOT]` (each person is `@DNAName`) → `[LOCATION]` → `SHOT N — 0:00–0:02 — …`
229
+ `N connected cinematic shots, Xs total, AR, Multishot ON` → `Total: Xs / N shots / AR` → `[GLOBAL LOOK – LOCKED, APPLIES TO EVERY SHOT]` → `[CAST – IDENTICAL IN EVERY SHOT]` (each person is `@DNAName`) → `[LOCATION]` → LOCATION MAP / CONTINUITY / PHYSICS → `SHOT N — 0:00–0:02 — …` (ranges sum to Xs) → closing `Total: Xs / N shots / AR`. Pass MCP `duration: X` matching that Total. Omitting Total / Multishot is a failed compile — same contract as the Kolbo help widget.
222
230
 
223
231
  Write the beats at FULL DEPTH. The cap is 15,000 characters on Seedance 2.5 (10,000 on 2.0) — a 30s / 8+ shot compile should land around 4k–9k, and every beat carries its own camera move, a performance task for the speaker AND the listeners, prop/hand state, and the sound in that beat. A one-line shot beat is under-written; the structure alone is not the craft. Read `references/models/seedance25.md` before compiling.
224
232
 
@@ -260,7 +268,7 @@ A user-named tool — in any language — overrides every other rule. Recognized
260
268
  - Pass the exact returned `id` as `preset_id`. Never invent an id.
261
269
 
262
270
  1. **Check credits** ONCE per conversation (Step 0). Skip if already checked.
263
- 2. **Load the matching skill** (HARD RULE above) — `skill` tool + Read the `references/` file. Do this before the first paid call in the turn.
271
+ 2. **Load the matching skill** (HARD RULE above) before the first paid call in the turn.
264
272
  3. **Discover models** with `list_models` using a `type` filter — but **skip when the user names a specific model** (this turn **or** earlier in the conversation / compaction `## Locked choices`).
265
273
  4. **Pick the model**:
266
274
  - User named one → that name is a **family lock**, not a single catalog row. Use it. Identifiers resolve leniently — `"z-image"` / `"nano banana 2"` / `"grok imagine"` auto-resolve, including to the sibling for the tool you are calling (`grok-imagine-text-to-video` on `generate_video_from_image` becomes `grok-imagine-image-to-video`). `list_models` is still authoritative for constraints, caps, and pricing — not for swapping brands.
@@ -268,17 +276,57 @@ A user-named tool — in any language — overrides every other rule. Recognized
268
276
  - Auto-select → **only when no model was named on this task**. Then pick from "Auto-selectable" (models with a `summary`). Cheapest fit. Prefer `[RECOMMENDED]` when cost is similar.
269
277
  - Never auto-select from "Named-only" section.
270
278
  5. **Validate inputs** against model caps — see `references/workflows/cost-and-validation.md`.
271
- 6. **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.
272
- 7. **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.
273
- 8. **Share the URL** after success. Never fabricate URLs.
279
+ 6. **Fire the call(s)**then follow "⚠️ Generation lifecycle" below for waiting, status, and failure handling.
280
+ 7. **Share the result** after success per "⚠️ Generated URLs in Chat" and the no-fabricated-URLs rule in Limitations & Safety.
274
281
 
275
282
  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`.
276
283
 
284
+ ## ⚠️ Generation lifecycle — source of truth, waiting, failures (HARD RULE — read this)
285
+
286
+ **How calls work:** each generation tool blocks until the job 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` (or `_timed_out`) instantly — the card updates on its own.
287
+
288
+ Four surfaces show the same job. Use this map — never invent a fifth:
289
+
290
+ | Surface | What it is | Trust it for |
291
+ |---|---|---|
292
+ | **Library** (right panel — "This session" / "All media") | User-facing gallery of **completed** media | "Is the user's output there?" Point humans here — never to chat history. Finished clips/images land automatically — do **not** call `list_media` / `get_media` / `list_session_generations` to "check if it worked" after a generate you already submitted (burns credits/context, can pollute the session). A K/logo spinner tile **is** the in-progress placeholder for the same job, not a missing one. |
293
+ | **Chat generation card** | Progress chrome while a job is in flight | Status badge only (`Generating` / done). A **black / empty preview while Generating is NORMAL** — the iframe has nothing to paint yet. It is **not** failure, not "lost", not a reason to re-fire. |
294
+ | **`get_generation_status`** (MCP) | Agent API for job state | Whether the server job is `completed` / `failed` / still running, and the final `urls`. This is your SoT for in-flight work — **not** the card pixels. |
295
+ | **`.kolbo/production.md`** | Your private log across turns | Ids + URLs after success. Compaction-safe memory — not the user gallery. |
296
+
297
+ **🛑 NEVER re-fire a generation you already called.** Aborted / timed-out / `submitted` calls still process server-side. Finish with `get_generation_status` (`wait=true`) — never a second `generate_*`.
298
+
299
+ **🛑 After `submitted` / `_timed_out` — END THE TURN (credit guard).** Do **not** keep thinking, writing skills, editing files, or planning "next steps" while a generation is still running — that burns the user's coding/chat credits for nothing. Either **stop immediately** after telling the user it's generating in Library / the card above (preferred when you do not need the output URLs yet), OR — if the **next** required step needs those URLs — call `get_generation_status` **once** with `wait=true` as the **only** follow-up, no parallel Write/Edit/Think while it waits.
300
+
301
+ **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: check ALL in-flight ids in ONE call, never one by one, never without `wait`. If it comes back with some still processing, call it ONCE more with `wait=true` and the remaining ids.
302
+
303
+ **🛑 Runaway-loop guard — ONE generation per requested item.** When the user asks for **one specific change**, the answer is **a single tool call**. After URLs return, **stop**. Surface and wait. You are NOT allowed to:
304
+ - Fire the same tool 3+ times in a single turn unless the user explicitly asked for "N variations".
305
+ - Re-fire because you think the result might not be exactly what the user wanted.
306
+ - Auto-retry on success.
307
+ - Fire 5+ parallel `generate_video*` calls speculatively.
308
+
309
+ **Only re-fire when:** user explicitly asked for variations with a count, OR previous call returned `failure.retryable === true` (ONE retry), OR previous call returned `completed` but `urls.length === 0` (ONE retry).
310
+
311
+ **Detecting failure — a generation can fail three ways. Treat ALL as failure:**
312
+
313
+ 1. **Tool returns `error`** — explicit. Surface, suggest retry, log `generation_id`.
314
+ 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 claim it worked.
315
+ 3. **Tool hangs / never returns** — MCP poll timed out. Call `get_generation_status(generation_id, wait=true)` IMMEDIATELY. The server might be done.
316
+
317
+ **Reporting:**
318
+ - Don't celebrate before reading the result. Verify `urls` is non-empty.
319
+ - Don't auto-retry without surfacing the failure. Partial batches: list failed items + reasons + successful count, and surface the user's count — "6 of 8 ready", not "videos ready". Never "✅ all done!" on partials.
320
+ - Log only successes to `.kolbo/production.md` — never failed items.
321
+ - When done: say the result is in **Library → This session**. "Where is it?" → Library (This session). "Is it done?" with no urls yet → `get_generation_status` once.
322
+
323
+ `failure` envelope structure + retry rules: `references/workflows/troubleshooting.md`.
324
+
277
325
  ## 📁 Projects — Where Work Lands (CRITICAL)
278
326
 
279
327
  Everything in Kolbo — sessions, generations, media, docs — lives inside a PROJECT. Getting this wrong is the #1 user complaint ("my work went to the wrong project").
280
328
 
281
- 1. **User names a project** ("in my Acme project", "for the film") → call `list_projects` ONCE to resolve the name to an ObjectId, then pass that **same** id as `project_id` on **EVERY** subsequent `generate_*` / `upload_media` / `create_doc` / `chat_send_message` call in **this conversation**. There is no server-side sticky store — omitting it on any later call silently lands in the default "API Generations" bucket (`is_default: true`). Once resolved, treat that id as required for the rest of the conversation. Accounts often hold hundreds of projects, so pass `list_projects({ search: "acme" })` rather than listing everything; the list is paginated (50/page) and hides archived projects unless you pass `include_archived: true`.
329
+ 1. **User names a project** ("in my Acme project", "for the film") → call `list_projects` ONCE to resolve the name to an ObjectId, then pass that **same** id as `project_id` on **EVERY** subsequent `generate_*` / `upload_media` / `create_doc` / `chat_send_message` call in **this conversation**. There is no server-side sticky store — omitting it on any later call silently lands in the default "API Generations" bucket (`is_default: true`). Once resolved, treat that id as required for the rest of the conversation. Accounts often hold hundreds of projects, so pass `list_projects({ search: "acme" })` rather than listing everything; the list is paginated (50/page) and hides archived projects unless you pass `include_archived: true`. When the user starts new work, `create_project` first, then pass its id the same way.
282
330
  2. **No project mentioned** → omit `project_id`; the default bucket is correct. Don't ask unless intent is ambiguous. If `list_sessions` already returned a `project_id` for the work you are continuing, keep passing that id.
283
331
  3. **Work landed in the wrong project? MOVE it, never regenerate**: `move_session` relocates a whole session + all its media (works for any session type — the `session_id` from generation responses, chats, transcriptions); `move_media` / `bulk_move_media` / `move_folder_contents` relocate individual media items. Empty leftover sessions after a move: `delete_session` (soft-delete; `restore_session` undoes it). `rename_session` only changes the sidebar title.
284
332
 
@@ -304,25 +352,11 @@ How to thread:
304
352
 
305
353
  Write each session's `session_id` + plan name into `.kolbo/production.md` `### Sessions`. Do **not** mark the phase Approved or jump to the next bucket until the user confirms (or you asked a labeled GATE and they answered). Full rules: `references/workflows/production-planning.md` + `production-log.md`.
306
354
 
307
- ## Cost Awareness — Quick Rules
308
-
309
- Full tables + formulas in `references/workflows/cost-and-validation.md`. Quick rules:
310
-
311
- - **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.
312
- - **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.
313
- - **Batch totalling 100+ credits**: run `check_credits` first.
314
- - **Quote real cost**: after firing, log `credits_used` (from the tool result) to `.kolbo/production.md` — never `base × count`.
315
- - **Video/lipsync `credit` is per-SECOND, not per-clip**: `total = credit × duration`. This is the universal rule for video/firstlast/elements/motion_graphic/cast types, not a per-model exception — `list_models` states it inline now. The one carve-out is a model with `flat_credit_by_resolution` set.
316
- - **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.
317
-
318
355
  ## Rate Limiting & Batch Generation
319
356
 
320
357
  - `generate_image`: 30/min. All other generation tools: 10/min per type. 300/min global. `upload_media`: 300/min, no credit cost.
321
- - **⚠️ 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.
322
- - **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`.
323
358
  - **Batch ≤10 items**: output ALL tool calls in one response — they run concurrently.
324
359
  - **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`.
325
- - **`upload_media` external (non-Kolbo) URLs only.** `files`/`source_images`/`image_url` reject unknown hosts with `400`. A `media.kolbo.ai` / generate_* URL is already hosted — pass it through. Never `upload_media` a Kolbo URL.
326
360
 
327
361
  ## ⚠️ Multi-output? Default to `generate_creative_director` (CRITICAL)
328
362
 
@@ -334,18 +368,6 @@ Full tables + formulas in `references/workflows/cost-and-validation.md`. Quick r
334
368
 
335
369
  **Parameter gotcha:** `num_images` (1–4, same prompt different seeds) on `generate_image` vs `scene_count` (1–8, distinct prompt per scene) on `generate_creative_director`. **Never pass `num_images` to Creative Director.**
336
370
 
337
- ## 🛑 Runaway-Loop Guard — ONE Generation per Requested Item (CRITICAL)
338
-
339
- When the user asks for **one specific change**, the answer is **a single tool call**. After URLs return, **stop**. Surface and wait.
340
-
341
- You are NOT allowed to:
342
- - Fire the same tool 3+ times in a single turn unless the user explicitly asked for "N variations".
343
- - Re-fire because you think the result might not be exactly what the user wanted.
344
- - Auto-retry on success.
345
- - Fire 5+ parallel `generate_video*` calls speculatively.
346
-
347
- **Only re-fire when:** user explicitly asked for variations with a count, OR previous call returned `failure.retryable === true` (ONE retry), OR previous call returned `completed` but `urls.length === 0` (ONE retry).
348
-
349
371
  ## ⚠️ Editing an Existing Video → ONE Call, Not Frames-First (CRITICAL)
350
372
 
351
373
  Existing video → modify → **single `generate_video_from_video` call** with source video URL + edit prompt.
@@ -366,30 +388,14 @@ For any ad / story / scene-based video **created from scratch** featuring a Visu
366
388
 
367
389
  Skip frames-first only when the user says "go straight to video", single-shot quick experiments, or the user supplies approved frames. Full rules: `references/models/creative-director.md`.
368
390
 
369
- ## ⚠️ Detecting Failed Generations (CRITICAL)
370
-
371
- A generation can fail three ways. Treat ALL as failure:
372
-
373
- 1. **Tool returns `error`** — explicit. Surface, suggest retry, log `generation_id`.
374
- 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.
375
- 3. **Tool hangs / never returns** — MCP poll timed out. Call `get_generation_status(generation_id, wait=true)` IMMEDIATELY. The server might be done.
376
-
377
- **Always:**
378
- - Don't celebrate before reading the result. Verify `urls` is non-empty.
379
- - Don't auto-retry without surfacing the failure. Partial batches: list failed items + reasons + successful count. Never "✅ all done!" on partials.
380
- - Don't log failed items to `.kolbo/production.md`. Only successes.
381
- - Surface the user's count. "6 of 8 ready", not "videos ready".
382
-
383
- `failure` envelope structure + retry rules: `references/workflows/troubleshooting.md`.
384
-
385
391
  ## ⚠️ Generated URLs in Chat (CRITICAL)
386
392
 
387
393
  Chat renders markdown natively. `![alt](url)` = inline image. `[label](url)` = labeled link with preview.
388
394
 
389
395
  - **Catalog-style replies** (numbered lists of characters / scenes / products): embed `![alt](url)` so each item shows inline.
390
- - **Conversational replies** ("4 shots ready"): keep prose short; canvas chip already shows gallery.
396
+ - **Conversational replies** ("4 shots ready"): keep prose short; Library already shows the gallery.
391
397
 
392
- Avoid bare URL dumps and HTML `<table>` grids — canvas already provides a gallery.
398
+ Avoid bare URL dumps and HTML `<table>` grids — Library already provides a gallery.
393
399
 
394
400
  **After `generate_creative_director` completes** — share results as individual URLs, one per scene. Do NOT create an HTML grid artifact.
395
401
 
package/skill/VERSION CHANGED
@@ -1 +1 @@
1
- 0.9.3
1
+ 0.9.7
@@ -18,7 +18,7 @@ A multi-scene batch generator. Submit 1–8 scenes in one go and the tool fans t
18
18
  - **Cinema Manual** — per-scene **first frame + last frame** + per-scene prompt. Full cinematic control over composition transitions. Best for: hero shots, controlled camera moves, deliberate edits.
19
19
 
20
20
  ### Identity & Style Locks
21
- - **Visual DNA** — attach a character/product preset via `visual_dna_ids` to lock identity across all scenes. Up to **8 Visual DNAs** can be active at once (e.g. main character + product + side character). See `workflows/visual-dna.md` for the `@name` syntax — every DNA must be tagged inside the prompt.
21
+ - **Visual DNA** — attach a character/product preset via `visual_dna_ids` to lock identity across all scenes (e.g. main character + product + side character). The cap is per model — read `max_visual_dna` from `list_models`. See `workflows/visual-dna.md` for the `@name` syntax — every DNA must be tagged inside the prompt.
22
22
  - **Moodboard** — attach `moodboard_id` (or `moodboard_ids`) for a curated mood/style reference that anchors the aesthetic of the whole batch.
23
23
  - When the user mentions a recurring character/product, **ask** if they want to use a Visual DNA and recommend it. Same for a consistent aesthetic → recommend a Moodboard.
24
24
 
@@ -97,13 +97,7 @@ A great batch isn't 8 random shots — it's a sequence with intent. Pick one str
97
97
 
98
98
  ## Character-Driven Video — Frames First
99
99
 
100
- For any ad / story / scene-based video **created from scratch** featuring a Visual DNA character, do NOT jump straight from DNA to per-shot video. The right flow is:
101
-
102
- 1. **Generate the shot frames first** as still images via `generate_creative_director` with `scene_count` + `visual_dna_ids` + `workflow_type: "image"`. DNA is strongest in image generation; the user can approve cheaply before any expensive video runs.
103
- 2. **Confirm the frames with the user** if there are more than ~3 shots, or if the user hasn't said "go straight to video."
104
- 3. **Animate each frame** with `generate_video_from_image`, passing each approved frame as `image_url`.
105
-
106
- Skip frames-first only when the user says "go straight to video / skip the storyboard", on single-shot quick experiments, or when the user supplies their own approved frames.
100
+ SKILL.md's frames-first rule applies. The Creative Director deltas: generate the frames via `generate_creative_director` with `workflow_type: "image"` (+ `scene_count`, `visual_dna_ids`), then animate each approved frame with `generate_video_from_image`, passing it as `image_url`.
107
101
 
108
102
  ## UGC sets and thumbnail sets
109
103
 
@@ -4,7 +4,7 @@
4
4
 
5
5
  # Music — Prompt Rules (Suno-led)
6
6
 
7
- Load this file when the user wants AI-generated **music** — full songs, lyrics, instrumentals, jingles, scores, soundtracks, lo-fi beats, trailers, ad music. Primarily Suno; the same craft applies to other music models. For TTS / voice cloning see `models/prompt-copilot.md`. For sound effects see SKILL.md "Sound Effects".
7
+ Load this file when the user wants AI-generated **music** — full songs, lyrics, instrumentals, jingles, scores, soundtracks, lo-fi beats, trailers, ad music. Primarily Suno; the same craft applies to other music models. For TTS / voice cloning see `models/prompt-copilot.md`. For sound effects see `generate_sound` (SKILL.md tool table).
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
 
@@ -101,7 +101,7 @@ For models that DO expose `negative_prompt` (some text-to-image variants), keep
101
101
  | `21:9` | Ultrawide cinematic, banner |
102
102
  | `3:1` / `1:3` | Hero banner, narrow strip |
103
103
 
104
- Model-dependent — always check `supported_aspect_ratios` on the model via `list_models` before passing a value. See SKILL.md "Resolution / Aspect / Duration — validate against caps".
104
+ Model-dependent — always check `supported_aspect_ratios` on the model via `list_models` before passing a value. See `references/workflows/cost-and-validation.md`.
105
105
 
106
106
  ### Safety / content policy
107
107
 
@@ -15,28 +15,30 @@ Load this file when the user wants a **Seedance 2 / Seedance 2.0** (ByteDance) v
15
15
 
16
16
  - **Visual DNA names are immutable anchors:** when `visual_dna_ids` is passed, every DNA MUST appear in the prompt as the exact literal `@DNA_name` (CAST + every shot it is in). Never "Zohar's", "the left man", "the man on the LEFT", a nickname, or a Visual DNA anchors paragraph without `@tags`.
17
17
  - **Rewrites never thin out or rename anchors.** "`@X anchors Odysseus`" is NOT a reference line, and `Odysseus` must never replace `@X` later. Every referenced asset keeps its exact literal tag plus a full role line on every rewrite. Re-use the exact DNA tag in every shot it participates in. A compile that dropped `@gal_suit` / `@yonatan` / `#Board` is a failed turn.
18
- - **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. For connected narrative sequences the proven phrasing is `N connected cinematic shots, 15 seconds total, 16:9, Multishot ON` — use it and keep `Multishot ON` for any multi-shot story.
19
- - **Then the Locked Intro** — `[GLOBAL LOOK]` / `[CAST]` / `[LOCATION]` before any shot. A one-liner `same character throughout` is not a character lock.
18
+ - **DURATION + SHOT STRUCTURE (HARD same as help widget):** every text-to-video / Elements prompt MUST open AND close with total duration, shot count, and aspect. Omit only for video-edit tasks (source duration is locked). Required first lines:
19
+ 1. `N connected cinematic shots, Xs total, AR, Multishot ON`
20
+ 2. `Total: Xs / N shots / AR`
21
+ Then Locked Intro, then `SHOT N — 0:00–0:02 — Size / camera` beats whose ranges **sum exactly to Xs**. Last line repeats `Total: Xs / N shots / AR`.
22
+ - Example (15s / 6 shots): `6 connected cinematic shots, 15 seconds total, 16:9, Multishot ON` + `Total: 15s / 6 shots / 16:9`
23
+ - UGC / phone vertical: `N connected phone shots, Xs total, 9:16, Multishot ON` (never the word "cinematic").
24
+ - A prompt with only shot body and no Total / Multishot header is a **failed turn** — rewrite before calling `generate_*`.
25
+ - **MCP `duration` must match the Total line.** Pass `duration: X` (whole seconds) on `generate_video` / `generate_elements` / `generate_video_from_image` equal to the `Xs` in `Total: Xs / …`. Mismatch = wrong-length clip.
26
+ - **Then the Locked Intro** — `[GLOBAL LOOK]` / `[CAST]` / `[LOCATION]` (+ LOCATION MAP / CONTINUITY / PHYSICS for multi-shot) — before any shot. A one-liner `same character throughout` is not a character lock.
20
27
  - **Order inside each shot**: Subject → Action → Camera → Constraints → (Audio/SFX if relevant). Do NOT restack GLOBAL LOOK style inside the shot.
21
- - **Prompt length**: simple single-idea pieces ~120–280 words. Locked-intro cinematic typically 400–900 words. Shorter than ~120 words = random output. The 8000-char cap below always wins.
28
+ - **Prompt length**: simple single-idea pieces ~120–280 words. Locked-intro cinematic typically 400–900 words. Shorter than ~120 words = random output. The 10,000-char cap below always wins.
22
29
  - **Shot count is user-directed.** If the user asks for N shots, deliver exactly N in one prompt unless they ask to split.
23
30
  - **Always describe at least one camera movement per shot.**
24
31
  - **Tell Seedance what the camera is NOT doing** (e.g. `no cuts, no zoom, natural head movement`) — this is what locks POV.
25
32
  - **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.
26
- - **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.
27
- - Applies to ANY prompt: 1 shot or 6 shots, single POV or full montage — the WHOLE thing must fit under 8000 chars combined.
28
- - It is NOT 8000 chars per shot. It is 8000 chars per prompt.
29
- - 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.
30
- - **Never** split into multiple prompts, multiple code blocks, or "part 1 / part 2" to evade the cap.
31
- - 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.
33
+ - **HARD CAP: 10,000 characters TOTAL for the ENTIRE prompt** — measured as one single string including all shots, boilerplate, SFX lines, and the Total lines. It is per PROMPT, not per shot. **Never** split into multiple prompts, code blocks, or "part 1 / part 2" to evade the cap. Count the final prompt before output; if over, trim (cut adjectives, collapse boilerplate, shorten SFX lists, merge or drop shots) and re-count until it fits.
32
34
 
33
35
  ## Locked Intro (DEFAULT for any multi-shot cinematic — including Elements)
34
36
 
35
- After the Total line, every multi-shot prompt — and any piece with recurring people or a recurring place — opens with three locked blocks. Skip only for: true single-shot POV/orb, 3×3 grid-panel mode, or video-edit tasks.
37
+ After the Total lines, every multi-shot prompt — and any piece with recurring people or a recurring place — opens with the locked blocks. Skip only for: true single-shot POV/orb, 3×3 grid-panel mode, or video-edit tasks.
36
38
 
37
39
  ```
38
- Total: Xs / N shots / AR
39
40
  N connected cinematic shots, Xs total, AR, Multishot ON
41
+ Total: Xs / N shots / AR
40
42
 
41
43
  [GLOBAL LOOK – LOCKED, APPLIES TO EVERY SHOT]
42
44
  <body>, <lens family>, <film stock>, <aspect> spherical, <stop>. <DoF, grain, grade as law>. <movement grammar>. <performance + audio law>.
@@ -48,15 +50,28 @@ PROP: recurring object.
48
50
  [LOCATION]
49
51
  Place in materials + light + color field. Blocking. Background LIFE.
50
52
 
53
+ [LOCATION MAP]
54
+ Named seats / sides in SCREEN language (screen-left armchair, center couch, door camera-left).
55
+
56
+ [CONTINUITY – LOCKED ACROSS EVERY CUT]
57
+ Axis / camera side of the line. Screen direction. Eyelines. Floor props stay. Which hand holds what. No teleport.
58
+
59
+ [PHYSICS]
60
+ Weight into furniture, props resting, cloth/hair settle, no float.
61
+
51
62
  SHOT 1 — 0:00–0:02 — Medium / camera position
52
63
  (physical verbs, timed acting, quoted dialogue)
53
-
64
+ SHOT 2 — 0:02–0:05 —
65
+ … (ranges MUST sum to Xs)
54
66
  Total: Xs / N shots / AR
67
+ POSITIVE LOCKS: <2–4 sentences restating positions / mouth / optical signature>
55
68
  ```
56
69
 
57
- When a Visual DNA exists, its exact `@DNA_name` IS the cast name never place a nickname before it or substitute one later. For plain image refs use `@ImageN`.
70
+ ## OUTPUT CONTRACT (WINSsame as help widget)
71
+
72
+ FORBIDDEN: omitting Total / Multishot; "same character throughout" as the only lock; one fence per shot; `[0s]`/`[3s]` stubs; splitting a ≤15s story into multiple generations unless the user asks.
58
73
 
59
- ## The 5 Formats
74
+ ## The 6 Formats
60
75
 
61
76
  ### 1. Transformations (highest-performing format)
62
77
  - Numbered shots, beat by beat.
@@ -218,7 +233,7 @@ Place CAMERA in the **3rd position** of each shot's core layers (Subject → Act
218
233
  - No equipment / director names?
219
234
  - Emotion through muscle, not labels?
220
235
  - Multishot: FOV per segment + "no drift mid-segment"?
221
- - 8000-char cap honored?
236
+ - prompt-cap honored?
222
237
 
223
238
  ## Grid Storyboard Mode (3×3 grid input)
224
239
 
@@ -243,7 +258,6 @@ When the user uploads a 3×3 grid image and asks for Seedance prompts, switch to
243
258
  - Final prompt(s) ALWAYS in a fenced code block ready to paste into Seedance.
244
259
  - After the code block, give a 1-line "why this works" note (camera/escalation/physics choice).
245
260
  - If user asked in any language other than English, write your explanation in their language but keep the prompt itself English.
246
- - **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.
247
261
 
248
262
  ## Where to run in Kolbo
249
263
 
@@ -256,4 +270,4 @@ Seedance 2 lives in the **Video** category. Route the prompt card by the INPUTS:
256
270
 
257
271
  ## Seedance + Visual DNA / References
258
272
 
259
- When a character must stay consistent, pair Seedance with Visual DNA via `generate_elements` (NOT `generate_video` — text-to-video silently drops `visual_dna_ids`). Use the exact literal `@DNA_name` as the character name in CAST and re-anchor every shot where it appears — never a nickname, alias, possessive (`Zohar's`), or spatial label (`the left man`). See `workflows/visual-dna.md`. For grid/storyboard inputs, the source frame is `@image1`.
273
+ When a character must stay consistent, pair Seedance with Visual DNA via `generate_elements` (NOT `generate_video` — text-to-video silently drops `visual_dna_ids`). `@DNA_name` tagging rules: see `workflows/visual-dna.md`. For grid/storyboard inputs, the source frame is `@image1`.
@@ -20,24 +20,48 @@ Load this file when the user wants a **Seedance 2.5** video (they said "2.5" / "
20
20
  - **Duration 4–30 seconds**, whole seconds. 30s IS supported.
21
21
  - **Up to 30 shots/cuts in ONE generation.** Deliver exactly N if N ≤ 30.
22
22
  - **Prompt cap 15,000 characters** for the entire prompt as one string (`max_prompt_length` in the catalog; Seedance 2.0 is 10,000). Verify with `list_models` rather than trusting this number — it was documented as 30,000 for months, which is double the real limit.
23
- - **Up to 50 reference medias / Visual DNA mentions** (`@Name`, `@ImageN`, `#Moodboard`). Every referenced asset must be tagged in the prompt text. A rewrite that drops or renames a tag ( `@doron_fauda_1` → `DORON` / `the hero` ) is a failed turn — put the exact tag back.
23
+ - **Large reference / Visual DNA capacity** (`@Name`, `@ImageN`, `#Moodboard`) — read the exact caps from `max_visual_dna` / `elements_max_images` in `list_models`. Every referenced asset must be tagged in the prompt text. A rewrite that drops or renames a tag ( `@doron_fauda_1` → `DORON` / `the hero` ) is a failed turn — put the exact tag back.
24
24
  - **Multimodal refs:** images + video clips + audio can all anchor one generation.
25
25
 
26
- ## Locked Intro (DEFAULT — same shape as Seedance 2)
26
+ ## Universal Rules (HARD — same as help widget OUTPUT CONTRACT)
27
+
28
+ - **First lines ALWAYS declare shot structure** (text-to-video / Elements / reference gen — NOT video-edit):
29
+ 1. `N connected cinematic shots, Xs total, AR, Multishot ON`
30
+ 2. `Total: Xs / N shots / AR`
31
+ Example: `12 connected cinematic shots, 30 seconds total, 16:9, Multishot ON` + `Total: 30s / 12 shots / 16:9`
32
+ UGC phone: `N connected phone shots, Xs total, 9:16, Multishot ON` — never the word "cinematic"; restate `9:16 vertical phone frame` in every shot.
33
+ - **Last line repeats** `Total: Xs / N shots / AR` + short POSITIVE LOCKS.
34
+ - **Shot timecodes MUST sum to Xs.** `SHOT 1 — 0:00–0:02` … through SHOT N ending at Xs. Never `[0s]` / `[3s]` stubs.
35
+ - **MCP `duration` = Xs** on the generate call. Mismatch is a failed turn.
36
+ - Duration range **4–30s**; shot count **≤30** in one generation. Do not split a ≤30s story into multiple 10s clips unless the user asks.
37
+ - Omit Total / Multishot / shot-count headers only for **video editing** (source duration locked) — use Edit Goal blocks instead.
27
38
 
28
- After the Total line, every multi-shot cinematic opens with:
39
+ ## Locked Intro (DEFAULT same shape as Seedance 2)
29
40
 
30
41
  ```
42
+ N connected cinematic shots, Xs total, AR, Multishot ON
43
+ Total: Xs / N shots / AR
44
+
31
45
  [GLOBAL LOOK – LOCKED, APPLIES TO EVERY SHOT]
32
46
  [CAST – IDENTICAL IN EVERY SHOT]
33
47
  [LOCATION]
48
+ [LOCATION MAP]
49
+ [CONTINUITY – LOCKED ACROSS EVERY CUT]
50
+ [PHYSICS]
51
+
52
+ SHOT 1 — 0:00–0:02 — Medium / camera position
53
+
54
+ Total: Xs / N shots / AR
34
55
  ```
35
56
 
36
- then timecoded `SHOT N 0:00–0:02 Medium / camera position` beats. Full skeleton, acting rules, and optical craft: `models/seedance.md`.
57
+ Full acting / continuity craft: `models/seedance.md`. Do not skip the Total lines or the three look/cast/location blocks. Do not restack GLOBAL LOOK inside shots.
58
+
59
+ 2.5 is where this format earns its keep: 15 shots timed to 30s, ~5k characters, one locked look so every cut matches camera / grade / cast.
37
60
 
38
- 2.5 is where this format earns its keep: 15 shots timed to 30s, ~5k characters, one locked look so every cut matches camera / grade / cast. Do not skip the three blocks. Do not restack GLOBAL LOOK inside shots.
61
+ ## OUTPUT CONTRACT (WINS mirror of help widget)
39
62
 
40
- UGC / phone vertical (full craft: `workflows/ugc-smartphone.md`): NEVER write "cinematic". GLOBAL LOOK is phone-native. Use `N connected phone shots, Xs total, 9:16, Multishot ON` and restate `9:16 vertical phone frame` inside every shot.
63
+ ONE fenced prompt. Missing Total / Multishot / summing timecodes / matching `duration` = failed skill turn.
64
+ FORBIDDEN: "same character throughout" as the only lock; one fence per shot; claiming you followed the skill while omitting GLOBAL LOOK / CAST / LOCATION / Multishot ON.
41
65
 
42
66
  ## Prompt length
43
67
 
@@ -15,7 +15,7 @@ Load this file when the user wants a **Veo 3 / Veo 3.1** (Google) video. For oth
15
15
  ## CRITICAL Kolbo Platform Rules
16
16
 
17
17
  - **Aspect ratio, resolution, and clip length are MCP-tool params** (`aspect_ratio`, `resolution`, `duration`). **NEVER include "16:9", "9:16", "720p", "1080p", "4 seconds", "8s", or any duration / aspect / resolution string inside the prompt body.**
18
- - Pass `sound_enabled: true/false` as a separate param when the user mentions audio — see SKILL.md "Sound on/off".
18
+ - Pass `sound_enabled: true/false` as a separate param when the user mentions audio — see `workflows/cost-and-validation.md`.
19
19
  - Don't write Python / Vertex AI / API call syntax. The user is generating through Kolbo's MCP tools.
20
20
 
21
21
  ## Model Capabilities (informs recommendations, never in the prompt body)
@@ -0,0 +1,12 @@
1
+ # Color DNA — Brand Palette Grading
2
+
3
+ Load this file when the user works with Color DNA / color palettes: creating, activating, analyzing, or opting a generation out of palette grading.
4
+
5
+ Core contract (also in SKILL.md): **Color DNA is sticky and account-wide — at most one palette is active at a time**, and while one is active it strict-grades **every** image and video generation automatically, with no per-call argument.
6
+
7
+ Operational detail:
8
+
9
+ - `analyze_color_palette` pulls colors out of 1–5 image URLs **for free** and does **NOT** save anything — use it to draft a palette before creating one.
10
+ - `create_color_palette` defaults `is_active: true`, which activates the new palette and deactivates any other active one.
11
+ - Per-generation opt-out: `skip_color_palette: true` on `generate_image` / `generate_image_edit` / `generate_video` / `generate_video_from_image`.
12
+ - Manage with `list_color_palettes` / `update_color_palette` / `activate_color_palette` / `deactivate_color_palette` / `delete_color_palette` (edit in place — never delete+recreate).
@@ -8,9 +8,9 @@ Creative generations bill against the user's Kolbo credit balance. **Billing uni
8
8
 
9
9
  | Type | Billing unit | Credit range | Example |
10
10
  |------|-------------|-------------|---------|
11
- | **Image** | per image (flat) | 1–30 cr | Flux.1 Fast = 1 cr, Midjourney = 4 cr. If `resolution` is set, check `resolutionMultipliers` — some families multiply cost significantly at higher tiers. |
11
+ | **Image** | per image (flat) | 1–30 cr | Flux.1 Fast = 1 cr, Midjourney = 4 cr. If `resolution` is set, check `resolution_multipliers` — some families multiply cost significantly at higher tiers. |
12
12
  | **Image edit** | per image (flat) | 2–20 cr | |
13
- | **Video** | **cr/s × duration** | 2–30 cr/s | Kandinsky 5 Fast × 5s = 10 cr; Seedance 2.0 × 10s = 300 cr. Check `resolutionMultipliers` + `soundCreditMultiplier`. |
13
+ | **Video** | **cr/s × duration** | 2–30 cr/s | Kandinsky 5 Fast × 5s = 10 cr; Seedance 2.0 × 10s = 300 cr. Check `resolution_multipliers` + `sound_credit_multiplier`. |
14
14
  | **Video from image** | **cr/s × duration** | 4–30 cr/s | Same per-second rule. |
15
15
  | **Elements (ref-to-video)** | **cr/s × duration** | 4–30 cr/s | Check `credit` and multipliers in `list_models type="elements"`. |
16
16
  | **Lipsync** | **cr/s × duration** | 5–20 cr/s | |
@@ -28,7 +28,7 @@ Apply when confirming cost before firing:
28
28
  - **Music**: flat per generation — `total = model_credit` (duration does not change cost).
29
29
  - **TTS**: `total = model_credit × ceil(character_count / 100)`. Count actual characters first. 1000 chars with ElevenLabs = 50 credits.
30
30
  - **Images / 3D / Sound effects**: `total = model_credit × quantity`.
31
- - **Resolution / audio multipliers**: if `resolution` is set or model has native audio, read `resolutionMultipliers[tier]` and `soundCreditMultiplier`. Formula: `final = base × resolutionMult × (sound ? soundMult : 1) × durationSeconds`.
31
+ - **Resolution / audio multipliers**: if `resolution` is set or model has native audio, read `resolution_multipliers[tier]` and `sound_credit_multiplier`. Formula: `final = base × resolutionMult × (sound ? soundMult : 1) × durationSeconds`.
32
32
 
33
33
  ### Tier label → pixel mapping (rough)
34
34
 
@@ -38,8 +38,7 @@ Apply when confirming cost before firing:
38
38
  ## When to Confirm Cost
39
39
 
40
40
  **Skip cost confirmation when:**
41
- - The user already specified model + count + duration ("make 5 videos, seedance 2 fast, 15s" IS the confirmation).
42
- - A single generation costs under 5 credits.
41
+ - Model + count + aspect + creative direction are already pinned by the user ("make 5 videos, seedance 2 fast, 15s" IS the confirmation).
43
42
 
44
43
  **Required cost confirmation when:**
45
44
  - Anything else — present a one-line summary: "8 videos × 5s × [model] @ X cr/s = **Y credits**. Proceed?"
@@ -52,21 +51,7 @@ Apply when confirming cost before firing:
52
51
 
53
52
  ## ⚠️ Quote Real Cost, Never Estimates (CRITICAL)
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).
56
-
57
- ```json
58
- {
59
- "credits_used": 12,
60
- "credits_breakdown": [
61
- { "model": "nano-banana-2", "base": 8, "final": 12, ... }
62
- ],
63
- "urls": [...]
64
- }
65
- ```
66
-
67
- **Log `credits_used` to `.kolbo/production.md`**, not `base × count`. The multiplier-adjusted number is the only truth.
68
-
69
- When the user asks "how much did I spend?" → call `get_session_usage` for the real, multiplier-adjusted session total + per-tool + per-model breakdowns (same numbers as the desktop bottom-bar counter).
54
+ Pre-flight formulas above are for **preview only** after firing, quote the returned `credits_used`, never `base × count`. Log `credits_used`, resolution, duration and sound state per entry — format in `production-log.md`.
70
55
 
71
56
  ## Validation Pattern — Every Generation
72
57
 
@@ -132,9 +117,4 @@ Cost formula: `final_cost = credit × resolution_multipliers[resolution] × (sou
132
117
 
133
118
  ## Always Log the Resolution / Duration / Sound Choices
134
119
 
135
- Production-log entries should include the resolution and (for video) duration + sound state alongside the URL, so the user can see what they paid for:
136
-
137
- ```md
138
- - still: https://...01-coffee.png (flux-2-pro · 1K, 2026-05-14)
139
- - video: https://...02-rain.mp4 (kling-2 · 1080p · 5s · sound-off, 2026-05-14)
140
- ```
120
+ Log `credits_used`, resolution, duration and sound state per entry format in `production-log.md`.
@@ -122,5 +122,5 @@ Default-to-cheapest when the user hasn't expressed a quality intent and the diff
122
122
  2. **Always confirm aspect ratio + resolution + quantity** before firing.
123
123
  3. **Always check for a brand kit** before scraping fresh — `Read .kolbo/brand-kits/<slug>.md` first.
124
124
  4. **Always log products + brand kits in `.kolbo/production.md`** so future ads reuse instead of re-uploading / re-scraping.
125
- 5. **No auto-retry on failure** surface the reason and let the user adjust.
125
+ 5. **Retries:** one retry only when `failure.retryable === true` or the generation completed with empty URLs (SKILL.md "⚠️ Generation lifecycle"); otherwise surface the reason and let the user adjust.
126
126
  6. **Strict NO uninvited additions** in every ad prompt: "NO captions, NO subtitles, NO watermarks, NO extra text beyond what's specified."
@@ -52,30 +52,6 @@ Compile only what the current generation needs. A video model cannot resolve “
52
52
 
53
53
  Kolbo Visual DNA is semantic project truth, not merely reference imagery. Read and preserve the saved DNA type and analyzed context: character DNAs own identity/state/performance/voice; environment and scene DNAs own location/geography/light; product DNAs own prop/product identity, scale, material, and state; style DNAs own the visual register. Keep exact tags and never reinterpret one DNA type as another.
54
54
 
55
- ## Choose control density
56
-
57
- Never equate sophistication with maximum length.
58
-
59
- - **Strict** — lock exact blocking, count, timing, dialogue, hand/prop state, axis, scale, or failure-prone physics. Use for continuity-heavy dialogue, expensive hero shots, repeated failures, and exact music synchronization.
60
- - **Anchored** — dictate non-negotiable story/continuity/physics anchors and allow camera or performance variation inside them. Use for complex spectacle where controlled discovery is valuable.
61
- - **Exploratory** — protect identity, world, safety, and essential beats while inviting coverage variations. Use for montage, inserts, music-video coverage, and ideation.
62
-
63
- If the user supplied an exact prompt, preserve its chosen density unless the failure diagnosis proves density itself is the problem.
64
-
65
- ## Select craft packs
66
-
67
- Load only what the shot needs:
68
-
69
- - Story causality and scene reversals: [scene-engine.md](references/filmmaking/scene-engine.md)
70
- - Asset building, versions, and stress tests: [asset-preproduction.md](references/filmmaking/asset-preproduction.md)
71
- - Character performance, listening, and voice identity: [acting-direction.md](references/filmmaking/acting-direction.md)
72
- - Geography, axes, eyelines, diagrams, and state continuity: [blocking-continuity.md](references/filmmaking/blocking-continuity.md)
73
- - Shot size, optics, operator behavior, and visual grammar: [cinematography.md](references/filmmaking/cinematography.md)
74
- - Action feasibility, mass, materials, transformations, and impossible shots: [physics-action.md](references/filmmaking/physics-action.md)
75
- - Dialogue, ambience, native audio, source-song performance, and post music: [audio-dialogue-music.md](references/filmmaking/audio-dialogue-music.md)
76
-
77
- Do not paste every craft pack into every prompt. Translate the selected pack into the shortest observable instructions that preserve the intended result.
78
-
79
55
  ## Compile a shot
80
56
 
81
57
  Read [prompt-contracts.md](references/filmmaking/prompt-contracts.md) for exact structures.
@@ -92,7 +68,7 @@ Before writing, establish:
92
68
  8. Audio ownership, exact words/lyrics, and whether music is native, source-driven, or reserved for post.
93
69
  9. Model capability limits and target generation mode.
94
70
 
95
- Prompt-length limits apply to the entire compiled generation prompt as one string, including whitespace, headers, timecodes, dialogue, audio, and locks. Count after compilation. For the current Seedance 2.5 adapter snapshot, the hard ceiling is 30,000 characters; never borrow that number for another model.
71
+ Prompt-length limits apply to the entire compiled generation prompt as one string, including whitespace, headers, timecodes, dialogue, audio, and locks. Count after compilation; read the cap from `max_prompt_length` via `list_models` (see `models/seedance25.md`).
96
72
 
97
73
  **Seedance 2 / Seedance 2.5 / `generate_elements` — Locked Intro is the only compile shape.** Read `references/models/seedance.md` (and `seedance25.md` for 2.5 caps). Do not emit the SCENE CONTEXT / OPTICS / ACTION department pack below as the generation prompt. Every Visual DNA in play must be `@ExactName` in CAST and in each shot — never "the left man" or a possessive.
98
74
 
@@ -44,15 +44,17 @@ If the user mentions a product / brand but no mode word, default to `ugc`. If th
44
44
 
45
45
  The mode determines which Kolbo MCP tool to call, what defaults to set, and what's forbidden.
46
46
 
47
- | Mode | Primary tool | aspect_ratio | duration | sound_enabled | Captions / watermarks |
48
- |---|---|---|---|:-:|:-:|
49
- | `ugc`, `ugc_how_to`, `ugc_unboxing`, `ugc_virtual_try_on`, `product_review` | `generate_video_from_image` (frame-first) OR `generate_elements` (Visual DNA → video) | **`9:16`** | model's `default_duration` (5–8s) | OFF | **Never add** |
50
- | `product_showcase` | `generate_creative_director` with `workflow_type: "video"` (for multi-shot) OR `generate_video` (single) | `16:9` or `1:1` | 5–10s | ON if model supports `sound_generation_type: "native"` | Allowed if user asks |
51
- | `tv_spot` | `generate_creative_director` with `workflow_type: "video"` (3–6 shots for a beat structure) | `16:9` | 15–30s total | ON (full audio + dialogue) | Allowed if part of the spot |
52
- | `virtual_try_on` | `generate_elements` with character Visual DNA + product as `reference_images` | `9:16` or `4:5` | 5–8s | OFF | Never add |
53
- | `wild_card` | User's chosen model with broader prompt latitude (no mode-specific defaults) | User's pick | User's pick | User's pick | User's pick |
47
+ | Mode | Primary tool |
48
+ |---|---|
49
+ | `ugc`, `ugc_how_to`, `ugc_unboxing`, `ugc_virtual_try_on`, `product_review` | `generate_video_from_image` (frame-first) OR `generate_elements` (Visual DNA → video) |
50
+ | `product_showcase` | `generate_creative_director` with `workflow_type: "video"` (for multi-shot) OR `generate_video` (single) |
51
+ | `tv_spot` | `generate_creative_director` with `workflow_type: "video"` (3–6 shots for a beat structure) |
52
+ | `virtual_try_on` | `generate_elements` with character Visual DNA + product as `reference_images` |
53
+ | `wild_card` | User's chosen model with broader prompt latitude (no mode-specific defaults) |
54
+
55
+ Aspect / duration / sound / captions defaults for the `ugc*` family live in "UGC Family Defaults" below.
54
56
 
55
- **Pick the actual model** with `list_models({ type: "..." })` and validate caps before firing — see SKILL.md "Resolution / Aspect / Duration — validate against caps".
57
+ **Pick the actual model** with `list_models({ type: "..." })` and validate caps before firing — see `references/workflows/cost-and-validation.md`.
56
58
 
57
59
  ## The Look Itself — read `workflows/ugc-smartphone.md`
58
60
 
@@ -149,8 +151,7 @@ Scale to 2–6 slots. Keep `hook → demo → payoff` as the minimum arc; add `t
149
151
  ### 2. Rendering rules (hard invariants — apply to EVERY slot)
150
152
 
151
153
  - One aspect ratio across all slots (UGC = `9:16`). Never mix.
152
- - **No on-image text**, captions, subtitles, watermarks, or lower-thirds (users add captions in post).
153
- - **Identity lock**: same presenter, same wardrobe, same lighting environment across all slots — open the prompt with `same character throughout all shots`.
154
+ - **Identity lock**: same presenter, same wardrobe, same lighting environment across all slots — bind identity by tagging `@<dna-name>` in every slot description (identity binds via the DNA; the phrase "same character throughout all shots" is FORBIDDEN — see `models/seedance.md`).
154
155
  - Hands and product must read cleanly — no deformed hands, no floating / clipping product, product logo legible when held.
155
156
  - Phone-shot aesthetic (handheld sway, window/screen key) unless the mode is polished (`tv_spot`, `product_showcase`).
156
157
 
@@ -183,7 +184,7 @@ Track these so each slot's call is reproducible and the arc stays coherent:
183
184
  Brief: *"15s UGC review of a skincare serum, tech-savvy woman creator."*
184
185
 
185
186
  1. Ensure/create presenter Visual DNA (tech-savvy woman) → `visual_dna_id`.
186
- 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`.
187
+ 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 — `@<dna-name>` tagged in every panel description, locked to the DNA. → `board_media_id`.
187
188
  3. Slots (each `9:16`, ~5s, sound OFF, animate from the matching board panel + product `@image2`):
188
189
  - Slot 1 (hook): "Before this serum my routine was five products…" holding it to camera.
189
190
  - Slot 2 (demo): hands applying, product in active use.
@@ -194,9 +195,8 @@ Brief: *"15s UGC review of a skincare serum, tech-savvy woman creator."*
194
195
 
195
196
  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]`.
196
197
  2. **Always confirm aspect ratio + duration + sound** before firing — these materially change output and cost. One question, labeled options.
197
- 3. **Default UGC settings are hard rules** captions OFF, music OFF, watermarks OFF even when the user doesn't mention them. Only flip when they ask.
198
- 4. **No auto-retry on failure.** If the generation fails (content policy, model OOM), surface the reason and let the user adjust prompt or product.
199
- 5. **Show results without dumping URLs** — see SKILL.md "Generated URLs in chat".
198
+ 3. **Retries:** one retry only when `failure.retryable === true` or the generation completed with empty URLs (SKILL.md "⚠️ Generation lifecycle"); otherwise surface the reason and let the user adjust prompt or product.
199
+ 4. **Show results without dumping URLs** see SKILL.md "Generated URLs in chat".
200
200
 
201
201
  ## Prompt Template Seed for UGC
202
202
 
@@ -70,7 +70,7 @@ fails to open (exit 26).
70
70
 
71
71
  | User says | Call |
72
72
  |---|---|
73
- | "Upload this file" / "host this" / "give me a public URL for this" | `upload_media` — but see "Local files" below if it's a path on the user's disk |
73
+ | "Upload this file" / "host this" / "give me a public URL for this" | `upload_media` — but see "Local files" above if it's a path on the user's disk |
74
74
  | "Show my media" / "list my images/videos" / "what do I have?" | `list_media` (pass `type` / `category` / `project_id` / `folder_id` / `search`) |
75
75
  | "Show my favorites" / "list starred items" | `list_media` with `category=favorites` |
76
76
  | "List everything in project X" | `list_media` with `project_id=X` |
@@ -110,3 +110,13 @@ fails to open (exit 26).
110
110
  8. **Bulk caps:** 1000 ids for `bulk_delete_media` / `bulk_restore_media` / `bulk_permanently_delete_media` / `bulk_move_media`; 500 ids for `add_media_to_folder` / `remove_media_from_folder`. Split larger jobs into successive calls.
111
111
  9. **Folder share resolution:** `share_media_folder` takes emails; users not found come back in `not_found`. Report those to the user — don't assume the share succeeded silently. Members can list/add/remove items but cannot delete the folder or reshare it.
112
112
  10. **`get_media` accepts a generation_id as a fallback** for the `media_id` arg, so you can chase down items the user references by their original generation rather than by library id.
113
+
114
+ ## SYNCI licensed music — operational detail
115
+
116
+ The `*_music_library` tools (`search_music_library` / `browse_music_library` / `get_music_library_facets` / `get_music_track_audio` / `get_music_track_lyrics` / `get_music_track_related` / `analyze_script_for_music` / `acquire_clean_music_track` / `import_music_track_to_library`) front **SYNCI**, a commercially licensed catalog — not free stock.
117
+
118
+ - Discovery and previews are free but **watermarked** — there is no unwatermarked URL until you pay.
119
+ - `acquire_clean_music_track` **CHARGES CREDITS** for the clean master. Confirm with the user first, and pass a stable `requestId` so a retry doesn't buy the track twice.
120
+ - `import_music_track_to_library` charges the same way AND also copies the clean track into the media library.
121
+ - `analyze_script_for_music` turns a script into search terms for `search_music_library`.
122
+ - Use this family when the user needs music cleared for commercial use. When free stock will do, use `search_stock_media` with `mediaType: "music"` instead.
@@ -61,7 +61,7 @@ The mode determines which Kolbo MCP tool to call and what defaults to use.
61
61
 
62
62
  **For multi-output modes** (`social_carousel`, `ad_creative_pack`), always use `generate_creative_director` — never fire ≥2 `generate_image` calls in a loop. See `models/creative-director.md`.
63
63
 
64
- **Always validate** `aspect_ratio` and `resolution` against the chosen model's `supported_aspect_ratios` / `supported_resolutions` via `list_models` — see SKILL.md "Resolution / Aspect / Duration — validate against caps".
64
+ **Always validate** `aspect_ratio` and `resolution` against the chosen model's `supported_aspect_ratios` / `supported_resolutions` via `list_models` — see `references/workflows/cost-and-validation.md`.
65
65
 
66
66
  ## Pre-Generation Interview (CRITICAL)
67
67
 
@@ -4,7 +4,9 @@ Load this file when starting a multi-step production, or before any continuation
4
4
 
5
5
  ## Why It Exists
6
6
 
7
- Every URL, id, and brief produced by a Kolbo MCP tool MUST be recorded in `.kolbo/production.md` in the user's workspace. This file — not chat history is your source of truth for prior artifacts: URLs scattered across `tool_result` blobs are unreliable to re-scan and disappear entirely on context compaction. If the user named a model, write that name into `## 🎯 Now` and keep using that family on every follow-up — compaction is not permission to cheapest-swap.
7
+ Every URL, id, and brief produced by a Kolbo MCP tool MUST be recorded in `.kolbo/production.md` in the user's workspace. This file is **your** (agent) source of truth for prior artifacts across turns — not chat history (unreliable / compacted) and not a substitute for the user's **Library** gallery. URLs scattered across `tool_result` blobs are unreliable to re-scan and disappear entirely on context compaction. If the user named a model, write that name into `## 🎯 Now` and keep using that family on every follow-up — compaction is not permission to cheapest-swap.
8
+
9
+ **User vs agent SoT:** finished media for the human → **Library → This session**. Job state while in flight → `get_generation_status`. Your memory → this file. Chat cards are progress UI only.
8
10
 
9
11
  ## When to READ it
10
12
 
@@ -36,20 +38,8 @@ The log records **what the user approved** — not everything you produced. Gett
36
38
 
37
39
  **Never write an artifact into the log as approved without the user's approval.**
38
40
 
39
- If they did not volunteer a yes, end the turn with a **GATE** the next message can
40
- parse (same contract as `production-planning.md`):
41
-
42
- ```
43
- GATE — <bucket name>
44
- Presented: <what is in play>
45
- Lock + next: "lock <bucket>" / "yes" / "next" / "now <next bucket>"
46
- Stay: "redo @name" / "another take of …"
47
- ```
48
-
49
- Confirmation the agent may treat as a lock: `yes`, `ok`, `lock`, `approved`,
50
- `that's the one`, `use take 2`, `next`, `go`, `continue`, or they name the next
51
- planned bucket while treating this set as done. Silence / "maybe" / a new
52
- question is **not** a lock — repeat the GATE once, do not invent a yes.
41
+ If they didn't volunteer a yes, end the turn with the GATE block from
42
+ `production-planning.md` §3.
53
43
 
54
44
  **If the user genuinely doesn't care** — "whatever you think", "you pick", "don't care", or they hand you the whole job — then **you decide**. Choose, say in one line which you picked and why, and log it as usual with `(agent-selected)`. Do not stall a production waiting for an approval the user has already delegated to you.
55
45
 
@@ -143,11 +143,12 @@ the next planned bucket in **its** session.
143
143
  Only now compile shots. Defaults:
144
144
 
145
145
  - **`generate_elements` with Seedance 2.5** (`seedance-2-5`) for the film itself —
146
- up to 30s and 30 shots in ONE generation, up to 20 Visual DNAs, dialogue and SFX
147
- baked in. `generate_video` also accepts `visual_dna_ids` now; Elements remains
148
- the primary reference-driven route.
149
- - **Seedance 2.0** (`seedance-2`, cheaper, 4–15s, 9 DNAs) when the piece is short
150
- and the cast is small. `seedance-2-fast` / `seedance-2-mini` for cheap blocking.
146
+ up to 30s and 30 shots in ONE generation, dialogue and SFX baked in. DNA cap:
147
+ read `max_visual_dna` from `list_models`. `generate_video` also accepts
148
+ `visual_dna_ids` now; Elements remains the primary reference-driven route.
149
+ - **Seedance 2.0** (`seedance-2`, cheaper, 4–15s, smaller DNA cap per
150
+ `list_models`) when the piece is short and the cast is small.
151
+ `seedance-2-fast` / `seedance-2-mini` for cheap blocking.
151
152
  - Every DNA in `visual_dna_ids` must also appear as `@ExactName` in the prompt.
152
153
  - Dialogue in quotes inside its shot beat — English only, never TTS or lipsync.
153
154
  See `models/seedance25.md`.
@@ -0,0 +1,98 @@
1
+ # Kolbo Review — client review & approval collections
2
+
3
+ Load this file when the user wants **feedback on finished media**: send a cut to a client,
4
+ collect timestamped comments, run an approve / request-changes loop, ship a v2 against the
5
+ same feedback thread, or share work with someone who has no Kolbo account. This is a
6
+ Frame.io-style layer over the media library — assets, versions, comments, statuses, and
7
+ guest share links — all project-scoped like everything else in Kolbo.
8
+
9
+ Not for: publishing a page (`publish_html_artifact`), sharing a whole media folder
10
+ (`share_media_folder`), or internal doc collaboration (`share_doc`).
11
+
12
+ ## Tool inventory
13
+
14
+ | Tool | What it does |
15
+ |---|---|
16
+ | `create_review_asset` | New review asset with v1 media attached (`name`, `media_id`, optional `collection_id`, `version_note`). |
17
+ | `list_review_assets` / `get_review_asset` | Browse a project's review assets (filter by `collection_id` / `status`); fetch one with all versions + URLs. |
18
+ | `update_review_asset` | Rename, move to a collection (`collection_id: null` = uncollected), or switch `current_version_index`. |
19
+ | `add_review_version` | Append a new version to an existing asset from a `media_id`. |
20
+ | `set_review_status` | Workflow status: `in_progress` / `needs_review` / `approved` / `changes_requested`. |
21
+ | `delete_review_asset` | Soft-delete an asset AND its underlying review media. |
22
+ | `create_review_collection` / `list_review_collections` / `update_review_collection` / `delete_review_collection` | Folder layer. Deleting a collection is soft — its assets become uncollected, not deleted. |
23
+ | `create_review_comment` / `list_review_comments` / `reply_review_comment` / `edit_review_comment` / `delete_review_comment` | Text comments, optional video timecodes (`time_start` / `time_end`, seconds). One level of reply threading. |
24
+ | `resolve_review_comment` / `unresolve_review_comment` | Close / reopen a comment thread. |
25
+ | `create_review_share_link` / `list_review_share_links` / `revoke_review_share_link` | Guest links (no Kolbo account) for one asset or a whole collection. |
26
+ | `get_review_storage_usage` | `usedBytes` vs the 5GB review cap for the API-key owner. |
27
+
28
+ ## The core flow
29
+
30
+ ```
31
+ upload_media (or reuse a generation's media_id from list_media)
32
+ → create_review_collection (only if grouping multiple assets)
33
+ → create_review_asset ← media becomes v1
34
+ → set_review_status "needs_review"
35
+ → create_review_share_link ← hand the client the share_url
36
+ → list_review_comments ← read what came back
37
+ → fix → add_review_version ← v2 on the SAME asset
38
+ → resolve_review_comment on each addressed note
39
+ → set_review_status "approved" (usually the client does this via the link)
40
+ ```
41
+
42
+ Media must already exist in the library — every attach point takes a `media_id` from
43
+ `upload_media` / `create_upload_ticket` / `media_upload_widget` / `list_media`, never a raw
44
+ URL or local path.
45
+
46
+ ## Version semantics
47
+
48
+ - Versions **append**; labels are auto-set `v1`, `v2`, … — you can't choose or reorder them.
49
+ - `add_review_version` automatically makes the new version current. Use
50
+ `update_review_asset({ current_version_index })` only to point BACK at an older cut.
51
+ - **Comments attach to a version's media**, not the asset. `list_review_comments` defaults
52
+ to the current version — after adding v2, pass `version_media_id` to re-read v1 feedback.
53
+ Comments do not carry forward; the v2 thread starts clean.
54
+ - Never delete+recreate an asset to "update" it — that orphans the comment history and
55
+ every share link already sent to the client. New cut = `add_review_version`. Rename /
56
+ re-file = `update_review_asset`. Delete is for abandoning the review entirely.
57
+
58
+ ## Share links — permissions and defaults
59
+
60
+ `create_review_share_link` targets an `asset` or a `collection` (collection links cover
61
+ every asset inside, including ones added later). Guest defaults if you pass nothing:
62
+
63
+ | Permission | Default |
64
+ |---|---|
65
+ | `canComment`, `canViewOtherComments`, `canSwitchVersions` | **true** |
66
+ | `canDownload`, `canResolveOwn`, `canSetStatus` | **false** |
67
+ | `require_email` | **true** — guests identify by email before viewing |
68
+ | `role_label` | `"Client"` (max 40 chars) |
69
+
70
+ - Want the client to approve directly? Pass `permissions: { canSetStatus: true }` —
71
+ otherwise they can only comment and you relay the verdict via `set_review_status`.
72
+ - Lockdown options: `password` (a NEW guest password — never an account credential),
73
+ `allowed_emails`, `expires_at` (ISO8601).
74
+ - Links are revoked by id (`revoke_review_share_link`), not edited — to change permissions,
75
+ create a new link and revoke the old one. This is the one place recreate IS the mechanism.
76
+ - When someone other than the owner sets a status, the owner gets a notification — don't
77
+ also announce it manually.
78
+
79
+ ## Storage — the 5GB cap
80
+
81
+ Review media is **copied into dedicated review storage** and counts against a flat 5GB cap
82
+ per account — separate from library storage. The cap is enforced on `create_review_asset`
83
+ AND `add_review_version`; hitting it returns `REVIEW_STORAGE_LIMIT` (413). That error is a
84
+ real limit, not a transient failure — don't retry. Check `get_review_storage_usage`
85
+ (`usedBytes` / `capBytes`) before bulk-adding large videos, and free space by deleting
86
+ finished review assets (the library originals are untouched).
87
+
88
+ ## Practical notes
89
+
90
+ - All of this is instant CRUD — no credits, no polling, no `get_generation_status`.
91
+ - Project contract applies: pass the same `project_id` you resolved via `list_projects` on
92
+ `create_review_asset` / `create_review_collection` / the list calls.
93
+ - `status` filter on `list_review_assets` takes exactly the four enum values — "pending" /
94
+ "done" are not statuses.
95
+ - Comment ids are `note_id` in the reply/edit/delete/resolve tools; version notes cap at
96
+ 1000 chars.
97
+ - Guests can only resolve their own comments, and only if you granted `canResolveOwn` — the
98
+ resolve loop on client feedback is normally yours to run after fixing.
@@ -26,6 +26,10 @@ If Kolbo tools timeout or aren't listed, the MCP server may not be wired. Tell t
26
26
  ```
27
27
  This re-wires the MCP configuration automatically. Then restart the session.
28
28
 
29
+ ## Generation status, waiting, black cards
30
+
31
+ Status semantics, `wait=true` batching, black-card-is-normal and the credit guard live in SKILL.md "⚠️ Generation lifecycle — source of truth, waiting, failures".
32
+
29
33
  ## "Rate limited" (429 errors)
30
34
 
31
35
  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".
@@ -43,10 +47,6 @@ Call `list_color_palettes` and look for `is_active: true`. Then either
43
47
  grade by writing colours into the prompt — the palette is applied after, and the
44
48
  prompt loses.
45
49
 
46
- ## Checking generation status without spinning
47
-
48
- `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.
49
-
50
50
  ## Failure envelope from `get_generation_status`
51
51
 
52
52
  When a generation fails, `get_generation_status` returns a structured `failure` field alongside `error`:
@@ -8,7 +8,7 @@ Visual DNA profiles capture the visual "identity" of a character, style, product
8
8
 
9
9
  ## Workflow
10
10
 
11
- 1. **Sheet first, then DNA.** For any production asset (character / location / prop), resolve the sheet **preset** (`list_presets` with `search`) and `generate_image` with that `preset_id` — custom instructions live on the preset. Then `create_visual_dna` with the sheet as `character_sheet_url` (max 4 extra images — if the user gives more, pick the 4 most representative **that share the same identity and vibe**; never pass 5+). Optionally video and audio. See **Purity** above before you generate those stills.
11
+ 1. **Sheet first, then DNA.** For any production asset (character / location / prop), resolve the sheet **preset** (`list_presets` with `search`) and `generate_image` with that `preset_id` — custom instructions live on the preset. Then `create_visual_dna` with the sheet as `character_sheet_url` (max 4 extra images — if the user gives more, pick the 4 most representative **that share the same identity and vibe**; never pass 5+). Optionally video and audio. See **Purity** below before you generate those stills.
12
12
  2. **Types**: `character` (default), `style`, `product`, `scene`, `environment`.
13
13
  3. **Use** the profile by passing its `id` in `visual_dna_ids` in: `generate_image`, `generate_creative_director`, `generate_elements`, `generate_video_from_image`, `generate_video_from_video`, `generate_first_last_frame`.
14
14
  4. **List/inspect** profiles with `list_visual_dnas` / `get_visual_dna`.
@@ -22,7 +22,7 @@ Visual DNA profiles capture the visual "identity" of a character, style, product
22
22
  Kolbo no longer sends only the first still or the character sheet. For every attached DNA:
23
23
 
24
24
  1. **User-uploaded refs take image slots first.**
25
- 2. **Remaining slots:** one main still per DNA, then leftover stills from each DNA **round-robin** until the model's image-slot cap (`elementsMaxImages` / equivalent) is full.
25
+ 2. **Remaining slots:** one main still per DNA, then leftover stills from each DNA **round-robin** until the model's image-slot cap (`elements_max_images` / equivalent) is full.
26
26
  3. **If every still fits the cap, every still is sent** as its own reference. A 4-image character DNA on a 9-slot model is four slots, not one.
27
27
  4. **If a DNA only gets one leftover slot**, has **no distinct character sheet**, and still has unused stills, those leftovers are composited into a **white grid / collage** (up to 9 cells) so the model still sees them. A real character sheet is never overwritten by a collage.
28
28
  5. **Native Kling Elements** stays one element per DNA (sheet / frontal). Other providers use the slot pack above.
@@ -63,11 +63,12 @@ When the user says "use the model אסתר" but you've only created a DNA for "
63
63
 
64
64
  ## ⚠️ Don't re-fetch / re-list your own outputs (CRITICAL)
65
65
 
66
- After a generation tool returns its URLs, those URLs are **already** in the canvas (the desktop app's gallery panel) and in `.kolbo/production.md`. Do **NOT** call `list_media`, `get_media`, `get_media_stats`, `list_visual_dnas`, or `chat_send_message` with `media_urls` on those URLs just to "verify" or "fetch thumbnails of the results":
66
+ After a generation tool returns its URLs, those URLs are **already** in **Library** (right panel This session) and in `.kolbo/production.md`. Do **NOT** call `list_media`, `get_media`, `get_media_stats`, `list_visual_dnas`, or `chat_send_message` with `media_urls` on those URLs just to "verify" or "fetch thumbnails of the results":
67
67
 
68
68
  - It burns credits and time for zero new information.
69
- - Every such tool call streams partial output into the session, which forces the desktop canvas to re-evaluate (visible flicker on the gallery tiles).
69
+ - Every such tool call streams partial output into the session, which forces Library to re-evaluate (visible flicker on the gallery tiles).
70
70
  - The thumbnails returned by `list_media` / `get_media` are the SAME asset you just generated.
71
+ - A black chat generation card while `Generating` is normal — do not treat it as missing output.
71
72
 
72
73
  **Only call list/get media tools when:**
73
74
  - The user explicitly asks ("what do I have in my library?", "show me my old DNAs").
@@ -103,16 +104,7 @@ Fields to read for the image source (use the first one present on the item): `th
103
104
 
104
105
  ## ⚠️ @name Syntax — ALWAYS use it when passing visual_dna_ids (MANDATORY)
105
106
 
106
- Whenever a generation call passes `visual_dna_ids` (even just one), the prompt MUST refer to each Visual DNA by `@<exact-name>` — the literal `name` field as it was set in `create_visual_dna` and as it appears in `list_visual_dnas`. This is how the engine binds the DNA to a role in the scene. Without `@name`, the engine guesses, drops the DNA, or blends multiple DNAs together.
107
-
108
- **Use the actual stored name, programmatically.** When you call `list_visual_dnas` (or `create_visual_dna`), read the `name` field off the response and use that exact string after the `@`. Do NOT:
109
-
110
- - Translate the name into another language ("אסתר" / "esther" / "אסתי" — pick whichever string is in `name` and use ONLY that one).
111
- - Invent a friendlier alias ("the model", "המודל", "her", "Zohar's", "the left man", "the man on the LEFT").
112
- - Write a "Visual DNA anchors:" prose block that describes position/wardrobe but never writes `@ExactName`.
113
- - Write the character's name in plain text without the `@` prefix.
114
- - Drop the `@name` when only one DNA is passed — the engine still needs the binding so it knows the DNA is the *subject* and not a passive style.
115
- - **Drop or "clean" tags while rewriting a prompt** (help-widget parity). Compiling SCENE CONTEXT / Locked Intro / a "better" English prompt is not permission to delete `@gal_suit` or rewrite `@yonatan` as `Yonatan`. Copy every existing `@` / `#` token into the new prompt, then add craft around them.
107
+ SKILL.md's `@Name` hard rule applies; here is why it binds that way:
116
108
 
117
109
  **Wrong** (DNA `name` is `esther_model`, user wrote prompt in Hebrew):
118
110
  ```
@@ -227,31 +219,11 @@ You can combine all three reference types in a single call — they're additive,
227
219
 
228
220
  ## Visual DNA Limits
229
221
 
230
- Read `max_visual_dna` from `list_models` for the exact cap, AND `supports_visual_dna` for the on/off boolean. A model can support DNA without an explicit cap, or have a non-null cap but silently ignore DNA on certain paths (e.g. `generate_video`). Typical ranges: image models (non-Kling) up to **8**, Kling image models **3**, Elements video models **3–5**, everything else up to **3**.
222
+ Read `max_visual_dna` (and `elements_max_images` for image-slot packing) from `list_models` for the chosen model, AND `supports_visual_dna` for the on/off boolean. A model can support DNA without an explicit cap, or have a non-null cap but silently ignore DNA on certain paths (e.g. `generate_video`). Typical ranges: image models (non-Kling) up to **8**, Kling image models **3**, Elements video models **3–5**, everything else up to **3**.
231
223
 
232
224
  ## ⚠️ Visual DNA Creation — Always Generate Reference Images First (MANDATORY)
233
225
 
234
- **Before calling `create_visual_dna` for a character**, always generate 2 reference images first and include them alongside any user-provided images. These give the Visual DNA engine multi-angle coverage and dramatically improve consistency.
235
-
236
- **Step 1 — Generate both images in parallel (one `generate_image` call each, fire simultaneously):**
237
-
238
- 1. **4-angle character sheet** — prompt: `"[character description], character reference sheet showing front view, back view, left side view, right side view, four panels arranged in a 2x2 grid, neutral solid background, full body, photorealistic"`, aspect ratio `16:9` (or `3:2` — always landscape, see the aspect-ratio rule below)
239
- 2. **Close-up portrait** — prompt: `"[character description], close-up portrait, face and shoulders, neutral solid background, soft studio lighting, photorealistic"`, aspect ratio `1:1`
240
-
241
- **Step 2 — Call `create_visual_dna`** with:
242
- - `images`: the 4-angle sheet URL first, then the close-up URL — **plus** the user's reference photo(s) only if they provided one (i.e. a real person or existing character they want to match). If they gave no reference image, the 2 generated images alone are sufficient.
243
- - `type`: `"character"`
244
- - `name`: single-token lowercase descriptive name (see naming rule above)
245
-
246
- **Why:** A single reference photo only shows one angle. The close-up gives the engine facial detail; the 4-angle sheet gives it body geometry and pose range. Together they produce far more consistent generations. Both stills (and any user photos you add) must be the **same person, same vibe** — they will all be packed into the next generation.
247
-
248
- **Skip this only if** the user explicitly says "just use my image as-is" or provides 3+ reference images already covering multiple angles.
249
-
250
- ### Environments, products, style — same precision
251
-
252
- - **Environment / location:** generate empty (or crowd-only) plates. Prompt out heroes and readable faces. A location DNA that contains `@maya` in the frame will put Maya in every later shot of that place.
253
- - **Product:** isolated angles, consistent lighting, readable label. No extra hero unless the product is worn and the body is generic.
254
- - **Style:** one look, applied cleanly. Do not mix neon-cyber and dusty-western stills on the same style DNA.
226
+ **Before calling `create_visual_dna` for a character**, generate the reference stills first — a multi-angle sheet plus a close-up gives the engine far better coverage than a single photo. Route the stills through the **preset contract** (`list_presets` search → `preset_id` on `generate_image`), never a raw hand-written sheet prompt — see "Character sheet — default for production assets" below for the full flow, preset search terms, and aspect-ratio rules. Include the user's reference photo(s) alongside only if they provided one. **Skip this only if** the user explicitly says "just use my image as-is" or provides 3+ reference images already covering multiple angles.
255
227
 
256
228
  ## When to Use
257
229