@nodetool-ai/agents 0.8.4-a24.2 → 0.8.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.
Files changed (135) hide show
  1. package/dist/.nodetool-build-stamp +1 -1
  2. package/dist/_skills/LICENSE-iart-motion-design-skills +21 -0
  3. package/dist/_skills/README.md +211 -0
  4. package/dist/_skills/api-agents/SKILL.md +58 -0
  5. package/dist/_skills/api-apps/SKILL.md +54 -0
  6. package/dist/_skills/api-assets/SKILL.md +66 -0
  7. package/dist/_skills/api-collections/SKILL.md +33 -0
  8. package/dist/_skills/api-games/SKILL.md +81 -0
  9. package/dist/_skills/api-media/SKILL.md +131 -0
  10. package/dist/_skills/api-memory/SKILL.md +72 -0
  11. package/dist/_skills/api-models/SKILL.md +78 -0
  12. package/dist/_skills/api-scripts/SKILL.md +79 -0
  13. package/dist/_skills/api-settings/SKILL.md +49 -0
  14. package/dist/_skills/api-sketches/SKILL.md +61 -0
  15. package/dist/_skills/api-storyboards/SKILL.md +94 -0
  16. package/dist/_skills/api-timelines/SKILL.md +151 -0
  17. package/dist/_skills/api-web/SKILL.md +57 -0
  18. package/dist/_skills/api-workflows/SKILL.md +123 -0
  19. package/dist/_skills/beat-sync-editing/SKILL.md +208 -0
  20. package/dist/_skills/caption-titles/SKILL.md +94 -0
  21. package/dist/_skills/color-motion/SKILL.md +185 -0
  22. package/dist/_skills/commercial-beat-sheet/SKILL.md +338 -0
  23. package/dist/_skills/elevenlabs-audio-prompting/SKILL.md +163 -0
  24. package/dist/_skills/explainer-storyboard/SKILL.md +63 -0
  25. package/dist/_skills/flux-2-klein-prompting/SKILL.md +107 -0
  26. package/dist/_skills/frame-composition/SKILL.md +291 -0
  27. package/dist/_skills/game-direction/SKILL.md +99 -0
  28. package/dist/_skills/gpt-image-2-prompting/SKILL.md +161 -0
  29. package/dist/_skills/hailuo-prompting/SKILL.md +107 -0
  30. package/dist/_skills/kling-video-prompting/SKILL.md +188 -0
  31. package/dist/_skills/launch-commercial/SKILL.md +267 -0
  32. package/dist/_skills/launch-kit/SKILL.md +120 -0
  33. package/dist/_skills/logo-reveal/SKILL.md +225 -0
  34. package/dist/_skills/manimgx/SKILL.md +123 -0
  35. package/dist/_skills/minimax-h3-prompting/SKILL.md +134 -0
  36. package/dist/_skills/motion-ad/SKILL.md +281 -0
  37. package/dist/_skills/motion-background/SKILL.md +145 -0
  38. package/dist/_skills/motion-curves/SKILL.md +302 -0
  39. package/dist/_skills/motion-direction/SKILL.md +259 -0
  40. package/dist/_skills/motion-graphics/SKILL.md +217 -0
  41. package/dist/_skills/motion-principles/SKILL.md +255 -0
  42. package/dist/_skills/music-video-treatment/SKILL.md +40 -0
  43. package/dist/_skills/nano-banana-pro-prompting/SKILL.md +133 -0
  44. package/dist/_skills/native-game/SKILL.md +310 -0
  45. package/dist/_skills/native-game-reference/SKILL.md +879 -0
  46. package/dist/_skills/nodetool-3d-scene/SKILL.md +110 -0
  47. package/dist/_skills/nodetool-api-reference/SKILL.md +338 -0
  48. package/dist/_skills/nodetool-app-builder/SKILL.md +291 -0
  49. package/dist/_skills/nodetool-browser-agent/SKILL.md +119 -0
  50. package/dist/_skills/nodetool-chat-cli/SKILL.md +184 -0
  51. package/dist/_skills/nodetool-custom-node-developer/SKILL.md +294 -0
  52. package/dist/_skills/nodetool-deployment/SKILL.md +195 -0
  53. package/dist/_skills/nodetool-js-scripting/SKILL.md +223 -0
  54. package/dist/_skills/nodetool-model-provider-config/SKILL.md +348 -0
  55. package/dist/_skills/nodetool-rag-indexing/SKILL.md +153 -0
  56. package/dist/_skills/nodetool-sketch/SKILL.md +138 -0
  57. package/dist/_skills/nodetool-skill-author/SKILL.md +125 -0
  58. package/dist/_skills/nodetool-troubleshooter/SKILL.md +370 -0
  59. package/dist/_skills/nodetool-video-post/SKILL.md +149 -0
  60. package/dist/_skills/nodetool-workflow-builder/SKILL.md +295 -0
  61. package/dist/_skills/product-commercial/SKILL.md +132 -0
  62. package/dist/_skills/qwen-image-prompting/SKILL.md +122 -0
  63. package/dist/_skills/script-video/SKILL.md +106 -0
  64. package/dist/_skills/seedance-2-prompting/SKILL.md +194 -0
  65. package/dist/_skills/seedream-prompting/SKILL.md +117 -0
  66. package/dist/_skills/short-film/SKILL.md +123 -0
  67. package/dist/_skills/stable-audio-prompting/SKILL.md +130 -0
  68. package/dist/_skills/storyboard-core/SKILL.md +716 -0
  69. package/dist/_skills/timeline-edit-ops/SKILL.md +736 -0
  70. package/dist/_skills/trailer-template/SKILL.md +291 -0
  71. package/dist/_skills/ugc-video/SKILL.md +186 -0
  72. package/dist/_skills/veo-3-prompting/SKILL.md +140 -0
  73. package/dist/_skills/video-audio-continuity/SKILL.md +90 -0
  74. package/dist/_skills/video-clone/SKILL.md +96 -0
  75. package/dist/_skills/video-workflow/SKILL.md +119 -0
  76. package/dist/_skills/wan-2-6-prompting/SKILL.md +107 -0
  77. package/dist/app-build/bridge.d.ts.map +1 -1
  78. package/dist/app-build/bridge.js +44 -17
  79. package/dist/app-build/bridge.js.map +1 -1
  80. package/dist/capabilities/apps.d.ts.map +1 -1
  81. package/dist/capabilities/apps.js +55 -13
  82. package/dist/capabilities/apps.js.map +1 -1
  83. package/dist/capabilities/apps.specs.d.ts.map +1 -1
  84. package/dist/capabilities/apps.specs.js +5 -3
  85. package/dist/capabilities/apps.specs.js.map +1 -1
  86. package/dist/capabilities/game-asset-browser.d.ts.map +1 -1
  87. package/dist/capabilities/game-asset-browser.js +6 -1
  88. package/dist/capabilities/game-asset-browser.js.map +1 -1
  89. package/dist/capabilities/game.d.ts +1 -1
  90. package/dist/capabilities/game.d.ts.map +1 -1
  91. package/dist/capabilities/game.js +71 -56
  92. package/dist/capabilities/game.js.map +1 -1
  93. package/dist/capabilities/game.specs.js +1 -1
  94. package/dist/capabilities/game.specs.js.map +1 -1
  95. package/dist/capabilities/game3d.d.ts.map +1 -1
  96. package/dist/capabilities/game3d.js +14 -19
  97. package/dist/capabilities/game3d.js.map +1 -1
  98. package/dist/capabilities/gameAssertions.d.ts +52 -0
  99. package/dist/capabilities/gameAssertions.d.ts.map +1 -0
  100. package/dist/capabilities/gameAssertions.js +32 -0
  101. package/dist/capabilities/gameAssertions.js.map +1 -0
  102. package/dist/capabilities/models.d.ts.map +1 -1
  103. package/dist/capabilities/models.js +9 -0
  104. package/dist/capabilities/models.js.map +1 -1
  105. package/dist/capabilities/storyboards.d.ts.map +1 -1
  106. package/dist/capabilities/storyboards.js +36 -11
  107. package/dist/capabilities/storyboards.js.map +1 -1
  108. package/dist/capabilities/storyboards.specs.d.ts.map +1 -1
  109. package/dist/capabilities/storyboards.specs.js +11 -1
  110. package/dist/capabilities/storyboards.specs.js.map +1 -1
  111. package/dist/capabilities/workflows.d.ts.map +1 -1
  112. package/dist/capabilities/workflows.js +1 -0
  113. package/dist/capabilities/workflows.js.map +1 -1
  114. package/dist/capabilities/workflows.specs.d.ts.map +1 -1
  115. package/dist/capabilities/workflows.specs.js +4 -3
  116. package/dist/capabilities/workflows.specs.js.map +1 -1
  117. package/dist/evals/surfaces/game.d.ts.map +1 -1
  118. package/dist/evals/surfaces/game.js +29 -1
  119. package/dist/evals/surfaces/game.js.map +1 -1
  120. package/dist/game-authoring.d.ts +120 -0
  121. package/dist/game-authoring.d.ts.map +1 -1
  122. package/dist/game-build-integrity.d.ts +12 -0
  123. package/dist/game-build-integrity.d.ts.map +1 -0
  124. package/dist/game-build-integrity.js +78 -0
  125. package/dist/game-build-integrity.js.map +1 -0
  126. package/dist/game-examples.d.ts +44 -3
  127. package/dist/game-examples.d.ts.map +1 -1
  128. package/dist/game-examples.js +60 -10
  129. package/dist/game-examples.js.map +1 -1
  130. package/dist/system-skills.d.ts +1 -1
  131. package/dist/system-skills.js +1 -1
  132. package/dist/tools/builtin-tools.d.ts.map +1 -1
  133. package/dist/tools/builtin-tools.js +2 -0
  134. package/dist/tools/builtin-tools.js.map +1 -1
  135. package/package.json +19 -19
