@slatesvideo/shared 0.5.2 → 0.5.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 (37) hide show
  1. package/README.md +18 -0
  2. package/dist/index.d.ts +1 -0
  3. package/dist/index.js +3 -0
  4. package/dist/operations/index.d.ts +25 -0
  5. package/dist/operations/index.js +74 -5
  6. package/dist/prompts/character-sheet.d.ts +24 -12
  7. package/dist/prompts/character-sheet.js +78 -28
  8. package/dist/prompts/environment-sheet.d.ts +9 -1
  9. package/dist/prompts/environment-sheet.js +17 -3
  10. package/dist/prompts/index.d.ts +1 -0
  11. package/dist/prompts/index.js +4 -0
  12. package/dist/prompts/model-facts.js +4 -1
  13. package/dist/prompts/partials.generated.d.ts +2 -0
  14. package/dist/prompts/partials.generated.js +14 -0
  15. package/dist/prompts/prompting-tips.d.ts +23 -0
  16. package/dist/prompts/prompting-tips.js +376 -0
  17. package/dist/prompts/reference-rules.d.ts +43 -14
  18. package/dist/prompts/reference-rules.js +50 -26
  19. package/dist/skills/content.js +12 -12
  20. package/package.json +4 -3
  21. package/skills/_partials/decision-log.md +12 -0
  22. package/skills/_partials/reference-rules-core.md +12 -0
  23. package/skills/_partials/reference-tips-short.md +2 -0
  24. package/skills/_partials/references-read-literally.md +11 -0
  25. package/skills/_partials/still-gate.md +3 -0
  26. package/skills/slates-character-turnaround.md +64 -29
  27. package/skills/slates-cost-discipline.md +10 -0
  28. package/skills/slates-edit-and-iterate.md +16 -1
  29. package/skills/slates-model-selection.md +24 -1
  30. package/skills/slates-one-prompt-film.md +19 -0
  31. package/skills/slates-prompting-flux-2-max.md +36 -5
  32. package/skills/slates-prompting-kling-v3.md +33 -4
  33. package/skills/slates-prompting-nano-banana-2.md +40 -10
  34. package/skills/slates-prompting-seedance.md +284 -85
  35. package/skills/slates-prompting-veo-3.md +33 -4
  36. package/skills/slates-storyboard-from-script.md +19 -0
  37. package/skills/slates-vision-feedback-loop.md +49 -2
