cueframe 0.1.2 → 0.3.0
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/dist/analyze-4EZTZEAG.js +2 -0
- package/dist/chunk-3QSA3EBY.js +2 -0
- package/dist/chunk-4FMFWW74.js +12 -0
- package/dist/cueframe.js +46 -39
- package/dist/supportedAgents.js +2 -0
- package/package.json +4 -3
- package/skills/add-music-bed/SKILL.md +103 -0
- package/skills/brand-reel/SKILL.md +103 -0
- package/skills/clip-a-talking-head/SKILL.md +95 -0
- package/skills/composing-video/SKILL.md +666 -0
- package/skills/cueframe-brand-demo/SKILL.md +9 -6
- package/skills/cueframe-cli/SKILL.md +1 -1
- package/skills/cueframe-component-authoring/SKILL.md +3 -3
- package/skills/cueframe-compose-loop/SKILL.md +3 -0
- package/skills/cueframe-storyboard/SKILL.md +99 -0
- package/skills/every-format-from-one-edit/SKILL.md +91 -0
- package/skills/extracting-brand-kits/SKILL.md +156 -0
- package/skills/launch-video/SKILL.md +95 -0
- package/skills/make-a-social-reel/SKILL.md +103 -0
- package/skills/rebrand-a-video/SKILL.md +99 -0
- package/skills/video-craft-standards/SKILL.md +119 -0
- package/dist/analyze-CN3MXICA.js +0 -2
- package/dist/chunk-ZBD4U6PD.js +0 -12
|
@@ -5,6 +5,9 @@ description: Use when turning a local app into a brand-consistent product demo w
|
|
|
5
5
|
|
|
6
6
|
# CueFrame — Brand demo recipe
|
|
7
7
|
|
|
8
|
+
> **Kit truth over MCP (current limits):** kit CONTENTS are not yet inspectable over MCP (`get_profile` lists names only), so `$brand:` tokens resolve blind — verify resolved fonts/colors with a `preview_frame` still, and when the kit conflicts with an explicit client spec, the spec wins (hardcode it and note the conflict). Bind kits by the SERVER id from `get_profile` (slug binding is unreliable — it can silently bind nothing); always confirm via the project response `brandKitId`.
|
|
9
|
+
|
|
10
|
+
|
|
8
11
|
A **use-case recipe** that runs end-to-end from inside the user's own project
|
|
9
12
|
folder. You (Claude) already see their code and their running app — that's the
|
|
10
13
|
unfair advantage. This skill turns that context into a brand-consistent product
|
|
@@ -35,7 +38,7 @@ extract brand (repo + live UI) → create_brand_kit
|
|
|
35
38
|
→ capture (Kishu: Playwright walkthrough of localhost → MP4) → import_media
|
|
36
39
|
→ get_media_context (faces + transcript)
|
|
37
40
|
→ apply_composition (edit plan + brand template, refs brandKitId + $brand:)
|
|
38
|
-
→
|
|
41
|
+
→ compose { fromComposition:true } → wait_job kind:compose
|
|
39
42
|
→ create_render → wait_job kind:render → branded MP4
|
|
40
43
|
```
|
|
41
44
|
|
|
@@ -95,7 +98,7 @@ matter, click the features worth showing, pause on results.
|
|
|
95
98
|
|
|
96
99
|
Get the recording into CueFrame with `import_media` (public https URL) — it's
|
|
97
100
|
async; poll `list_media` for `processingStatus:"ready"` (or register
|
|
98
|
-
`create_webhook` on `media.
|
|
101
|
+
`create_webhook` on `media.completed`). Keep the click points; you'll map them onto
|
|
99
102
|
the rendered duration for the zoom.
|
|
100
103
|
|
|
101
104
|
## 3. Context → `get_media_context`
|
|
@@ -207,19 +210,19 @@ durations are illustrative — match your source.
|
|
|
207
210
|
}
|
|
208
211
|
```
|
|
209
212
|
|
|
210
|
-
## 5. Refine + judge → `
|
|
213
|
+
## 5. Refine + judge → `compose { fromComposition: true }`
|
|
211
214
|
|
|
212
|
-
Hand the seed to the Director: `
|
|
215
|
+
Hand the seed to the Director: `compose` with `{ fromComposition: true }`
|
|
213
216
|
authors an ensemble of candidates from your seed, runs the **server-side judge —
|
|
214
217
|
including the brand axis** (on-brand color/type/voice cohesion), and saves the
|
|
215
218
|
winner. Returns a `composeJobId`; `wait_job` `kind:"compose"` (or a webhook on
|
|
216
|
-
`compose.
|
|
219
|
+
`compose.completed`). The result carries the winner's composite score — verification
|
|
217
220
|
is built in. Pass your brief as `editorialIntent` so editorial is graded against
|
|
218
221
|
what you meant. (To self-drive the loop instead, see `cueframe-compose-loop`.)
|
|
219
222
|
|
|
220
223
|
## 6. Render → branded MP4
|
|
221
224
|
|
|
222
|
-
`create_render` → `wait_job` `kind:"render"` (or a webhook on `render.
|
|
225
|
+
`create_render` → `wait_job` `kind:"render"` (or a webhook on `render.completed`)
|
|
223
226
|
for the download URL. The output is brand-frozen: the kit's **intro/outro** bumper
|
|
224
227
|
the video, the **logo** bug sits in its corner, **motion** drives the overlay
|
|
225
228
|
entrances, and every `$brand:` color/font is resolved. Verify the output (sample
|
|
@@ -157,7 +157,7 @@ video and composites it (the shared renderer never runs your code).
|
|
|
157
157
|
cueframe init --json
|
|
158
158
|
|
|
159
159
|
# 2a. FORK a built-in primitive into cueframe/components/<id>/ as owned, editable source.
|
|
160
|
-
# Discover ids from the catalog: cueframe api GET /v1/components (
|
|
160
|
+
# Discover ids from the catalog: cueframe api GET /v1/components (the live primitive catalog).
|
|
161
161
|
cueframe eject cinematic-title --json
|
|
162
162
|
|
|
163
163
|
# 2b. …or scaffold a blank custom component.
|
|
@@ -27,9 +27,9 @@ Single self-contained module per component (`create_component` takes one `tsxSou
|
|
|
27
27
|
ids from the catalog (`/v1/components`). *(Or author from scratch — skip to step 2.)*
|
|
28
28
|
2. **Author/own it:** edit the `tsxSource`, then `create_component({ componentId, tsxSource, … })`
|
|
29
29
|
to store your customized copy (origin `server-native`; if forked, `ejectedFrom` is stamped).
|
|
30
|
-
3. **Iterate (author→preview→fix):** `
|
|
30
|
+
3. **Iterate (author→preview→fix):** `preview_component({ componentId, params })` (sessionless; if a cold first call returns 409 box_warming, retry in a few seconds)
|
|
31
31
|
renders ONE still. A 422 `component_does_not_compile` returns the compiler error — read it, fix
|
|
32
|
-
via `update_component` (same id, in place), preview again.
|
|
32
|
+
via `update_component` (same id, in place), preview again.
|
|
33
33
|
4. **Render:** add it to a composition as an `alpha-layer` clip (`apply_composition`), then
|
|
34
34
|
`create_render` → `wait_job kind:"render"` for the MP4.
|
|
35
35
|
|
|
@@ -57,7 +57,7 @@ MCP path stores. To preview before a full render, push it and use the MCP `previ
|
|
|
57
57
|
The catalog (`/v1/components`) gives each primitive's `description` / `useWhen` / `tags` / `mood` /
|
|
58
58
|
`tier` / `useCase` / `examples` (example params) + `propSchema` + its source via `get_component_source`.
|
|
59
59
|
Read the spec + the code to pick a starting point. (Rendered preview thumbnails are a separate
|
|
60
|
-
follow-up — today you choose from prose + params + source, or compose+`
|
|
60
|
+
follow-up — today you choose from prose + params + source, or compose+`preview_frame` to see it.)
|
|
61
61
|
|
|
62
62
|
## Don't
|
|
63
63
|
- Don't expect a forked primitive to use rich named props — it's adapted to `({durationInFrames,
|
|
@@ -5,6 +5,9 @@ description: Use when an AI agent should DRIVE CueFrame to a high-quality clip i
|
|
|
5
5
|
|
|
6
6
|
# CueFrame — Compose convergence loop
|
|
7
7
|
|
|
8
|
+
> **LANE SCOPE:** this skill is written against the DESKTOP/REST compose-session surface. Over MCP those endpoints do not exist — use the `composing-video` skill (sessionless judge/preview) instead; this document is reference for the REST lane only.
|
|
9
|
+
|
|
10
|
+
|
|
8
11
|
You are the director. CueFrame gives you hands (author), eyes (capture), and a
|
|
9
12
|
judge (verify); you supply the taste and the iteration. The engine does NOT
|
|
10
13
|
auto-compose for you here — you drive the loop and decide when it's done. Drive
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: cueframe-storyboard
|
|
3
|
+
description: Use BEFORE composing when starting a NEW video from scratch and you need to plan its structure — turning a rough ask ("make a launch video", "30s promo", "an explainer for our API") into a concrete beat flow. Owns the intake + storyboard step: interview the user for the brief, resolve the format from the platform, and lay out the hook→body→cta beats that drive the compose workflow. Triggers on "plan a video", "storyboard", "structure this video", "outline the video", "where do I start", or any new-video ask that has no structure yet. Hand off to composing-video for per-beat craft.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# CueFrame Storyboard: brief → flow
|
|
7
|
+
|
|
8
|
+
> **The bar:** the `video-craft-standards` skill (GET /v1/skills/video-craft-standards) defines DONE for every artifact class — per-class MUST checklists and kill criteria. Read it before composing and score against it before rendering. When this skill and that document disagree, the standards win.
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
## The one idea
|
|
12
|
+
|
|
13
|
+
**You are the planner.** You have the user, the whole conversation, the brand, and the judgment — you are
|
|
14
|
+
the smartest thing in this loop. CueFrame is the hands. This skill is the **intake + structure** step:
|
|
15
|
+
turn intent into a concrete **beat flow** *before* you seed a composition, so the curated workflow (media →
|
|
16
|
+
components → seed) executes a plan instead of a guess. Craft — grounded-vs-slop, the verify loop — belongs
|
|
17
|
+
to the sibling **composing-video** skill; this skill gets you a flow, then hands off to it.
|
|
18
|
+
|
|
19
|
+
Do not offload the *thinking* to CueFrame. There is no server that plans the video for you, and you would
|
|
20
|
+
not want one — it would be a blind model with none of your context. Plan here, in the open, with the user.
|
|
21
|
+
|
|
22
|
+
## 1. Interview for the brief — ask only what you can't infer
|
|
23
|
+
|
|
24
|
+
Fill the brief from the conversation first; ask the user **only for the 1–2 things you genuinely cannot
|
|
25
|
+
infer**, and STATE what you assume for the rest. Never wall them with a form.
|
|
26
|
+
|
|
27
|
+
- **Goal / intent** *(required)* — what is this video FOR? launch, promo, explainer, demo, teaser, recap.
|
|
28
|
+
- **Platform** *(sets the format)* — reels / tiktok / shorts → **9:16, ~20s** · youtube → **16:9, ~45s** ·
|
|
29
|
+
linkedin / x → **1:1, ~20s** · web → **16:9, ~30s**. (Or an explicit aspect ratio + duration.)
|
|
30
|
+
- **Audience**, **tone** (punchy / premium-calm / playful / authoritative), **CTA**, **must-includes**
|
|
31
|
+
(a number, a name, a screen), **references** (a style to echo), **brand kit**.
|
|
32
|
+
|
|
33
|
+
If the ask is "make a launch video for our API," you already have goal + a hint of audience — ask "Reels,
|
|
34
|
+
YouTube, or your site?" and infer the rest: *"I'll assume a developer audience and a punchy tone — say if
|
|
35
|
+
you'd rather it feel calm/premium."* One or two questions, not seven.
|
|
36
|
+
|
|
37
|
+
## 2. Structure the flow — the storyboard
|
|
38
|
+
|
|
39
|
+
Lay the duration into **beats** using the fixed editorial vocabulary
|
|
40
|
+
**hook → context → body → proof → cta → outro** (use what the piece needs — most short-form is
|
|
41
|
+
hook → body → cta). For each beat decide:
|
|
42
|
+
|
|
43
|
+
- a one-line **intent** (what this beat does for the viewer),
|
|
44
|
+
- a **duration** (they sum to the target; the hook earns attention in ~3s),
|
|
45
|
+
- a **media need** — real footage is the strongest grounding and CueFrame's home turf, so reach for it
|
|
46
|
+
first; otherwise `generate` a *purposeful* clip (a diagram of the real mechanism, the real UI) or `find`
|
|
47
|
+
stock. Animated text over a gradient is not grounding — it's the slop default,
|
|
48
|
+
- an optional **graphic** (a lower-third, title, CTA card),
|
|
49
|
+
- a **caption** and/or a **VO/script** line.
|
|
50
|
+
|
|
51
|
+
**Ground it, don't invent it.** Pick every graphic/scene from `list_catalog` (filter by `useCase`/`tier`)
|
|
52
|
+
— never hardcode hex or positions or name a component that doesn't exist. Theme from the brand kit. If
|
|
53
|
+
you're planning over real footage, read `get_media_context` (detected faces + transcript) so beat timing,
|
|
54
|
+
crops, and captions land on what's actually there.
|
|
55
|
+
|
|
56
|
+
## 3. Show the flow, then persist it as a Brief
|
|
57
|
+
|
|
58
|
+
Show the user the beat list **first** — a five-line outline. It is cheap to change here and expensive to
|
|
59
|
+
change after a render, so this is where you converge on structure. On their go, **persist the plan with
|
|
60
|
+
`create_brief`** — the beats/goal/format/gates you just elicited map 1:1 onto its fields, and the plan stops
|
|
61
|
+
being chat-ephemeral (it survives the session, carries a cost quote, and is honored field-by-field):
|
|
62
|
+
|
|
63
|
+
1. `import_media` / `generate_media` for each beat's media need,
|
|
64
|
+
2. `create_brief` — goal, audience, platform/format, durationSec, tone, cta, locale, and the beats
|
|
65
|
+
(each with its editorial intent and, when you're cutting real footage, MOMENT PINNING
|
|
66
|
+
`source: {mediaId, startSec, endSec}` from the transcript — honored to-the-frame or refused).
|
|
67
|
+
Relay the response's **quote** (compose + estimated render) BEFORE composing.
|
|
68
|
+
3. `compose { briefId }` — the Director authors FROM your brief; every field is honored or the
|
|
69
|
+
compose is refused loudly naming the field. Gates: put `holdAt: ["layout"]` in the brief's `gates` when
|
|
70
|
+
the user wants to approve the storyboard mid-flight; `autoApprove: true` for hands-off.
|
|
71
|
+
4. `score_composition` / `consult` to fix the weakest beat,
|
|
72
|
+
5. `create_render` for the MP4.
|
|
73
|
+
|
|
74
|
+
**Two graphic media — pick per beat, and review accordingly:** a `card` (verbatim HTML in
|
|
75
|
+
`seededGraphics`) is a STATIC graphic — cheap, approve it from a still; a **component**
|
|
76
|
+
(`create_component`, `useCurrentFrame`) is MOTION — a still is one frame, so preview it before trusting it.
|
|
77
|
+
Seeded graphics you author into the brief are carried VERBATIM as locked clips — the Director never
|
|
78
|
+
re-authors them; `exclusions` bans graphic kinds you never want it to author.
|
|
79
|
+
|
|
80
|
+
Then load **composing-video** and apply its craft to make each beat good.
|
|
81
|
+
|
|
82
|
+
## Related skills & positioning
|
|
83
|
+
|
|
84
|
+
This skill owns **structure/intake**; its siblings own execution and craft — defer to them:
|
|
85
|
+
|
|
86
|
+
- **composing-video** — the craft/quality layer (grounded specificity vs. slop, the vision → rubric →
|
|
87
|
+
verify loop). Load it *after* you have a flow; it makes each beat good.
|
|
88
|
+
- **cueframe-compose-loop** — the author → render → verify → fix convergence loop + the ship bar.
|
|
89
|
+
- **cueframe-product-video** — click-points → auto-zoom tiling + PiP for screen demos.
|
|
90
|
+
- **cueframe-brand-demo** — brand-token vocabulary + auto intro/outro/logo for branded launches.
|
|
91
|
+
- **cueframe-component-authoring** — fork → preview → push for a custom graphic a beat needs.
|
|
92
|
+
- **cueframe-cli** — the `cueframe` binary + wire mechanics.
|
|
93
|
+
|
|
94
|
+
## The boundary
|
|
95
|
+
|
|
96
|
+
You own the **vision** (the one idea and the flow for *this* video) and **data correctness** (a wrong
|
|
97
|
+
number you supply is rendered faithfully — the mistake is yours). CueFrame owns being faithful, legible,
|
|
98
|
+
and giving you real footage + real components to plan against. Reason from this; skip the whole flow only
|
|
99
|
+
for a re-render of an approved composition or a single trivial one-off.
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: every-format-from-one-edit
|
|
3
|
+
description: Derives content-aware 9:16, 1:1, and 4:5 siblings from one finished composition — same edit, every platform, no re-editing. Triggers on "make this vertical too", "I need this for TikTok and LinkedIn", "every aspect ratio", "square version of this", "resize for Reels", "one video, all platforms", "port this edit to Shorts".
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Every format from one edit
|
|
7
|
+
|
|
8
|
+
You finish ONE edit; you get back its siblings for every platform — 9:16 for
|
|
9
|
+
Reels/TikTok/Shorts, 1:1 and 4:5 for feeds — derived content-aware from the master,
|
|
10
|
+
subject-tracked rather than letterboxed, each judged and rendered on its own. The edit decisions
|
|
11
|
+
are made once; the formats are a job, not a re-edit.
|
|
12
|
+
|
|
13
|
+
## Before you start
|
|
14
|
+
|
|
15
|
+
Confirm which master and which target platforms before setup. When the first tool call
|
|
16
|
+
approaches and CueFrame isn't connected:
|
|
17
|
+
|
|
18
|
+
- **Claude Code:** offer to run
|
|
19
|
+
`claude mcp add --transport http cueframe https://api.cueframe.ai/v1/mcp` — browser OAuth,
|
|
20
|
+
one **Allow** click.
|
|
21
|
+
- **Claude.ai / Claude Desktop:** Settings → Connectors → add a custom connector with
|
|
22
|
+
`https://api.cueframe.ai/v1/mcp`.
|
|
23
|
+
- **Other agents:** paste `set up https://cueframe.ai/skill.md`, or run
|
|
24
|
+
`npx -y cueframe install`.
|
|
25
|
+
|
|
26
|
+
Then straight to deriving — this whole job is minutes when the master is good.
|
|
27
|
+
|
|
28
|
+
## Inputs
|
|
29
|
+
|
|
30
|
+
- **The master composition** (required): a finished, approved edit — find it via
|
|
31
|
+
`list_compositions` if the user doesn't have the id. If the master isn't done, finish it first
|
|
32
|
+
(this skill multiplies quality AND flaws).
|
|
33
|
+
- **Target aspects**: default all three siblings — 9:16, 1:1, 4:5. The documented derive lane
|
|
34
|
+
starts from a 16:9 master.
|
|
35
|
+
- **Per-platform tweaks**: default none — determinism is the point. Take an explicit ask (e.g.
|
|
36
|
+
"shorter for TikTok") as a separate edit on the derived sibling.
|
|
37
|
+
|
|
38
|
+
## Workflow
|
|
39
|
+
|
|
40
|
+
1. **Verify the master is actually done.** It passed its class checklist, its audio was
|
|
41
|
+
decided, its render was approved. Deriving from a draft ships the draft's flaws four times.
|
|
42
|
+
2. **Derive each sibling.** `derive_composition` per target aspect — the reframe is
|
|
43
|
+
content-aware: it tracks the subject into the new frame instead of letterboxing. Each
|
|
44
|
+
sibling is a real composition you can edit independently afterward; the master is never
|
|
45
|
+
touched.
|
|
46
|
+
3. **Audit every sibling on real pixels — required, not optional.** `preview_frame` each
|
|
47
|
+
sibling at t=0, hook-end, and each card's midpoint; describe each still. What to look for
|
|
48
|
+
per aspect: the subject's head fully in the vertical frame; cards and captions inside the
|
|
49
|
+
safe area (no critical copy in the outer ~8%); no beat where the tighter crop lost the thing
|
|
50
|
+
the beat exists to show.
|
|
51
|
+
4. **Fix per-sibling, surgically.** Where a crop or card misbehaves, `apply_composition` on
|
|
52
|
+
THAT sibling — nudge a `setCropIntents` segment, resize a card for the narrower frame
|
|
53
|
+
(re-shell with `applyMotionPreset` in a following call if you replace the card). Don't
|
|
54
|
+
re-edit the story; the story is the master's.
|
|
55
|
+
5. **Confirm the audio carried.** The master's decided audio — bed, ducking, beat-aligned cuts
|
|
56
|
+
(`materializeGrid` markers), or its intentional silence — rides into each sibling. Verify
|
|
57
|
+
the bed is present and the silence decision, if any, still holds; the sibling's delivery
|
|
58
|
+
note repeats it. If a sibling needs a different bed, `search_resources` honoring the brand
|
|
59
|
+
kit's `musicMood` and swap it on that sibling only.
|
|
60
|
+
6. **Judge each sibling as its own artifact.** `score_composition` per sibling with the
|
|
61
|
+
master's vision as `editorialIntent`. A 9:16 sibling is a social reel and answers to that
|
|
62
|
+
class's checklist — hook inside 2 seconds still applies in the new crop. Fix worst-first to
|
|
63
|
+
≥ 7.5.
|
|
64
|
+
7. **Render each approved sibling.** `create_render` → `wait_job (kind:"render")` per
|
|
65
|
+
composition. One final render per approval; iterate with previews.
|
|
66
|
+
|
|
67
|
+
## What good looks like
|
|
68
|
+
|
|
69
|
+
Quoted from `video-craft-standards` (cross-cutting rules — every artifact):
|
|
70
|
+
|
|
71
|
+
> **MUST** Safe-area respected: no critical copy in the outer ~8% of frame.
|
|
72
|
+
|
|
73
|
+
> **MUST** One final render per approval; iterate with previews, not renders.
|
|
74
|
+
|
|
75
|
+
> **MUST** Delivery never ends with "done": the last message carries the output link and where
|
|
76
|
+
> to find it, plus the intentional-silence note if any.
|
|
77
|
+
|
|
78
|
+
And the class rule that governs each sibling: a derived 9:16 answers to §1 (Social reel) —
|
|
79
|
+
*"**MUST (K)** The hook lands inside 2 seconds"* — a derived 16:9 to its own class. Derivation
|
|
80
|
+
changes the frame, never the bar.
|
|
81
|
+
|
|
82
|
+
## Delivering
|
|
83
|
+
|
|
84
|
+
The last message is a manifest, never "done":
|
|
85
|
+
|
|
86
|
+
- Every sibling's render link, labeled by aspect and platform, and where each lives (project +
|
|
87
|
+
composition id — the master's id too, since it stays the source of truth).
|
|
88
|
+
- The master's attribution list (it covers all siblings — same assets).
|
|
89
|
+
- The intentional-silence note, restated once, if the master chose silence.
|
|
90
|
+
- Any sibling-specific edits you made (which crop nudged, which card resized) so future master
|
|
91
|
+
edits know what to re-check after re-deriving.
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: extracting-brand-kits
|
|
3
|
+
description: Use when the user says "make my video look like THIS" with a reference video, screenshots, or a moodboard — build a CueFrame brand kit FROM that inspiration so every subsequent compose speaks its visual language. Owns the extraction step: sample the reference's graphics-bearing frames, upload them as exemplars, reproduce each recurring motif as an authored graphic verified against the reference, and upsert the kit with the full language payload. Triggers on "match this style", "like this reference", "use this video as inspiration", "extract a brand kit", "moodboard". Hand off to cueframe-storyboard/composing-video once the kit is bound.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Extracting brand kits: reference pixels → a kit the engine honors
|
|
7
|
+
|
|
8
|
+
## The one idea
|
|
9
|
+
|
|
10
|
+
**No summarization anywhere in the path.** A reference described in prose converges on house style
|
|
11
|
+
with the reference's palette — the pixels are the ground truth. You (the agent) are the extractor:
|
|
12
|
+
you SEE the reference, curate its frames, and reproduce its motifs as ordinary authored graphics,
|
|
13
|
+
verified against the reference by looking. The kit you produce carries (a) **exemplar frames** the
|
|
14
|
+
compose maker and judge both see, and (b) **motif skins** — card HTML the designer reproduces —
|
|
15
|
+
plus code-checked facts (caption profile, density, palette). Once bound to a project, the engine
|
|
16
|
+
takes over: the planner plans to your density, the designer sees your exemplars
|
|
17
|
+
(`view_style_reference`), the judge grades every candidate against them, and a half-applied kit
|
|
18
|
+
fails the compose loudly instead of shipping house style.
|
|
19
|
+
|
|
20
|
+
Everything below drives the public `/v1` API with your API key. Frames never pass through chat —
|
|
21
|
+
they go straight to storage via presigned PUTs.
|
|
22
|
+
|
|
23
|
+
## 0. Prereqs
|
|
24
|
+
|
|
25
|
+
- An API key with `projects:write` (create_brand_kit gates on the `brand_kits` plan feature — check `get_account` first; 402 names the feature).
|
|
26
|
+
- `ffmpeg` locally, and the reference video file (download it first if it's a URL).
|
|
27
|
+
- Know the org's IDENTITY kit if one exists (`get_profile` → brandKits). Inspiration NEVER overwrites identity: logo, brand fonts, and identity color slots come from the existing kit (or stay for the user to fill) — extraction contributes the LANGUAGE only.
|
|
28
|
+
|
|
29
|
+
## 1. Sample the reference (local, ffmpeg)
|
|
30
|
+
|
|
31
|
+
Uniform sampling misses short-lived graphics (1–3s overlays). Sample two ways and union:
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
# scene cuts
|
|
35
|
+
ffmpeg -i ref.mp4 -vf "select='gt(scene,0.22)',showinfo" -vsync vfr scenes/%03d.jpg
|
|
36
|
+
# 2fps sweep (catches overlays that appear without a cut)
|
|
37
|
+
ffmpeg -i ref.mp4 -vf fps=2,scale=720:-1 -q:v 4 sweep/%04d.jpg
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
Then LOOK at the frames and curate: keep the **graphics-bearing** ones — frames where a card,
|
|
41
|
+
pill, stat, lower-third, caption treatment, or end-card is visible and sharp. Drop near-duplicates.
|
|
42
|
+
**≤24 frames**, each downscaled to ≤720px width, jpeg. For each animated graphic, also note the
|
|
43
|
+
timestamp where it ENTERS (you'll classify its motion in step 5; re-watch that 1s window at
|
|
44
|
+
`ffmpeg -ss <t> -t 1 -i ref.mp4 -vf fps=12 burst/%02d.jpg` if you need to see the entrance).
|
|
45
|
+
|
|
46
|
+
Optional but recommended: build a contact sheet for the human's "right vibe?" check:
|
|
47
|
+
`ffmpeg -i frames/frame-%02d.jpg -filter_complex tile=6x4 sheet.jpg`.
|
|
48
|
+
|
|
49
|
+
## 2. Upload the exemplars (the ingest door)
|
|
50
|
+
|
|
51
|
+
```
|
|
52
|
+
POST /v1/brand-kits/exemplar-uploads { "count": <n>, "includeContactSheet": true }
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
Returns presigned PUT slots under the org's `brand-inspiration/…` prefix — the ONLY namespace the
|
|
56
|
+
kit door accepts exemplar keys from. PUT each curated frame (order matters: frame-01 ↔ index 0 —
|
|
57
|
+
motif `evidence` arrays reference these indexes), PUT the sheet, keep the returned `key` list.
|
|
58
|
+
URLs expire in 15 minutes; re-POST for a fresh batch if you run over.
|
|
59
|
+
|
|
60
|
+
## 3. Inventory the motifs
|
|
61
|
+
|
|
62
|
+
Look across the exemplars and list every RECURRING graphic treatment (expect ~5–12 for a designed
|
|
63
|
+
reference). For each, write:
|
|
64
|
+
|
|
65
|
+
- `id` — `m1`, `m2`, …
|
|
66
|
+
- `observed` — one precise sentence ("thin-outline rounded keyword pill, single word, beside subject").
|
|
67
|
+
- `role` — the closed vocabulary the planner/designer speak (exact values):
|
|
68
|
+
`title-card | stat | lower-third | pull-quote | hero | logo-tag | enumeration | sequence | comparison`.
|
|
69
|
+
Pick the role each motif best SERVES — the designer's steering matches on it exactly.
|
|
70
|
+
- `evidence` — the exemplar indexes (0-based) it appears in.
|
|
71
|
+
- `zone` — normalized `{x, y, w, h}` where it lives.
|
|
72
|
+
- Behind-the-subject motifs (text the speaker occludes): record them with `coverage: "skipped"` and
|
|
73
|
+
`skipReason: "behind-subject — card graphics render front-only"`. Do NOT attempt them.
|
|
74
|
+
|
|
75
|
+
Also read the CAPTION treatment off the frames (step 6 consumes it): plate or plateless? base/
|
|
76
|
+
highlight colors? case? emphasis styling? entrance feel (~ms)?
|
|
77
|
+
|
|
78
|
+
## 4. Reproduce each motif as a card (author → look → refine, ≤3 iterations)
|
|
79
|
+
|
|
80
|
+
For each non-skipped motif, author it as a **card** (freeform HTML/CSS — rendered verbatim) and
|
|
81
|
+
verify it against the exemplar BY LOOKING:
|
|
82
|
+
|
|
83
|
+
1. **Measure first**: read the exemplar — border weight, radius, padding, font size relative to
|
|
84
|
+
frame, colors. Measurement-seeded CSS gets you ~90% in one shot.
|
|
85
|
+
2. Author `{ "kind": "card", "html": "…", "tokens": { … } }`. Bind every brand-swappable color
|
|
86
|
+
through `tokens` with `$brand:` refs (e.g. `"line": "$brand:colors.accent"`, referenced in CSS
|
|
87
|
+
as `var(--cf-line)`) so the kit's identity re-themes it. No `<script>`, no `@keyframes` (inert —
|
|
88
|
+
motion is step 5).
|
|
89
|
+
3. Render it (`preview_frame` on a scratch session, or `preview_component` if you forked a
|
|
90
|
+
component) and compare the still against the exemplar side by side. Fix the largest visible
|
|
91
|
+
difference. Repeat — **cap 3 iterations**, keep the best.
|
|
92
|
+
4. Record `diffScore` (your honest 0–1 same-language judgment) and `coverage`:
|
|
93
|
+
`"reproduced"` (≥0.8) or `"approximated"`.
|
|
94
|
+
|
|
95
|
+
Prefer a catalog primitive (`list_catalog`) over a card ONLY if it genuinely matches closer —
|
|
96
|
+
record it as `{ "kind": "overlay", "primitiveId": "…", "params": { … } }`. A custom component
|
|
97
|
+
(`{ "kind": "component", "componentId": "…" }`) only for motifs with internal motion (counters).
|
|
98
|
+
|
|
99
|
+
## 5. Classify motion (closed vocabulary — never invent animation)
|
|
100
|
+
|
|
101
|
+
Watch each motif's entrance burst and map it:
|
|
102
|
+
|
|
103
|
+
- Graphic motion presets (exact values): `fade-up | slide-in-left | slide-in-right | scale-pop | stagger-reveal`,
|
|
104
|
+
with `enterMs` / `exitMs` / `staggerMs` timings you observed.
|
|
105
|
+
- Caption per-word entrances: `none | fade | word-pop | stagger-up`.
|
|
106
|
+
- Unsure or the reference does something the vocabulary can't say? Pick the NEAREST preset and set
|
|
107
|
+
`"confidence": "low"` — honesty beats fabrication; the vocabulary grows engine-side, not here.
|
|
108
|
+
|
|
109
|
+
## 6. Compute the facts
|
|
110
|
+
|
|
111
|
+
- `captionProfile` — from step 3's caption read. The kit door speaks the full look: `color`,
|
|
112
|
+
`highlightColor`, `plate` (`"none"` for the clean plateless look), `entrance`, `entranceMs`,
|
|
113
|
+
`exitMs`, `emphasisColor/Scale/FontWeight/FontStyle`, `emphasisPlate` knobs, `textTransform`.
|
|
114
|
+
- `density` — `{ "graphicsPerMin": <count/duration*60>, "maxSimultaneous": <max overlapping> }`.
|
|
115
|
+
- Palette → `extraColors` entries `{ "hex", "label": "inspiration accent N", "usage": "swappable" }`.
|
|
116
|
+
NEVER write the identity `colors.*` slots, `headingFont`/`bodyFont`, or `logo` from the
|
|
117
|
+
reference — copy those from the base identity kit, or leave them for the user.
|
|
118
|
+
- `styleRubric` — 2–4 sentences the JUDGE will grade with: name the motif language, the caption
|
|
119
|
+
treatment, and what disqualifies a frame ("filled chips or plated captions are off-language").
|
|
120
|
+
|
|
121
|
+
## 7. Upsert the kit + bind it
|
|
122
|
+
|
|
123
|
+
One `create_brand_kit` call (it's an upsert — re-POST the same `kitId` to curate):
|
|
124
|
+
|
|
125
|
+
```jsonc
|
|
126
|
+
{
|
|
127
|
+
"kitId": "acme-launchfilm",
|
|
128
|
+
"name": "Acme × Launch Film",
|
|
129
|
+
// identity: copied from the base kit or neutral — never from the reference
|
|
130
|
+
"colors": { … }, "headingFont": { … }, "bodyFont": { … },
|
|
131
|
+
"extraColors": [ { "hex": "#F5B942", "label": "inspiration accent 1", "usage": "swappable" } ],
|
|
132
|
+
"captionProfile": { "plate": "none", "entrance": "fade", "entranceMs": 220, … },
|
|
133
|
+
"exemplarKeys": [ "<keys from step 2, in frame order>" ],
|
|
134
|
+
"contactSheetKey": "<sheet key>",
|
|
135
|
+
"motifs": [ { "id": "m1", "observed": "…", "body": { "kind": "card", … }, "motion": { "preset": "fade-up", "enterMs": 320 }, "role": "pull-quote", "zone": { … }, "evidence": [0, 2], "diffScore": 0.93, "coverage": "reproduced" } ],
|
|
136
|
+
"styleRubric": "…",
|
|
137
|
+
"density": { "graphicsPerMin": 4, "maxSimultaneous": 2 },
|
|
138
|
+
"inspiration": { "sources": ["<reference URL>"], "extractedAt": <now ms>, "extractionVersion": "skill-1" }
|
|
139
|
+
}
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
The door validates loudly: exemplar keys must come from step 2's batch, motif roles/presets must be
|
|
143
|
+
in-vocabulary, evidence indexes must be in range. A 422 names exactly what to fix.
|
|
144
|
+
|
|
145
|
+
Then bind: `update_project { "brandKitId": "acme-launchfilm" }`. Show the human the contact sheet
|
|
146
|
+
("right vibe?") before composing. From here, hand off to **cueframe-storyboard** — every compose
|
|
147
|
+
against the project now plans, designs, and JUDGES in the reference's language, and refuses to
|
|
148
|
+
ship house style if any part of the kit fails to resolve.
|
|
149
|
+
|
|
150
|
+
## Failure honesty
|
|
151
|
+
|
|
152
|
+
- Reference has no graphics language (talking head, zero overlays)? Say so — upsert nothing, or a
|
|
153
|
+
captions-only kit. Don't invent motifs.
|
|
154
|
+
- A motif you can't match in 3 iterations ships as `"approximated"` with its real diffScore — the
|
|
155
|
+
judge's floor will surface it; don't inflate.
|
|
156
|
+
- Behind-subject motifs stay `"skipped"` with the reason. The engine refuses them loudly anyway.
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: launch-video
|
|
3
|
+
description: Turns screen recordings and product footage into a 30–90 second 16:9 launch film — payoff-first hook, real product surface punched in, a building bed or narration, one CTA end card. Triggers on "make a launch video", "announcement video for this feature", "turn this screen recording into a demo film", "product video from these captures", "we're shipping Friday and need a video", "feature announcement".
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Launch video
|
|
7
|
+
|
|
8
|
+
You bring real screen recordings or product footage plus the one outcome the feature delivers;
|
|
9
|
+
you get back a 30–90 second 16:9 announcement that opens on the payoff, shows the actual product
|
|
10
|
+
doing the real thing, builds under a bed or narration, and lands on a single CTA.
|
|
11
|
+
|
|
12
|
+
## Before you start
|
|
13
|
+
|
|
14
|
+
Nail the payoff sentence and collect the captures before any setup. When the first tool call
|
|
15
|
+
approaches and CueFrame isn't connected:
|
|
16
|
+
|
|
17
|
+
- **Claude Code:** offer to run
|
|
18
|
+
`claude mcp add --transport http cueframe https://api.cueframe.ai/v1/mcp` — browser OAuth,
|
|
19
|
+
one **Allow**.
|
|
20
|
+
- **Claude.ai / Claude Desktop:** Settings → Connectors → add a custom connector with
|
|
21
|
+
`https://api.cueframe.ai/v1/mcp`.
|
|
22
|
+
- **Other agents:** paste `set up https://cueframe.ai/skill.md`, or run
|
|
23
|
+
`npx -y cueframe install`.
|
|
24
|
+
|
|
25
|
+
Keep the momentum — the video plan is the hard part, the connection is not.
|
|
26
|
+
|
|
27
|
+
## Inputs
|
|
28
|
+
|
|
29
|
+
- **Real captures** (required): screen recordings, product footage, real output. CueFrame does
|
|
30
|
+
not screen-record — the user records (or uses a capture client) and you `import_media` the
|
|
31
|
+
file. Never mock what's missing; ask for the real capture.
|
|
32
|
+
- **The payoff**: the outcome in the user's words ("close the books two days faster"), plus the
|
|
33
|
+
CTA (one action) and launch date if any.
|
|
34
|
+
- **Brand kit**: project kit if present; ask for wordmark + accent color otherwise.
|
|
35
|
+
- **Voice**: default a building instrumental bed with captioned key lines; narrated VO if they
|
|
36
|
+
have a script or want one generated.
|
|
37
|
+
|
|
38
|
+
## Workflow
|
|
39
|
+
|
|
40
|
+
1. **Import the real surface.** `import_media` every capture; wait for ready;
|
|
41
|
+
`get_media_context` for what each recording actually shows (and the transcript, if narrated
|
|
42
|
+
footage exists). Inventory the strongest 3–5 real moments before writing a beat.
|
|
43
|
+
2. **Open on the payoff, not the name.** The hook is the OUTCOME — the result on screen, the
|
|
44
|
+
pain disappearing — inside the first seconds. "Introducing X" is throat-clearing; the
|
|
45
|
+
outcome-first frame is the hook. No logo, no title card first.
|
|
46
|
+
3. **Structure: hook → problem → reveal → proof → CTA.** `new_composition` at 16:9 →
|
|
47
|
+
`apply_composition` with the beats. Pacing tightens as the payoff approaches — clips get
|
|
48
|
+
shorter toward the reveal.
|
|
49
|
+
4. **Punch in on the real pixels.** A click target is tiny in a full-frame capture;
|
|
50
|
+
`setCropIntents` with `point` focus segments zooming to the exact UI region per step,
|
|
51
|
+
`frame-center` in the gaps, tiling every clip. The single biggest amateur-to-pro delta in
|
|
52
|
+
product video.
|
|
53
|
+
5. **Cards for the claims and the end card.** Key lines and the closing CTA are `kind:"card"`
|
|
54
|
+
HTML in the brand's type and palette — persisted first, then shelled with
|
|
55
|
+
`applyMotionPreset` in a FOLLOWING `apply_composition` call. One CTA on the end card, held
|
|
56
|
+
long enough to read, plus the date if there is one.
|
|
57
|
+
6. **Audio that builds — required.** `search_resources` for a bed honoring the brand kit's
|
|
58
|
+
`musicMood`, energy arcing toward the reveal; place it `audioRole:"music"`,
|
|
59
|
+
`materializeGrid { grid:"beat" }`, and land beat boundaries and the reveal on the grid. If
|
|
60
|
+
narrated: the VO is the rhythm authority instead — cut to the voice and duck the bed under
|
|
61
|
+
it. Silence is almost never right for a launch; if chosen anyway, record the decision and
|
|
62
|
+
reason in the delivery note.
|
|
63
|
+
7. **Caption narration.** If there is a voice, `captions.fromTranscript` (or authored word
|
|
64
|
+
timings for generated VO), styled legible via `setCaptionStyle`. Captions are mandatory when
|
|
65
|
+
narrated.
|
|
66
|
+
8. **Preview, judge, one render.** `preview_frame` at t=0, hook-end, the reveal, and the end
|
|
67
|
+
card; describe each still — is that a REAL capture on screen? Then `score_composition` with
|
|
68
|
+
the payoff line as `editorialIntent`; fix worst-first to ≥ 7.5; `create_render` →
|
|
69
|
+
`wait_job (kind:"render")`.
|
|
70
|
+
|
|
71
|
+
## What good looks like
|
|
72
|
+
|
|
73
|
+
Quoted from `video-craft-standards` §2 (Launch film / feature announcement) — the full checklist
|
|
74
|
+
wins:
|
|
75
|
+
|
|
76
|
+
> **MUST (K)** Payoff-first hook: the OUTCOME, not the feature name ("Close the books two days
|
|
77
|
+
> faster" beats "Introducing the reconciliation module"). No throat-clearing.
|
|
78
|
+
|
|
79
|
+
> **MUST** Narration or a bed that builds toward the reveal; pacing tightens as the payoff
|
|
80
|
+
> approaches. **MUST** Real product surface: actual UI/screens/output — never mocked.
|
|
81
|
+
|
|
82
|
+
> **MUST** End card with a single CTA. **MUST** Captions present when narrated.
|
|
83
|
+
|
|
84
|
+
And cross-cutting: *"Footage carries the video: real footage / real UI / real data ≥60% of
|
|
85
|
+
runtime for footage-first classes."*
|
|
86
|
+
|
|
87
|
+
## Delivering
|
|
88
|
+
|
|
89
|
+
Close with the handoff, never "done":
|
|
90
|
+
|
|
91
|
+
- The render link and where it lives (project + composition id).
|
|
92
|
+
- Attribution for the bed and any licensed asset (provider, id, author).
|
|
93
|
+
- The intentional-silence note with its reason, in the rare case silence was chosen.
|
|
94
|
+
- A one-line cutdown offer: the 16:9 master can become 9:16 / 1:1 siblings for social (see
|
|
95
|
+
`every-format-from-one-edit`).
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: make-a-social-reel
|
|
3
|
+
description: Turns footage into a finished 9:16 social reel — hook inside 2 seconds, poster-grade type, a decided music bed, one final render. Triggers on "make me a reel from this", "turn this into a short", "cut a clip for TikTok / Reels / Shorts", "make this vertical", "make a social clip from this video", "the opening is boring", "can you make this pop for Instagram".
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Make a social reel
|
|
7
|
+
|
|
8
|
+
You hand over footage (a file URL, a talk, a product moment); you get back a 9:16 reel of 8–30
|
|
9
|
+
seconds that opens on its strongest image, cuts on the music, carries brand-grade type, and ends
|
|
10
|
+
on a deliberate beat — with a download link, not a "done".
|
|
11
|
+
|
|
12
|
+
## Before you start
|
|
13
|
+
|
|
14
|
+
Don't stall the conversation on setup — get the footage, the hook, and the tone agreed first.
|
|
15
|
+
When the first real tool call is imminent and CueFrame isn't connected:
|
|
16
|
+
|
|
17
|
+
- **Claude Code:** offer to run
|
|
18
|
+
`claude mcp add --transport http cueframe https://api.cueframe.ai/v1/mcp` — a browser tab
|
|
19
|
+
opens and the user clicks **Allow**.
|
|
20
|
+
- **Claude.ai / Claude Desktop:** Settings → Connectors → add a custom connector with
|
|
21
|
+
`https://api.cueframe.ai/v1/mcp`.
|
|
22
|
+
- **Any other agent:** paste `set up https://cueframe.ai/skill.md`, or run
|
|
23
|
+
`npx -y cueframe install`.
|
|
24
|
+
|
|
25
|
+
Thirty seconds, then straight back to the reel — treat it as a detour, never a gate.
|
|
26
|
+
|
|
27
|
+
## Inputs
|
|
28
|
+
|
|
29
|
+
- **Footage** (required): a public https URL, or something already in `list_media`. If they have
|
|
30
|
+
nothing, ask for the real thing before reaching for stock — real footage is the whole edge.
|
|
31
|
+
- **Brand kit**: use the project's kit if one exists; otherwise ask for a color + font or extract
|
|
32
|
+
one. Default: proceed with a neutral palette and say so.
|
|
33
|
+
- **Tone / platform**: default punchy, 15–25s, sound-on-with-captions. Ask only if the answer
|
|
34
|
+
would change the cut.
|
|
35
|
+
|
|
36
|
+
## Workflow
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
0. **Find the claim (before anything else).** Interrogate the brand/material
|
|
40
|
+
for its tension — what it believes that its category doesn't — and write
|
|
41
|
+
the claim in one sentence. Derive the shot list, the bed's mood/tempo, the
|
|
42
|
+
pacing, and every card's copy FROM that sentence. If you cannot state the
|
|
43
|
+
claim, you are not ready to compose (video-craft-standards: the
|
|
44
|
+
controlling idea is kill-level).
|
|
45
|
+
|
|
46
|
+
1. **Import and read the footage.** `import_media` (public https URL), poll `list_media` until
|
|
47
|
+
ready, then `get_media_context` — faces, transcript, word timings. The context tells you
|
|
48
|
+
where the hook lives; don't guess.
|
|
49
|
+
2. **Pick the hook before you touch the timeline.** The strongest image, motion, or claim in the
|
|
50
|
+
footage — the outcome, not the feature name, is the hook. If the best moment is at 0:47, the
|
|
51
|
+
reel opens at 0:47. No logo-first cold opens, ever.
|
|
52
|
+
3. **Seed the timeline.** `new_composition` at 9:16, then `apply_composition`: clips trimmed to
|
|
53
|
+
the beats you chose, a new visual beat at least every ~4 seconds. Cut TO moments; never let a
|
|
54
|
+
clip run out.
|
|
55
|
+
4. **Reframe for vertical.** `setCropIntents` with segments that tile every clip —
|
|
56
|
+
`active-speaker` or `face` focus when a person carries it, `point` focus on the action
|
|
57
|
+
otherwise. A wide shot letterboxed into 9:16 is a fail, not a fallback.
|
|
58
|
+
5. **Author the type as cards.** Brand text is `kind:"card"` HTML — your typography,
|
|
59
|
+
palette-as-fields, considered alignment — persisted first, then shelled with
|
|
60
|
+
`applyMotionPreset` in a FOLLOWING `apply_composition` call. Catalog text primitives are
|
|
61
|
+
utility only.
|
|
62
|
+
6. **Decide the audio — required, never skipped.** Search a bed with `search_resources` honoring
|
|
63
|
+
the brand kit's `musicMood`, place it as an `audioRole:"music"` clip, then `materializeGrid`
|
|
64
|
+
`{ grid:"beat" }` and land your cut points and transition midpoints on the markers. If the
|
|
65
|
+
piece is genuinely better silent, that is a decision — record it and its reason in the
|
|
66
|
+
delivery note. A reel whose silence nobody chose is not done.
|
|
67
|
+
7. **Caption any speech.** `captions.fromTranscript` with the mediaId, styled via
|
|
68
|
+
`setCaptionStyle` (plated, bottom, out of the mouth/eyes). Most social viewing is sound-off;
|
|
69
|
+
don't karaoke a beat with no speech.
|
|
70
|
+
8. **Look, then get judged.** `preview_frame` at t=0, hook-end, and every beat boundary;
|
|
71
|
+
describe each still in words before scoring it. Then `score_composition` with your one-line
|
|
72
|
+
vision as `editorialIntent` — fix the worst criterion first. Ship at composite ≥ 7.5, budget
|
|
73
|
+
3–5 passes.
|
|
74
|
+
9. **One final render.** `create_render` → `wait_job (kind:"render")`. Iterate with previews,
|
|
75
|
+
not renders.
|
|
76
|
+
|
|
77
|
+
## What good looks like
|
|
78
|
+
|
|
79
|
+
Quoted from `video-craft-standards` §1 (Social reel) — the full checklist wins over this skill
|
|
80
|
+
wherever they disagree:
|
|
81
|
+
|
|
82
|
+
> **MUST (K)** The hook lands inside 2 seconds: the strongest image, motion, or claim opens the
|
|
83
|
+
> piece. No logo-first cold opens, no fade-in-from-black preambles.
|
|
84
|
+
|
|
85
|
+
> **MUST** Typography is poster-grade: composed plates/fields in the brand palette, considered
|
|
86
|
+
> alignment and scale. **K:** centered white text floating on footage.
|
|
87
|
+
|
|
88
|
+
> **MUST** Pacing is cut-driven: a new visual beat at least every ~4s […] **MUST** Ends on a
|
|
89
|
+
> deliberate beat: tagline, logo, or CTA lockup — not a clip running out.
|
|
90
|
+
|
|
91
|
+
And the cross-cutting audio rule:
|
|
92
|
+
|
|
93
|
+
> **MUST** Audio is decided, never defaulted […] **K:** a render whose silence nobody chose.
|
|
94
|
+
|
|
95
|
+
## Delivering
|
|
96
|
+
|
|
97
|
+
Never end with "done". The last message carries:
|
|
98
|
+
|
|
99
|
+
- The render's download URL and where it lives (the project, by composition id).
|
|
100
|
+
- Attribution for every stock asset used (provider, id, author) — the provenance you recorded at
|
|
101
|
+
import.
|
|
102
|
+
- The intentional-silence note with its reason, if you chose silence over a bed.
|
|
103
|
+
- One line on what you'd tighten next, so the follow-up edit has a starting point.
|