@kolbo/mcp 1.75.5 → 1.75.7

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kolbo/mcp",
3
- "version": "1.75.5",
3
+ "version": "1.75.7",
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@d0d959b, the single source of truth.
3
+ This tree is mirrored from kolbo-code@b950100, 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
@@ -70,6 +70,8 @@ For multi-scene / batch work this pairs with `generate_creative_director` (see b
70
70
  | Build a **dashboard / data viz / interactive widget / mini-game / UI mockup** | `references/models/visual-code.md` |
71
71
  | Generate with **any other model** (Flux, Kling, Sora, Hailuo, ElevenLabs, DeepDub, …) — also covers universal prompt-engineering basics | `references/models/prompt-copilot.md` |
72
72
  | Build a **UGC ad / TV spot / branded video / unboxing / product review / virtual try-on** | `references/workflows/marketing-studio.md` |
73
+ | Make anything look **shot on a phone** — UGC, selfie, candid, "authentic", a product photo that must not look like an ad (image OR video) | `references/workflows/ugc-smartphone.md` |
74
+ | Make a **YouTube / Shorts / Reels thumbnail** or video cover | `references/workflows/thumbnails.md` |
73
75
  | Compose a **DTC ad image** (brand kit + ad format + avatar + product + reference media) | `references/workflows/dtc-ads.md` |
74
76
  | Generate **brand product imagery** (studio shot, lifestyle, Pinterest pin, hero banner, carousel, ad pack, virtual try-on, conceptual, restyle) | `references/workflows/product-photoshoot.md` |
75
77
  | Generate **marketplace listing cards** (Amazon main + secondary + A+ content) | `references/workflows/marketplace-cards.md` |
@@ -104,3 +104,17 @@ For any ad / story / scene-based video **created from scratch** featuring a Visu
104
104
  3. **Animate each frame** with `generate_video_from_image`, passing each approved frame as `image_url`.
105
105
 
106
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.
107
+
108
+ ## UGC sets and thumbnail sets
109
+
110
+ Two batch shapes come up constantly and both have their own craft file:
111
+
112
+ - **UGC set** — same creator or product, several angles, all pretending to be one camera
113
+ roll. Put the phone-look line in EVERY scene worded identically (a look written once at
114
+ the top drifts by scene 4), vary the angle and the moment rather than the look, and never
115
+ mix a graded scene into the set. See `workflows/ugc-smartphone.md`.
116
+ - **Thumbnail set** — vary the CONCEPT (bold → minimal → saturated → dark moody →
117
+ typography-forward), never the words; keep the text to 2–4 quoted words and forbid every
118
+ other word on the image. See `workflows/thumbnails.md`. Kolbo also ships a dedicated
119
+ **Thumbnail Generator** tool that runs on Creative Director and fans out 4–8 art-directed
120
+ variations of one topic — name it when the user just wants options.
@@ -19,6 +19,7 @@ Load this file when the user wants a **GPT Image 2 / gpt-image-2** image (OpenAI
19
19
  - **Structure + goal**: write prompts in a consistent order — background/scene → subject → key details → constraints → declared intended use (ad / UI mock / infographic / poster / logo / etc.). The "intended use" line sets the mode and polish level.
20
20
  - **Format**: prefer skimmable templates over clever syntax. Use short labeled segments or line breaks for complex requests. Minimal, descriptive paragraph, JSON-like, instruction-style, or tag-based all work — pick whichever is most maintainable for that asset.
21
21
  - **Specificity + quality cues**: be concrete about materials, shapes, textures, and medium (photo / watercolor / 3D render / vector). Add targeted quality levers only when needed (`film grain`, `textured brushstrokes`, `macro detail`).
22
+ - **Phone-shot / UGC / "authentic" realism**: photorealism triggers are not enough — that look needs deep depth of field, computational-HDR flatness, named available light and deliberate imperfection. Read `workflows/ugc-smartphone.md`.
22
23
  - **Photorealism trigger**: include the literal word **"photorealistic"** to engage the model's photorealistic mode. Supporting phrases: "real photograph", "taken on a real camera", "professional photography", "iPhone photo", "35mm film". Camera specs (lens mm, aperture) work for high-level look but are loosely interpreted — use for vibe, not physics.
23
24
  - **Composition**: specify framing/viewpoint (close-up, wide, top-down), perspective (eye-level, low-angle), lighting/mood (soft diffuse, golden hour, high-contrast). If layout matters, call out placement ("logo top-right", "subject centered, negative space on left").
24
25
  - **People, pose, action**: describe scale, body framing, gaze, object interactions ("full body visible, feet included", "looking down at the open book, not at the camera", "hands naturally gripping the handlebar").
@@ -72,6 +72,7 @@ Layer these onto any framework to lift good → breathtaking.
72
72
  - **Natural**: "golden hour backlighting with long shadows", "overcast diffused light", "blue-hour twilight ambient".
73
73
 
74
74
  ### Camera, lens, focus (hardware = visual DNA)
75
+ - **`iPhone` is a vibe word, not a look** — for a real phone-capture image (and for a product photo that must not read as an ad) read `workflows/ugc-smartphone.md` and write the optics/processing/light/imperfection stack.
75
76
  - **Hardware vibe**: `GoPro` for distorted action immersion · `Fujifilm` for authentic color science · `disposable camera` for raw nostalgic flash · `Hasselblad medium format` for editorial fashion · `iPhone` for everyday realism · `ARRI ALEXA` for cinematic.
76
77
  - **Lens / focus**: "low-angle shot, shallow depth of field f/1.8", "wide-angle for vast scale", "macro for intricate detail", "85mm portrait compression", "anamorphic 2.39:1 bokeh".
77
78
 
@@ -33,7 +33,7 @@ then timecoded `SHOT N — 0:00–0:02 — Medium / camera position` beats. Full
33
33
 
34
34
  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.
35
35
 
36
- UGC / phone vertical: 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.
36
+ 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.
37
37
 
38
38
  ## Prompt length
39
39
 
@@ -54,6 +54,15 @@ The mode determines which Kolbo MCP tool to call, what defaults to set, and what
54
54
 
55
55
  **Pick the actual model** with `list_models({ type: "..." })` and validate caps before firing — see SKILL.md "Resolution / Aspect / Duration — validate against caps".
56
56
 
57
+ ## The Look Itself — read `workflows/ugc-smartphone.md`
58
+
59
+ The modes and defaults below decide WHAT gets made. The physics that make it read as a
60
+ real phone capture — deep depth of field, computational HDR, named available light,
61
+ imperfect framing — live in `workflows/ugc-smartphone.md`. Read it before writing any
62
+ UGC prompt: **"smartphone" on its own does not produce a smartphone look**, and that file
63
+ is also where the still-image cases live (a user's product photo re-shot as a customer
64
+ snapshot, the to-camera vs observational subject dial).
65
+
57
66
  ## UGC Family Defaults (CRITICAL)
58
67
 
59
68
  When ANY `ugc*` mode is selected, snap to these unless the user explicitly overrides:
@@ -171,6 +171,9 @@ NO captions, NO watermarks, NO extra text.
171
171
  @image1 (the product) in a {real-world scene description},
172
172
  natural {time-of-day} light, {natural action involving the product}.
173
173
  Photographic, editorial style, {iPhone | 35mm film | medium format} feel.
174
+ <!-- "iPhone feel" is not a look on its own — for a genuine phone-shot / UGC product
175
+ photo (deep focus, computational HDR, named available light, real clutter, and the
176
+ rules for keeping label identity intact) read workflows/ugc-smartphone.md. -->
174
177
  {Optional: include hands, partial face — never identifiable people}.
175
178
  {Brand palette baked into props/clothing}.
176
179
  NO captions, NO watermarks.
@@ -0,0 +1,117 @@
1
+ # Thumbnails — YouTube, Shorts, Reels, TikTok covers
2
+
3
+ Load this file when the user wants a **thumbnail, video cover, first-frame card, or
4
+ channel art**: "thumbnail for my video", "YouTube cover", "Shorts cover", "make it
5
+ clickable", "higher CTR".
6
+
7
+ A thumbnail is not a nice image at small size. It is a different craft with a different
8
+ success test: **it is judged at ~200px inside a scrolling feed, next to a hundred others.**
9
+ Everything below follows from that.
10
+
11
+ ---
12
+
13
+ ## The four layers
14
+
15
+ Every thumbnail that works has exactly these, in this order of importance.
16
+
17
+ ### 1. ONE hero subject — 40–70% of the frame
18
+
19
+ A face with a big, readable emotion (eyes visible, mouth doing something), or a single
20
+ object caught mid-action. Crop tight — chest-up for a person.
21
+
22
+ Kill on sight: full-body wide shots, three competing focal points, a floating UI panel, an
23
+ abstract gradient, "a person at a desk". If the concept has no surprise, wit, or
24
+ impossibility in it, it will not stop a scroll — write the concept as one sentence first,
25
+ and if that sentence is boring, invent harder before generating.
26
+
27
+ ### 2. Extreme separation
28
+
29
+ The subject must pop off the background: a dark field behind a bright subject, or one
30
+ saturated accent against its complement. **Mid-tone on mid-tone is the number-one
31
+ unreadable-thumbnail failure.** Muted, tasteful palettes lose in a feed.
32
+
33
+ ### 3. Text — 2 to 4 words, maximum
34
+
35
+ - Quote the exact words in the prompt: `render only this text: "STOP DOING THIS"`.
36
+ - Topmost layer, above every element and effect.
37
+ - Roughly **35–45% of the canvas width**. Heavy condensed sans.
38
+ - White or a single accent colour with a **thick dark outline or a solid backing bar** —
39
+ raw text on a busy image is illegible small.
40
+ - Upper or lower third. **Never across the face.**
41
+ - Forbid everything else explicitly: `no other text, no taglines, no watermark, no logo,
42
+ no captions, no placeholder text`.
43
+
44
+ Long strings come back mangled from every image model. If the user wrote a sentence, put
45
+ three words on the image and tell them the rest belongs in the video title. For brand
46
+ names, spell them letter-by-letter in the prompt and raise quality when the type is small.
47
+
48
+ **Depth trick:** let the subject overlap one word slightly (subject in front of one
49
+ letter). Instant production value.
50
+
51
+ ### 4. Platform-safe composition
52
+
53
+ | Format | Rules |
54
+ |---|---|
55
+ | **16:9 — YouTube** | Centre-weighted. Nothing critical in the outer 15%: the duration chip sits bottom-right and the red progress bar covers the bottom edge on watched videos. |
56
+ | **9:16 — Shorts / Reels / TikTok** | Every critical element must survive a **centre-square crop** (feeds and grids crop vertical media to its middle). Keep the top ~15% and the bottom ~20% clear of the platform's title, avatar, caption and buttons. |
57
+ | **1:1** | Community posts and square feeds. |
58
+
59
+ **Verification is a release gate, not a suggestion:** view the render at ~200px, and for
60
+ 9:16 crop the centre square first. If the words or the face don't survive, iterate.
61
+
62
+ ---
63
+
64
+ ## Model choice
65
+
66
+ Text fidelity is the entire constraint. Pick the image model that renders type most
67
+ reliably, and raise the quality setting when the words are small or multi-font. If the
68
+ words come back garbled twice, generate the image **text-free** and tell the user to set
69
+ the type in the Canvas tool — a clean plate plus real type beats a third mangled attempt.
70
+
71
+ ## Routing in Kolbo
72
+
73
+ | Ask | Tool |
74
+ |---|---|
75
+ | One cover | `generate_image` (a single `text_to_image`) |
76
+ | Several options at once | The in-app **Thumbnail Generator** — topic + style + font + aspect, and it fans out 4–8 art-directed variations in one run (it uses Creative Director underneath) |
77
+ | A batch with a locked character or product | `generate_creative_director` with a Visual DNA attached |
78
+ | Cover for a video the user already made | Never crop a frame out of the video — generate a fresh comp. A film frame is exposed for motion, not for a 200px grid |
79
+
80
+ ## Variation ladder
81
+
82
+ When producing a set, vary the **concept**, never the words. This is the ladder the in-app
83
+ tool uses, and it is a good default order:
84
+
85
+ 1. Bold dynamic — high contrast, dramatic light, scroll-stopping energy
86
+ 2. Clean minimal — one focal point, premium negative space
87
+ 3. Vibrant saturated — rich colour, maximum visual impact
88
+ 4. Cinematic wide — epic scale, movie-poster feeling
89
+ 5. Close-up dramatic — intense subject detail, emotional impact
90
+ 6. Typography-forward — the text is the hero, graphic art direction
91
+ 7. Dark moody — deep shadows, selective highlights
92
+ 8. Flat bright illustration — playful shapes, bold outlines
93
+
94
+ ## Faces
95
+
96
+ If the channel has a host, lock them with a **character Visual DNA**
97
+ (`workflows/visual-dna.md`) so every thumbnail in the series is the same person. Expression
98
+ is the payload: shock, delight, disbelief, triumph. A neutral face is a wasted thumbnail.
99
+
100
+ ## Phone-shot thumbnails
101
+
102
+ A "raw / authentic" cover is a real style — a phone-shot frame with big type over it beats
103
+ a polished render for vlog and UGC channels. Build the plate from
104
+ `workflows/ugc-smartphone.md`, then apply the text rules above unchanged. The type stays
105
+ graphic and deliberate even when the photo is deliberately casual.
106
+
107
+ ---
108
+
109
+ ## Checklist
110
+
111
+ - [ ] One subject, 40–70% of frame, tight crop
112
+ - [ ] Subject separates hard from the background
113
+ - [ ] ≤ 4 words, quoted verbatim, everything else forbidden
114
+ - [ ] Text has an outline or backing bar, sits off the face
115
+ - [ ] Correct aspect, critical content inside the safe area
116
+ - [ ] Checked at 200px (and centre-cropped first, for 9:16)
117
+ - [ ] No watermark, no stray words, no gibberish letters
@@ -0,0 +1,238 @@
1
+ # UGC / Smartphone Look — Images and Video
2
+
3
+ Load this file whenever the user asks for anything that should look like a real person's
4
+ phone captured it: "UGC", "shot on my phone", "iPhone photo", "selfie", "candid",
5
+ "authentic", "organic", "TikTok / Reels / Shorts", "creator video", "unboxing", "POV",
6
+ "talking head", or a product photo that "shouldn't look like an ad".
7
+
8
+ For the *campaign* layer around this — ad modes, hooks, avatars, brand kits — see
9
+ `workflows/marketing-studio.md`. This file is the LOOK: the physics that make a
10
+ generation read as a phone capture instead of a commercial.
11
+
12
+ ---
13
+
14
+ ## The one rule everything else follows
15
+
16
+ **Writing "smartphone photo" does not produce a smartphone photo.**
17
+
18
+ Image and video models treat "phone" as a subject label, not a rendering instruction.
19
+ The model has already decided what a good picture looks like — shallow depth of field,
20
+ sculpted key light, clean background, retouched skin — and the word "phone" does not
21
+ overrule any of it. You have to specify the *causes*.
22
+
23
+ Every UGC prompt states four things. Miss one and it drifts back to a commercial.
24
+
25
+ ### 1. Optics — the biggest tell
26
+
27
+ > `shot on a phone, 24mm-equivalent wide lens, tiny sensor: DEEP depth of field, the
28
+ > background as sharp as the subject`
29
+
30
+ Deep focus is the single strongest signal. A creamy blurred background instantly reads
31
+ "produced" — it is physically what a phone cannot do without portrait mode. Add:
32
+
33
+ - mild wide-angle distortion toward the frame edges
34
+ - close-focus perspective: the nearest hand / nose / product reads slightly large
35
+ - the camera stands where a person stands — chest height, arm's length, or above a table
36
+
37
+ ### 2. Processing — what the phone's chip does after the shutter
38
+
39
+ > `computational HDR: flat contrast, lifted shadows, highlights held right at clipping,
40
+ > over-sharpened micro-detail, heavy noise reduction with faint luminance noise in the shadows`
41
+
42
+ This is the "digital" texture people recognise without being able to name. It is the
43
+ opposite of a graded image: nothing is crushed, nothing is filmic, edges are a little
44
+ too crisp.
45
+
46
+ ### 3. Light — available only, and NAMED
47
+
48
+ Never "natural lighting". Name the actual source:
49
+
50
+ | Source | What it does |
51
+ |---|---|
52
+ | Window daylight | soft from one side, faint pane shadows, cool |
53
+ | One ceiling bulb | top-down, warm, shadowed eye sockets |
54
+ | Phone / laptop screen glow | up-lit face, cool cast, dark room |
55
+ | Supermarket / office fluorescents | flat, green-ish, no modelling |
56
+ | Direct on-camera flash at night | hard shadow thrown on the wall behind, hot falloff, dark background |
57
+
58
+ **Mixed white balance in one frame is the strongest realism cue that exists** — warm bulb
59
+ inside plus cool daylight through a window, and the model stops rendering a studio.
60
+
61
+ ### 4. Imperfection — the part everyone skips
62
+
63
+ - framing slightly off-centre, a few degrees of tilt, head near the top edge or lightly cropped
64
+ - caught mid-gesture or mid-blink, not on a posed peak
65
+ - faint motion blur on a moving hand
66
+ - visible pores, flyaway hair, creased clothing, chapped lips — no beauty retouching
67
+ - **a real cluttered background**: cables, a mug, an unmade bed corner, a full dish rack.
68
+ Empty minimal sets are the AI default and the giveaway.
69
+
70
+ ---
71
+
72
+ ## The subject dial — ask once, then state it
73
+
74
+ Users often want the subject facing camera. **Often — not always.** Decide it explicitly
75
+ and write it into the prompt:
76
+
77
+ - **TO-CAMERA** — arm's-length selfie geometry, direct eye contact, talking to the viewer
78
+ like a friend. Default for a talking head, review, testimonial, or hook.
79
+ - **OBSERVATIONAL** — candid, subject unaware, filmed by someone standing where a person
80
+ would stand. Default for lifestyle, product-in-use, and "day in the life".
81
+
82
+ Do not silently assume to-camera for every UGC ask; an observational frame is what makes a
83
+ product shot feel found rather than staged.
84
+
85
+ ---
86
+
87
+ ## Product + UGC (the most common image case)
88
+
89
+ The user uploads a product and wants a photo a customer could have taken.
90
+
91
+ **Route first:**
92
+
93
+ | What they want | Tool |
94
+ |---|---|
95
+ | The SAME uploaded photo re-rendered as a phone shot | `generate_image_edit` (`image_editing`) |
96
+ | The product in a NEW scene — a hand, a counter, a gym bag | `generate_image` with the product image as a reference |
97
+
98
+ **Then four hard rules:**
99
+
100
+ 1. **Identity is not creative latitude.** `keep the label artwork, typography, colours,
101
+ proportions and closure exactly as in the reference — do not redesign, re-letter or
102
+ re-colour the packaging`. Models rewrite label text unless forbidden. If the label
103
+ carries words, quote them verbatim in the prompt.
104
+ 2. **Relight it into the room.** A studio pack-shot dropped into a kitchen is the classic
105
+ fake. Demand: the same light direction and colour temperature as the scene, a contact
106
+ shadow where it meets the surface, the room reflected in glossy or laminated faces, a
107
+ matching noise level, and no leftover white-cyclorama edge glow.
108
+ 3. **Human scale.** A real hand holding or using it — unmanicured nails, natural grip,
109
+ slight motion blur — or set down mid-use (open, half-full, cap beside it). Never
110
+ centred like a catalogue.
111
+ 4. **One product per frame**, label toward camera at least once.
112
+
113
+ For recurring products, make a **product Visual DNA** (`workflows/visual-dna.md`) so the
114
+ identity survives every generation instead of being re-described each time.
115
+
116
+ ---
117
+
118
+ ## Video
119
+
120
+ Everything above still applies. On top of it:
121
+
122
+ - **The word "cinematic" is banned** — not in the header, not in GLOBAL LOOK, not in a
123
+ shot. It is the single line that turns a phone video back into a commercial.
124
+ - **Frame:** `9:16 vertical phone frame`, restated **inside every shot**. Forbid letterbox,
125
+ pillarbox and 16:9 inserts — multishot models silently flip a later shot to widescreen
126
+ when the prompt reads filmic.
127
+ - **Single shot vs multi-shot** — ask, don't assume:
128
+ - *Single* (default): `single unbroken take, no cuts`. One continuous handheld take is
129
+ what most UGC actually is.
130
+ - *Multi*: `N connected phone shots, Xs total, 9:16, Multishot ON`. Every shot must be an
131
+ angle one person with one phone could actually have grabbed — never crew coverage.
132
+ Vary the angle and the moment (selfie arm → held out at the product → set down on the
133
+ counter → mid-use), never the look.
134
+ - **Camera:** the phone is in a hand. Slight sway with constant micro-corrections,
135
+ reframing a beat late, selfie-arm at arm's length, or propped on a surface. NEVER dolly,
136
+ crane, gimbal glide, orbit, crash zoom, or a locked tripod master.
137
+ - **Product:** it is HANDLED, not displayed — picked up, opened, used, label turned to the
138
+ lens at least once, and locked identical across every shot.
139
+ - **Audio:** room tone and the phone's own mic. No score, no SFX layer, no burned-in
140
+ captions or subtitles unless the user explicitly asked (they add those in CapCut, and
141
+ baked-in captions kill reuse).
142
+
143
+ Seedance's phone-vertical exception in `references/models/seedance25.md` is the same rule
144
+ from the model's side — read it before compiling a multi-shot UGC prompt.
145
+
146
+ ---
147
+
148
+ ## The negative list (append it every time)
149
+
150
+ ```
151
+ no cinematic colour grade, no teal-and-orange, no shallow depth of field or bokeh,
152
+ no anamorphic flare, no studio softbox or rim light, no beauty retouching or skin
153
+ smoothing, no film-grain overlay, no perfect symmetry, no watermark, no added text
154
+ ```
155
+
156
+ ## Aspect
157
+
158
+ 9:16 for social and Stories. 4:3 / 3:4 for a camera-roll photo. Widescreen only if asked.
159
+
160
+ ## Optional era dials (only when the user wants that vibe)
161
+
162
+ Direct-flash night party · disposable camera with a burned-in date stamp · front-camera
163
+ selfie with the arm in frame · screenshot of a video call · mirror selfie with the phone
164
+ visible · early-2010s low-light grain.
165
+
166
+ ---
167
+
168
+ ## Parity with the Kolbo app
169
+
170
+ The web app ships this look as a **Smartphone** cinematic preset, and its wording is the
171
+ house baseline — match it so a prompt written here and a preset clicked in the UI produce
172
+ the same picture:
173
+
174
+ - **Camera — Smartphone:** *the everyday look of a phone snapshot, deep depth of field with
175
+ foreground and background both sharp, flat computational-HDR contrast, slightly
176
+ oversharpened detail, candid realism*
177
+ - **Focal length:** 24mm · **Lighting:** Window Light · **Colour:** Naturalistic Clean
178
+
179
+ `list_cinematic_presets` returns the live catalog. Related in-app looks worth knowing:
180
+ **Camcorder Tape** (2000s home video), **Reality Show**, **Mockumentary**, and the
181
+ **Handheld** movesets for video.
182
+
183
+ ---
184
+
185
+ ## Copy-ready seeds
186
+
187
+ **Phone still (person):**
188
+ ```
189
+ Candid phone snapshot of {subject} in {real, specific room}, {mid-action}.
190
+ Shot on a phone, 24mm wide, tiny sensor — deep depth of field, background as sharp as
191
+ the subject. Computational HDR: flat contrast, lifted shadows, highlights at clipping,
192
+ over-sharpened detail, faint shadow noise. Lit only by {named source}; {second source}
193
+ mixes a different colour temperature into the frame. Framing slightly off-centre with a
194
+ few degrees of tilt, caught mid-gesture. Visible skin texture and flyaway hair, creased
195
+ clothing, real clutter in the background ({two specific objects}).
196
+ 9:16 vertical.
197
+ no cinematic grade, no bokeh, no rim light, no retouching, no watermark, no text
198
+ ```
199
+
200
+ **Product in a real kitchen (new scene, product image as reference):**
201
+ ```
202
+ {Product from the reference} held in a real hand over a kitchen counter, mid-use, cap
203
+ beside it. Keep the label artwork, typography, colours and proportions exactly as in the
204
+ reference — do not redesign or re-letter the packaging.
205
+ Shot on a phone, 24mm wide, deep depth of field. Computational HDR, flat contrast,
206
+ over-sharpened detail. Lit by window daylight from the left with a warm ceiling bulb
207
+ mixing in. The product is relit by the room: matching light direction and colour, a
208
+ contact shadow where it meets the counter, the window reflected in its glossy face,
209
+ the same noise level as the rest of the frame.
210
+ Unmanicured nails, natural grip, slight motion blur. Crumbs and a mug in the background.
211
+ 4:3.
212
+ no studio background, no rim light, no bokeh, no retouching, no added text
213
+ ```
214
+
215
+ **Single-shot UGC video:**
216
+ ```
217
+ Single unbroken take, no cuts, 9:16 vertical phone frame.
218
+ {Presenter or @dna} in {everyday room}, TO-CAMERA, talking to the viewer like a friend
219
+ while {natural action with the product}. Phone held at arm's length with slight sway and
220
+ constant micro-corrections; the frame reframes a beat late.
221
+ Available light only: {named source}. Deep focus, flat computational-HDR contrast,
222
+ over-sharpened detail.
223
+ Audio: room tone and the phone's own mic. No music, no SFX, no captions.
224
+ ```
225
+
226
+ ---
227
+
228
+ ## QC — look for these before you ship
229
+
230
+ | Symptom | Cause |
231
+ |---|---|
232
+ | Background is blurred | you didn't demand deep depth of field |
233
+ | Reads as an ad | the word "cinematic" survived, or a rim/key light is in the prompt |
234
+ | Product looks pasted in | you didn't relight it into the scene |
235
+ | Label text is wrong | you didn't forbid redesigning it / didn't quote the words |
236
+ | Face is plastic | no pores/asymmetry/flyaway hair line, or retouching wasn't forbidden |
237
+ | Set is empty and clean | you didn't name real clutter |
238
+ | A later video shot went widescreen | 9:16 wasn't restated inside every shot |
@@ -133,9 +133,18 @@ function boot(sc) {
133
133
  makeExpandable(el('prompt'));
134
134
  renderChips(sc);
135
135
  el('credits').textContent = sc.credits_used != null ? fmtCredits(sc.credits_used) : '';
136
- if (sc.phase === 'generating') renderGenerating(sc);
137
- else if (sc.phase === 'failed') renderError(sc.error || 'Generation failed');
138
- else renderResult(sc);
136
+ // Every legitimate completed payload sets phase:'completed' explicitly
137
+ // (uiCompleted, completedFromPlain, the visual_dna character-sheet path)
138
+ // there is no real case where "no media yet" should render as a result.
139
+ // A host that sends some OTHER phase string here (e.g. a host-side
140
+ // pre-flight envelope built before the tool call even ran) used to fall
141
+ // through straight to renderResult with no urls/scenes, rendering as a
142
+ // broken/empty "completed" card — indistinguishable from a real failure —
143
+ // for however long that phase lingered. Default anything unrecognized to
144
+ // "still working" instead of assuming it's done.
145
+ if (sc.phase === 'failed') renderError(sc.error || 'Generation failed');
146
+ else if (sc.phase === 'completed') renderResult(sc);
147
+ else renderGenerating(sc);
139
148
  window.kolbo.notifySize();
140
149
  }
141
150