@@ -0,0 +1,376 @@
1
+ // Per-model PROMPTING TIPS — the user-facing card content rendered by the
2
+ // desktop app's "See prompting tips" modals. SINGLE SOURCE OF TRUTH: this
3
+ // file. The desktop renders whatever this exports (no hand-written tips JSX
4
+ // in slate — that's how the Omni Flash / Veo / Kling chimera modal shipped).
5
+ //
6
+ // Relationship to the skills: packages/shared/skills/slates-prompting-*.md
7
+ // are the LONG-FORM agent guidance; these tips are the curated end-user
8
+ // subset of the same knowledge. When a skill's rules change, update the
9
+ // matching entry here in the same pass. Keys are model FAMILIES — the
10
+ // desktop maps concrete model ids to a family key with its MODEL_REGISTRY
11
+ // helpers (the runtime truth for ids lives in slate/src/shared/pricing.ts).
12
+ //
13
+ // Cards whose content is ALSO doctrine (not just model trivia) compose their
14
+ // copy from skills/_partials/*.md via PARTIALS rather than restating it. The
15
+ // NANO_BANANA reference card is why: it shipped "label every role" — retired
16
+ // doctrine — for thirteen months after the reversal, in the same package as
17
+ // the rule forbidding it. Hand-sync didn't merely drift, it survived a
18
+ // reversal. Add a short partial; don't hand-copy a rule into a card.
19
+ import { PARTIALS } from './partials.generated.js';
20
+ const SEEDANCE = {
21
+ label: 'Seedance 2.0',
22
+ intro: [
23
+ 'Seedance 2.0 is a multimodal director: it reads your text, images, video and audio at once and splits them into a "spatial layer" (what is in frame) and a "temporal layer" (how it changes). So a good prompt is an engineering-style instruction, not a piece of copywriting. Audio is always generated alongside video at no extra cost.',
24
+ "ByteDance's official advanced formula has 8 slots: precise subject + action details + scene/environment + lighting & color tone + camera movement + visual style + image quality + constraints. Sweet spot 60-150 words for a single shot, longer for multi-shot.",
25
+ ],
26
+ columns: [
27
+ [
28
+ {
29
+ heading: 'Pin the subject in the first sentence',
30
+ example: 'A matte black earbud case sits on a polished obsidian surface...',
31
+ note: "The first 20-30 words are the identity anchor. If the subject isn't locked in immediately, Seedance will hallucinate new subjects mid-generation.",
32
+ },
33
+ {
34
+ heading: 'Shot 1 / Shot 2 / Shot 3 — never time stamps',
35
+ example: 'Shot 1: Side shot of the alley; the man slowly starts running.\nShot 2: He knocks over a fruit stand; the camera shakes and cuts to his face.\nShot 3: He climbs a low wall; the camera pulls back onto the empty street.',
36
+ note: 'ByteDance: write a "Shot 1 / Shot 2 / Shot 3" storyboard in the order events occur, then merge it into one prompt. Do NOT write "At 4 seconds" or "0:00–0:03" and do not set per-shot durations — official docs say precise timing is unstable and forcing it "may lead to abnormal generation results." Let the plot set the pacing.',
37
+ critical: true,
38
+ },
39
+ {
40
+ heading: 'Order inside each shot',
41
+ example: 'camera move → action + expression → position change → audio',
42
+ note: "ByteDance's recommended per-shot order. Lead with the camera (\"slowly push in from a wide shot\", \"fixed camera position\", \"cut to...\"), then what the subject does, then where they end up, then the sound.",
43
+ },
44
+ {
45
+ heading: 'Lighting is a top quality lever',
46
+ example: 'A cool-white diagonal beam from upper left, dust particles drifting through...',
47
+ note: 'Lighting & color tone has its own slot in the official formula. Describe it before or alongside the subject.',
48
+ },
49
+ ],
50
+ [
51
+ {
52
+ heading: 'Standard camera terms — including shot size',
53
+ example: 'medium shot · close-up · wide shot · slow push-in · smooth lateral tracking · fixed shot',
54
+ note: 'ByteDance: the model has a strong understanding of camera terminology, so use it directly — this is an open vocabulary, not a fixed list, and shot size counts as camera direction. Only ONE camera movement per shot: asking for push, pull, pan and move at once increases image instability.',
55
+ },
56
+ {
57
+ heading: 'Slow, gentle, continuous movement',
58
+ example: 'slowly raise a hand · quickly turn the head · walk slowly · sit down naturally with the motion',
59
+ note: 'Official rule: name the body part and quantify range, speed and force — and prefer small continuous movement over sprints, big jumps and violent rolls. Slow-motion is supported in natural language; "fast" is a known quality-degrading word.',
60
+ },
61
+ {
62
+ heading: 'Externalize emotion',
63
+ example: '❌ she looks very sad\n✅ head lowering, shoulders trembling slightly, eyes reddening, fingers clutching the corner of her clothing',
64
+ note: 'Replace abstract emotion words with the physical detail that shows them. This is the single highest-leverage habit in ByteDance\'s guide — the model renders bodies, not adjectives.',
65
+ },
66
+ {
67
+ heading: 'Separate camera from subject motion',
68
+ example: 'The earbud rises smoothly. The camera tracks upward.',
69
+ note: 'Two different sentences. Mixing them ("the camera speed ramps as the earbud rises") is a common cause of shaky, glitchy output.',
70
+ },
71
+ {
72
+ heading: 'Multi-character shots — forbid twins',
73
+ example: 'Throughout the video, characters with completely identical appearance, clothing, and accessories are prohibited. Do not generate duplicate avatars or a twin effect.',
74
+ note: 'With several characters in frame, Seedance can render the same person twice. ByteDance\'s fix: bind each character to its image ("Marcus (image 1)"), append that constraint verbatim at the end, and prefer single-person reference photos. Past 4 reference people, stability drops — compose a group still first.',
75
+ },
76
+ ],
77
+ ],
78
+ footer: [
79
+ 'Quality and constraint slots have their own official vocabulary: ask for "HD, rich details, cinematic texture, natural colors, soft lighting" — not "8K / masterpiece / trending on artstation." Seedance has no negative-prompt field, so constraints go inline: "keep it subtitle-free", "do not generate a logo", "do not generate a watermark".',
80
+ 'Style block at the end: one primary anchor plus 2-3 supporting details. End with "Single continuous take" if you want one shot with no cuts. Never write "no cut" or "seamless transition" — those aren\'t in the training vocabulary.',
81
+ 'Multi-modal: up to 9 images, 3 videos and 3 audio references. Cite them by type and index — "Zhang San@Image 1", or the "Marcus (image 1)" form Slates composes from your @mentions. Never cite an asset ID instead of the image number; the model can\'t associate the two. Max length: 4,000 characters.',
82
+ 'Don\'t cross-pollinate image-model syntax: named lenses, apertures and film stocks ("85mm f/1.4", "Kodak Portra 400") are a Nano Banana lever and a Seedance anti-pattern. Translate them into shot size, depth of field and colour tone instead.',
83
+ ],
84
+ };
85
+ const KLING = {
86
+ label: 'Kling 3.0',
87
+ intro: [
88
+ 'Kling 3.0 features native audio-visual co-generation with dialogue, sound effects, and music (Omni tier). Define your core subjects clearly at the beginning of the prompt and keep descriptions consistent across shots.',
89
+ ],
90
+ columns: [
91
+ [
92
+ {
93
+ heading: 'Dialogue',
94
+ example: 'Character says, "exact words here"',
95
+ note: 'Use quotation marks for precise speech. Languages (Omni only): English, Chinese, Japanese, Korean, Spanish.',
96
+ },
97
+ {
98
+ heading: 'Voice Quality',
99
+ example: 'with a trembling voice, "I\'m scared"',
100
+ note: "Describe emotional tone, pitch, or speaking style before the dialogue. No pronouns or synonyms after a character's first introduction — they cause voice drift.",
101
+ },
102
+ {
103
+ heading: 'Sound Effects',
104
+ example: 'SFX: heavy boots on wet pavement, distant siren wailing',
105
+ note: 'Use the "SFX:" prefix, with physical-cause specificity — "SFX: footsteps" is too vague.',
106
+ },
107
+ ],
108
+ [
109
+ {
110
+ heading: 'Multi-Character Dialogue (Omni)',
111
+ example: 'Alice says in English, "Hello!" Immediately, Bob replies in Spanish, "¡Hola!"',
112
+ note: 'The "Immediately" keyword makes lines back-to-back; without it Kling adds a natural conversational beat.',
113
+ },
114
+ {
115
+ heading: 'Ambient Noise & Music',
116
+ example: 'Ambient noise: city traffic, birds chirping\nBackground music: tense orchestral strings',
117
+ note: 'Set the background soundscape and request specific music styles or moods.',
118
+ },
119
+ {
120
+ heading: 'Multi-shot',
121
+ example: 'Shot 1: ... Shot 2: ...',
122
+ note: 'Max 6 cuts, 15s total. One primary action and ONE camera move per shot; describe the subject identically in every shot block.',
123
+ },
124
+ ],
125
+ ],
126
+ footer: [
127
+ 'Keep dialogue concise (under 10 seconds per line). Use the Language and Accent settings in Audio Controls to control speech characteristics.',
128
+ ],
129
+ };
130
+ const KLING_EDIT = {
131
+ ...KLING,
132
+ label: 'Kling O3 Edit',
133
+ columns: [
134
+ KLING.columns[0],
135
+ [
136
+ ...KLING.columns[1],
137
+ {
138
+ heading: 'Video edit — name the change, keep the rest',
139
+ example: 'Replace the man in @Video1 with @Element1, keeping his walk cycle, the camera move, and the rain unchanged.',
140
+ note: '@Video1 is your clip; attached subject refs compile to @Element1..; style refs to @Image1.. (max 4 combined). One edit intent per pass — chain passes for compound changes. Original audio is preserved verbatim.',
141
+ critical: true,
142
+ },
143
+ ],
144
+ ],
145
+ };
146
+ const VEO = {
147
+ label: 'Veo 3.1',
148
+ intro: [
149
+ 'Veo 3.1 generates synchronized audio directly with video. Aspect ratio: 16:9 only (for 9:16 vertical, use Kling or Seedance). Native single-clip duration: 4, 6, or 8 seconds — longer durations require chaining clips via last-frame reuse.',
150
+ 'Official Cloud formula: [Cinematography] + [Subject] + [Action] + [Context] + [Style & Ambiance]. Sweet spot ~50-150 words.',
151
+ ],
152
+ columns: [
153
+ [
154
+ {
155
+ heading: 'Dialogue',
156
+ example: 'Character says, "exact words"',
157
+ note: 'Use quotation marks for exact speech. Keep voice direction terse: "says in a weary voice", "whispers", "shouts". 2-3 speakers max — sync degrades past that.',
158
+ },
159
+ {
160
+ heading: 'Sound Effects — with cause',
161
+ example: 'SFX: thunder cracks in the distance',
162
+ note: 'Always specify direction or distance — "SFX: thunder" alone is too vague.',
163
+ },
164
+ {
165
+ heading: 'Ambient is mandatory',
166
+ example: 'Soft office ambience. · Wind on the open ridge.',
167
+ note: 'Include an ambience line in every scene — without it the audio mix feels dead.',
168
+ },
169
+ ],
170
+ [
171
+ {
172
+ heading: 'No subtitles — MANDATORY',
173
+ example: 'The founder says, "..." (no subtitles). Soft office ambience.',
174
+ note: 'Without (no subtitles) after every dialogue line, Veo bakes subtitle text into the video. This is genuinely critical and underspecified in most guides.',
175
+ critical: true,
176
+ },
177
+ {
178
+ heading: 'Cinematography vocabulary',
179
+ example: '85mm · shallow depth of field · Rembrandt lighting · dolly in · whip pan',
180
+ note: 'Veo responds to real lens, lighting, and camera-move terms — lead the prompt with them.',
181
+ },
182
+ ],
183
+ ],
184
+ footer: [
185
+ "First-frame + last-frame is Veo's strongest workflow. Generate a start frame, generate an end frame, then animate with both as anchors. Motion-Lock hack: keep ~60% of the same background pixels between start and end to prevent latent drift.",
186
+ 'Keep dialogue under one natural breath — lines fit the 8s clip ceiling. Texture-realism phrases: fine skin pores, visible fabric weave, subtle contrast, no gloss or sharpening.',
187
+ ],
188
+ };
189
+ const OMNI_FLASH = {
190
+ label: 'Gemini Omni Flash',
191
+ intro: [
192
+ 'Gemini Omni Flash is the cheap 720p tier with native synced audio included — dialogue, SFX, and ambient generate WITH the video at no extra cost. 3-10s, 16:9 or 9:16. Text-to-video, one start frame, or up to 7 reference images. No last frame, no video/audio references.',
193
+ ],
194
+ columns: [
195
+ [
196
+ {
197
+ heading: 'Structure like a shot brief',
198
+ example: 'subject + action + setting + camera + lighting + tone',
199
+ note: 'Descriptive prompts are fine for generation (the short-prompt rule is edit-only).',
200
+ },
201
+ {
202
+ heading: 'Dialogue',
203
+ example: 'The barista says, "Your usual?"',
204
+ note: 'Audio is prompt-driven — there are no audio parameters. Dialogue in quotes.',
205
+ },
206
+ {
207
+ heading: 'Sound in plain language',
208
+ example: 'rain patters on the tin roof · distant traffic hum',
209
+ note: 'Describe sounds directly in the prose — no SFX: prefix needed.',
210
+ },
211
+ ],
212
+ [
213
+ {
214
+ heading: 'Name references inline',
215
+ example: 'Marcus (images 1 and 2) walks into the cafe...',
216
+ note: 'Up to 7 reference images merge into one list — refer to them by number in the prompt.',
217
+ },
218
+ {
219
+ heading: 'Negatives as plain instructions',
220
+ example: 'Do not show text.',
221
+ note: 'No negative-prompt field — write what to avoid as a direct instruction.',
222
+ },
223
+ {
224
+ heading: 'Know its seat',
225
+ note: 'Cheap drafts, iteration volume, and audio-in-one-gen at low cost. For hero shots, Kling 3.0 (general default) or Seedance 2.0 (premium/physics) still win.',
226
+ },
227
+ ],
228
+ ],
229
+ };
230
+ const OMNI_FLASH_EDIT = {
231
+ label: 'Omni Flash Edit',
232
+ intro: [
233
+ 'Omni Flash Edit changes what the prompt names in an existing 3-10s clip, footage-synced — prop, effect, environment, and lighting swaps. Prompt + source clip only: no reference images (identity swaps that need refs → Kling O3 Edit). 720p output; voice editing unsupported.',
234
+ ],
235
+ columns: [
236
+ [
237
+ {
238
+ heading: 'One short change — MANDATORY',
239
+ example: 'Small magical flames appear on his fingertips when he snaps his fingers, and vanish when he blows on them. Keep everything else the same.',
240
+ note: "Google's own doc: simple prompts work best; overly descriptive prompts cause unintended changes. Long \"keep every frame identical\" preambles make drift WORSE. One change, then the magic phrase.",
241
+ critical: true,
242
+ },
243
+ {
244
+ heading: 'Always end with the preservation phrase',
245
+ example: '...Keep everything else the same.',
246
+ note: 'The one documented preservation lever. Every edit prompt ends with it.',
247
+ },
248
+ {
249
+ heading: 'Never name objects as metaphors',
250
+ example: '❌ a candle-like flame → ✅ small magical flames on his fingertips',
251
+ note: '"Candle-like" renders a literal candle in his hand. Describe the effect itself.',
252
+ },
253
+ ],
254
+ [
255
+ {
256
+ heading: 'No conditional timing cues',
257
+ example: '❌ ...appears WHEN he calls it, perches AS he walks',
258
+ note: "Beat-by-beat stage directions cued to moments in the footage hard-fail the request. Collapse to one continuous action; the model syncs it to the footage's own motion.",
259
+ },
260
+ {
261
+ heading: 'Frame effects as harmless VFX',
262
+ example: '❌ his fingertips catch fire → ✅ magical flames appear on his fingertips',
263
+ note: "Google's safety filter is strict about harm-to-person phrasing. Magical/harmless framing passes.",
264
+ },
265
+ {
266
+ heading: 'Expect a possible tail artifact',
267
+ note: "Occasional jitter or a doubled final speech beat in the last ~0.5s. Trim the tail on the timeline — don't burn a re-roll on it.",
268
+ },
269
+ ],
270
+ ],
271
+ footer: [
272
+ 'Ship via segment-splice: edit only the seconds where the change happens (Trim / Split first), then splice back over the original on the timeline with the original audio underneath. Chain edits one change at a time — each edit saves as a new clip linked to its parent.',
273
+ ],
274
+ };
275
+ const NANO_BANANA = {
276
+ label: 'Nano Banana 2',
277
+ intro: [
278
+ 'Nano Banana 2 is a language model that outputs pixels. Brief it like a creative director, not like a Stable-Diffusion tag tool. The biggest realism lever: specificity that mimics how real photographers describe their work.',
279
+ "Google's 4 official rules: Be specific. Use positive framing (describe what you want, not what you don't). Control the camera with cinematic terms. Iterate conversationally.",
280
+ ],
281
+ columns: [
282
+ [
283
+ {
284
+ heading: 'Cinematic prompt formula',
285
+ example: 'Film still from [Director] [genre]. Shot on [camera] with [lens]. [Subject + action]. [3-5 details]. [Lighting]. [Color palette]. [Film stock].',
286
+ note: 'Specific gear beats generic descriptors. "ARRI Alexa 65 with Panavision anamorphic" outperforms "cinematic camera."',
287
+ },
288
+ {
289
+ heading: 'Named lenses + apertures',
290
+ example: '85mm f/1.4 · 135mm f/2.8 · 50mm f/1.2 · 35mm f/2 · Panavision anamorphic · 400mm telephoto',
291
+ note: '135mm f/2.8 is the cheat code for skin texture and intimate compression. Anamorphic for cinematic width + horizontal flares.',
292
+ },
293
+ {
294
+ heading: 'Named film stocks (one per prompt)',
295
+ example: 'Kodak Portra 400 · Fuji Velvia 50 · Ilford HP5 Plus · CineStill 800T',
296
+ note: 'Portra = natural skin warmth. Velvia = saturated landscape. HP5 = gritty B&W grain. CineStill 800T = tungsten night with halation. Never mix stocks.',
297
+ },
298
+ {
299
+ heading: "Don't carry lens + stock into a video prompt",
300
+ example: '85mm f/1.4, Portra 400\n→ close-up, shallow depth of field, warm natural colors, cinematic texture',
301
+ note: 'Lenses, apertures, film stocks and camera bodies are an image-model lever and a video-model anti-pattern — ByteDance\'s Seedance guide never mentions f-stops, lens millimetres, fps or shutter angle. When you animate a frame you made here, translate the look into shot size, depth of field and colour tone instead of pasting the gear list across.',
302
+ },
303
+ {
304
+ heading: 'Physics-based lighting',
305
+ example: 'Single key light at 45 degrees from upper left. Color temperature 4500K. Crisp catchlights in the eyes.',
306
+ note: 'Direction + Kelvin temp + named source. "Single key light at 10 o\'clock" beats "soft lighting" every time.',
307
+ },
308
+ {
309
+ heading: 'Imperfection vocabulary',
310
+ example: 'visible pores · peach fuzz · ISO noise · sweat beading · slight hyperpigmentation · unretouched raw photography',
311
+ note: 'Forces the model away from AI-clean skin. The default is too smooth — you have to ask for the imperfections that real photos have.',
312
+ },
313
+ ],
314
+ [
315
+ {
316
+ heading: '❌ The anti-list — avoid these',
317
+ example: '8k · masterpiece · hyperrealistic · ultra-detailed · trending on ArtStation · perfect skin · flawless · airbrushed · cinematic (alone)',
318
+ note: 'Tag-soup phrases from the Stable-Diffusion era. Measured success ~60-70% with these vs ~95%+ with positive description. Always specify which cinema — director, lens, era, stock.',
319
+ critical: true,
320
+ },
321
+ {
322
+ heading: 'No negative-prompt field',
323
+ example: '✅ "empty street" not "no cars"\n✅ "without people, vehicles, or signage"\n❌ "not anime, not cartoon, not 3D"',
324
+ note: 'Reframe positively first. Use inline "without" / "free of" only when positive framing can\'t suppress the unwanted element.',
325
+ },
326
+ {
327
+ heading: 'Reference images — name them, never label roles',
328
+ example: 'Marcus (images 1 and 2) sits across from the woman (image 3) in the cafe (image 4).',
329
+ note: `Up to 14 refs (10 object + 4 character — caps don't trade). ${PARTIALS['reference-tips-short']}`,
330
+ },
331
+ {
332
+ heading: 'Common fixes',
333
+ example: 'Hands → "five fingers, natural proportions"\nText → quote-wrap "HEADLINE" + specify font\nLeft/right → "from the character\'s perspective"',
334
+ note: "Default left/right is the viewer's perspective. Surreal prompts trip uncanny valley — the model drags toward realism. For surrealism, lean hard into \"painted\" / \"illustrated\".",
335
+ },
336
+ {
337
+ heading: 'Resolution tactics',
338
+ example: '1k = drafts · 2k = hero · 4k = print/final',
339
+ note: 'Pick by need. 2K+ allocates more tokens to surface detail, so texture vocab (pores, fabric weave, grain) compounds at higher resolution.',
340
+ },
341
+ ],
342
+ ],
343
+ footer: [
344
+ 'Boring vs Cinema. Boring: "Wide shot of man on dock looking at forest." Cinema: "Direct overhead drone shot on weathered dock. Single figure climbing up frame bottom. Boot prints leading toward shore. Pale winter light. Anamorphic flare. Desaturated blue/slate palette. Kodak Portra 400 grain. Map of threat."',
345
+ "3-strike rule. If three iterations on the same prompt haven't landed, stop. The slot machine doesn't converge — the prompt structure is wrong, not the seed.",
346
+ ],
347
+ };
348
+ const NANO_BANANA_LITE = {
349
+ ...NANO_BANANA,
350
+ label: 'Nano Banana 2 Lite',
351
+ columns: [
352
+ NANO_BANANA.columns[0],
353
+ NANO_BANANA.columns[1].map((card) => card.heading === 'Resolution tactics'
354
+ ? {
355
+ heading: 'Resolution tactics',
356
+ example: '1k only on Lite',
357
+ note: 'Lite outputs 1K only — use it for iteration volume and drafts, then switch to Nano Banana 2 for 2K/4K finals.',
358
+ }
359
+ : card),
360
+ ],
361
+ };
362
+ export const PROMPTING_TIPS = {
363
+ seedance: SEEDANCE,
364
+ kling: KLING,
365
+ 'kling-edit': KLING_EDIT,
366
+ veo: VEO,
367
+ 'omni-flash': OMNI_FLASH,
368
+ 'omni-flash-edit': OMNI_FLASH_EDIT,
369
+ 'nano-banana': NANO_BANANA,
370
+ 'nano-banana-lite': NANO_BANANA_LITE,
371
+ };
372
+ /** Null when no tips exist for the key — callers render an honest fallback. */
373
+ export function getPromptingTips(key) {
374
+ return PROMPTING_TIPS[key] ?? null;
375
+ }
376
+ //# sourceMappingURL=prompting-tips.js.map
@@ -1,3 +1,4 @@
1
+ export { PARTIALS } from './partials.generated.js';
1
2
  export type SourceGrade = 'Eric-test' | 'community' | 'code-verified' | 'creator-demo';
