@slatesvideo/shared 0.7.2 → 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.
Files changed (84) hide show
  1. package/dist/clients/cloud.d.ts +4 -0
  2. package/dist/clients/cloud.js +11 -3
  3. package/dist/index.d.ts +1 -0
  4. package/dist/index.js +1 -0
  5. package/dist/manual/content.d.ts +1 -1
  6. package/dist/manual/content.js +1 -1
  7. package/dist/operations/index.d.ts +12 -13
  8. package/dist/operations/index.js +158 -133
  9. package/dist/operations/surface.d.ts +6 -2
  10. package/dist/operations/surface.js +29 -5
  11. package/dist/prompts/agent-doctrine.d.ts +4 -4
  12. package/dist/prompts/agent-doctrine.js +17 -28
  13. package/dist/prompts/guide-discovery.d.ts +23 -0
  14. package/dist/prompts/guide-discovery.js +39 -0
  15. package/dist/prompts/guide-retrieval.js +1 -1
  16. package/dist/prompts/model-capabilities.d.ts +8 -9
  17. package/dist/prompts/model-capabilities.js +11 -51
  18. package/dist/prompts/model-facts.d.ts +2 -2
  19. package/dist/prompts/model-facts.js +15 -26
  20. package/dist/prompts/partials.generated.js +6 -3
  21. package/dist/prompts/prompting-tips.d.ts +1 -1
  22. package/dist/prompts/prompting-tips.js +21 -63
  23. package/dist/prompts/search-terms.d.ts +3 -0
  24. package/dist/prompts/search-terms.js +24 -0
  25. package/dist/skills/content.js +36 -37
  26. package/dist/skills/metadata.d.ts +7 -0
  27. package/dist/skills/metadata.js +29 -0
  28. package/exports/slates-chatgpt-images/generated/SKILL.md +7 -1
  29. package/exports/slates-chatgpt-images/generated/slates-chatgpt-images.skill +0 -0
  30. package/exports/slates-prompt-builder/generated/SKILL.md +28 -16
  31. package/exports/slates-prompt-builder/generated/reference-character.md +12 -13
  32. package/exports/slates-prompt-builder/generated/reference-content-policy.md +2 -2
  33. package/exports/slates-prompt-builder/generated/reference-gpt-image-2-5.md +191 -0
  34. package/exports/slates-prompt-builder/generated/reference-kling.md +32 -11
  35. package/exports/slates-prompt-builder/generated/reference-nano-banana.md +24 -6
  36. package/exports/slates-prompt-builder/generated/reference-omni-flash.md +65 -0
  37. package/exports/slates-prompt-builder/generated/reference-seedance-2-5.md +362 -0
  38. package/exports/slates-prompt-builder/generated/reference-seedance.md +34 -4
  39. package/exports/slates-prompt-builder/generated/slates-prompt-builder-manifest.json +77 -23
  40. package/exports/slates-prompt-builder/generated/slates-prompt-builder.skill +0 -0
  41. package/package.json +2 -1
  42. package/skills/_partials/blender-action-curves.md +24 -0
  43. package/skills/_partials/iteration-diagnosis.md +5 -0
  44. package/skills/_partials/model-routing.md +35 -0
  45. package/skills/_partials/seedance-25-timestamps.md +2 -2
  46. package/skills/_partials/still-gate.md +2 -2
  47. package/skills/_partials/thresholds.md +1 -1
  48. package/skills/slates-blocking-to-prompt.md +15 -13
  49. package/skills/slates-camera-language.md +45 -7
  50. package/skills/slates-character-identity.md +8 -6
  51. package/skills/slates-chatgpt-images.md +7 -1
  52. package/skills/slates-cinematic-look.md +1 -1
  53. package/skills/slates-content-policy.md +4 -6
  54. package/skills/slates-cost-discipline.md +18 -12
  55. package/skills/slates-dialogue-blocking.md +6 -6
  56. package/skills/slates-direct-response-ad.md +1 -1
  57. package/skills/slates-edit-and-iterate.md +12 -4
  58. package/skills/slates-model-selection.md +82 -90
  59. package/skills/slates-one-prompt-film.md +1 -1
  60. package/skills/slates-previs-blocking.md +44 -13
  61. package/skills/slates-project-organization.md +2 -2
  62. package/skills/slates-prompting-elevenlabs.md +4 -4
  63. package/skills/slates-prompting-flux-2-max.md +2 -3
  64. package/skills/slates-prompting-gpt-image-2-5.md +2 -2
  65. package/skills/slates-prompting-inworld-tts.md +174 -174
  66. package/skills/slates-prompting-kling-v3.md +11 -9
  67. package/skills/slates-prompting-lip-sync.md +15 -15
  68. package/skills/slates-prompting-ltx-2-5.md +5 -6
  69. package/skills/slates-prompting-minimax-h3.md +11 -11
  70. package/skills/slates-prompting-motion-transfer.md +8 -8
  71. package/skills/slates-prompting-nano-banana-2.md +8 -4
  72. package/skills/slates-prompting-omni-flash.md +9 -9
  73. package/skills/slates-prompting-seed-audio.md +24 -4
  74. package/skills/slates-prompting-seedance-2-5.md +40 -30
  75. package/skills/slates-prompting-seedance.md +4 -4
  76. package/skills/slates-prompting-seedream-5-lite.md +6 -6
  77. package/skills/slates-restyle-from-blocking.md +2 -2
  78. package/skills/slates-script-craft.md +1 -1
  79. package/skills/slates-shot-variety.md +1 -1
  80. package/skills/slates-storyboard-from-script.md +1 -1
  81. package/skills/slates-style-prompting.md +56 -54
  82. package/skills/slates-ugc-influencer-ad.md +1 -1
  83. package/skills/slates-vision-feedback-loop.md +118 -110
  84. 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": "d7510c28be9453ab1bb1be062ff04a79a75ede5150ac4564a978d4a80d6315c5"
