@slatesvideo/shared 0.7.1 → 0.7.3
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/clients/cloud.d.ts +4 -0
- package/dist/clients/cloud.js +11 -3
- package/dist/index.d.ts +2 -1
- package/dist/index.js +2 -1
- package/dist/manual/content.d.ts +1 -1
- package/dist/manual/content.js +1 -1
- package/dist/manual/index.d.ts +11 -2
- package/dist/manual/index.js +178 -14
- package/dist/operations/index.d.ts +292 -94
- package/dist/operations/index.js +870 -199
- package/dist/operations/surface.d.ts +6 -2
- package/dist/operations/surface.js +35 -5
- package/dist/prompts/agent-doctrine.d.ts +4 -4
- package/dist/prompts/agent-doctrine.js +18 -29
- package/dist/prompts/generation-policy.d.ts +1 -1
- package/dist/prompts/guide-discovery.d.ts +23 -0
- package/dist/prompts/guide-discovery.js +39 -0
- package/dist/prompts/guide-retrieval.js +1 -1
- package/dist/prompts/model-capabilities.d.ts +8 -9
- package/dist/prompts/model-capabilities.js +11 -51
- package/dist/prompts/model-facts.d.ts +2 -2
- package/dist/prompts/model-facts.js +15 -26
- package/dist/prompts/partials.generated.js +6 -3
- package/dist/prompts/prompting-tips.d.ts +1 -1
- package/dist/prompts/prompting-tips.js +21 -63
- package/dist/prompts/search-terms.d.ts +3 -0
- package/dist/prompts/search-terms.js +24 -0
- package/dist/skills/content.js +36 -37
- package/dist/skills/metadata.d.ts +7 -0
- package/dist/skills/metadata.js +29 -0
- package/exports/slates-chatgpt-images/generated/SKILL.md +7 -1
- package/exports/slates-chatgpt-images/generated/slates-chatgpt-images.skill +0 -0
- package/exports/slates-prompt-builder/generated/SKILL.md +28 -16
- package/exports/slates-prompt-builder/generated/reference-character.md +12 -13
- package/exports/slates-prompt-builder/generated/reference-content-policy.md +2 -2
- package/exports/slates-prompt-builder/generated/reference-gpt-image-2-5.md +191 -0
- package/exports/slates-prompt-builder/generated/reference-kling.md +32 -11
- package/exports/slates-prompt-builder/generated/reference-nano-banana.md +24 -6
- package/exports/slates-prompt-builder/generated/reference-omni-flash.md +65 -0
- package/exports/slates-prompt-builder/generated/reference-seedance-2-5.md +362 -0
- package/exports/slates-prompt-builder/generated/reference-seedance.md +34 -4
- package/exports/slates-prompt-builder/generated/slates-prompt-builder-manifest.json +77 -23
- package/exports/slates-prompt-builder/generated/slates-prompt-builder.skill +0 -0
- package/package.json +2 -1
- package/skills/_partials/blender-action-curves.md +24 -0
- package/skills/_partials/cinematic-card.md +1 -1
- package/skills/_partials/iteration-diagnosis.md +5 -0
- package/skills/_partials/model-routing.md +35 -0
- package/skills/_partials/seedance-25-timestamps.md +2 -2
- package/skills/_partials/still-gate.md +2 -2
- package/skills/_partials/thresholds.md +1 -1
- package/skills/slates-blocking-to-prompt.md +15 -13
- package/skills/slates-camera-language.md +45 -7
- package/skills/slates-character-identity.md +8 -6
- package/skills/slates-chatgpt-images.md +7 -1
- package/skills/slates-cinematic-look.md +1 -1
- package/skills/slates-content-policy.md +4 -6
- package/skills/slates-cost-discipline.md +18 -12
- package/skills/slates-dialogue-blocking.md +6 -6
- package/skills/slates-direct-response-ad.md +1 -1
- package/skills/slates-edit-and-iterate.md +12 -4
- package/skills/slates-model-selection.md +82 -90
- package/skills/slates-one-prompt-film.md +1 -1
- package/skills/slates-previs-blocking.md +44 -13
- package/skills/slates-project-organization.md +2 -2
- package/skills/slates-prompting-elevenlabs.md +4 -4
- package/skills/slates-prompting-flux-2-max.md +2 -3
- package/skills/slates-prompting-gpt-image-2-5.md +2 -2
- package/skills/slates-prompting-inworld-tts.md +1 -1
- package/skills/slates-prompting-kling-v3.md +11 -9
- package/skills/slates-prompting-lip-sync.md +15 -15
- package/skills/slates-prompting-ltx-2-5.md +5 -6
- package/skills/slates-prompting-minimax-h3.md +11 -11
- package/skills/slates-prompting-motion-transfer.md +8 -8
- package/skills/slates-prompting-nano-banana-2.md +8 -4
- package/skills/slates-prompting-omni-flash.md +9 -9
- package/skills/slates-prompting-seed-audio.md +24 -4
- package/skills/slates-prompting-seedance-2-5.md +40 -30
- package/skills/slates-prompting-seedance.md +4 -4
- package/skills/slates-prompting-seedream-5-lite.md +6 -6
- package/skills/slates-restyle-from-blocking.md +2 -2
- package/skills/slates-script-craft.md +1 -1
- package/skills/slates-shot-variety.md +1 -1
- package/skills/slates-storyboard-from-script.md +1 -1
- package/skills/slates-style-prompting.md +8 -6
- package/skills/slates-ugc-influencer-ad.md +1 -1
- package/skills/slates-vision-feedback-loop.md +118 -110
- package/skills/slates-prompting-veo-3.md +0 -224
|
@@ -4,75 +4,129 @@
|
|
|
4
4
|
"sourceFiles": [
|
|
5
5
|
{
|
|
6
6
|
"path": "exports/slates-prompt-builder/prompt-builder.md",
|
|
7
|
-
"sha256": "
|
|
7
|
+
"sha256": "ec5a8002eec5438f092f9f4df5e60cbcbfbea73238a4b5ce89e2cbcc26665afe"
|
|
8
8
|
},
|
|
9
9
|
{
|
|
10
10
|
"path": "skills/slates-character-identity.md",
|
|
11
|
-
"sha256": "
|
|
11
|
+
"sha256": "144beb0c551201b9ba55aa6ed441928d6494860c1c0ee2eacfe5681c179421f0"
|
|
12
12
|
},
|
|
13
13
|
{
|
|
14
|
-
"path": "skills/slates-
|
|
15
|
-
"sha256": "
|
|
14
|
+
"path": "skills/slates-content-policy.md",
|
|
15
|
+
"sha256": "89ed04fb8d4d7e7aa23d1706d36055cfa7b1e8b7acb09c860c966bb848a4c9ca"
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"path": "skills/slates-prompting-gpt-image-2-5.md",
|
|
19
|
+
"sha256": "501276dd45d5d8f8faae199680bfb5c78c9e4cc083d9fcde76a49e3cf674600e"
|
|
16
20
|
},
|
|
17
21
|
{
|
|
18
22
|
"path": "skills/slates-prompting-kling-v3.md",
|
|
19
|
-
"sha256": "
|
|
23
|
+
"sha256": "e247bf2ba2999a57ee2255cd31c197d1391c0b24acef0508e948bce7bad1650c"
|
|
20
24
|
},
|
|
21
25
|
{
|
|
22
26
|
"path": "skills/slates-prompting-nano-banana-2.md",
|
|
23
|
-
"sha256": "
|
|
27
|
+
"sha256": "1912a693c668a14f03acc039abe497c3920906aa1bf14d52e3e40d61037464d2"
|
|
24
28
|
},
|
|
25
29
|
{
|
|
26
|
-
"path": "skills/slates-
|
|
27
|
-
"sha256": "
|
|
30
|
+
"path": "skills/slates-prompting-omni-flash.md",
|
|
31
|
+
"sha256": "887551ad854a05d0065a08fc15c654153803486ffda7ee1dcea23ad31219afd2"
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
"path": "skills/slates-prompting-seedance-2-5.md",
|
|
35
|
+
"sha256": "6e8b17b81bef5ba50a10e46610268f718c2941b6e78c18a2cae4393332337c49"
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
"path": "skills/slates-prompting-seedance.md",
|
|
39
|
+
"sha256": "e65776d8d803f10d6eac57f2a4742a634f55699e9d725d3cbec24e1099552a40"
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
"path": "src/prompts/character-sheet.ts",
|
|
43
|
+
"sha256": "2c07fb6e15c6a226f759eb10d812518401dfdf7804cdb221784252e87581df75"
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
"path": "src/prompts/generation-policy.ts",
|
|
47
|
+
"sha256": "8910685e757d86f7d25f52d2f1e606b69936d97ebad4b8a695b33ee551bbfbe2"
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
"path": "src/prompts/model-capabilities.ts",
|
|
51
|
+
"sha256": "abf78613f8210e80a67e1ccbb8d4a93fc094baa23b075b0043fa98b3974d9324"
|
|
28
52
|
},
|
|
29
53
|
{
|
|
30
54
|
"path": "src/prompts/model-facts.ts",
|
|
31
|
-
"sha256": "
|
|
55
|
+
"sha256": "e7298b62ff4562b60808d7c5addff2737d648b4ae89b95c84796bb0238986bba"
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
"path": "src/prompts/partials.generated.ts",
|
|
59
|
+
"sha256": "8051b8cc02ce38f8fa35eea2b2db55ac948faf4c6a1728632bf68534004b676b"
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
"path": "src/prompts/reference-rules.ts",
|
|
63
|
+
"sha256": "bb7cae0a613976303274b3f96b2bc85dca6c8fdd83f31ae368676325450a8efe"
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
"path": "src/prompts/style-library.ts",
|
|
67
|
+
"sha256": "138ec5301839bff15a2144bd57474a8b4481b31c6b56f5245ea37923ea52f583"
|
|
32
68
|
}
|
|
33
69
|
],
|
|
34
70
|
"outputs": [
|
|
35
71
|
{
|
|
36
72
|
"path": "SKILL.md",
|
|
37
|
-
"bytes":
|
|
38
|
-
"sha256": "
|
|
73
|
+
"bytes": 9157,
|
|
74
|
+
"sha256": "c8946925df07e853a446d84b18df65c5bb82ea2f14ca269bf1f8fd42de183166"
|
|
39
75
|
},
|
|
40
76
|
{
|
|
41
77
|
"path": "reference-character.md",
|
|
42
|
-
"bytes":
|
|
43
|
-
"sha256": "
|
|
78
|
+
"bytes": 12614,
|
|
79
|
+
"sha256": "09bc878dd5618ceaa954019b676dea79357ae2e8dcda3a611d4381380cbfa0e4"
|
|
44
80
|
},
|
|
45
81
|
{
|
|
46
82
|
"path": "reference-seedance.md",
|
|
47
|
-
"bytes":
|
|
48
|
-
"sha256": "
|
|
83
|
+
"bytes": 37635,
|
|
84
|
+
"sha256": "910cb83f446f0264c4b3a1bc0fe545aecfc1057394ab2a5870cd6f2eac6491b8"
|
|
49
85
|
},
|
|
50
86
|
{
|
|
51
87
|
"path": "reference-kling.md",
|
|
52
|
-
"bytes":
|
|
53
|
-
"sha256": "
|
|
88
|
+
"bytes": 17639,
|
|
89
|
+
"sha256": "6fbea11e3dc2e0e592e426a07e533e43baebe1eb949c6230848e72dfbb8d59df"
|
|
54
90
|
},
|
|
55
91
|
{
|
|
56
92
|
"path": "reference-nano-banana.md",
|
|
57
|
-
"bytes":
|
|
58
|
-
"sha256": "
|
|
93
|
+
"bytes": 20888,
|
|
94
|
+
"sha256": "93be71144d74d89bc6080fa6e19d4529730f69fa188af4a0b0cb529dc2065022"
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
"path": "reference-seedance-2-5.md",
|
|
98
|
+
"bytes": 22995,
|
|
99
|
+
"sha256": "8a3b9fe96f7a03fcd861fd943555c40fbf82d1fb7a50d349c0fd0b9cbb85b265"
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
"path": "reference-gpt-image-2-5.md",
|
|
103
|
+
"bytes": 23072,
|
|
104
|
+
"sha256": "459494344b294ed269c8c3dc2aec2d686357497fe9d5f8fa1c25a9f9c7a91020"
|
|
105
|
+
},
|
|
106
|
+
{
|
|
107
|
+
"path": "reference-omni-flash.md",
|
|
108
|
+
"bytes": 8639,
|
|
109
|
+
"sha256": "d54bf97d0f88b1f288a40571638e7c6a05f7dc4b23fdcb2a8aa5cdbfef45882b"
|
|
59
110
|
},
|
|
60
111
|
{
|
|
61
112
|
"path": "reference-content-policy.md",
|
|
62
|
-
"bytes":
|
|
63
|
-
"sha256": "
|
|
113
|
+
"bytes": 7194,
|
|
114
|
+
"sha256": "66bb27b46e10696c42fad1660f8e6a37d2b54c14b4901297fc244efa6a3e6d3a"
|
|
64
115
|
}
|
|
65
116
|
],
|
|
66
117
|
"archive": {
|
|
67
118
|
"path": "slates-prompt-builder.skill",
|
|
68
|
-
"bytes":
|
|
69
|
-
"sha256": "
|
|
119
|
+
"bytes": 69638,
|
|
120
|
+
"sha256": "2fa30156c21241d4bf27dc6db462245d8f8f9bcab7e88ff1b792aebf02a22795",
|
|
70
121
|
"entries": [
|
|
71
122
|
"SKILL.md",
|
|
72
123
|
"reference-character.md",
|
|
73
124
|
"reference-content-policy.md",
|
|
125
|
+
"reference-gpt-image-2-5.md",
|
|
74
126
|
"reference-kling.md",
|
|
75
127
|
"reference-nano-banana.md",
|
|
128
|
+
"reference-omni-flash.md",
|
|
129
|
+
"reference-seedance-2-5.md",
|
|
76
130
|
"reference-seedance.md"
|
|
77
131
|
]
|
|
78
132
|
}
|
|
Binary file
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@slatesvideo/shared",
|
|
3
|
-
"version": "0.7.
|
|
3
|
+
"version": "0.7.3",
|
|
4
4
|
"description": "Shared operations layer for the Slates MCP server and CLI: auth, cloud/desktop clients, and the single tool surface both consume. Most users want @slatesvideo/mcp-server or @slatesvideo/cli instead.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -79,6 +79,7 @@
|
|
|
79
79
|
"node": ">=18"
|
|
80
80
|
},
|
|
81
81
|
"dependencies": {
|
|
82
|
+
"yaml": "^2.9.1",
|
|
82
83
|
"zod": "^3.23.0",
|
|
83
84
|
"zod-to-json-schema": "^3.23.0"
|
|
84
85
|
},
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
## Read animation curves from the active action layout
|
|
2
|
+
|
|
3
|
+
Blender 5 uses layered actions: curves belong to the channelbag for `animation_data.action_slot`, inside each layer's strips. A direct `action.fcurves` lookup failed on Blender 5.2.1 in the 2026-08-28 blocking run. Feature-detect the layout before changing interpolation or noise; an unanimated object can legitimately have no curves.
|
|
4
|
+
|
|
5
|
+
The snippets below use this small Blender-side iterator. It runs inside Blender; no add-on code is imported into the MCP package.
|
|
6
|
+
|
|
7
|
+
```python
|
|
8
|
+
def action_curves(datablock):
|
|
9
|
+
anim = getattr(datablock, "animation_data", None)
|
|
10
|
+
action = getattr(anim, "action", None)
|
|
11
|
+
if action is None:
|
|
12
|
+
return
|
|
13
|
+
if hasattr(action, "fcurves"):
|
|
14
|
+
yield from action.fcurves
|
|
15
|
+
elif getattr(anim, "action_slot", None) is not None:
|
|
16
|
+
for layer in action.layers:
|
|
17
|
+
for strip in layer.strips:
|
|
18
|
+
if hasattr(strip, "channelbag"):
|
|
19
|
+
bag = strip.channelbag(anim.action_slot)
|
|
20
|
+
if bag is not None:
|
|
21
|
+
yield from bag.fcurves
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
Use the datablock that owns the keyed property: the curve data for `eval_time`, the object for location and rotation, the camera data for lens. Confirm a named channel exists before assuming a keyframe operation created it.
|
|
@@ -5,4 +5,4 @@
|
|
|
5
5
|
- **Lens name plus effect** — `200mm telephoto`, `peaks loom huge behind her and melt into soft shapes`.
|
|
6
6
|
- **Name every garment and close the foreground.** Omissions invite reference leakage or invented props.
|
|
7
7
|
Bind references inline. A scene reference owns the grade; for a look-only reference, write the new scene's light. References are optional. For owned-frame edits, describe only the change and what stays.
|
|
8
|
-
<!-- slates-only -->Use `slates-cinematic-look` with a technique ID or section query for more.<!-- /slates-only -->
|
|
8
|
+
<!-- slates-only -->Use `slates-cinematic-look` with a technique ID or section query for more.<!-- /slates-only -->
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
## Diagnose repeated failures
|
|
2
|
+
|
|
3
|
+
After three failed attempts at the same requirement, pause unchanged re-rolls and diagnose the source reference, prompt structure, model fit and tool result. Three is a review checkpoint, not a universal limit or proof that the seed cannot matter. Preserve the attempts and name what each test changed.
|
|
4
|
+
|
|
5
|
+
Continue autonomously when the brief is clear, a specific correction is supported and the next request is already authorized. Hand control back when taste or intent cannot be inferred, the next request needs fresh consent, or the available tool cannot meet the requirement. A failed roll never authorizes an additional charge. Follow the existing batch and per-request cost policy.
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
**Current model routing, generated from the operation routing source:**
|
|
2
|
+
|
|
3
|
+
### image generate
|
|
4
|
+
|
|
5
|
+
Nano Banana 2 (Gemini 3.1 Flash Image): The all-rounder and the only image seat with a headless path: holds many subjects coherently in one frame, and the start-frame for legible in-scene text. Knowledge cutoff Jan 2025: anything later needs reference images.
|
|
6
|
+
Nano Banana 2 Lite: FAST/DRAFT image tier — markedly cheaper and faster than NB2 full, at draft quality. Route here for iteration volume, then re-run the winner on NB2 full. Same Gemini content filter as NB2.
|
|
7
|
+
Nano Banana Pro: HERO-FRAME / typography PREMIUM image tier. NB2 is about 95% of Pro — escalate only when spatial composition, cinematic lighting/skin, fine typography-in-scene or deep multi-element reasoning must be perfect, and say why.
|
|
8
|
+
GPT Image 2.5 Flare: THE FAST GPT IMAGE SEAT — OpenAI's small model, optimized for SPEED, quality COMPARABLE to GPT Image 2 (not better) at roughly half the latency. Route here when speed matters: drafts, exploration, volume. TEXT / DIAGRAM / PANEL work — character sheets, shot grids, text-bearing panels. When quality outranks speed, escalate to Sunburst. Own content filter, distinct from Gemini's. Killed by a head-to-head at the intended crop going the other way.
|
|
9
|
+
GPT Image 2.5 Sunburst: THE QUALITY GPT IMAGE SEAT — OpenAI's most capable image model, higher quality than GPT Image 2, same price as Flare, deliberately SLOWER. Route here unless speed is the point: finals, hero frames, photoreal people, and multi-reference edits where every reference must survive into one frame — its widest lead. Explore on Flare, finish on Sunburst.
|
|
10
|
+
FLUX.2 Max: Photoreal image seat, less censored than the Gemini rails. Auto-routes to its edit endpoint when references are present.
|
|
11
|
+
Seedream 5 Lite: Cheapest flat-priced image seat (GPT Image 2.5 at low quality costs less per image). Less censored. Routes to its edit endpoint when references are present.
|
|
12
|
+
|
|
13
|
+
### video generate
|
|
14
|
+
|
|
15
|
+
Seedance 2.0: THE 4K AND VALUE SEAT beside the 2.5 default — the only Seedance with native 4K (Pro-gated; base accounts get PRO_REQUIRED) and cheaper than 2.5 at every resolution they share, with the same physics, effects and scale strengths; shorter takes, fewer references, no timestamps. VIDEO-ONLY. A bare "seedance" still resolves here for older CLIs that expect 4K.
|
|
16
|
+
Seedance 2.5: DEFAULT VIDEO MODEL — the strongest seat for physics, effects, scale and hero shots, and the only Seedance that takes long single takes, many references, audio-only references and integer-second timestamps. No 4K, and dearer than 2.0 at every shared resolution: go to 2.0 for 4K or the same resolution cheaper. LENGTH is the price dial — quote long takes first. VIDEO-ONLY. Timestamp grammar and the edit/extend words that make the provider reclassify and fail a generation are in slates-prompting-seedance-2-5.
|
|
17
|
+
Kling 3.0: THE COST-EFFECTIVE SEAT — strong start-frame adherence (identity, layout, text), acting, dialogue and lip-sync; pick it when the budget matters and the shot is a performance or a start-frame animation. Kling is also the ONLY engine behind the Motion Transfer and Lip Sync tools.
|
|
18
|
+
Gemini Omni Flash: 720p seat with native synced audio included. Route here for drafts with sound in one pass and reference-to-video character-consistency trials; LTX, H3 and H3 Max Turbo cost less per second. VIDEO-ONLY. Quality against Kling/Seedance is unproven — do not route hero shots here.
|
|
19
|
+
MiniMax H3: THE AUTHORED-AUDIO SEAT — reach for H3 when the sound is part of the shot rather than a switch on it: synchronised dialogue, scene sound and an audience-only score directed as three separate layers in ONE pass, across eleven languages. Kling and Seedance treat audio as on/off. Only H3 also carries a DECLARED REFERENCE RELATIONSHIP (kept whole, partly kept, transferred, or a loose echo). VIDEO-ONLY. Its top two resolution tiers are UPSCALES of the native render, not larger generations — judge at native and upscale in post. Reference images past the fifth are a PAID key dimension: pass referenceImages when quoting.
|
|
20
|
+
MiniMax H3 Max: THE SPEED SEAT, dearer than base H3 at 768p and equal at 480p — never the cheap H3 and never the default. fal's post-train of the H3 weights: MEASURED 2026-08-27 at about 12x faster than base H3 on the same prompt and params, queue to finished file, plus a thin vendor-reported quality edge. It tops out at a 1080p refinement of its 768p render. It takes the same omni-reference set as base H3 and animates start and end frames — but not both in one call, the same as base H3: frames and references go to different endpoints. Never describe this row as taking no image or reference input. Route here when a fast turnaround on text-to-video or a start-frame shot is worth the premium.
|
|
21
|
+
MiniMax H3 Max Turbo: THE BUDGET SEAT of the MiniMax family: a second fal post-train of the H3 weights, billed at half H3 Max's rate at every tier. Its 1080p is a refinement of the native 768p render, not a native 1080p generation. INPUTS ARE FRAMES, NOT REFERENCES: text-to-video and start/end frames only, with no reference endpoint, so reference-driven consistency goes to H3 Max or base H3. Route here for drafts, volume and cheap coverage, then re-run the keeper on H3 Max or a hero seat.
|
|
22
|
+
LTX-2.5: THE VOLUME SEAT — the cheapest 1080p second with sound included, and the row for MANY takes rather than one hero shot. Native synced audio is included free at every tier, unlike Kling where sound is a paid key dimension. It supports native high-resolution output and longer takes than most seats; use the capability surface for its resolution-dependent duration limits. VIDEO-ONLY. INPUTS ARE FRAMES, NOT REFERENCES: start frame plus an optional end frame, and no reference endpoint at all — for character consistency across shots use H3 or Kling. Route here for batch coverage, long takes, and anything where the credit budget is the binding constraint.
|
|
23
|
+
LTX-2.5 Pro: THE FIDELITY SEAT of the LTX pair — the full diffusion build against the base row's distilled one. 🚨 IT IS NOT A SUPERSET OF THE BASE ROW, which is the opposite of every other Pro seat here: it reaches a SHORTER resolution ladder and makes SHORTER clips, and it costs more at both tiers they share. Reaching for it because the name says Pro costs more AND takes away reach. Everything else matches the base row. Route here only when a specific shot needs the fidelity and fits inside its narrower envelope.
|
|
24
|
+
|
|
25
|
+
### video edit
|
|
26
|
+
|
|
27
|
+
Seedance 2.5 Edit: VIDEO-TO-VIDEO EDIT via slates_edit_video, and the only edit engine that takes a clip longer than the other two reach — that length is the whole reason to route here. Inside their range, compare on fidelity instead: Omni Flash edit won the prompt-only head-to-head, and Kling edit is the one that takes reference images. Edits audio on the same row (re-voice, re-accent, translate with re-fitted lips, replace BGM). Costs about 1.2x a plain 2.5 generation of the same length: an edit bills at twice the reduced video-reference rate.
|
|
28
|
+
Kling O3 Video Edit: VIDEO-TO-VIDEO EDIT, the REF-DRIVEN one: it is the only edit seat that takes element/style reference images to lock subject identity, and its keepAudio preserves the original audio verbatim. Route here when an edit NEEDS reference images or bit-exact audio; for prompt-only footage-synced VFX, omni-flash-edit won the fidelity head-to-head. One instruction beat per pass — multi-beat prompts get under-executed.
|
|
29
|
+
Omni Flash Edit: VIDEO-TO-VIDEO EDIT, prompt-only — THE EDIT-FIDELITY WINNER (head-to-head vs Kling edit on real talking footage: lips held, audio near-identical, both action beats landed), priced level with Kling O3 Edit Standard. Footage-synced prop, effect, environment and lighting swaps. Takes NO reference images — identity swaps needing refs go to Kling edit. Fidelity is EARNED by prompt discipline; the exact form is in slates-prompting-omni-flash.
|
|
30
|
+
|
|
31
|
+
### audio generate
|
|
32
|
+
|
|
33
|
+
Seed Audio 1.0: DEFAULT audio model — the one-pass SCENE workhorse: dialogue, SFX and ambience together from ONE plain sentence. Route here for continuity beds, room tone, crowd and nature soundscapes, and quick scratch VO. AUDIO-ONLY. Takes one image XOR up to three audio clips as references, never both. Prompt form and the length rule are in slates-prompting-seed-audio.
|
|
34
|
+
ElevenLabs Sound Effects v2: ONE-SHOT SOUND EFFECT with an EXACT duration — route here for a single hit that must land on a frame (door slam, whoosh, impact, UI blip) or for a seamless loop. AUDIO-ONLY. For layered scenes with dialogue or room tone, seed-audio does it in one pass instead.
|
|
35
|
+
Inworld Realtime TTS-2: THE VOICE SEAT — one named voice saying one line, billed per CHARACTER not per second. Route here when WHO is speaking matters. NOT scene audio — that is seed-audio; a single effect is eleven-sfx.
|
|
@@ -30,5 +30,5 @@ pacing you are happy to leave to the model, timestamps when a beat has to land a
|
|
|
30
30
|
from 4-6 seconds in Video 1, and leave the rest of the content unchanged."* Without a range, a
|
|
31
31
|
whole-clip instruction is applied to the whole clip.
|
|
32
32
|
|
|
33
|
-
Do **not** carry this back to 2.0, and do not
|
|
34
|
-
either — 2.0 ignores time entirely, and the cross-model syntax swap is its own known failure.
|
|
33
|
+
Do **not** carry this back to 2.0, and do not write `[00:00-00:02]` minute-second brackets (another
|
|
34
|
+
vendor's syntax) into either — 2.0 ignores time entirely, and the cross-model syntax swap is its own known failure.
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
**
|
|
1
|
+
**Inspect a start frame before animating it.** Repair a visible defect that would make the intended crop or performance unusable before spending on motion. A clean frame can be animated whenever the brief calls for movement; this check does not require an image stage for text-to-video.
|
|
2
2
|
|
|
3
|
-
This is a
|
|
3
|
+
This is a cost rule as well as craft: a premium video call can cost many times an image correction. Broken geometry can turn to mush, oily textures can crawl and malformed objects can fall apart in motion. Fix a known source defect at the source instead of buying a more expensive copy. Judge intentional stylisation against the brief, not a universal photoreal standard. Additional image or video requests still follow the existing generation authorization.
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
**The thresholds, from the code that enforces them:**
|
|
8
8
|
|
|
9
9
|
- **Confirm gate:** above **17 credits** an op returns `requires_confirm` and will not
|
|
10
|
-
proceed until you re-call with `confirm: true`.
|
|
10
|
+
proceed until you re-call with `confirm: true`. This is a code gate, not permission to spend: every generation still needs the user-approved plan or quote.
|
|
11
11
|
- **Deviation pause:** the desktop Studio Agent stops and re-asks when projected generation spend
|
|
12
12
|
exceeds the approved plan by more than **20%**. You do not trigger this; the app does.
|
|
13
13
|
- **Seed Audio duration:** **3–120 seconds.** There is no duration
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: slates-blocking-to-prompt
|
|
3
|
-
description:
|
|
3
|
+
description: "Translate a rendered blocking clip into a video prompt that preserves its camera, cuts, timing and spatial relationships. Use for previs-guided generation or when output ignores the blocking."
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Blocking → prompt
|
|
@@ -27,7 +27,9 @@ Those two sentences do more work than any other part of the prompt.
|
|
|
27
27
|
slates_blender_scene
|
|
28
28
|
```
|
|
29
29
|
|
|
30
|
-
|
|
30
|
+
Read `cutSeconds` from the rendered scene, rather than using the shot list you intended to build. It resolves to markers on a multi-camera edit and camera keyframes otherwise. Preserve the exact frame boundaries in the blocking and edit record: at 24fps they can be `7.79s`, `9.33s` or `19.875s`.
|
|
31
|
+
|
|
32
|
+
Translate those measurements into the selected model's timing grammar. Seedance 2.5 accepts whole-second timestamps; use those for its prompt while the reference clip carries the exact cuts. Seedance 2.0 uses shot numbers instead. The fractional examples below describe the measured blocking; they are not a universal request syntax. If frame-exact output is a delivery requirement, inspect the result and finish the timing in the edit rather than promising the model reproduces every frame.
|
|
31
33
|
|
|
32
34
|
## Structure
|
|
33
35
|
|
|
@@ -66,11 +68,11 @@ HOLD FOR THE FULL TIMELINE
|
|
|
66
68
|
|
|
67
69
|
The single highest-leverage format in this whole workflow. Each reference is a **positive claim plus an exclusion list**, because a reference the model over-reads is as damaging as one it ignores.
|
|
68
70
|
|
|
69
|
-
Label each by the badge code Slates echoes back (`IMG-A8`, `VID-
|
|
71
|
+
Label each by the badge code Slates echoes back (`IMG-A8`, `VID-V2`) or by an unmistakable role name, and use that same label everywhere below.
|
|
70
72
|
|
|
71
73
|
**The blocking clip:**
|
|
72
74
|
|
|
73
|
-
> VID-
|
|
75
|
+
> VID-V2 = the blocking previz (30s, 720 frames, 24fps), the MASTER for everything that moves and everything that stands. It defines the full edit one-to-one: every cut point, every camera position, angle, move and framing, all action timing, screen direction, and the geometry of the world. Its untextured grey surfaces, flat colours and viewport grid are NOT inherited; every grey proxy is dressed into a real object in the exact position the previz puts it. Proxies give position, angle, scale and motion only; never surface, shape detail or design.
|
|
74
76
|
|
|
75
77
|
That last sentence is the **placement-only clause** and it is not optional. Without it the model renders grey boxes.
|
|
76
78
|
|
|
@@ -80,11 +82,11 @@ That last sentence is the **placement-only clause** and it is not optional. With
|
|
|
80
82
|
|
|
81
83
|
**A location/style reference:**
|
|
82
84
|
|
|
83
|
-
> IMG-
|
|
85
|
+
> IMG-A3 = the tunnel, defines location geometry, look and grade. Camera angle, framing and any people in it are NOT inherited; the camera comes exclusively from VID-V2.
|
|
84
86
|
|
|
85
87
|
**An atmosphere or style master — a reference that is never a shot:**
|
|
86
88
|
|
|
87
|
-
> IMG-
|
|
89
|
+
> IMG-A9 = ATMOSPHERE MASTER, NOT a keyframe, NOT a location to reproduce, NOT a frame that ever appears in the film: its own subject, framing and composition are never seen in any shot. It defines ONLY the weather, light, colour and grade: deep clean night just after rain, wet asphalt as a dark mirror, cool white-cyan lamps as the ambient key, teal-and-amber grade, deep clean blacks. Every shot is lit and graded in this regime for all 30 seconds.
|
|
88
90
|
|
|
89
91
|
Without those three NOTs the model reproduces the reference's composition as an actual shot — you get its street corner in your film. The same wording covers a rendering-style master; see `slates-restyle-from-blocking`.
|
|
90
92
|
|
|
@@ -161,7 +163,7 @@ One block per shot or beat. Two notations; pick one and hold it.
|
|
|
161
163
|
**For a continuous take**, ranges with a camera note and a closing state audit:
|
|
162
164
|
|
|
163
165
|
```
|
|
164
|
-
8-12s
|
|
166
|
+
8-12s: THE SWEEP (per VID-V2: elevated rear push, swinging to profile by 12s):
|
|
165
167
|
<what happens, in prose, with sub-beats on tenths and → chaining cause to effect>
|
|
166
168
|
END 12s: bodies 1 (behind him as he steps past) · standing — four ahead, holding.
|
|
167
169
|
```
|
|
@@ -169,7 +171,7 @@ END 12s: bodies 1 (behind him as he steps past) · standing — four ahead, hold
|
|
|
169
171
|
**For a cut edit**, numbered shots ending on their cut:
|
|
170
172
|
|
|
171
173
|
```
|
|
172
|
-
9.33-10.33s
|
|
174
|
+
9.33-10.33s: SHOT 10, Interior over the centre console as in VID-V2: <what the
|
|
173
175
|
frame contains>. Hard cut at 10.33s.
|
|
174
176
|
```
|
|
175
177
|
|
|
@@ -177,7 +179,7 @@ Three habits that separate a beat that works from one that does not:
|
|
|
177
179
|
|
|
178
180
|
- **Declare the frame's contents as a closed set** when the shot is tight: *the frame holds exactly the console, the lever, his hand, and the edges of both seats.* An open description invites additions.
|
|
179
181
|
- **Chain cause to effect inside one sentence** with `→`. `he overcommits a lunge → the Hero drops low and sweeps his standing leg → he hits the earth at 12s`.
|
|
180
|
-
- **
|
|
182
|
+
- **Pin every event to a moment**, in the finest unit the selected model accepts: whole seconds on Seedance 2.5 (`12s`, `19s`), shot numbers on 2.0. Vague beats generate vague timing. The production prompts behind this guide carried tenths (`11.7s`, `19.5s`, `22.5s`); whether 2.5 acts on the fraction is untested, and ByteDance documents integers only.
|
|
181
183
|
|
|
182
184
|
Density: roughly 60–130 words per second of screen time is what these prompts actually run at. That is much denser than a normal video prompt, and it is the point.
|
|
183
185
|
|
|
@@ -205,7 +207,7 @@ Two rules that stop dialogue from breaking the edit:
|
|
|
205
207
|
|
|
206
208
|
> A line marked off-screen must STAY off-screen — never show the speaker, never move him into frame, never route the camera to him because he spoke.
|
|
207
209
|
|
|
208
|
-
Model note: dialogue direction as separate layers is minimax-h3's seat
|
|
210
|
+
Model note: dialogue direction as separate layers is minimax-h3's seat. Route per `slates-model-selection` and read the model's own prompting skill before writing the audio block.
|
|
209
211
|
|
|
210
212
|
## ENDING LOCK
|
|
211
213
|
|
|
@@ -219,17 +221,17 @@ Close with a terminal re-assertion of only the constraints most prone to drift
|
|
|
219
221
|
|
|
220
222
|
```
|
|
221
223
|
HOLD FOR THE FULL TIMELINE
|
|
222
|
-
- VID-
|
|
224
|
+
- VID-V2 camera path 1:1; any deviation = failure.
|
|
223
225
|
- Six and only six figures; the count above holds at every second.
|
|
224
226
|
- IMG-A8 identity constant at every distance and through motion blur.
|
|
225
|
-
- The IMG-
|
|
227
|
+
- The IMG-A3 location in every frame; no subtitles, no watermarks.
|
|
226
228
|
```
|
|
227
229
|
|
|
228
230
|
Restating is not redundancy here. It is the last thing the model reads.
|
|
229
231
|
|
|
230
232
|
## Checklist before you generate
|
|
231
233
|
|
|
232
|
-
- [ ]
|
|
234
|
+
- [ ] Frame-exact timings retained from `slates_blender_scene`'s `cutSeconds`; model-facing timing translated to the selected guide's syntax
|
|
233
235
|
- [ ] Every reference has an explicit "NOT inherited"
|
|
234
236
|
- [ ] The placement-only clause is present
|
|
235
237
|
- [ ] The tie-break clause is present
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: slates-camera-language
|
|
3
|
-
description:
|
|
3
|
+
description: "Build or refine Blender camera rigs for a previs pass: orbits, floor rises, whip-and-lock moves, handheld, speed ramps and shot transitions. Use when the intended camera path needs deterministic control."
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Camera language — from a shot list to a rig
|
|
@@ -71,6 +71,33 @@ curve.keyframe_insert("eval_time", frame=96)
|
|
|
71
71
|
|
|
72
72
|
**Why a path and not raw location keys:** the user can drag a control point to retime or reshape the move without you regenerating anything. That is the difference between "re-prompt and hope" and "nudge it."
|
|
73
73
|
|
|
74
|
+
<!-- @inject:blender-action-curves -->
|
|
75
|
+
## Read animation curves from the active action layout
|
|
76
|
+
|
|
77
|
+
Blender 5 uses layered actions: curves belong to the channelbag for `animation_data.action_slot`, inside each layer's strips. A direct `action.fcurves` lookup failed on Blender 5.2.1 in the 2026-08-28 blocking run. Feature-detect the layout before changing interpolation or noise; an unanimated object can legitimately have no curves.
|
|
78
|
+
|
|
79
|
+
The snippets below use this small Blender-side iterator. It runs inside Blender; no add-on code is imported into the MCP package.
|
|
80
|
+
|
|
81
|
+
```python
|
|
82
|
+
def action_curves(datablock):
|
|
83
|
+
anim = getattr(datablock, "animation_data", None)
|
|
84
|
+
action = getattr(anim, "action", None)
|
|
85
|
+
if action is None:
|
|
86
|
+
return
|
|
87
|
+
if hasattr(action, "fcurves"):
|
|
88
|
+
yield from action.fcurves
|
|
89
|
+
elif getattr(anim, "action_slot", None) is not None:
|
|
90
|
+
for layer in action.layers:
|
|
91
|
+
for strip in layer.strips:
|
|
92
|
+
if hasattr(strip, "channelbag"):
|
|
93
|
+
bag = strip.channelbag(anim.action_slot)
|
|
94
|
+
if bag is not None:
|
|
95
|
+
yield from bag.fcurves
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
Use the datablock that owns the keyed property: the curve data for `eval_time`, the object for location and rotation, the camera data for lens. Confirm a named channel exists before assuming a keyframe operation created it.
|
|
99
|
+
<!-- @end:blender-action-curves -->
|
|
100
|
+
|
|
74
101
|
## Speed — the part that reads as production value
|
|
75
102
|
|
|
76
103
|
Movement at one constant speed is the tell of a machine. Real moves accelerate, hold, and snap.
|
|
@@ -82,7 +109,11 @@ Speed lives in the **f-curve handles** of `eval_time` (or of location, if you ke
|
|
|
82
109
|
- `interpolation = 'CONSTANT'` → no movement at all until the next key. This is how you get an absolute dead stop.
|
|
83
110
|
|
|
84
111
|
```python
|
|
85
|
-
|
|
112
|
+
# Add the middle key to the two-key path example above.
|
|
113
|
+
curve.eval_time = 48
|
|
114
|
+
curve.keyframe_insert("eval_time", frame=48)
|
|
115
|
+
fc = next((f for f in action_curves(curve) if f.data_path == "eval_time"), None)
|
|
116
|
+
assert fc is not None, "Key eval_time before shaping its motion"
|
|
86
117
|
for kp in fc.keyframe_points:
|
|
87
118
|
kp.interpolation = 'BEZIER'
|
|
88
119
|
kp.handle_left_type = kp.handle_right_type = 'FREE'
|
|
@@ -122,12 +153,18 @@ Rotation during a rise destroys the effect. Leave it out.
|
|
|
122
153
|
|
|
123
154
|
The whip-and-lock commercial move: a fast flight along a curved arc, an **absolute** dead stop at a completely different angle, repeat. Each relocation is roughly a third of a second; each stop is a distinct, readable frame.
|
|
124
155
|
|
|
125
|
-
Build it as a path with a control point per stop,
|
|
156
|
+
Build it as a path with a control point per stop. On a fresh path action, key both ends of each hold and leave the flight between holds animated. At 24 fps, these eight-frame flights last a third of a second:
|
|
126
157
|
|
|
127
158
|
```python
|
|
128
|
-
|
|
159
|
+
for frame, progress in [(1, 0), (11, 0), (19, 32), (29, 32), (37, 64), (47, 64)]:
|
|
160
|
+
curve.eval_time = progress
|
|
161
|
+
curve.keyframe_insert("eval_time", frame=frame)
|
|
162
|
+
fc = next(f for f in action_curves(curve) if f.data_path == "eval_time")
|
|
163
|
+
assert [int(k.co[0]) for k in fc.keyframe_points] == [1, 11, 19, 29, 37, 47]
|
|
164
|
+
HOLD_START_FRAMES = {1, 19, 37}
|
|
129
165
|
for kp in fc.keyframe_points:
|
|
130
|
-
kp.interpolation = 'CONSTANT'
|
|
166
|
+
kp.interpolation = 'CONSTANT' if int(kp.co[0]) in HOLD_START_FRAMES else 'BEZIER'
|
|
167
|
+
kp.handle_left_type = kp.handle_right_type = 'AUTO_CLAMPED'
|
|
131
168
|
```
|
|
132
169
|
|
|
133
170
|
Keep the target separate and slightly offset per stop, so each lock-off is a different composition of the same subject rather than six centred portraits.
|
|
@@ -139,7 +176,8 @@ Applied **last**, on top of a finished move. Slow organic sway, not jitter: long
|
|
|
139
176
|
```python
|
|
140
177
|
for path in ("location", "rotation_euler"):
|
|
141
178
|
for i in range(3):
|
|
142
|
-
fc =
|
|
179
|
+
fc = next((f for f in action_curves(cam)
|
|
180
|
+
if f.data_path == path and f.array_index == i), None)
|
|
143
181
|
if fc is None:
|
|
144
182
|
continue
|
|
145
183
|
n = fc.modifiers.new('NOISE')
|
|
@@ -148,7 +186,7 @@ for path in ("location", "rotation_euler"):
|
|
|
148
186
|
n.phase = i * 7.3 # decorrelate the axes or it reads as a slide
|
|
149
187
|
```
|
|
150
188
|
|
|
151
|
-
**
|
|
189
|
+
**For a restrained handheld register, avoid fast jitter, wobble or snap corrections.** Those motions can serve a deliberately frantic or phone-camera brief; choose them intentionally rather than adding them as a generic cinematic finish.
|
|
152
190
|
|
|
153
191
|
### Over-the-shoulder cuts
|
|
154
192
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: slates-character-identity
|
|
3
|
-
description:
|
|
3
|
+
description: "Prepare and bind a reusable character identity sheet from an image or description. Use when creating cast or preserving the same character across shots."
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Character identity sheet — Slates workflow
|
|
@@ -33,7 +33,7 @@ Slates generates **one identity sheet per character**, bound as the character's
|
|
|
33
33
|
|
|
34
34
|
The rule is **kill every competing rendering of the FACE, not every head** — which is why exactly one body panel is headless.
|
|
35
35
|
|
|
36
|
-
On a deep neutral-grey plate (hex `3a3a3c`,
|
|
36
|
+
On a deep neutral-grey plate (hex `3a3a3c`, written bare; since the composer fix `#3a3a3c` reads the same — see the resolved composer hazard in Don'ts), flat and shadowless, with catchlights in the eyes, irises never crushed to black, surface texture at the medium's own natural level of detail, broken symmetry, and no over-clean 3D-game-model look. Expression is **a slight natural smile with the teeth just visible** — a closed mouth carries no dental information, so every downstream smiling shot invents teeth, and teeth are person-specific.
|
|
37
37
|
|
|
38
38
|
**Two carve-outs, scoped differently on purpose.** Non-human characters get a natural neutral expression instead of a smile — that one is scoped by *having a human mouth*, so a bipedal robot or humanoid alien is covered. Quadrupeds and non-bipedal characters get a natural standing stance with the head shown on both body panels — that one is *anatomical*. **Both are conditionals the image model evaluates against your reference; neither is a code branch, because the op has no character-kind input.**
|
|
39
39
|
|
|
@@ -68,6 +68,7 @@ If text only: generate from prompt-only — less consistent, so warn the user.
|
|
|
68
68
|
- Estimate cost first with `slates_estimate_generation_cost` and announce in **credits** — never quote a price from memory.
|
|
69
69
|
<!-- /slates-only -->
|
|
70
70
|
|
|
71
|
+
<!-- slates-only -->
|
|
71
72
|
<!-- @inject:sheet-tool-defaults -->
|
|
72
73
|
**What the sheet tools render on** (you do not pick these; omit `model`):
|
|
73
74
|
|
|
@@ -76,6 +77,7 @@ If text only: generate from prompt-only — less consistent, so warn the user.
|
|
|
76
77
|
|
|
77
78
|
Price a sheet for that model at 16:9, with resolution and quality left at their defaults. **Never 4K** — no identity gain at sheet scale, wasted spend.
|
|
78
79
|
<!-- @end:sheet-tool-defaults -->
|
|
80
|
+
<!-- /slates-only -->
|
|
79
81
|
|
|
80
82
|
- When the result returns inline, **evaluate it before binding**:
|
|
81
83
|
- Is the portrait clearly the largest panel, and is it off-frontal?
|
|
@@ -102,12 +104,12 @@ Critically, the app injects **no** wardrobe, expression, or lighting directive.
|
|
|
102
104
|
## Anti-patterns
|
|
103
105
|
|
|
104
106
|
- **Don't** studio-light, white-background, or black-background the sheet. White bleeds into the video and washes out the location; black eats edge detail. Flat, even, shadowless light on a deep neutral grey.
|
|
105
|
-
- **Don't** hand-write the sheet prompt when the op will build it — that is how the template and the shipped prompt fork
|
|
107
|
+
<!-- slates-only -->- **Don't** hand-write the sheet prompt when the op will build it — that is how the template and the shipped prompt fork.<!-- /slates-only -->
|
|
106
108
|
- **Don't** create a second character image. One canonical identity is what the storyboard pipeline reads.
|
|
107
|
-
- **Don't** skip binding. An unbound asset doesn't help downstream
|
|
109
|
+
<!-- slates-only -->- **Don't** skip binding. An unbound asset doesn't help downstream.<!-- /slates-only -->
|
|
108
110
|
- **Don't** invent character details. Stick to what's in the reference image and the user's description.
|
|
109
111
|
- **Don't** describe the front panel's crop as an absent head — in `userNotes` or any hand-written variant. The template asks for it as *framing*: **"cropped at the collarbone, an invisible-mannequin presentation with just the face cropped out"**, a standard e-commerce genre with deep training data. **"the head not shown" is a hard 422 on GPT Image** (measured on `gpt-image-2`, the model 2.5 replaced; the classifier is OpenAI's, not the version's, so the rule carries — but nobody has re-run it on Flare or Sunburst) — fal returns `content_policy_violation` with `loc: ["body","prompt"]`, so the text is rejected before any image is read, because an anatomical absence reads as gore to OpenAI's classifier. It passed NB2, which is why the original receipt looked safe: **it was model-scoped.** State an exclusion as a framing choice, never as a missing body part.
|
|
110
112
|
- **Don't** invoke the invisible-mannequin genre without bounding it to the face. **"an invisible-mannequin presentation where the clothing holds its own shape" removed all the skin** — no neck, no hands, no forearms, a garment floating on nothing — because that *is* the e-commerce genre in full: an empty outfit. **"with just the face cropped out"** keeps the anchor and bounds it. Generalises: a genre anchor imports the whole genre, so name what STAYS, not only what goes.
|
|
111
|
-
|
|
113
|
+
**Resolved composer hazard:** on 2026-07-30, `#3a3a3c` reached fal as `background ()` because unresolved sigils were deleted. The composer now preserves unresolved `#` and `@` text byte-for-byte; a token binds a reference only when it resolves. Literal hex colours and handles are safe. The sheet template keeps its bare hex as a wording choice, not a workaround.
|
|
112
114
|
- **Don't** use 4K — wastes credits, no quality gain at sheet scale.
|
|
113
|
-
- **Don't** feed a multi-view sheet into a Seedance shot that has **several characters in frame** without binding each character to its image and appending the anti-twin constraint
|
|
115
|
+
- **Don't** feed a multi-view sheet into a Seedance 2.0 shot that has **several characters in frame** without binding each character to its image and appending the anti-twin constraint; ByteDance documents multi-view assets as a cause of duplicate characters on 2.0. See `slates-prompting-seedance`. Seedance 2.5 supports multi-view subject references; see `slates-prompting-seedance-2-5`.
|
|
@@ -1,10 +1,16 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: slates-chatgpt-images
|
|
3
|
-
description: Generate images
|
|
3
|
+
description: "Generate and save images through a connected ChatGPT account or the host image tool, preserving Slates prompts, references and project context. Use when ChatGPT generation is requested."
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# ChatGPT images in Slates
|
|
7
7
|
|
|
8
|
+
## Prerequisites
|
|
9
|
+
|
|
10
|
+
Saving into a Slates project requires the Slates desktop app open and a connected Slates MCP server or CLI. Follow the [connection guide](https://slates.video/docs/connect-claude); CLI onboarding is `npx -y @slatesvideo/cli setup`. The host image tool alone does not expose Slates project tools. If the required tools or desktop connection are unavailable, report the missing connection and retain the prompt and references; do not invent operations.
|
|
11
|
+
|
|
12
|
+
The connected generation path also needs the optional ChatGPT images add-on enabled and authenticated as described below. A host-tool path needs an actual image generator exposed by the host. These are distinct capabilities; a paid account alone establishes neither.
|
|
13
|
+
|
|
8
14
|
Resolve the project with `slates_list_projects` and references with
|
|
9
15
|
`slates_get_selection` or `slates_list_assets`. Badge codes are project-specific.
|
|
10
16
|
Inspect the selected images before generating. Keep the ordered reference IDs
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: slates-cinematic-look
|
|
3
|
-
description:
|
|
3
|
+
description: "Choose lighting, exposure, grade, lens, atmosphere and imperfection techniques for a filmed look. Use for photographic direction or an image that looks too clean, evenly exposed or studio-lit."
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Cinematic look — make a generated frame read as filmed
|
|
@@ -1,18 +1,16 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: slates-content-policy
|
|
3
|
-
description:
|
|
3
|
+
description: "Check provider-sensitive content before prompting a brief with conflict, creatures, crowds, violence, destruction, weapons, real likenesses or young characters. Use its scoped refusal receipts and scene alternatives alongside the selected model guide."
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Content-policy-safe construction — read before any risk-surface prompt
|
|
7
7
|
|
|
8
8
|
<!-- @banned:start -->
|
|
9
9
|
<!-- slates-only -->
|
|
10
|
-
<!--
|
|
11
|
-
|
|
12
|
-
estimate, and every submitted prompt is matched against it. Keep entries
|
|
13
|
-
backticked and prose outside the backticks. -->
|
|
10
|
+
<!-- Content-policy guidance. Read this list alongside the selected model's
|
|
11
|
+
own prompting guide. -->
|
|
14
12
|
<!-- /slates-only -->
|
|
15
|
-
**Never use
|
|
13
|
+
**Never use**: each one is a filter tripwire with a substitution in the table below:
|
|
16
14
|
- `civilians in panic`, `crowds fleeing`, `blood`, `gore`, `corpse`
|
|
17
15
|
- `ignite`, `catch fire`, `on fire` applied to a person — frame body-contact effects as magical or harmless VFX
|
|
18
16
|
- `candle-like`, `flame-like` and any real object used as a metaphor for an effect
|