2
3
  export interface ReferenceRule {
3
4
  id: string;
@@ -11,24 +12,52 @@ export interface ReferenceRule {
11
12
  * are the reusable text the templates compose.
12
13
  */
13
14
  export declare const REFERENCE_RULES: ReferenceRule[];
14
- /** Flat, even, shadowless identity lighting on a plain neutral background. */
15
+ /** Flat, even, shadowless identity lighting on a deep neutral-grey plate. */
15
16
  export declare const IDENTITY_LIGHTING = "flat, even, shadowless lighting";
16
- export declare const IDENTITY_BACKGROUND = "a plain neutral-grey background";
17
- export declare const IDENTITY_LIGHTING_CLAUSE = "Render on a plain neutral-grey background with flat, even, shadowless lighting so the sheet captures the character's identity, not scene lighting.";
17
+ /**
18
+ * The plate value is deliberate, not decorative: **white bleeds into the
19
+ * generated video and washes out the location; black eats edge detail and
20
+ * crushes hair and wardrobe silhouettes.** A deep neutral grey holds both.
21
+ */
22
+ export declare const IDENTITY_PLATE_HEX = "#3a3a3c";
23
+ export declare const IDENTITY_BACKGROUND = "a plain, deep neutral-grey background (#3a3a3c)";
24
+ export declare const IDENTITY_LIGHTING_CLAUSE = "Render on a plain, deep neutral-grey background (#3a3a3c) with flat, even, shadowless lighting so the sheet captures the character's identity, not scene lighting.";
25
+ /**
26
+ * Craft clauses every identity reference wants — the eye and skin detail that
27
+ * survives downstream, plus the two "reads literally" guards. Crushed-black
28
+ * irises carry no light information, so eye tone drifts between generations;
29
+ * no catchlight reads as dead eyes; perfect mirroring reads as synthetic and
30
+ * the model PRESERVES that reading; a game-render look gets ANIMATED like game
31
+ * footage. See skills/_partials/references-read-literally.md.
32
+ */
33
+ export declare const IDENTITY_CRAFT_CLAUSE: string;
18
34
  /** Inherit the source's artistic medium unless told otherwise. */
19
35
  export declare const INHERIT_SOURCE_STYLE = "Preserve the artistic medium and visual style of the reference image (photograph, anime, illustration, 3D render, painterly, etc.).";
20
36
  /** Environment plate guidance: one clean, naturally-lit establishing image. */
21
- export declare const ENVIRONMENT_NATURAL_LIGHT = "natural, even ambient lighting that reads as the location's real light, not a studio setup";
22
- /** One-line summary used as a header in skills + the lead magnet. */
23
- export declare const REFERENCE_RULES_HEADLINE = "Identity = a few flat-lit neutral angles; one reference per role, labeled; 2-4 refs not 12; describe environments instead of feeding a grid.";
37
+ export declare const ENVIRONMENT_NATURAL_LIGHT = "natural ambient lighting that reads as the location's real light, not a studio setup";
38
+ /**
39
+ * One-line summary used as a header in skills + the lead magnet. DERIVED from
40
+ * the partial's opening line — a hand-authored copy here would be a ninth
41
+ * wording of the same rule, which is the thing this whole mechanism exists to
42
+ * stop. Edit `skills/_partials/reference-rules-core.md`.
43
+ */
44
+ export declare const REFERENCE_RULES_HEADLINE: string;
24
45
  /**
25
- * Canonical markdown block — the SOURCE OF TRUTH the skill markdown and the
26
- * lead-magnet are reconciled AGAINST. NOTE: nothing imports this yet — the
27
- * skills hand-author their own reference-rule prose and embed-skills.mjs ships
28
- * the raw .md as-is, so a change here must be propagated to the per-model skill
29
- * blocks + lead-magnet by hand until the skill-embed wiring lands (see
30
- * plans/2026-06-25-slates-prompting-system-overhaul.md). The TARGET is to
31
- * inject this text so it can't drift; today it's reconciled manually.
46
+ * Canonical markdown block — the SOURCE OF TRUTH for reference-image doctrine
47
+ * across every Slates surface.
48
+ *
49
+ * ✅ WIRED 2026-07-21. This is no longer hand-reconciled prose. The text lives
50
+ * in `skills/_partials/reference-rules-core.md`; `scripts/sync-partials.mjs`
51
+ * injects it between the `@inject:reference-rules-core` markers in the
52
+ * per-model skills AND emits it here via `partials.generated.ts`. One edit to
53
+ * the partial now moves the markdown skills, this export, the MCP
54
+ * prompting-guide op, the CLI-installed skills, and the Studio Agent together.
55
+ *
56
+ * The build runs `sync-partials.mjs --check`, so a hand-edit inside a marker
57
+ * block fails the build with a diff instead of silently forking.
58
+ *
59
+ * To change reference doctrine: edit `skills/_partials/reference-rules-core.md`.
60
+ * Do NOT edit this file, and do NOT edit between markers in a skill.
32
61
  */
33
- export declare const REFERENCE_RULES_TEXT = "## Reference rules (how to use reference images)\n\nIdentity = a few flat-lit neutral angles; one reference per role, labeled; 2-4 refs not 12; describe environments instead of feeding a grid.\n\n1. **2-4 strong references beat both extremes.** Not 1 (warps toward itself), not 12 (averages worse). Start with 2-3 focused refs.\n2. **One reference per ROLE, labeled in the prompt.** Identity / style-grade / environment. The model does not infer roles from order \u2014 name each role in the prompt text. Same-role competitors drift.\n3. **Attach both sheets \u2014 NAME them as one entity, don't gate them.** Attach the full-body turnaround (body/proportion/outfit) AND the close-up expression sheet (high-res facial detail: eyes, skin, teeth, bone structure). NAME both inline as the same subject (\"Marcus (images 1 and 2)\") \u2014 the shared name tells the model they are ONE person, which is what stops the varied expressions from averaging the face. Do **not** inject a role essay (\"use for identity, ignore the outfit/lighting, render neutral\") \u2014 that drags the studio-lit sheet's wardrobe + lighting into the scene; the user's prompt owns wardrobe, expression, and lighting. Naming-as-one-entity IS each model's official lever (NB2 \"assign a distinct name\"; Seedance \"Reference Subject_N in Image_N\"; Kling \"reuse a fixed label verbatim\"). The trend is MORE references \u2014 addressing each by name is what makes many refs work.\n4. **Flat-light identity refs.** Prep identity refs with flat, even, shadowless lighting on a plain neutral background. Studio-lit / scene-lit sheets bleed their lighting into every generation (the studio-lit sheet \u2192 \"green-screen-pasted in front of mountains\" failure). Reference prep beats prompting here.\n5. **Environment: describe it, don't feed a grid.** Default to describing the location in words. Reserve an environment reference for a mandatory exact-match, and then use ONE clean establishing image with natural, even ambient lighting that reads as the location's real light, not a studio setup \u2014 never a multi-panel grid fed whole.\n6. **Grids: explore, don't input.** Use grids to explore compositions cheaply, then pick a cell. Never feed a grid back in as a reference \u2014 cells share a split detail budget and generate jointly, so flaws propagate.\n7. **Reuse the same refs across all shots.** Lock a set and reuse it; swapping refs mid-sequence causes drift.\n8. **Legible in-shot text \u2192 bake it into an image start frame, never trust text-to-video.** Animate from the locked frame.\n9. **I2V / own-footage superpower.** Restyle your own clip keeping the performance; delayed-VFX on \"video one\"; marker-object insertion; video-as-ref for a series. Describe ONLY what changes.\n10. **Style transform by natural language.** Default keeps the source's art style; an optional plain-text instruction transforms it (\"anime \u2192 real person\"). No preset pickers.";
62
+ export declare const REFERENCE_RULES_TEXT: string;
34
63
  //# sourceMappingURL=reference-rules.d.ts.map
@@ -5,6 +5,10 @@
5
5
  // Source grades: [Eric-test] = Eric's own hands-on result (doctrine-grade);
6
6
  // [community] = multi-guide consensus; [code-verified] = verified against
7
7
  // the slate codebase; [creator-demo] = single creator demonstration.
8
+ // The generated partial store — one entry per skills/_partials/*.md file.
9
+ // Re-exported so consumers can reach any partial, not just the rules block.
10
+ export { PARTIALS } from './partials.generated.js';
11
+ import { PARTIALS } from './partials.generated.js';
8
12
  /**
9
13
  * The 10 verified reference rules. These are the WHY; the fragments below
10
14
  * are the reusable text the templates compose.
@@ -26,8 +30,8 @@ export const REFERENCE_RULES = [
26
30
  },
27
31
  {
28
32
  id: 'identity-name-as-one-entity',
29
- title: 'Attach both sheets — NAME them as one entity, don\'t gate them',
30
- rule: 'Attach BOTH the full-body turnaround (body/proportion/outfit) AND the close-up expression sheet (high-res facial detail). NAME both inline as the SAME subject ("Marcus (images 1 and 2)") — that shared name is what tells the model they are ONE person and stops the varied expressions from averaging the face. Do NOT inject a role essay ("use for identity, ignore the outfit/lighting, render neutral"): the user\'s prompt owns wardrobe, expression, and lighting.',
33
+ title: 'One identity sheet per character — NAME whatever you attach as one entity',
34
+ rule: 'Attach the character\'s single identity sheet (dominant portrait + body panels) rather than a pile of views — fewer competing renderings of a face is always better, because the model cannot tell which is authoritative and averages them. When a character DOES carry a second bound sheet (an explicit expression range, or a legacy turnaround+expression pair), NAME both inline as the SAME subject ("Marcus (images 1 and 2)") — that shared name is what tells the model they are ONE person. Do NOT inject a role essay ("use for identity, ignore the outfit/lighting, render neutral"): the user\'s prompt owns wardrobe, expression, and lighting.',
31
35
  why: 'Naming both images as one entity IS each model\'s OWN official consistency lever — NB2 "assign a distinct name to each character/object"; Seedance "Reference <Subject_N> in <Image_N>"; Kling "reuse a fixed label verbatim". The old heavy role-essay was the OFF-doctrine part: telling the model to "use for identity" while injecting "ignore the outfit" dragged the studio-lit sheet\'s wardrobe + lighting into scenes that explicitly wanted otherwise (the movie-still injection failure). The close-ups still carry far more facial signal (eyes, skin, teeth, bone structure) than a turnaround\'s postage-stamp faces, so attach both — the NAME, not an instruction, is what makes many refs work. The trend is MORE references (video/audio/3D into Seedance-class models), all addressed by name.',
32
36
  grade: 'Eric-test',
33
37
  },
@@ -84,37 +88,57 @@ export const REFERENCE_RULES = [
84
88
  // ── Reusable text fragments (the template-assembly building blocks) ──
85
89
  // These are the exact strings the desktop prompt templates, MCP skills,
86
90
  // and lead-magnet compose. Change a rule HERE and every consumer follows.
87
- /** Flat, even, shadowless identity lighting on a plain neutral background. */
91
+ /** Flat, even, shadowless identity lighting on a deep neutral-grey plate. */
88
92
  export const IDENTITY_LIGHTING = 'flat, even, shadowless lighting';
89
- export const IDENTITY_BACKGROUND = 'a plain neutral-grey background';
93
+ /**
94
+ * The plate value is deliberate, not decorative: **white bleeds into the
95
+ * generated video and washes out the location; black eats edge detail and
96
+ * crushes hair and wardrobe silhouettes.** A deep neutral grey holds both.
97
+ */
98
+ export const IDENTITY_PLATE_HEX = '#3a3a3c';
99
+ export const IDENTITY_BACKGROUND = `a plain, deep neutral-grey background (${IDENTITY_PLATE_HEX})`;
90
100
  export const IDENTITY_LIGHTING_CLAUSE = `Render on ${IDENTITY_BACKGROUND} with ${IDENTITY_LIGHTING} so the sheet captures the character's identity, not scene lighting.`;
101
+ /**
102
+ * Craft clauses every identity reference wants — the eye and skin detail that
103
+ * survives downstream, plus the two "reads literally" guards. Crushed-black
104
+ * irises carry no light information, so eye tone drifts between generations;
105
+ * no catchlight reads as dead eyes; perfect mirroring reads as synthetic and
106
+ * the model PRESERVES that reading; a game-render look gets ANIMATED like game
107
+ * footage. See skills/_partials/references-read-literally.md.
108
+ */
109
+ export const IDENTITY_CRAFT_CLAUSE = 'Crisp catchlights in the eyes and open, readable irises — never crushed to black. ' +
110
+ "Render surface texture at the medium's own natural level of detail — skin, hair and fabric should read as material, not airbrushed or plastic. " +
111
+ 'Break perfect symmetry — avoid a mirrored face or dead-square framing. ' +
112
+ 'Whatever the medium, avoid the over-clean 3D-game-model look.';
91
113
  /** Inherit the source's artistic medium unless told otherwise. */
92
114
  export const INHERIT_SOURCE_STYLE = 'Preserve the artistic medium and visual style of the reference image (photograph, anime, illustration, 3D render, painterly, etc.).';
93
115
  /** Environment plate guidance: one clean, naturally-lit establishing image. */
94
- export const ENVIRONMENT_NATURAL_LIGHT = 'natural, even ambient lighting that reads as the location\'s real light, not a studio setup';
95
- /** One-line summary used as a header in skills + the lead magnet. */
96
- export const REFERENCE_RULES_HEADLINE = 'Identity = a few flat-lit neutral angles; one reference per role, labeled; 2-4 refs not 12; describe environments instead of feeding a grid.';
116
+ export const ENVIRONMENT_NATURAL_LIGHT = 'natural ambient lighting that reads as the location\'s real light, not a studio setup';
97
117
  /**
98
- * Canonical markdown block — the SOURCE OF TRUTH the skill markdown and the
99
- * lead-magnet are reconciled AGAINST. NOTE: nothing imports this yet — the
100
- * skills hand-author their own reference-rule prose and embed-skills.mjs ships
101
- * the raw .md as-is, so a change here must be propagated to the per-model skill
102
- * blocks + lead-magnet by hand until the skill-embed wiring lands (see
103
- * plans/2026-06-25-slates-prompting-system-overhaul.md). The TARGET is to
104
- * inject this text so it can't drift; today it's reconciled manually.
118
+ * One-line summary used as a header in skills + the lead magnet. DERIVED from
119
+ * the partial's opening line — a hand-authored copy here would be a ninth
120
+ * wording of the same rule, which is the thing this whole mechanism exists to
121
+ * stop. Edit `skills/_partials/reference-rules-core.md`.
122
+ */
123
+ export const REFERENCE_RULES_HEADLINE = PARTIALS['reference-rules-core'].split('\n')[0];
124
+ /**
125
+ * Canonical markdown block — the SOURCE OF TRUTH for reference-image doctrine
126
+ * across every Slates surface.
127
+ *
128
+ * ✅ WIRED 2026-07-21. This is no longer hand-reconciled prose. The text lives
129
+ * in `skills/_partials/reference-rules-core.md`; `scripts/sync-partials.mjs`
130
+ * injects it between the `@inject:reference-rules-core` markers in the
131
+ * per-model skills AND emits it here via `partials.generated.ts`. One edit to
132
+ * the partial now moves the markdown skills, this export, the MCP
133
+ * prompting-guide op, the CLI-installed skills, and the Studio Agent together.
134
+ *
135
+ * The build runs `sync-partials.mjs --check`, so a hand-edit inside a marker
136
+ * block fails the build with a diff instead of silently forking.
137
+ *
138
+ * To change reference doctrine: edit `skills/_partials/reference-rules-core.md`.
139
+ * Do NOT edit this file, and do NOT edit between markers in a skill.
105
140
  */
106
141
  export const REFERENCE_RULES_TEXT = `## Reference rules (how to use reference images)
107
142
 
108
- ${REFERENCE_RULES_HEADLINE}
109
-
110
- 1. **2-4 strong references beat both extremes.** Not 1 (warps toward itself), not 12 (averages worse). Start with 2-3 focused refs.
111
- 2. **One reference per ROLE, labeled in the prompt.** Identity / style-grade / environment. The model does not infer roles from order — name each role in the prompt text. Same-role competitors drift.
112
- 3. **Attach both sheets — NAME them as one entity, don't gate them.** Attach the full-body turnaround (body/proportion/outfit) AND the close-up expression sheet (high-res facial detail: eyes, skin, teeth, bone structure). NAME both inline as the same subject ("Marcus (images 1 and 2)") — the shared name tells the model they are ONE person, which is what stops the varied expressions from averaging the face. Do **not** inject a role essay ("use for identity, ignore the outfit/lighting, render neutral") — that drags the studio-lit sheet's wardrobe + lighting into the scene; the user's prompt owns wardrobe, expression, and lighting. Naming-as-one-entity IS each model's official lever (NB2 "assign a distinct name"; Seedance "Reference Subject_N in Image_N"; Kling "reuse a fixed label verbatim"). The trend is MORE references — addressing each by name is what makes many refs work.
113
- 4. **Flat-light identity refs.** Prep identity refs with ${IDENTITY_LIGHTING} on a plain neutral background. Studio-lit / scene-lit sheets bleed their lighting into every generation (the studio-lit sheet → "green-screen-pasted in front of mountains" failure). Reference prep beats prompting here.
114
- 5. **Environment: describe it, don't feed a grid.** Default to describing the location in words. Reserve an environment reference for a mandatory exact-match, and then use ONE clean establishing image with ${ENVIRONMENT_NATURAL_LIGHT} — never a multi-panel grid fed whole.
115
- 6. **Grids: explore, don't input.** Use grids to explore compositions cheaply, then pick a cell. Never feed a grid back in as a reference — cells share a split detail budget and generate jointly, so flaws propagate.
116
- 7. **Reuse the same refs across all shots.** Lock a set and reuse it; swapping refs mid-sequence causes drift.
117
- 8. **Legible in-shot text → bake it into an image start frame, never trust text-to-video.** Animate from the locked frame.
118
- 9. **I2V / own-footage superpower.** Restyle your own clip keeping the performance; delayed-VFX on "video one"; marker-object insertion; video-as-ref for a series. Describe ONLY what changes.
119
- 10. **Style transform by natural language.** Default keeps the source's art style; an optional plain-text instruction transforms it ("anime → real person"). No preset pickers.`;
143
+ ${PARTIALS['reference-rules-core']}`;
120
144
  //# sourceMappingURL=reference-rules.js.map