@cliangdev/conductor 0.26.0 → 0.27.1
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/assets/claude/agents/conductor-coder.md +25 -0
- package/assets/claude/agents/conductor-content-art-director.md +68 -0
- package/assets/claude/agents/conductor-content-creative-director.md +56 -0
- package/assets/claude/agents/conductor-content-ideator.md +49 -0
- package/assets/claude/agents/conductor-content-scriptwriter.md +42 -0
- package/assets/claude/agents/conductor-content-strategist.md +47 -0
- package/assets/claude/commands/conductor/content.md +64 -0
- package/assets/claude/commands/conductor/creative.md +8 -0
- package/assets/claude/commands/conductor/implement.md +1 -1
- package/assets/claude/skills/conductor-content-studio/SKILL.md +323 -0
- package/assets/claude/skills/conductor-content-studio/references/capabilities.md +61 -0
- package/assets/claude/skills/conductor-content-studio/references/compliance-checklist.md +120 -0
- package/assets/claude/skills/conductor-content-studio/references/idea-template.md +54 -0
- package/assets/claude/skills/conductor-content-studio/references/platform-specs.md +59 -0
- package/assets/claude/skills/conductor-content-studio/references/publish-pack-template.md +121 -0
- package/assets/claude/skills/conductor-content-studio/references/rubric.md +99 -0
- package/assets/claude/skills/conductor-content-studio/references/script-template.md +53 -0
- package/assets/claude/skills/conductor-content-studio/references/shotlist-template.md +44 -0
- package/assets/claude/skills/conductor-creative/SKILL.md +4 -0
- package/assets/claude/skills/conductor-publisher/SKILL.md +26 -2
- package/assets/cli-manifest.json +32 -0
- package/dist/creative/assertions.js +57 -7
- package/dist/creative/font.js +29 -0
- package/dist/creative/frame.css +2 -0
- package/dist/creative/frame.js +7 -4
- package/dist/creative/layouts/bleed/layout.css +14 -7
- package/dist/creative/motion.js +61 -19
- package/dist/creative/render.js +21 -2
- package/dist/creative/sheet.js +7 -2
- package/dist/creative/styles.css +16 -7
- package/dist/lib/plugin-assets.d.ts.map +1 -1
- package/dist/lib/plugin-assets.js +16 -0
- package/dist/lib/plugin-assets.js.map +1 -1
- package/dist/mcp/tools/creative-drafts.d.ts.map +1 -1
- package/dist/mcp/tools/creative-drafts.js +5 -1
- package/dist/mcp/tools/creative-drafts.js.map +1 -1
- package/dist/mcp/tools/issues.d.ts.map +1 -1
- package/dist/mcp/tools/issues.js +6 -1
- package/dist/mcp/tools/issues.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,323 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: conductor-content-studio
|
|
3
|
+
description: Runs a small team of subagents (strategist, three ideators, creative director, scriptwriter, art director) that brainstorm competing short-form social post ideas, pick one with a bias-resistant judging method, write the script and visual direction, run pre-publish checks (disclosure, AI label, music, claims, third-party material, accessibility), and render a local draft with a publish pack the publisher later pre-fills from. The person approves at the preview; only then is the Creative uploaded to Conductor. Ideas are either RENDER (a still, carousel, story sequence or motion text that Conductor can render) or FILM (needs real filming, so the output is a shoot-ready script). A run ends at a committed Creative or a shoot script and never creates a Post. Use when asked to come up with, choose and make a short-form post (TikTok, Reels, Shorts, Facebook) from a goal rather than from a given headline, or via /conductor:content. For a headline or photo already chosen, use conductor-creative instead.
|
|
4
|
+
user-invocable: true
|
|
5
|
+
allowed-tools: mcp__conductor__*, Agent, AskUserQuestion, Skill, Read, Write, Glob, Grep, WebFetch
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Conductor Content Studio
|
|
9
|
+
|
|
10
|
+
Takes a request ("a post about X for Y") to either a committed Creative or a shoot-ready script. The
|
|
11
|
+
team chooses the idea itself; the person is asked once, at the final draft preview. You are the
|
|
12
|
+
orchestrator and run in the main session. Subagents do the thinking and writing; you do every
|
|
13
|
+
Conductor call and every file merge.
|
|
14
|
+
|
|
15
|
+
## Rules that shape the design
|
|
16
|
+
|
|
17
|
+
Each exists because of a known failure mode (sources are in `references/rubric.md`).
|
|
18
|
+
|
|
19
|
+
- **Subagents do not share context.** Hand off through files. Each stage writes its file and
|
|
20
|
+
returns only the path plus at most about 150 words. Never paste a file's content into a prompt
|
|
21
|
+
when its path will do.
|
|
22
|
+
- **Flat orchestration.** Only you call `Agent`. Subagents never spawn subagents.
|
|
23
|
+
- **Subagents get no MCP tools.** You make every Conductor call (`get_brand_kit`,
|
|
24
|
+
`preview_creative_draft`, `commit_creative_draft`, ...). Their tools are Read, Write and, for the
|
|
25
|
+
trend ideator, WebSearch.
|
|
26
|
+
- **Diverge first.** Three ideators with different angles run in parallel and cannot see each other.
|
|
27
|
+
- **Judge bias.** The judge is a different model tier, sees anonymized ideas at the same length,
|
|
28
|
+
writes reasoning before scores, compares finalists pairwise in both orders, and argues against its
|
|
29
|
+
own leader.
|
|
30
|
+
- **One gate.** The person is asked only at the final draft preview. Do not stop to ask which idea.
|
|
31
|
+
The one exception is S5b's disclosure question, asked only when disclosure cannot be inferred.
|
|
32
|
+
- **A run never creates a Post.** It ends at a committed Creative (or a shoot script).
|
|
33
|
+
|
|
34
|
+
Cost: a run is about 8 subagent calls (strategist 1, ideators 3, director 2, scriptwriter 1, art
|
|
35
|
+
director 1), and only the strategist and the director use the top model tier. `--quick` runs two
|
|
36
|
+
ideators and skips the finalist renders (about 7 calls).
|
|
37
|
+
|
|
38
|
+
## Run folder and state
|
|
39
|
+
|
|
40
|
+
`<projectRoot>/.conductor/content-runs/<YYYYMMDD-HHMM-slug>/`, where `projectRoot` is the working
|
|
41
|
+
directory's repository root and `slug` is 2 to 4 words of the request. The `.conductor/` folder is
|
|
42
|
+
git-ignored. Write files with `Write` (it creates folders). Every path below is relative to the run
|
|
43
|
+
folder; give subagents absolute paths.
|
|
44
|
+
|
|
45
|
+
```
|
|
46
|
+
request.md run.json brief.md script.md direction.md creative-spec.json decision.md
|
|
47
|
+
context/ brand-kit.json knowledge.md performance.md learning.md media.json
|
|
48
|
+
ideas/ angle-1.md angle-2.md angle-3.md pool.md
|
|
49
|
+
judging/ scores.md
|
|
50
|
+
drafts/ finalist-<id>/ (contact sheets from the finalist renders)
|
|
51
|
+
publish-pack.md publish-pack.json (S5b; see references/publish-pack-template.md)
|
|
52
|
+
shoot/ shoot-script.md (FILM winner only)
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
`run.json` is how a run resumes. Update it after every stage:
|
|
56
|
+
|
|
57
|
+
```json
|
|
58
|
+
{
|
|
59
|
+
"runId": "20261003-1415-spring-sale", "request": "...", "quick": false, "platform": "...",
|
|
60
|
+
"stages": {"S0": "done", "S1": "done", "S2": "pending", "merge": "pending", "S3a": "pending",
|
|
61
|
+
"S3b": "pending", "S3c": "pending", "S4": "pending", "S5": "pending", "S5b": "pending",
|
|
62
|
+
"S6": "pending"},
|
|
63
|
+
"idMap": {"I1": {"angle": "story/emotion", "file": "ideas/angle-1.md", "n": 3}},
|
|
64
|
+
"finalists": [], "winner": null, "tag": null, "runnerUps": [],
|
|
65
|
+
"tags": {"hookType": null, "angle": null, "format": null},
|
|
66
|
+
"drafts": {"finalist-I3": "<absolute dir>", "final": "<absolute dir>"},
|
|
67
|
+
"creativeId": null, "creativeDisplayId": null, "shootDoc": null
|
|
68
|
+
}
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
Stage values: `pending`, `done`, `failed`, `skipped`. The `idMap` is the only place angles are
|
|
72
|
+
linked to IDs; it is never shown to the director.
|
|
73
|
+
|
|
74
|
+
**Resume check (first thing).** Glob `.conductor/content-runs/*/run.json`. If one has a stage that is
|
|
75
|
+
not `done` or `skipped` and no `creativeId` or `shootDoc`, ask with `AskUserQuestion` whether to
|
|
76
|
+
**Resume** that run (name it and its last finished stage) or **Start a new run**. On resume, skip
|
|
77
|
+
done stages and continue from the first pending one.
|
|
78
|
+
|
|
79
|
+
## Delegation prompt template
|
|
80
|
+
|
|
81
|
+
Every `Agent` call uses this shape, filled in. Keep it short; the agent's own file holds its role.
|
|
82
|
+
|
|
83
|
+
```
|
|
84
|
+
Objective: <one sentence: what this stage must produce>
|
|
85
|
+
Mode / angle: <text-round | visual-round | angle "story/emotion" with N ideas | n/a>
|
|
86
|
+
Inputs (read only these): <absolute paths>
|
|
87
|
+
Template / rubric: <absolute path to the reference file>
|
|
88
|
+
Output: write only <absolute path>
|
|
89
|
+
Boundaries: do not call Conductor or any MCP tool; do not read or write other files; follow the
|
|
90
|
+
template exactly; <any stage-specific rule>
|
|
91
|
+
Return: at most 150 words plus the output path.
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
Resolve the reference files once: Glob for `**/conductor-content-studio/references/rubric.md` under
|
|
95
|
+
`.claude/skills/` in this project, then under `~/.claude/skills/`. Use that folder for every
|
|
96
|
+
`references/` path below. A subagent that returns more than 150 words or leaves its file unwritten
|
|
97
|
+
has failed the stage: retry once with a one-line reminder, then tell the person.
|
|
98
|
+
|
|
99
|
+
## Stages
|
|
100
|
+
|
|
101
|
+
### S0 — Context snapshot (you)
|
|
102
|
+
|
|
103
|
+
Write `request.md` (the request verbatim, `--quick` if given, the platform if stated). Then:
|
|
104
|
+
|
|
105
|
+
1. `get_brand_kit` -> `context/brand-kit.json`. If `configured` is false and the person already
|
|
106
|
+
skipped setup in the command, note that in the brief's constraints.
|
|
107
|
+
2. Knowledge, for `context/knowledge.md`: `read_knowledge_pages` for the kit's `knowledgePagePath`
|
|
108
|
+
and `marketing/what-works.md`; `search_knowledge` for persona/audience, campaign and positioning
|
|
109
|
+
pages and read the best few (at most 6 pages in all). Paste each page under its path heading, trimmed
|
|
110
|
+
to what bears on the request; keep approved lines verbatim. List every expected page that was not
|
|
111
|
+
found under "Missing pages". A missing page is a gap to record, never a reason to stop.
|
|
112
|
+
3. Performance, for `context/performance.md`: `get_marketing_insights` (window `30d`, or `90d` if
|
|
113
|
+
empty) and `list_top_posts` (limit 10). Summarise what the data says; "no performance data yet"
|
|
114
|
+
is a valid result.
|
|
115
|
+
4. `list_creative_media` for `IMAGE`, `VIDEO` and `AUDIO` -> `context/media.json` (id, kind, label,
|
|
116
|
+
dimensions or duration, checked, blocked, provenance).
|
|
117
|
+
5. Learning, for `context/learning.md`. Glob `.conductor/content-runs/*/run.json`, skip this run, and
|
|
118
|
+
keep the runs that have a `creativeId` and `tags`. For each, call `get_creative` (the variants'
|
|
119
|
+
attributed performance and the family's hook experiment, with its winner once decided) and read
|
|
120
|
+
its tags (hookType, angle, format). Summarise which hook types and angles did well and which did
|
|
121
|
+
not, using views, engagement rate, average view percentage, 72 h views and any 3-second or
|
|
122
|
+
completion figure the insights expose, and any experiment result. Name what you could not
|
|
123
|
+
measure. With no earlier run or no data, write exactly "No data yet".
|
|
124
|
+
6. Every renderable idea needs a photo (or, for MOTION, a clip); see `references/capabilities.md`. If
|
|
125
|
+
`media.json` has no unblocked image and no clip, ask once with `AskUserQuestion` before ideating:
|
|
126
|
+
**Give a photo or two** (local paths; record them in `context/media.json` as `local` entries the
|
|
127
|
+
art director may use via `photoPath`) or **Plan for filming** (ideas will be `FILM`). Never let
|
|
128
|
+
the team design a type-only still; the preview refuses it.
|
|
129
|
+
|
|
130
|
+
### S1 — Strategist -> `brief.md`
|
|
131
|
+
|
|
132
|
+
`Agent(subagent_type: "conductor-content-strategist")` with the six context files, `request.md`
|
|
133
|
+
and `references/capabilities.md` (so the brief states rendering constraints correctly: motion text
|
|
134
|
+
over a photo is renderable and needs no filming).
|
|
135
|
+
|
|
136
|
+
### S2 — Ideators, in parallel -> `ideas/angle-<n>.md`
|
|
137
|
+
|
|
138
|
+
Three `Agent` calls in ONE message so they run in parallel, `subagent_type:
|
|
139
|
+
"conductor-content-ideator"`, with these angles and no knowledge of each other:
|
|
140
|
+
|
|
141
|
+
1. story/emotion 2. utility/education 3. trend/humor (the only one allowed web search)
|
|
142
|
+
|
|
143
|
+
Each gets `brief.md`, `context/media.json`, `references/idea-template.md` and
|
|
144
|
+
`references/capabilities.md` (the `RENDER`/`FILM` test), and writes 4 ideas.
|
|
145
|
+
With `--quick`: only angles 1 and 2, 3 ideas each.
|
|
146
|
+
|
|
147
|
+
### Merge (you) -> `ideas/pool.md`
|
|
148
|
+
|
|
149
|
+
Build one pool from all the angle files:
|
|
150
|
+
|
|
151
|
+
- Give every idea an ID `I1..In` in a shuffled order (not grouped by angle, not in file order).
|
|
152
|
+
- Remove angle names and any trace of the source. Put every idea in the identical template from
|
|
153
|
+
`references/idea-template.md`, trimming any field to its word cap so lengths match.
|
|
154
|
+
- Record the true mapping in `run.json` `idMap`. Keep the tag (`RENDER`/`FILM`) in the pool.
|
|
155
|
+
- Drop an idea that breaks the brief's must-avoid list or copy rules in a way you cannot fix by
|
|
156
|
+
one word, and note the drop in `run.json`.
|
|
157
|
+
|
|
158
|
+
### S3a — Creative director, text round -> `judging/scores.md`
|
|
159
|
+
|
|
160
|
+
`Agent(subagent_type: "conductor-content-creative-director")`, mode `text-round`. Inputs:
|
|
161
|
+
`brief.md`, `ideas/pool.md`, `references/rubric.md`. It scores every idea independently, reasoning
|
|
162
|
+
before each score, and names the top 3. Store the finalists in `run.json`.
|
|
163
|
+
|
|
164
|
+
### S3b — Finalist drafts (you; skipped in `--quick`)
|
|
165
|
+
|
|
166
|
+
For each `RENDER` finalist, call `preview_creative_draft` with that idea's draft spec (map the
|
|
167
|
+
draft-spec block to the tool's fields) and `draftDir` set to `<run>/drafts/finalist-<id>`. Use
|
|
168
|
+
`full: false`. Record each draft dir in `run.json`.
|
|
169
|
+
|
|
170
|
+
- If the validator refuses the copy (accent phrase or a copy rule), fix the copy once yourself and
|
|
171
|
+
retry. If it still fails, mark that finalist unrenderable in `run.json`, keep its text score, and
|
|
172
|
+
move on. It is not dropped.
|
|
173
|
+
- A photo id that is not in `media.json`, or a layout the registry rejects, counts as a refusal.
|
|
174
|
+
- The preview result carries `checks` and `passed` (the full-size safe-zone, spill and contrast
|
|
175
|
+
checks). If a finalist fails a blocking check, fix it once (`layoutOverrides`, `typeOverrides`, a
|
|
176
|
+
shorter body) and re-preview; otherwise keep it and record the failure for the judge.
|
|
177
|
+
- `FILM` finalists have no render.
|
|
178
|
+
|
|
179
|
+
### S3c — Creative director, visual round -> `decision.md`
|
|
180
|
+
|
|
181
|
+
Same agent, mode `visual-round`. Inputs: `brief.md`, `judging/scores.md`, `ideas/pool.md`, the
|
|
182
|
+
finalist image paths (`drafts/finalist-<id>/sheet.jpg`; the director views them with Read), the
|
|
183
|
+
rubric and `references/compliance-checklist.md`. It compares finalists pairwise in both orders, runs
|
|
184
|
+
the devil's-advocate pass against the leader (including the veto questions: an unsubstantiated
|
|
185
|
+
claim, trademark or parody risk, a representation or sensitivity problem, disclosure needed), and
|
|
186
|
+
writes `decision.md`: the winner, why it won, the runners-up, one line per cut idea and the veto
|
|
187
|
+
answers. A veto "yes" that copy cannot fix disqualifies an idea. In `--quick` there are no images,
|
|
188
|
+
so it judges from the text and says so.
|
|
189
|
+
|
|
190
|
+
Read `decision.md`, then set `winner`, `tag` and `runnerUps` in `run.json`, and the run's own
|
|
191
|
+
`tags`: `hookType` from the winning idea's hook type, `angle` from `idMap` (`story-emotion`,
|
|
192
|
+
`utility-education` or `trend-humor`) and `format` from the idea's format. Do not ask the person
|
|
193
|
+
which idea to take; show the decision at the gate.
|
|
194
|
+
|
|
195
|
+
### S4 — Scriptwriter -> `script.md`
|
|
196
|
+
|
|
197
|
+
`Agent(subagent_type: "conductor-content-scriptwriter")` with `brief.md`, `decision.md`, the winning
|
|
198
|
+
idea from `ideas/pool.md`, `references/script-template.md`, `references/platform-specs.md` and
|
|
199
|
+
`references/publish-pack-template.md`. Besides the script it writes the Publish copy section: a
|
|
200
|
+
caption per platform, hashtags, a first comment and 2 to 3 alternate hooks with a hookType each.
|
|
201
|
+
When merging into `publish-pack.json`, append each platform's hashtags to its `captionOverride`
|
|
202
|
+
(caption, blank line, hashtags): that field is posted verbatim.
|
|
203
|
+
|
|
204
|
+
### S5 — Art director (`RENDER` only) -> `direction.md` + `creative-spec.json`
|
|
205
|
+
|
|
206
|
+
`Agent(subagent_type: "conductor-content-art-director")` with `script.md`, `context/media.json`,
|
|
207
|
+
`context/brand-kit.json`, `references/shotlist-template.md`, `references/platform-specs.md` and
|
|
208
|
+
`references/publish-pack-template.md`. Besides the spec it writes the Publish assets section of
|
|
209
|
+
`direction.md`: cover frame, alt text per card, on-screen text placement and the sound source and
|
|
210
|
+
licence per platform.
|
|
211
|
+
Tell it the supported options: the kit's enabled placements, and the layouts and themes
|
|
212
|
+
the creative registry supports (at the time of writing `stacked`, `bleed`, `split` dark only, `card` dark or
|
|
213
|
+
light; a refusal from the validator names the valid ones). The spec's keys must be exactly
|
|
214
|
+
`preview_creative_draft` inputs. Give it `references/capabilities.md` too. The spec's `name` is the
|
|
215
|
+
idea's title only: never include the internal `I<n>` ID, which means nothing outside this run. A
|
|
216
|
+
`FILM` winner skips S5 and goes to the shoot script, below.
|
|
217
|
+
|
|
218
|
+
### S5b — Publish pack and pre-publish checks (you; RENDER after S5, FILM after the shoot script)
|
|
219
|
+
|
|
220
|
+
Before the gate, so the person sees the settings with the draft. Skip nothing here; a check that
|
|
221
|
+
does not apply is answered "not applicable".
|
|
222
|
+
|
|
223
|
+
1. Run `references/compliance-checklist.md` against `brief.md`, `script.md`, `direction.md` (or the
|
|
224
|
+
shoot script), `creative-spec.json` and the provenance in `context/media.json` (`aiGenerated`,
|
|
225
|
+
`licence`).
|
|
226
|
+
2. Merge the scriptwriter's Publish copy and the art director's Publish assets, add the compliance
|
|
227
|
+
results, and write `publish-pack.md` and `publish-pack.json` in the shapes of
|
|
228
|
+
`references/publish-pack-template.md`. Real option keys only. The posting window comes from
|
|
229
|
+
`get_marketing_insights` (`byHour`, `byWeekday`) for the platform, or "no data yet".
|
|
230
|
+
3. Ask at most ONE `AskUserQuestion`, and only when disclosure cannot be inferred: the request,
|
|
231
|
+
brief or media names a creator, customer, partner or sponsor and the relationship is unclear.
|
|
232
|
+
Question "Is anyone in or behind this post paid, gifted, an employee/affiliate?" with options
|
|
233
|
+
**No, this is the brand's own post**, **Yes, paid partnership**, **Yes, gifted or affiliate**.
|
|
234
|
+
Otherwise assume the brand's own promotional post and set TikTok `brandOrganicToggle`. Paid
|
|
235
|
+
sets `brandContentToggle`; gifted or affiliate sets `brandContentToggle` and adds the
|
|
236
|
+
disclosure to the caption's first line.
|
|
237
|
+
4. A claims or trademark check that fails and cannot be fixed by you in one word goes back to the
|
|
238
|
+
scriptwriter once, with the failing line; re-run S4's merge and S5 only if the copy changed. If
|
|
239
|
+
it still fails, show it at the gate as a known issue and never hide it.
|
|
240
|
+
5. Set `S5b` to `done`. On any later copy change, redo this stage so the pack matches the draft.
|
|
241
|
+
|
|
242
|
+
### S6 — Preview gate (you; `RENDER` winner)
|
|
243
|
+
|
|
244
|
+
1. `preview_creative_draft` with the fields from `creative-spec.json`, `full: false`, and no
|
|
245
|
+
`draftDir` (the default location is cleaned up automatically after the commit). Record the
|
|
246
|
+
returned `draftDir` as `drafts.final`. Local files (`photoPath`, `clipPath`, `audioPath`) go in
|
|
247
|
+
as given in the spec.
|
|
248
|
+
2. Eye-check the image. Load the `conductor-creative` skill with `Skill(skill: "conductor-creative")` and
|
|
249
|
+
apply its review guidance (step 7 and the silent-failures list): does the headline read at a
|
|
250
|
+
glance, does the accent phrase fall on the words that carry the meaning, is copy on a face, are
|
|
251
|
+
the safe zones clear. Also read the result's `checks`/`passed`: while any blocking check fails,
|
|
252
|
+
fix it (`layoutOverrides` for photo height, `typeOverrides` for text size, a shorter body) and
|
|
253
|
+
re-preview **before** showing anything, and never offer Approve & upload while one still fails.
|
|
254
|
+
Revise at most twice beyond that; if it is still wrong, show it honestly and say what is off.
|
|
255
|
+
3. Show the person: the draft image, the finalist sheets of the runners-up (view them from
|
|
256
|
+
`drafts/finalist-<id>/sheet.jpg`; say when a runner-up could not be rendered), and a short decision
|
|
257
|
+
summary (the winner and why, the runners-up, what was cut and why), and a short pack summary: the
|
|
258
|
+
disclosure setting (which toggle, or none), the AI-label setting, the sound and its licence, and
|
|
259
|
+
the alternate hooks with their types.
|
|
260
|
+
4. Ask with `AskUserQuestion`, header "Draft", with exactly these four options. `AskUserQuestion`
|
|
261
|
+
allows at most four, so never add one per runner-up, and **Stop** must always be among them:
|
|
262
|
+
- **Approve & upload**: if the spec used a local file (`photoPath`, `clipPath`, `audioPath`),
|
|
263
|
+
first ask for its provenance (`source`, `licence`, and whether it is AI-generated) and pass
|
|
264
|
+
them to `commit_creative_draft({draftDir, source, licence, aiGenerated})`. Then
|
|
265
|
+
`get_creative` and read its `readiness`. If provenance or anything else blocking is missing,
|
|
266
|
+
say exactly what and ask for it; never call a Creative done while `ready` is false. After the
|
|
267
|
+
commit, write the Creative's id into `publish-pack.json` as `creativeId` (and into `run.json`).
|
|
268
|
+
- **Use a runner-up**: ask a second `AskUserQuestion` listing the runners-up by title (with
|
|
269
|
+
their tag; label one that could not be rendered as such and say why, rather than offering it as
|
|
270
|
+
if it would work). Then set the chosen idea as `winner` and re-run S4 onward for it (S5, S5b and S6,
|
|
271
|
+
or the FILM path if it is tagged `FILM`).
|
|
272
|
+
- **Request changes**: take the free text. If it is about the copy, send it with the current
|
|
273
|
+
script to the scriptwriter (S4), then the art director (S5); if only about the look, send it to
|
|
274
|
+
the art director. Redo S5b, then re-preview. Do not commit the old draft.
|
|
275
|
+
- **Stop**: upload nothing. Tell the person where the drafts are
|
|
276
|
+
(`drafts.final` and the finalist folders) and that the run can be resumed.
|
|
277
|
+
|
|
278
|
+
### FILM winner
|
|
279
|
+
|
|
280
|
+
1. After S4, have the art director write the shoot version: `Agent(subagent_type:
|
|
281
|
+
"conductor-content-art-director")` with `script.md`, `context/media.json`, `context/brand-kit.json`
|
|
282
|
+
and `references/shotlist-template.md`, output `shoot/shoot-script.md`: script, shot list, capture
|
|
283
|
+
settings (9:16, 30 fps, sound on), B-roll, safe zones, and the on-screen text and captions ready to
|
|
284
|
+
paste. It also writes the Publish assets section there. It writes no `creative-spec.json` here.
|
|
285
|
+
2. Run S5b. The shoot script gets the publish pack too (captions, hashtags, first comment,
|
|
286
|
+
disclosure, music and its licence) so it can be applied when the clip is posted later; append a
|
|
287
|
+
short "Publish pack" section to `shoot/shoot-script.md`, and leave `creativeId` null in
|
|
288
|
+
`publish-pack.json`.
|
|
289
|
+
3. Show the shoot script, then ask with `AskUserQuestion` whether to save it as a project doc:
|
|
290
|
+
**Save to project docs** or **Keep local only**.
|
|
291
|
+
4. On save, `write_project_doc` at path `Content/Shoots/<runId> <title>` with the file's content;
|
|
292
|
+
verify with `read_project_doc` and record `shootDoc` in `run.json`. Nothing else is uploaded.
|
|
293
|
+
|
|
294
|
+
## Final message
|
|
295
|
+
|
|
296
|
+
Keep it short:
|
|
297
|
+
|
|
298
|
+
- the decision summary: winner, one line on why, the runners-up;
|
|
299
|
+
- the Creative display id (and the readiness gaps, if any) or the shoot doc path;
|
|
300
|
+
- `publish-pack.md` (captions, hashtags, first comment, disclosure and AI-label settings, sound,
|
|
301
|
+
alternate hooks); say the publisher will pre-fill the Post from `publish-pack.json`, and that the
|
|
302
|
+
first comment is a manual step;
|
|
303
|
+
- next steps:
|
|
304
|
+
- make the Post with `/conductor:creative` or the `conductor-publisher` skill (the Creative is
|
|
305
|
+
not on a Post yet, because a run never creates one);
|
|
306
|
+
- to test a runner-up's hook, cut it as a lettered variant of the Creative with `variantOf`;
|
|
307
|
+
- for `FILM`: film it, upload the clip, then run `/conductor:creative` and pick "Video from a
|
|
308
|
+
clip I have".
|
|
309
|
+
|
|
310
|
+
## Failure handling
|
|
311
|
+
|
|
312
|
+
- A subagent that fails twice: mark the stage `failed` in `run.json` and tell the person what
|
|
313
|
+
stopped, with the run folder, so it can be resumed.
|
|
314
|
+
- MCP tool errors: surface the message as it is; do not work around a validator refusal by changing
|
|
315
|
+
the rule's field or dropping the check.
|
|
316
|
+
- If every finalist is unrenderable, run S3c in text-only mode as in `--quick`.
|
|
317
|
+
- Never commit a draft the person has not seen and approved. Never call `create_post`,
|
|
318
|
+
`attach_creative_to_post` or any publishing tool.
|
|
319
|
+
|
|
320
|
+
## Related
|
|
321
|
+
|
|
322
|
+
- `conductor-creative`: the single-Creative skill whose checklist S6 uses.
|
|
323
|
+
- `conductor-publisher`: takes the committed Creative onto a Post, pre-filled from `publish-pack.json`.
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# What Conductor can render
|
|
2
|
+
|
|
3
|
+
Read this before tagging an idea `RENDER` or `FILM`, and before writing a spec. An idea is `RENDER`
|
|
4
|
+
only if every card or frame it needs fits what is listed here, using media that is in
|
|
5
|
+
`context/media.json` or that the person has offered as a local file. Anything else is `FILM`, or it
|
|
6
|
+
needs changing until it fits.
|
|
7
|
+
|
|
8
|
+
## Kinds
|
|
9
|
+
|
|
10
|
+
- **STILL**: one photo with the brand layout over it: headline, optional body, logo lockup and CTA.
|
|
11
|
+
It renders once per placement.
|
|
12
|
+
- **Carousel**: 2–10 cards, rendered at one ratio (default 4:5).
|
|
13
|
+
- **Story**: 2–7 beats, rendered at the `story` placement.
|
|
14
|
+
- Each card or beat can take its own photo; a beat without one inherits the main photo. Every beat
|
|
15
|
+
after the first needs a headline.
|
|
16
|
+
- **MOTION**: a short video Conductor animates itself, 3–60 s (default 8 s).
|
|
17
|
+
- Text animation presets: `fade-up`, `word-by-word`, `accent-pop` or `none`.
|
|
18
|
+
- Background: a photo with a slow zoom or pan, or a clip from the library.
|
|
19
|
+
- An end card holds the finished frame for the last 2 s.
|
|
20
|
+
- Audio: the clip's own sound, a library music track, or none.
|
|
21
|
+
- This is the right tool for a motion-text post: **it does not need filming.**
|
|
22
|
+
- **CLIP**: a finished video posted as-is. There is no brand layout and nothing to draft. It only
|
|
23
|
+
applies when the person already has the video.
|
|
24
|
+
|
|
25
|
+
## Hard requirements (a draft is refused without them)
|
|
26
|
+
|
|
27
|
+
- **A photo.** Every STILL needs one, and so does a carousel or story, whose beats inherit the main
|
|
28
|
+
photo. A MOTION needs a photo or a clip as its background. There are no type-only stills. If
|
|
29
|
+
`media.json` has no usable (unblocked) image, a `RENDER` idea needs the person to supply a photo.
|
|
30
|
+
- **A headline.** If the Brand Kit requires an accent phrase, the headline needs exactly one
|
|
31
|
+
`*accent phrase*`.
|
|
32
|
+
- **Copy rules and approved lines.** Every Brand Kit copy rule applies to the headline, body,
|
|
33
|
+
caption and every beat. Approved lines must run word for word.
|
|
34
|
+
- **Real values.** Layouts, themes and placements must exist. The validator names the valid ones
|
|
35
|
+
if not.
|
|
36
|
+
|
|
37
|
+
## Layouts and controls
|
|
38
|
+
|
|
39
|
+
- **Layouts:** `stacked`, `bleed` and `split` are dark only; `card` is dark or light. The photo and
|
|
40
|
+
text arrangement is fixed per layout.
|
|
41
|
+
- **`stacked` drops the body at 4:5.** That includes every card of a 4:5 carousel, and it happens
|
|
42
|
+
silently. If a body line carries meaning (a claim, the product name, the accent phrase), use
|
|
43
|
+
`card`, `split` or `bleed`, or move the line into the headline.
|
|
44
|
+
- **Placements:** the kit's enabled placements (usually 9x16, 4x5, 1x1). You can also opt in to
|
|
45
|
+
`story`, `1.91x1`, `2x3` and `16x9`.
|
|
46
|
+
- **`typeOverrides`:** headline size per placement. Use this when text reads too small or too large;
|
|
47
|
+
don't switch layouts to fix it.
|
|
48
|
+
- **`layoutOverrides`:** photo height or focal point, for example to make the photo fill more of a
|
|
49
|
+
9:16 frame.
|
|
50
|
+
- **Safe zones:** checked automatically at preview, on every placement. A blocking failure, such as
|
|
51
|
+
text or a badge under the platform's buttons, is fixed before anyone is asked to approve.
|
|
52
|
+
- **The caption is never drawn on the artwork.** It goes with the post.
|
|
53
|
+
|
|
54
|
+
## What it cannot do (so the idea needs filming or a rethink)
|
|
55
|
+
|
|
56
|
+
- Footage of people, places, cooking or the product in use. Screen recordings of an app.
|
|
57
|
+
- Voiceover or spoken dialogue: MOTION has music or clip sound, not speech.
|
|
58
|
+
- Grids, charts, collages of several photos on one card, illustrations, or generated images.
|
|
59
|
+
Each card is one photo plus text.
|
|
60
|
+
- Anything that relies on a product claim the brief can't confirm. That's a copy problem, not a
|
|
61
|
+
rendering one: soften the claim or drop the idea.
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
# Pre-publish compliance checklist
|
|
2
|
+
|
|
3
|
+
Run by the orchestrator in stage S5b against `brief.md`, `script.md`, `direction.md`,
|
|
4
|
+
`creative-spec.json` and the media provenance in `context/media.json`. The creative director uses
|
|
5
|
+
the veto questions (marked **Veto**) in its devil's-advocate pass. Every check is a yes/no
|
|
6
|
+
question with what to do and the exact publish option it sets. Record each answer in
|
|
7
|
+
`publish-pack.md` and the options in `publish-pack.json` (see `publish-pack-template.md`).
|
|
8
|
+
|
|
9
|
+
Option keys here are the keys `list_publish_targets` reports under a destination's `optionKeys`
|
|
10
|
+
(camelCase, set under `options` in `create_post` or `publishOptions` in `set_publish_targets`).
|
|
11
|
+
That list is the authority at publish time: if a key is not in a destination's `optionKeys`, do not
|
|
12
|
+
send it. This is guidance for a team that makes content, not legal advice; platform and regulator
|
|
13
|
+
rules change, so check current guidance before relying on it.
|
|
14
|
+
|
|
15
|
+
## 1. Disclosure (Veto)
|
|
16
|
+
|
|
17
|
+
**Is anyone in or behind this post paid, gifted, an employee or an affiliate?** (A creator, a
|
|
18
|
+
customer given free product, a staff member speaking about the employer, a partner brand, an
|
|
19
|
+
affiliate link.)
|
|
20
|
+
|
|
21
|
+
- **Yes**: the relationship is disclosed in the first seconds of any video and in the caption's
|
|
22
|
+
opening line (for example "Paid partnership with ...", "Gifted by ...", "Affiliate link").
|
|
23
|
+
Set TikTok `brandContentToggle: true`. TikTok refuses `brandContentToggle` on a post whose
|
|
24
|
+
`privacyLevel` is `SELF_ONLY`, so the post must be visible.
|
|
25
|
+
- **No, this is the brand promoting its own product on its own account**: set TikTok
|
|
26
|
+
`brandOrganicToggle: true`. No on-screen disclosure line is needed beyond being obviously the
|
|
27
|
+
brand's own post.
|
|
28
|
+
- **Which toggle:** "Your brand" (`brandOrganicToggle`) is a business promoting itself.
|
|
29
|
+
"Branded content" (`brandContentToggle`) is a paid partnership where a third party is promoting
|
|
30
|
+
someone else's business. Never use `brandOrganicToggle` to cover a paid creator.
|
|
31
|
+
- Other platforms have no disclosure option in Conductor. Put the disclosure in the caption's first
|
|
32
|
+
line and turn on the platform's own paid-partnership label by hand; list that as a manual step.
|
|
33
|
+
- Default when nothing in the request, brief or media points to a third party: the brand's own
|
|
34
|
+
promotional post, so `brandOrganicToggle: true`.
|
|
35
|
+
|
|
36
|
+
Source: FTC Endorsement Guides FAQ (ftc.gov/business-guidance/resources/ftcs-endorsement-guides-what-people-are-asking):
|
|
37
|
+
disclose paid, gifted, employee and affiliate relationships; in video, disclose at the start.
|
|
38
|
+
|
|
39
|
+
## 2. AI label
|
|
40
|
+
|
|
41
|
+
**Is any realistic imagery, video or voice AI-generated or AI-altered?** Check the Creative's and
|
|
42
|
+
each media file's provenance (`aiGenerated` in `context/media.json`) and the script's visuals.
|
|
43
|
+
|
|
44
|
+
- **Yes**: set TikTok `isAigc: true` on a video post. Conductor does not send `isAigc` on a TikTok
|
|
45
|
+
photo post, so for a photo post note "turn on TikTok's AI label by hand" as a manual step. Set
|
|
46
|
+
YouTube `containsSyntheticMedia: true`. Meta has no option: note that Instagram's and Facebook's
|
|
47
|
+
"AI info" label must be turned on in the app.
|
|
48
|
+
- **No**: text, motion graphics over a real photo, and real photos are exempt. So is content that
|
|
49
|
+
is obviously unrealistic or animated. Say which of these applies.
|
|
50
|
+
- Never leave `isAigc` unset when provenance says `aiGenerated: true` for a realistic asset.
|
|
51
|
+
|
|
52
|
+
Source: TikTok, Meta and YouTube each require disclosure of realistic AI-generated or AI-altered
|
|
53
|
+
imagery, video or voice.
|
|
54
|
+
|
|
55
|
+
## 3. Music and sound (Veto, for TikTok)
|
|
56
|
+
|
|
57
|
+
**For each platform, what is the sound source and is it licensed for this account?** Name it in the
|
|
58
|
+
pack: original audio, a library track (with its recorded `licence`), the clip's own sound, or none.
|
|
59
|
+
|
|
60
|
+
- A business account cannot use most trending tracks. On TikTok a business account can only use
|
|
61
|
+
the Commercial Music Library, which is licensed for TikTok only, so a track from it is not
|
|
62
|
+
cleared for Reels or Shorts. Use the Commercial Music Library or original audio.
|
|
63
|
+
- Never name a trending song a business account cannot license. If the idea depends on one, the
|
|
64
|
+
idea fails this check and the director may disqualify it.
|
|
65
|
+
- Instagram Reels `audioName` is an attribution label for a Reel's audio; set it only when the
|
|
66
|
+
sound has a credit to give.
|
|
67
|
+
- A library track used in a MOTION Creative must have its licence recorded (the readiness checklist
|
|
68
|
+
blocks otherwise).
|
|
69
|
+
- Photo posts on TikTok: `autoAddMusic` lets TikTok pick a soundtrack. Leave it unset unless the
|
|
70
|
+
person chose it, because the track is not one the team vetted.
|
|
71
|
+
|
|
72
|
+
## 4. Claims (Veto)
|
|
73
|
+
|
|
74
|
+
**Is every factual or product claim confirmed?** A claim is anything a viewer could check: a
|
|
75
|
+
number, "first", "best", a result, a feature, a price, a comparison, a health or savings promise.
|
|
76
|
+
|
|
77
|
+
- Each must be confirmed by `brief.md`, a knowledge page in `context/knowledge.md` or an approved
|
|
78
|
+
line in the Brand Kit. Quote where.
|
|
79
|
+
- If not confirmed: soften it ("can help" instead of "will"), or remove it. If the idea only works
|
|
80
|
+
with the unconfirmed claim, it fails the check.
|
|
81
|
+
|
|
82
|
+
Source: the FTC's endorsement guidance: don't make claims the advertiser can't substantiate.
|
|
83
|
+
|
|
84
|
+
## 5. Third-party material (Veto, for parody and trademarks)
|
|
85
|
+
|
|
86
|
+
**List every third-party asset in the post:** music, footage, logos, memes, screenshots, likenesses
|
|
87
|
+
of real people, trademarks and product names, parodies.
|
|
88
|
+
|
|
89
|
+
- Each gets a row in the pack's third-party list: what it is, whose it is, and the permission or
|
|
90
|
+
licence (own work, licensed, with consent, or "none, remove").
|
|
91
|
+
- Anything with no permission is removed or replaced.
|
|
92
|
+
- **Flag parody of another company's product or brand.** Even a joke needs a person to approve it;
|
|
93
|
+
if it can't be fixed in copy (it is the whole premise), the idea fails.
|
|
94
|
+
- A person's likeness or voice, real or imitated, needs consent.
|
|
95
|
+
|
|
96
|
+
## 6. Representation and sensitivity (Veto)
|
|
97
|
+
|
|
98
|
+
**Does anything stereotype, exclude, mock or trade on a sensitive subject (health, money
|
|
99
|
+
hardship, grief, religion, politics, a protected group)?** A quick read of the hook, the visuals
|
|
100
|
+
and the caption.
|
|
101
|
+
|
|
102
|
+
- If yes and it can be fixed by changing words or the picture, fix it and note the change.
|
|
103
|
+
- If it can't be fixed, the idea fails.
|
|
104
|
+
|
|
105
|
+
## 7. Accessibility
|
|
106
|
+
|
|
107
|
+
**Does the post work for someone who cannot see it or cannot hear it?**
|
|
108
|
+
|
|
109
|
+
- Alt text for every image or card (at most 1,000 characters on Instagram). Carry it in the
|
|
110
|
+
Creative's `altText` and in the pack. Instagram `altText` is an option only on a single feed
|
|
111
|
+
image; cards in a carousel cannot each carry published alt text, so list it in the pack.
|
|
112
|
+
- Captions or on-screen text for everything spoken, so the post works with the sound off. Burned-in
|
|
113
|
+
text is preferred over relying on a platform's auto-captions.
|
|
114
|
+
- Contrast and safe zones are already checked by the renderer; do not repeat them.
|
|
115
|
+
|
|
116
|
+
## Result
|
|
117
|
+
|
|
118
|
+
Write a table: check, answer (yes / no / not applicable), what was done, option set. A check that
|
|
119
|
+
fails and can't be fixed in copy goes back to the scriptwriter once (S5b step 4); if it still
|
|
120
|
+
fails, say so at the gate rather than hiding it.
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
# Idea template
|
|
2
|
+
|
|
3
|
+
Every idea in `ideas/angle-<n>.md` uses exactly this template, so the merged pool reads the same
|
|
4
|
+
whichever agent wrote it. Keep the word caps; the judge is told not to reward length, and equal
|
|
5
|
+
length also keeps the comparison fair.
|
|
6
|
+
|
|
7
|
+
Heading: `## Idea <n>: <title>` where the title is 8 words or fewer.
|
|
8
|
+
|
|
9
|
+
```
|
|
10
|
+
## Idea <n>: <title, max 8 words>
|
|
11
|
+
|
|
12
|
+
- **Concept:** <one line, max 25 words: what the viewer sees and why it works>
|
|
13
|
+
- **Hook, spoken:** <max 12 words, or "none (text only)">
|
|
14
|
+
- **Hook, on screen:** <max 12 words>
|
|
15
|
+
- **Hook type:** <question | bold-claim | pattern-interrupt | relatable-pain | how-to | number | curiosity-gap | story | social-proof>
|
|
16
|
+
- **Format:** <still | carousel | story sequence | motion text over photo | motion text over clip | talking head | demo | skit | other>
|
|
17
|
+
- **Platform:** <primary platform, then any others>
|
|
18
|
+
- **Tag:** RENDER | FILM
|
|
19
|
+
- **Why this audience cares:** <max 30 words, tied to the brief's tension>
|
|
20
|
+
- **Assets needed:** <ids and labels from media.json, or "none", or what must be filmed>
|
|
21
|
+
|
|
22
|
+
Draft spec (RENDER only):
|
|
23
|
+
|
|
24
|
+
- kind: STILL | MOTION
|
|
25
|
+
- layout: <a layout the brand kit and registry support>
|
|
26
|
+
- theme: dark | light
|
|
27
|
+
- headline: <with exactly one *accent phrase* if the kit requires it>
|
|
28
|
+
- body: <max 20 words, or none>
|
|
29
|
+
- caption: <the post caption, within the platform's limit>
|
|
30
|
+
- photoId: <id from media.json, or none>
|
|
31
|
+
- sequence: <for a story or carousel only: one line per beat, "headline | body">
|
|
32
|
+
- motion: <MOTION only: preset, durationSec, background>
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## Sound
|
|
36
|
+
|
|
37
|
+
An idea may not rely on a trending song. A business account cannot license most trending tracks, so
|
|
38
|
+
name original audio or a Commercial Music Library track, or leave sound out of the concept.
|
|
39
|
+
|
|
40
|
+
## Tagging honestly
|
|
41
|
+
|
|
42
|
+
- `RENDER` means Conductor can make it end to end: a still, a carousel, a story sequence, or motion
|
|
43
|
+
text over photos or clips that exist in `media.json` (or need no photo at all). Nothing in it
|
|
44
|
+
requires a person to be filmed or footage that is not on hand.
|
|
45
|
+
- `FILM` means it needs real filming: a person speaking to camera, a demonstration, a skit, a
|
|
46
|
+
product in use. A `FILM` idea has no draft spec; it gets a shoot-ready script instead.
|
|
47
|
+
- Tag against the media actually on hand. If the idea needs a clip that is not in `media.json`, it
|
|
48
|
+
is `FILM`, or it is `RENDER` with the missing photo named under "Assets needed" as something the
|
|
49
|
+
user must supply.
|
|
50
|
+
|
|
51
|
+
## Distinctness
|
|
52
|
+
|
|
53
|
+
Within one angle file no two ideas may share a mechanic (for example two list posts, or two
|
|
54
|
+
before/after reveals). Differ in the hook device, the format, or the emotional register.
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# Platform specs for short-form posts
|
|
2
|
+
|
|
3
|
+
Every number on this page is a planning default taken from public platform guidance at the time of
|
|
4
|
+
writing. **Check current platform guidance before relying on any of it**; platforms change limits and
|
|
5
|
+
ranking signals without notice, and the brief's own platform list always wins.
|
|
6
|
+
|
|
7
|
+
## Craft that holds on every platform
|
|
8
|
+
|
|
9
|
+
- Hook in the first 0 to 3 seconds, both spoken and on screen. The first frame is the thumbnail
|
|
10
|
+
and the ad.
|
|
11
|
+
- A new beat or pattern interrupt every 3 to 5 seconds (a cut, a new line of text, a zoom, a
|
|
12
|
+
reveal), then a payoff, then one call to action.
|
|
13
|
+
- Captions on screen so it works with the sound off. Decide sound design on purpose: sound-on
|
|
14
|
+
platforms reward voice and music, but many people watch muted.
|
|
15
|
+
- Vertical 9:16 for TikTok, Reels, Stories and Shorts. Keep text out of the platform's own UI.
|
|
16
|
+
- Plan for retention, not reach: a shorter piece that is watched to the end beats a longer one that
|
|
17
|
+
is abandoned.
|
|
18
|
+
|
|
19
|
+
## Safe zone (9:16, 1080x1920)
|
|
20
|
+
|
|
21
|
+
Use the Reels zone as the default for every vertical placement: keep text and faces out of the top
|
|
22
|
+
~14%, the bottom ~35% and ~6% at each side. That leaves a central band of roughly 1000 px of height
|
|
23
|
+
for the hook, headline and CTA. TikTok's right-hand button column and caption area, and the Shorts
|
|
24
|
+
channel and title strip, take comparable space (check current platform guidance).
|
|
25
|
+
|
|
26
|
+
## Platforms
|
|
27
|
+
|
|
28
|
+
| Platform | Format and aspect | Length | What the ranking rewards | Sound and captions |
|
|
29
|
+
|---|---|---|---|---|
|
|
30
|
+
| TikTok | Video 9:16 (photo carousels also exist) | Up to several minutes; short pieces of about 15 to 45 s are the planning default | Watch time and completion, rewatches, shares, comments; TikTok's Creative Codes frame a piece as hook, body, close | Built for sound on; on-screen captions still matter. Caption text up to about 2,200 characters, but only the first line is visible before "more" |
|
|
31
|
+
| Instagram Reels | Video 9:16 | Up to 3 minutes; about 15 to 30 s is the planning default | Watch time, likes and sends (shares by direct message); originality | Captions on screen; sound-off viewing is common. Caption up to 2,200 characters, about 125 shown before "more" |
|
|
32
|
+
| Instagram feed | Image or carousel 4:5 (also 1:1) | Carousels 2 to 10 cards | Saves, sends, likes; carousel swipes | No sound; the first card carries the hook |
|
|
33
|
+
| Instagram Stories | 9:16, 2 to 7 beats | Each story card is short; sequences aim for 3 to 5 beats | Taps forward and replies; completion of the sequence | Text on screen; stickers and links sit in the UI zones |
|
|
34
|
+
| YouTube Shorts | Video 9:16 | Up to 3 minutes (older limits were 60 s) | Viewed vs swiped away, then average view duration | Sound on, captions on screen; title up to 100 characters |
|
|
35
|
+
| Facebook | Reels 9:16; feed image or video 1:1 | Reels are short vertical video; feed video varies | Watch time, shares, meaningful comments | Most feed video is watched muted: captions are required |
|
|
36
|
+
|
|
37
|
+
## Mapping to Conductor placements
|
|
38
|
+
|
|
39
|
+
| Placement key | Shape | Typical destinations |
|
|
40
|
+
|---|---|---|
|
|
41
|
+
| `9x16` | 1080x1920 vertical | TikTok, Instagram Reels, YouTube Shorts, Facebook Reels |
|
|
42
|
+
| `4x5` | portrait | Instagram feed |
|
|
43
|
+
| `1x1` | square | Facebook feed (also Instagram feed) |
|
|
44
|
+
| `story` | vertical, sequence frames | Instagram and Facebook Stories |
|
|
45
|
+
| `16x9` | landscape | YouTube (standard) |
|
|
46
|
+
| `1.91x1` | wide link-ad | link ads |
|
|
47
|
+
| `2x3` | tall pin | Pinterest |
|
|
48
|
+
|
|
49
|
+
The enabled placements come from the Brand Kit; a Creative can opt in to more via `placements`.
|
|
50
|
+
`attach_creative_to_post` does the placement to destination mapping later; this skill stops at the
|
|
51
|
+
committed Creative.
|
|
52
|
+
|
|
53
|
+
## Picking a format from the idea
|
|
54
|
+
|
|
55
|
+
- A single claim or quote: a STILL at `9x16` plus `4x5` and `1x1`.
|
|
56
|
+
- A sequence with a payoff on the last beat: a carousel (5 to 7 cards perform best, one shared
|
|
57
|
+
ratio) or a story (3 to 5 beats).
|
|
58
|
+
- A beat-by-beat reveal or kinetic text: MOTION, 6 to 15 s, over a photo or a clip on hand.
|
|
59
|
+
- A person, demonstration or skit: `FILM`, vertical, shot to the safe zones above.
|