@@ -0,0 +1,291 @@
1
+ ---
2
+ name: trailer-template
3
+ description: Structure a trailer or teaser as eight audio-first beats — hook, setup, inciting incident, escalation, drop, climax, title, button — with a runtime-scaled timecode grid, event/reception shot pairs, a planted-and-harvested motif, and one unbroken music bed, then store it as a NodeTool storyboard with a character entity behind every recurring face. Use when someone asks for a trailer, teaser, sizzle or announcement cut structure, says a cut has no spine or no build, or needs to know where the drop and the title card go. Pairs with short-film, which sets the cast, look and blocking. Not for ads (commercial-beat-sheet) or music videos (music-video-treatment).
4
+ ---
5
+
6
+ You are a single agent. Take a title, a genre and a runtime and produce a complete, timecoded trailer plan as a NodeTool storyboard. You call the storyboard, entity and timeline capabilities directly. You do not build a workflow. You do not render or assemble unless asked.
7
+
8
+ Fill the header first. Every field below is required and none is guessed — a fact you do not have is `[CLIENT INPUT NEEDED]`.
9
+
10
+ ```text
11
+ TITLE:
12
+ GENRE:
13
+ LENGTH: [seconds]
14
+ FORMAT: 16:9 / 2.39:1 / 9:16
15
+ THESIS: [the one idea the trailer argues, one sentence]
16
+ CENTRAL QUESTION: [the question left OPEN at the end]
17
+ MOTIF: [recurring visual element — hands, doors, water, mirrors]
18
+ Planted in SETUP, paid off in PEAK or BUTTON.
19
+ ```
20
+
21
+ ---
22
+
23
+ ## Two principles nothing overrides
24
+
25
+ **Event → reception.** The unit is a pair, never a single shot. Something happens, then a face receives it. Meaning lives in the second shot. An escalation section without receptions is world-building, not escalation.
26
+
27
+ **Audio is the clamp.** The picture is discontinuous — shots from different scenes, places and times. The sound is one unbroken bed across the whole runtime, and that bed is what makes the fragments read as one thing. Never cut the audio to silence. Dip it.
28
+
29
+ ---
30
+
31
+ ## The dynamic curve
32
+
33
+ ```text
34
+ quiet / slow ~65% | loud / fast ~35%
35
+ ─────────────────────────── DROP ──────────────────────
36
+ Beats 1–4 | Beats 6–8
37
+ ```
38
+
39
+ One hinge. The drop lands at **~65% of runtime**. Everything else is subordinate to this curve.
40
+
41
+ **Minimum perceptual durations** — below these a beat does not read:
42
+
43
+ | Beat | Minimum |
44
+ | --- | --- |
45
+ | Drop | 1.0s |
46
+ | Setup | 4.0s |
47
+ | Button | 2.0s |
48
+ | Any reception shot | 0.8s |
49
+
50
+ **Compression rule.** Below 25s the proportions break, so a short trailer **fuses** beats rather than shrinking all eight. Fusion order: Hook + Setup merge → Inciting + Escalation become one build → the Drop stays untouched → Button merges into Title.
51
+
52
+ ---
53
+
54
+ ## Beat budget
55
+
56
+ Compute timecodes from the runtime, rounded to 0.5s. Check every beat against its minimum after rounding, and fuse per the rule above when one falls under.
57
+
58
+ | Beat | % of runtime | Job |
59
+ | --- | --- | --- |
60
+ | 1 Hook | 0–8% | Interrupt. Open an information deficit. |
61
+ | 2 Setup / World | 8–25% | Install identification. The normal state as precious or fragile. Plant the motif. |
62
+ | 3 Inciting incident | 25–32% | One nameable event turns the state into a problem. |
63
+ | 4 Escalation / Stakes | 32–65% | Accumulate. Each unit raises a new dimension. Longest section. |
64
+ | 5 Drop | 65–68% | The hinge. Maximum contrast, not maximum volume. |
65
+ | 6 Climax / Peak | 68–85% | Payoff as fragments. The emotional summit is a human beat inside the spectacle. |
66
+ | 7 Title card | 85–90% | Name the feeling. Lands on the impact. |
67
+ | 8 Button / Stinger | 90–100% | Recency. One small, single beat that works without context. |
68
+
69
+ ---
70
+
71
+ ## The eight beats
72
+
73
+ ### Beat 1 — Hook
74
+
75
+ Event before face. No genre marker yet. Never explain. Start quiet — opening loud burns the dynamic range the drop needs.
76
+
77
+ | type | shot |
78
+ | --- | --- |
79
+ | event | a phenomenon with a timestamp — a thing that **happens**, not a state |
80
+ | reception | a face receiving it. Attention, not yet fear. |
81
+
82
+ ### Beat 2 — Setup / World
83
+
84
+ Not plot: an emotional anchor. Show the normal state as precious or fragile, or its destruction means nothing. Plant the musical motif here; you harvest it at the climax. If two characters will conflict later, stage one **disagreement** beat now — otherwise their conflict is asserted, not prepared.
85
+
86
+ | type | shot |
87
+ | --- | --- |
88
+ | setup | protagonist in the normal state — warm, ordinary, specific |
89
+ | setup | intimacy or fragility — a small physical gesture, the **motif** planted |
90
+ | setup | disagreement — two positions, silently staged |
91
+
92
+ ### Beat 3 — Inciting incident
93
+
94
+ One identifiable event, never a montage. If the viewer cannot name what changed, the trailer has no spine. First real impact — it works because you spent none before. Impacts are currency: spend them ascending.
95
+
96
+ | type | shot |
97
+ | --- | --- |
98
+ | event | the turn — one nameable event |
99
+ | reception A | character 1 reads it as `[reading A]` |
100
+ | reception B | character 2, the **same** event, reads it as `[reading B]` — the thesis in two faces |
101
+
102
+ ### Beat 4 — Escalation / Stakes
103
+
104
+ Accumulate, never repeat. Tension is a function of duration, so this is the longest section. The reveal ratio climbs like a ladder and never completes. **Every event needs a receiver.** Ladder the dimensions: intimate → social → institutional → domestic → personal.
105
+
106
+ | type | shot | dimension |
107
+ | --- | --- | --- |
108
+ | event | scale widens — the world notices | society |
109
+ | reception | a stranger's face | |
110
+ | event | institutions respond | state |
111
+ | reception | the protagonist's protector reacts — fear turns domestic | |
112
+ | event | the threat enters the home | intimate |
113
+ | reception | the protagonist chooses — a small physical act of crossing | |
114
+ | reception | stakes crystallize — someone realizes what they have lost | |
115
+
116
+ ### Beat 5 — Drop
117
+
118
+ The hinge between question and promise. Not the loudest moment: the moment of maximum **contrast**. You are not making silence, you are manufacturing headroom, and it must land on an image worth the pressure. Under 1s it reads as an edit error, not a pause.
119
+
120
+ | type | shot |
121
+ | --- | --- |
122
+ | DROP | stillness. The single best held image. Small figure, vast unseen force. |
123
+
124
+ ### Beat 6 — Climax / Peak
125
+
126
+ Payoff as fragments, never answers. Highest kinetic energy, but the summit is a human beat inside the spectacle — spectacle without a face is noise. Consequence, never outcome. The motif from Beat 2 returns in full orchestration.
127
+
128
+ | type | shot |
129
+ | --- | --- |
130
+ | climax | the face — emotion rising, readable |
131
+ | **PEAK** | the emotional summit — the motif paid off, in granular sensory detail |
132
+ | reversal | optional: everything snaps out — the sudden absence |
133
+
134
+ ### Beat 7 — Title card
135
+
136
+ The title arrives at maximum emotional charge so the name and the feeling weld. It lands **on** the impact, not after — sound and type in the same frame.
137
+
138
+ ### Beat 8 — Button / Stinger
139
+
140
+ The last thing is what gets carried out. Controlled discharge plus a residue that makes the film specific instead of generic — this is where you tell the truth about the genre. Small and single after the bigness, and it must work without context. Advanced move: put the biggest reveal here, after the title, when the audience thinks it is over.
141
+
142
+ | type | shot |
143
+ | --- | --- |
144
+ | BUTTON | one last beat — punchline, scare, tenderness or reveal. Deny the expected hit. |
145
+
146
+ ---
147
+
148
+ ## Audio bed — one unbroken track
149
+
150
+ ```text
151
+ [Hook] sub-bass drone + ambience + ONE distant tonal element
152
+ [Setup] THE SEED: fragile motif enters — instrument: [INSTRUMENT]
153
+ [Inciting] motif bends. First impact. Sub grows.
154
+ [Escalation] layers stack: pulses → riser → strings. Accelerating.
155
+ [Drop] ★ DIP to bare sub-rumble. Never fully out.
156
+ [Climax] THE HARVEST: motif returns fully orchestrated + choir/strings bloom
157
+ [Title] one sustained luminous chord + sub-boom → title
158
+ [Button] minimal. Withhold the stinger hit if the button is tender.
159
+ ```
160
+
161
+ **Cut on the transient.** Picture cuts land on hits, not between them. **Sound design over music at impact.** The braam carries the blow, the score carries the emotion.
162
+
163
+ ---
164
+
165
+ ## Entities
166
+
167
+ Any character in more than one shot is a **character entity**, or you get a different person every time. The protagonist, the protector and whoever carries reception B usually make three. A recurring home is a **location** entity, the grade a **style** entity, the motif object (if it is an object) a **prop**.
168
+
169
+ ```js
170
+ import { list_entities, create_entity } from "@nodetool-ai/sandbox-nodetool/entities";
171
+
172
+ await list_entities({}); // reuse before you generate
173
+
174
+ const still = await nodetool.media.generateImage(
175
+ "<the character, neutral background, in the trailer's grade>",
176
+ await nodetool.models.pick("text_to_image")
177
+ );
178
+ await create_entity({
179
+ asset_id: still.asset_id,
180
+ kind: "character",
181
+ name: "<Name>",
182
+ descriptor: "<one to two dense sentences describing exactly what the reference shows>"
183
+ });
184
+ const entityId = still.asset_id; // the entity IS its asset
185
+ ```
186
+
187
+ The descriptor is the face. Name entities in plain text in a shot's `action` or `motion` — "Mara turns from the window", never `@Mara` — and do not re-describe them in shot text. The render attaches a character or prop entity to a shot only when its name appears in that shot's text (style and location entities always apply), so a reception shot that says "she" instead of "Mara" renders a stranger. Show the roster before drafting beats.
188
+
189
+ ---
190
+
191
+ ## Storyboard
192
+
193
+ ### 1. Create the board
194
+
195
+ ```js
196
+ import { create_storyboard, edit_storyboard } from "@nodetool-ai/sandbox-nodetool/storyboards";
197
+
198
+ const board = await create_storyboard({
199
+ name: `${title} — trailer (${runtime}s)`,
200
+ brief: `${thesis}\nCENTRAL QUESTION: ${centralQuestion}\nMOTIF: ${motif}`,
201
+ style: "<the grade in one line>",
202
+ aspect_ratio: "16:9"
203
+ });
204
+ const boardId = board.storyboard_id;
205
+ ```
206
+
207
+ ### 2. Roster and models
208
+
209
+ The full contract — the fifteen `edit_storyboard` ops, every key `set_board` accepts (`music_prompt` among them), and which fields and entities each shot's prompt receives — is in `storyboard-core` § Tool contract. Models come from `find_model` — pass each result's `.ref`; there is no default, and an unset model fails the render. For the cast, the look and the blocking, load `short-film`; this skill only sets where the beats go.
210
+
211
+ ```js
212
+ const stills = await find_model({ capability: "text_to_image" });
213
+ const clips = await find_model({ capability: "image_to_video" });
214
+ await edit_storyboard({
215
+ storyboard_id: boardId,
216
+ ops: [{ op: "set_board", entity_ids: roster,
217
+ image_model: stills.ref, video_model: clips.ref }]
218
+ });
219
+ ```
220
+
221
+ Each result also names a `prompting_skill`. Load it before step 3: the shot `action`, `motion` and `camera` are the prompt the generator reads (`motion`, `action`, then the camera movement, for a keyframe clip), and a trailer's receptions and its drop are worded differently for a line that wants beats in order (Hailuo), a shot list (Kling) or a sound brief (Seedance).
222
+
223
+ ### 3. One shot per row
224
+
225
+ Every row in the beat tables is one `add_shot`. The slug carries the beat and the type, so the pair structure survives into the board and the cut.
226
+
227
+ ```js
228
+ await edit_storyboard({
229
+ storyboard_id: boardId,
230
+ ops: [{
231
+ op: "add_shot",
232
+ slug: "3-event", // <beat>-<type>: 1-event, 1-reception, 3-reception-a, 5-drop, 6-peak, 8-button
233
+ action: "INCITING (0:09–0:10.5): the turn — <one nameable event>, Mara in frame",
234
+ camera: { framing: "close", lens: "50mm", angle: "eye", movement: "static" },
235
+ motion: "<what moves, with counts — 'she looks up once', not 'tense'>",
236
+ duration_seconds: 1.5,
237
+ render_mode: "keyframe"
238
+ }]
239
+ });
240
+ ```
241
+
242
+ Rules for the shot text:
243
+
244
+ - `action` opens with the beat name and timecode, then the shot. Under 400 characters.
245
+ - A reception shot's `action` names whose face it is and what it reads. Its `motion` is a single small physical event.
246
+ - The drop shot's `motion` is stillness, stated: "nothing moves except the water".
247
+ - The title card and any on-screen text are **not** shots. Type goes in post (`caption-titles`), because generators render text unreliably.
248
+ - `render_mode: "direct"` only for a heavy-motion climax shot. Receptions and the drop stay on `keyframe`, where the face holds.
249
+
250
+ ### 4. The audio bed lives on the board, not on the shots
251
+
252
+ Put the eight-line bed into the board's `brief` as a `MUSIC:` block, one line per beat with its timecode. Per-shot `narration` stays empty — native per-shot audio is fragments, the opposite of the clamp. `edit_storyboard` → `{op: "set_board", music_prompt}` writes the same text into the board's music prompt, headless, and `assemble_storyboard_timeline` then turns it into a draft music clip.
253
+
254
+ ---
255
+
256
+ ## Pre-delivery check
257
+
258
+ Run before showing anyone. Every line must be true of the board, not the plan.
259
+
260
+ - [ ] Hook is event before face, no genre marker
261
+ - [ ] Every escalation event has a reception shot
262
+ - [ ] Setup shows the normal state as precious or fragile
263
+ - [ ] Disagreement beat present if characters conflict later
264
+ - [ ] Motif planted in Beat 2, harvested in Beat 6
265
+ - [ ] Drop sits at ~65% and lands on an image worth the pressure
266
+ - [ ] Emotional summit is not on the spectacle shot
267
+ - [ ] Title lands on the impact, same frame
268
+ - [ ] Button is small, single, works without context
269
+ - [ ] Audio never cuts to true silence — dips only
270
+ - [ ] Central question still open at the end
271
+ - [ ] No beat below its minimum perceptual duration
272
+ - [ ] Every face appearing twice is an entity on the board
273
+
274
+ ---
275
+
276
+ ## Render and cut (only on request)
277
+
278
+ **Stills first.** `render_storyboard_stills` costs less than clips, and you look at them before any clip renders. A wrong face is fixed at the entity, never in one shot's prompt.
279
+
280
+ **Fuse or render long, and say which before the clip pass.** A 1.5s beat still buys the video model's shortest clip, often 5s or more, so a shot rendered on its own comes back long without bumping `duration_seconds`. Where consecutive beats share a setting — an event and its reception, a run of escalation cuts — render them as one generation and split it with `covered_by` (`storyboard-core` § Fusing shots): fewer clips for the same cut. Render a beat on its own and trim it where it needs a picture no neighbour can share. Report the clip count and get the user's go-ahead when it is more than the request implied. Clips mute their own audio; `analyze_video` on a clip gives its real length before you trim.
281
+
282
+ **The bed is one clip.** After `assemble_storyboard_timeline`:
283
+
284
+ 1. `generate_music` once, for the full runtime, from the eight-line bed. One prompt, one clip.
285
+ 2. `edit_timeline` → `add_track` (audio), then `add_media_clip` for that one asset at 0:00. Mute the per-shot "Shot Audio" clips the assembly created (`set_clip_params {muted: true}`), and delete its draft music clip if the board has a music prompt, so this bed is the only music.
286
+ 3. `detect_audio_events` on the bed, then `beat-sync-editing`: every picture cut moves to the nearest transient. The drop shot's in-point sits on the dip.
287
+ 4. The dip is a volume keyframe on the bed, not a cut. Never a gap.
288
+ 5. `caption-titles` for the title card, timed to the same frame as the title impact in the bed.
289
+ 6. `validate_timeline`, then `preview_timeline_frame` at the drop, the peak and the title.
290
+
291
+ `timeline-edit-ops` carries the timeline op contract, `motion-graphics` the build loop, `video-audio-continuity` the case where a shot's own sound has to survive, `color-motion` the grade that makes shots from different scenes cut together, and `logo-reveal` a studio mark after the button.
@@ -0,0 +1,186 @@
1
+ ---
2
+ name: ugc-video
3
+ description: "Direct phone-shot creator videos, UGC ads, testimonials, or vlogs in NodeTool. For polished product films, use product-commercial; for an ad's beat structure, pair with commercial-beat-sheet."
4
+ ---
5
+
6
+ **Load `/storyboard-core` first.** It carries the loop, the tool contract,
7
+ the entity rules and the gating this skill assumes. Everything below is what is
8
+ different about a phone-shot piece with a person in it. For a UGC ad, this skill
9
+ sets the look and `/commercial-beat-sheet` sets the hook, beats and timecodes.
10
+
11
+ ## What makes this job type its own
12
+
13
+ The face is the deliverable. One character entity has to survive every shot, and the
14
+ look has to read as a phone rather than a camera. Both are set once, on the board, and
15
+ never re-argued in shot text.
16
+
17
+ ## Casting comes first, and it is two passes
18
+
19
+ There is no create-from-text, and a face you have not seen is a face you cannot lock.
20
+
21
+ 1. `find_model` (`text_to_image`) → `generate_image` with the character description
22
+ alone: age, build, skin, hair, no wardrobe, no set, front-lit, neutral expression.
23
+ 2. Show it. If the user likes it, `create_entity {asset_id, kind: "character", name,
24
+ descriptor}`. The descriptor is the face and hair only.
25
+ 3. After the first board stills come back, if a frame reads better than the reference,
26
+ `update_entity {entity_id, asset_id}` to move the entity onto that crop. Do this
27
+ **before** clips, not after.
28
+
29
+ Given a photo instead: save it as an asset, then `create_entity` from it. Write the
30
+ descriptor from the face and hair in the photo and **leave the photo's outfit out** —
31
+ wardrobe belongs in shot text, so the same entity can wear a gym set in one board and
32
+ a coat in the next.
33
+
34
+ ## The look goes in the board style, once
35
+
36
+ Put the camera pretence in `style` via `set_board`, never in each shot:
37
+
38
+ | Register | `style` |
39
+ |---|---|
40
+ | Front-camera UGC | `handheld front-camera iPhone, mild shake, autofocus hunt, compression grain, window daylight, no beauty filter` |
41
+ | Friend-filmed | `handheld phone at arm's length, natural wind and room noise, slightly off-level framing` |
42
+ | Old-phone ritual | `old iPhone 1x, propped static angle, fluorescent tint, heavy noise` |
43
+ | Vlog | `chest-height phone gimbal, wide lens, natural light, mild bloom` |
44
+
45
+ No music, no score, no burned-in captions. Natural audio is part of the register — say
46
+ so in the brief so the video model does not add a bed.
47
+
48
+ ## Shot pattern
49
+
50
+ Five to eight shots. A hook in the first four seconds, a middle that shows the thing
51
+ happening physically, and a verdict to camera.
52
+
53
+ - **Dialogue is a shot field**, not part of `action`. Set `dialogue` so
54
+ `extract_script_from_storyboard` can lift the words later if the user wants them
55
+ voiced properly.
56
+ - Write the physical beat in `motion` with a **count**: `two short spray bursts`,
57
+ `two head turns`, `she lifts one section of hair and lets it fall, once`. "She
58
+ reacts" renders as nothing.
59
+ - A talent-free end card (pack hero, logo card) needs its own `entity_ids` naming the
60
+ product alone — otherwise the character's descriptor seasons a shot she is not in.
61
+ - Native-audio video models are weakest on their image path. For a shot whose spoken
62
+ line has to look synced, set `render_mode: "direct"`. A direct clip prompt already
63
+ carries the camera fields and the board style.
64
+
65
+ ## Wardrobe and state
66
+
67
+ One outfit per piece unless the script changes it on camera. A wet, stained or
68
+ changed-outfit version of the same person is a **second entity** — cast it the same
69
+ way and name it in the shots where it applies.
70
+
71
+ ## Briefs
72
+
73
+ Adapt these examples to the user's brief. Example deliverables, style choices,
74
+ and approval checkpoints apply only when the user adopts them.
75
+
76
+ **Briefs** below has four written to these rules: review-to-hero UGC ad,
77
+ Pinterest-fail comedy, locker-room ritual, and a night-city vlog with a shot-collapse
78
+ step. Replace the bracketed placeholders and hand one over after the standing orders.
79
+
80
+ ## Briefs — phone-shot video with talent
81
+
82
+ One per message, after the standing orders from `/storyboard-core`. Replace
83
+ `[PRODUCT]`, `[CITY]`, `[ACTIVITY]`. `Nova` stands for the character entity's **plain
84
+ name** — that is what makes it season the prompt.
85
+
86
+ ---
87
+
88
+ ### Review-to-hero UGC ad, 30s 9:16
89
+
90
+ ```
91
+ Direct a 30s 9:16 UGC-to-hero ad for [PRODUCT].
92
+
93
+ Cast first. [PRODUCT] as a prop entity from the attached pack shot. Nova as a
94
+ character entity: generate the reference still (early 20s, natural skin, no
95
+ beauty filter, front-lit, neutral) and show me before you tag it. Descriptor is
96
+ face and hair only.
97
+
98
+ Board style: handheld front-camera iPhone, bedroom or bright bathroom, mild
99
+ shake, autofocus hunt, compression grain, window daylight, no beauty filter.
100
+ Natural audio only, no music, no burned-in captions.
101
+
102
+ Seven shots, then stop.
103
+ 1a 0-4 hook. Nova touches untreated hair. "I wanted lighter hair..."
104
+ 2a 4-8 she finds [PRODUCT] on the dressing table, autofocus hunts onto the
105
+ label. "...without permanently dyeing it."
106
+ 3a 8-13 she sections her hair, two short spray bursts. Physical coverage, not
107
+ a magic glow.
108
+ 4a 13-18 extreme close-up, untreated against treated. "Okay... that is
109
+ actually a huge difference."
110
+ 5a 18-23 mirror selfie, two head turns. "I actually love it."
111
+ 6a 23-26 [PRODUCT] held beside her face. "Just spray and switch up your look."
112
+ 7a 26-30 no talent. Studio hero of [PRODUCT], slow 8cm push-in, cream
113
+ cyclorama, copy space right. Set entity_ids on this shot to the
114
+ product alone.
115
+
116
+ After I pick a face from the stills, select that still with select_version and
117
+ move the Nova entity onto that crop before any clip renders.
118
+ ```
119
+
120
+ ### Pinterest-fail comedy, 30s 16:9
121
+
122
+ ```
123
+ Direct a 30s 16:9 friend-shot phone comedy. Nova tries to get a perfect
124
+ Pinterest still of [ACTIVITY] with [PRODUCT] in frame; reality ruins every
125
+ attempt. Same face and wardrobe throughout.
126
+
127
+ Cast Nova from text first: generate the reference, show me, then tag it.
128
+ Board style: handheld phone at arm's length, natural wind and room noise,
129
+ slightly off-level framing. No score — wind and laughter only.
130
+
131
+ 1a 0-5 she arranges the cloth and [PRODUCT]. Wind flips the plate once.
132
+ "...Okay, we'll pretend that didn't happen."
133
+ 2a 5-10 deadpan, she does not chase it. A friend's laugh jolts the frame once.
134
+ 3a 10-15 serene profile, a bee, one swat, a whip-pan.
135
+ 4a 15-20 hair-in-wind walk, cardigan over her head, [PRODUCT] still in one hand.
136
+ 5a 20-25 thermos pour, a stain spreads, off-camera "That's going to stain—"
137
+ 6a 25-30 she flops onto the cloth, [PRODUCT] on her stomach. "This is the photo.
138
+ This is the one we're posting." Thumbs up, cut mid-laugh.
139
+ ```
140
+
141
+ ### Locker-room ritual, 19s 16:9
142
+
143
+ ```
144
+ Direct a 19s 16:9 everyday phone video of Nova, cast from the attached photo.
145
+ Save the photo as an asset, then create the entity from it. The descriptor pins
146
+ the face and hair from the photo and does not mention its outfit.
147
+
148
+ Wardrobe in the shot text: black gym set, hair tied. Locker room, full-length
149
+ mirror, bag on the bench, no readable signage.
150
+ Board style: old iPhone 1x, propped static angle, fluorescent green tint, heavy
151
+ noise. No music bed.
152
+
153
+ 1a 0-4 she walks to the mirror, props the phone, adjusts her straps
154
+ 2a 4-8 sits, double-knots her laces, bounce-tests the shoes twice
155
+ 3a 8-11 earbuds in, one at a time
156
+ 4a 11-14 two shoulder rolls, a quiet "okay... let's get it."
157
+ 5a 14-17 three arm swings, one glance at the camera
158
+ 6a 17-19 picks up the phone, walks to the door, freeze mid-stride
159
+
160
+ Stills from the photo entity, then one clip pass.
161
+ ```
162
+
163
+ ### Night city vlog, 30s
164
+
165
+ ```
166
+ Direct a 30s first-person night vlog in [CITY] with Nova in one outfit
167
+ throughout. Mix selfie, cockpit, aerial and street-level. Short landmark lines
168
+ for [LANDMARK A] and [LANDMARK B]. No text, no logos. Wind in her hair.
169
+
170
+ Board style: chest-height phone gimbal, wide lens, city sodium and neon, mild
171
+ bloom, natural audio.
172
+
173
+ Board up to ten shots, then — before any render — propose a six-shot collapse
174
+ and name the four you would drop. Stop there.
175
+
176
+ 1 rooftop selfie, the vehicle behind her. "I'm getting on this in [CITY]."
177
+ 2 inside, harness on, a nervous smile
178
+ 3 lift-off, wide city and water
179
+ 4 open door. "there's no door."
180
+ 5 POV, feet over the grid
181
+ 6 selfie with [LANDMARK A]. "That's [LANDMARK A]."
182
+ 7 aerial over [LANDMARK B], her feet in frame
183
+ 8 low pass along a bridge
184
+ 9 she steps off, same outfit, walks to camera
185
+ 10 crossing the street. "Alright everyone, bye."
186
+ ```
@@ -0,0 +1,140 @@
1
+ ---
2
+ name: veo-3-prompting
3
+ description: Prompt Google's Veo 3 video line — the five-element shot/setting/subject/action/dialogue structure, the cinematography vocabulary it reads directly, duration and aspect-ratio tradeoffs, the audio and auto-fix switches per provider, and the fixes for visual drift, temporal inconsistency and audio mismatch. Use whenever the model id contains veo3 or veo-3 (fal-ai/veo3.1 and its fast, lite, image-to-video, first-last-frame and reference-to-video routes, fal-ai/veo3/image-to-video, google/veo3.1 on atlascloud, google/veo-3 and google/veo-3.1 on replicate, kie's veo-3-1, and Gemini's own veo-3.1-generate-preview) on generate_video, animate_image, generate_video_from_references or a TextToVideo node.
4
+ ---
5
+
6
+ # Veo 3 → a directorial spec, not a description
7
+
8
+ Veo 3 produces 4 to 8 second clips with synchronized audio: dialogue with
9
+ lip-sync, ambient effects, environmental sound. It parses shot types, camera
10
+ angles and film terminology accurately, and holds coherence across the frame
11
+ sequence. What separates a usable clip from a generic one is writing the prompt
12
+ as a spec rather than a narration.
13
+
14
+ Reach it with `find_model` for `text_to_video` or `image_to_video`, then
15
+ `generate_video` / `animate_image`; the reference-to-video routes take
16
+ `generate_video_from_references`. Those forward the prompt, the media, a
17
+ negative prompt (not `animate_image`), the duration, the aspect ratio and the
18
+ resolution. The audio switch, `auto_fix`, the seed and an end frame for the
19
+ first-last-frame routes exist only on the route's own node: find it with
20
+ `search_nodes`, read its fields with `get_node_info`, and run it with
21
+ `run_node`. Each run is a paid generation, so confirm the scope with the
22
+ user before rendering several.
23
+
24
+ The audio is per clip, so a piece cut from several Veo clips restarts its sound
25
+ at every join. `video-audio-continuity` decides whether the scenes belong in one
26
+ generation or under a track you add yourself.
27
+
28
+ ## Five elements, in order
29
+
30
+ 1. **Shot** — the camera work that frames everything else: medium shot,
31
+ close-up, wide angle, tracking shot.
32
+ 2. **Setting and atmosphere** — space, time, lighting quality, environment.
33
+ 3. **Subject** — enough visual detail to render consistently across frames.
34
+ 4. **Action** — the movement that defines the temporal progression.
35
+ 5. **Dialogue** (optional) — spoken lines, for anything needing lip-sync.
36
+
37
+ > A medium shot frames a cartographer in a cluttered Victorian study. Warm
38
+ > lamplight illuminates ancient maps spread across a mahogany table. The
39
+ > cartographer, wearing round spectacles and a burgundy vest, traces a route
40
+ > with his finger. "According to this sea chart, the lost island exists. We
41
+ > sail at dawn."
42
+
43
+ Each element builds on the one before it.
44
+
45
+ ## Parameters
46
+
47
+ **Duration** decides how much temporal complexity fits. 4 seconds holds a
48
+ single action — establishing shots, product showcases. 6 seconds holds a
49
+ multi-stage action or brief dialogue. 8 seconds holds extended dialogue or an
50
+ atmospheric moment. Longer durations spread attention across more frames, so
51
+ per-frame detail density drops.
52
+
53
+ **Aspect ratio** changes composition, not just framing. 16:9 matches the
54
+ training distribution and composes horizontally. 9:16 concentrates the subject
55
+ in a narrower horizontal band. 1:1 outpaints — the model extends the scene past
56
+ what you described to fill the square, which can surface environment you never
57
+ asked for.
58
+
59
+ **Resolution**: iterate at 720p, deliver at 1080p.
60
+
61
+ **Audio** is the cost lever. `generate_audio` defaults to true on fal and
62
+ Replicate and to false on AtlasCloud's `google/veo3.1/*` and
63
+ `google/veo3.1-fast/*`. The lite routes on AtlasCloud and Replicate and kie's
64
+ `veo-3-1` have no audio switch. fal's guide says disabling it cuts the standard
65
+ model to roughly half the price and the fast variant to about two thirds.
66
+ Disable it only when a custom soundtrack is going on in post.
67
+
68
+ ## Cinematography vocabulary
69
+
70
+ The model was trained on professional film content and reads the terms
71
+ directly:
72
+
73
+ - **Movement**: slow dolly forward, gentle pan left, crane shot descending,
74
+ handheld tracking.
75
+ - **Shot types**: extreme close-up, Dutch angle, over-the-shoulder,
76
+ establishing wide.
77
+ - **Lighting**: golden hour backlighting, harsh overhead fluorescents, dappled
78
+ forest light, volumetric fog rays.
79
+
80
+ > A slow tracking shot follows a lone figure walking through fog-shrouded ruins
81
+ > at twilight. Volumetric light rays pierce through broken archways, creating
82
+ > dramatic god rays in the mist.
83
+
84
+ **Sensory detail feeds the audio.** A prompt that describes neon reflecting in
85
+ rain puddles, steam rising from food stalls and a vendor calling out over
86
+ distant traffic gives the audio synthesis more to work with than the same scene
87
+ described visually only.
88
+
89
+ **Character consistency comes from distinctive markers.** "A woman in her
90
+ thirties with auburn hair pulled back in a loose bun, wearing a charcoal
91
+ peacoat and silver-rimmed glasses" holds identity across frames where "a woman"
92
+ does not.
93
+
94
+ ## Auto fix
95
+
96
+ `auto_fix` rewrites a prompt that trips content policy instead of rejecting
97
+ it, trying to keep the intent. It defaults to true on fal's text-to-video
98
+ routes (`fal-ai/veo3.1`, `/fast`, `/lite`) and to false on every fal
99
+ image-to-video, first-last-frame, extend and reference route. AtlasCloud, kie
100
+ and Replicate have no such field. Turn it off when your exact wording matters
101
+ more than getting a clip back.
102
+
103
+ ## Errors and fixes
104
+
105
+ - **Vague specification** — "a person walks in a city" constrains nothing.
106
+ Specify appearance, the character of the city, the time, the walk.
107
+ - **Internal contradiction** — "bright sunny day with dramatic moonlight" fights
108
+ itself. Keep the environment consistent.
109
+ - **Temporal overloading** — multiple scene transitions inside 8 seconds rarely
110
+ land. Split into discrete prompts.
111
+ - **Unused negative prompt** — use it for "no camera shake", "no lens
112
+ distortion", "no text overlays". The lite routes on AtlasCloud and
113
+ Replicate, kie's `veo-3-1` and fal's reference-to-video routes have no
114
+ negative prompt.
115
+ - **Ignored seed** — the seed is how a series holds a look. Record the ones
116
+ that worked. kie's `veo-3-1` and fal's reference-to-video routes have none.
117
+ - **Prompt length** — fal's guide puts the working range at 150 to 300
118
+ characters, with generic output under 100 and unpredictable priorities over
119
+ 400. The fal routes accept far longer prompts, so treat it as a style
120
+ target, not a limit.
121
+
122
+ Symptoms map to fixes. Clothing colour shifting or facial features morphing
123
+ means the subject needs more distinctive markers. Objects appearing without
124
+ logical progression means the prompt is too complex for the duration — cut it
125
+ down or shorten the clip. Dialogue out of sync with lips means the audio cue
126
+ needs to be explicit: "a vendor loudly calls out 'Fresh fish!' while
127
+ gesturing".
128
+
129
+ ## Working method
130
+
131
+ Refine on the fast variant at 4 seconds and 720p, where a bad idea costs
132
+ almost nothing. Move to the standard model, longer durations and 1080p only
133
+ once the prompt is doing what you want. Then vary the seed to explore
134
+ alternatives inside the same concept.
135
+
136
+ Check what rendered with `analyze_video`, `detect_video_scenes` and
137
+ `understand_video` instead of assuming.
138
+
139
+ Adapted from fal's Veo 3 prompt guide:
140
+ https://fal.ai/learn/devs/veo3-prompt-guide-master-google-video-generation