7
+ "sha256": "ec5a8002eec5438f092f9f4df5e60cbcbfbea73238a4b5ce89e2cbcc26665afe"
8
8
  },
9
9
  {
10
10
  "path": "skills/slates-character-identity.md",
11
- "sha256": "0f8d2a51ad2b8f1504d5e554384a97ad28e27603c1404dc27d234c73680e8b57"
11
+ "sha256": "144beb0c551201b9ba55aa6ed441928d6494860c1c0ee2eacfe5681c179421f0"
12
12
  },
13
13
  {
14
- "path": "skills/slates-prompting-seedance.md",
15
- "sha256": "426bd046a9ce8f2f0e466772e6f032d65ea773bbb96729e2161ac61c0d040135"
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": "ca609eddaa82fbccf103e9fdf91f2c68f4c28e3d9aa8d1e073b9fc6c8d0fe0bd"
23
+ "sha256": "e247bf2ba2999a57ee2255cd31c197d1391c0b24acef0508e948bce7bad1650c"
20
24
  },
21
25
  {
22
26
  "path": "skills/slates-prompting-nano-banana-2.md",
23
- "sha256": "1295e2be027cab84f0d96fd86d9cbcd6606e67c0537272ec916a8ed7c582ce3d"
27
+ "sha256": "1912a693c668a14f03acc039abe497c3920906aa1bf14d52e3e40d61037464d2"
24
28
  },
25
29
  {
26
- "path": "skills/slates-content-policy.md",
27
- "sha256": "68566e6431864f075f6397013f040fb41e0559b19b11a15e860a4da80068a9a6"
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": "92f42aa5befd60cc7f2aa058fcd50c720278008b4665a2bb14a6c7892db280a3"
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": 4630,
38
- "sha256": "416dce585f5ff042f4f83107ac907b0b10d77db171e34e4c5d3c6dfc51e50d75"
73
+ "bytes": 9157,
74
+ "sha256": "c8946925df07e853a446d84b18df65c5bb82ea2f14ca269bf1f8fd42de183166"
39
75
  },
40
76
  {
41
77
  "path": "reference-character.md",
42
- "bytes": 10639,
43
- "sha256": "cdf991fd220d5bf0240ae21f15acb238d8970c89a27c5e5434f034160732752d"
78
+ "bytes": 12614,
79
+ "sha256": "09bc878dd5618ceaa954019b676dea79357ae2e8dcda3a611d4381380cbfa0e4"
44
80
  },
45
81
  {
46
82
  "path": "reference-seedance.md",
47
- "bytes": 35163,
48
- "sha256": "46a4d6ae707bf5dffe622d62dbcc385dd29e9d2ffb3e270b5f91db5fecd5940e"
83
+ "bytes": 37635,
84
+ "sha256": "910cb83f446f0264c4b3a1bc0fe545aecfc1057394ab2a5870cd6f2eac6491b8"
49
85
  },
50
86
  {
51
87
  "path": "reference-kling.md",
52
- "bytes": 16192,
53
- "sha256": "964ca2bc79d4e1b5fb0902293780c9cb7e46a0b3fc7cbfc6e1998fa04661e768"
88
+ "bytes": 17639,
89
+ "sha256": "6fbea11e3dc2e0e592e426a07e533e43baebe1eb949c6230848e72dfbb8d59df"
54
90
  },
55
91
  {
56
92
  "path": "reference-nano-banana.md",
57
- "bytes": 19415,
58
- "sha256": "2146e05141da197be429ff50cbf6b16bd31fe081cfb74a3a73ca12e450277447"
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": 7169,
63
- "sha256": "26439b2948313ee9eed10cbbe9e3ede60d53a453c41af96c3928840b0a4f6212"
113
+ "bytes": 7194,
114
+ "sha256": "66bb27b46e10696c42fad1660f8e6a37d2b54c14b4901297fc244efa6a3e6d3a"
64
115
  }
65
116
  ],
66
117
  "archive": {
67
118
  "path": "slates-prompt-builder.skill",
68
- "bytes": 41393,
69
- "sha256": "0d9310955ad7e869d1caf195edafc20802944d238fa2350a832290400985b174",
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
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@slatesvideo/shared",
3
- "version": "0.7.2",
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.
@@ -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 carry Veo's `[00:00-00:02]` bracket syntax into
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
- **A visible defect in the still is already a STOP.** Do not animate it. Fix the frame first, then move to motion — and go to motion only when the crop passes the still scan and you genuinely need movement to confirm an uncertain edge, reflection, or object.
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 **cost** rule as much as a craft rule: a 1080p/10s premium video generation costs many multiples of an image re-roll, and video is where a defect stops being fixable. Anything wrong in the still gets worse in motion — soft geometry mushes, broken-but-plausible objects fall apart, oily textures start crawling. **Animating a known-bad frame is the single most expensive mistake in the pipeline.** Re-rolling the image is the cheap move; re-rolling the video is not.
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`. Below it, announce the cost once and go.
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: Write the generation prompt that matches a blocking clip second by second, so the reference video and the text agree instead of fighting. Use after rendering a previs blocking pass, when a generated shot ignores the reference video, when timings drift, or when the model invents shots and camera angles that are not in the blocking.
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
- Write timings from `cutSeconds`, never from the shot list you intended to build. It resolves to the marker frames on a multi-camera edit and to the camera's own keyframes otherwise, so it is the one field that is never empty on a rig that has cuts. At 24fps cuts land on frame boundaries and the honest values are not round — `7.79s`, `9.33s`, `19.875s`. **Use the exact ones.** Rounding to `7.8` is a tenth of drift you are handing the model for free.
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-C2`) or by an unmistakable role name, and use that same label everywhere below.
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-C2 = 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.
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-B3 = 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-C2.
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-D9 = 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.
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 — THE SWEEP (per VID-C2: elevated rear push, swinging to profile by 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 — SHOT 10 — Interior over the centre console as in VID-C2: <what the
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
- - **Put events on tenths.** `11.7s`, `19.5s`, `22.5s`. Vague beats generate vague timing.
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; native synced audio is Veo's. Route per `slates-model-selection` and read the model's own prompting skill before writing the audio block.
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-C2 camera path 1:1 — any deviation = failure.
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-B3 location in every frame; no subtitles, no watermarks.
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
- - [ ] Timings taken from `slates_blender_scene`'s `cutSeconds`, frame-exact, not rounded
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: Turn director vocabulary into real Blender camera rigs — orbits, floor rises, robo-arm whips, handheld, speed ramps, over-the-shoulder cuts — as bpy code. Use when building or refining the camera on a previs blocking pass, when a move needs to accelerate/hold/snap, or when someone asks for a "cinematic" camera and you need to convert that into an actual shot list.
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
- fc = curve.animation_data.action.fcurves.find("eval_time")
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, then make the stops real:
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
- HOLD_FRAMES = 10
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' # hold dead still between flights
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 = cam.animation_data.action.fcurves.find(path, index=i)
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
- **Never fast jitter, wobble or snap corrections.** Wrong-flavour handheld is more damaging than none.
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: Build a Slates character from a reference image — generate one identity sheet and bind it to the character so the card updates live. Use when the user wants to create a character, build a character from an image, or starts a storyboard flow that needs consistent character references.
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`, emitted without the `#` — see the sigil warning 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.
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
- - **Don't** put `#` or `@` anywhere in prompt text. Both are reference-token sigils in the desktop prompt composer and an unresolved one is **silently deleted** — no error, no log, just missing words. `#3a3a3c` reached fal as `background ()` on a real 2026-07-30 request, meaning the plate value had never been delivered to any model since the composer shipped. Write hex values bare.
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 — ByteDance documents multi-view assets as a cause of duplicate characters. See `slates-prompting-seedance`.
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 using a connected ChatGPT account or the desktop host's built-in image tool, preserving Slates project context, exact prompts and reference lineage. Use when the user requests ChatGPT generation rather than Slates credits.
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: Use when a frame should look filmed, not generated (light, exposure, grade, lens, atmosphere, imperfection), or when an image came back too clean or studio-lit. The organized technique catalogue for every image model, and the rule for picking only what the shot needs.
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: Read before writing any prompt involving conflict, creatures, crowds, destruction, weapons, or young characters. Builds the scene safe from the first word, so it hits full cinematic impact without depicting prohibited content — and without being silently rejected or degraded by the model's filter. Mirror of @slatesvideo/shared/prompts content-policy fragment — SSOT: second-brain business/projects/slates/product/prompting-ssot.md.
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
- <!-- MACHINE-READ. Every `backticked` token between the @banned markers is
11
- extracted by src/prompts/banned-tokens.ts and returned on this model's cost
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** — each one is a filter tripwire with a substitution in the table above:
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