Brand Voice Guideline Generation
Turn discovered signal into a single source of truth for the brand's voice, then express it as
Bolta writer parameters so it's operational, not just a document.
When to use
After brand-voice-discover, or whenever the user wants a formal voice guide. If no discovery
report exists in the session, run discovery first (or gather at least DNA + published posts).
Tools this skill uses
| Tool |
Why |
get-voice-context |
Anchor the guideline to Bolta's existing compiled voice, if any. |
list-business-dna / get-business-dna |
Confirm industry / audience / positioning for the mapping. |
extract-business-dna |
Optional — seed Business DNA by scraping the brand's website (needs a url; reaches the internet + uses credits). Pass set_as_default=false — it defaults to true and silently demotes the workspace's existing default DNA. |
update-business-dna |
Edit an existing DNA record — safe partial merge: pass only the changed keys in fields; omitted fields are preserved server-side. Covers tagline, colors/fonts/aesthetics, overview, local identity (city, service area, owner/staff), story, and image settings (logo placement, custom image instructions). |
list-voice-profiles |
Check whether a profile already exists (create new vs. evolve existing). |
create-voice-profile |
Persist the guideline as a native Bolta Voice Profile every agent then consumes. |
update-voice-profile |
Evolve an existing profile in place (partial update — omitted fields preserved). |
voice-generate |
Produce ONE sample draft to validate the mapping works end-to-end. |
Synthesis structure comes from references/guideline-template.md; scoring from
references/confidence-scoring.md. QA is done inline (Step 5).
Prerequisites
- A discovery report (from
brand-voice-discover) or equivalent gathered signal.
workspace_id — reuse from discovery (resolve once via list-workspaces). Auth is automatic
via the Bolta connector's OAuth grant — never ask for an API key. Default new content to
Draft; confirm before persisting/overwriting a profile.
references/guideline-template.md — output structure.
references/confidence-scoring.md — how to score each section.
Workflow
1. Assemble inputs
Take the discovery report. If thin, pull get-voice-context and list-business-dna /
get-business-dna to fill industry, audience, and positioning before synthesizing.
2. Synthesize the guideline
Following references/guideline-template.md, produce every section:
- We Are / We Are Not — at least 4 rows, each attribute paired with its opposite boundary,
each backed by evidence from discovery.
- Brand personality, messaging framework, terminology (must-use / preferred / avoid / never).
- Tone-by-context matrix — at least 3 contexts (e.g. LinkedIn, X, cold email, proposal),
each scored on formality / energy / technical depth.
- Content examples — before/after showing the voice applied.
3. Score confidence
Per references/confidence-scoring.md, assign High / Medium / Low to each section based on
evidence strength, volume, and source reliability (published posts and transcripts count as
behavioral evidence). Produce a confidence table and an aggregate weighted score.
4. Surface open questions — each WITH a recommendation
For every gap or conflict, write an open question AND a recommended default the brand can
accept as-is. Never leave a decision hanging without a recommendation.
5. QA
Guard the guideline before shipping it: verify all sections populated, 4+ We Are / We Are Not
rows, tone matrix covering 3+ contexts, 3+ attributes each with quoted evidence, confidence
assigned per section, every open question carrying a recommended default, sources attributed,
no PII, and the voice-generate parameter mapping present and faithful. Return pass or a
specific list of gaps and revise on them — never ship a partial guideline.
6. Express as voice-generate parameters — the operational half
Map the guideline onto Bolta's writer params so it drives generation immediately (see the
"voice-generate parameter mapping" section of references/guideline-template.md):
tone ← the dominant register from the We-Are attributes + default tone-matrix row, as a
short string (e.g. "professional, direct") — voice-generate takes a string here;
the 0-100 dials object belongs to create-voice-profile/update-voice-profile only.
dos[] ← the "We Are" attributes and must-use / preferred terminology, as imperative rules.
donts[] ← the "We Are Not" boundaries and avoid / never terminology.
custom_rules ← nuanced rules that don't fit dos/donts (structural, formatting, tone flexes).
context ← positioning + audience summary.
business_name / niche ← from Business DNA.
Present this block as copy-ready — it's what makes the guideline enforceable.
7. Validate the mapping with one sample
Call voice-generate once with the mapped params (a single, low-max_posts sample on a
representative topic) to confirm the mapping yields on-brand output. Show the sample; if it
misses, tune the mapping and note what changed. Do not publish the sample.
8. Persist into Bolta — the durable half
Write the guideline back into Bolta so it drives the writer AND every autonomous agent, not
just this session. Confirm with the user before creating/overwriting, then:
list-voice-profiles → decide create vs evolve.
- New brand:
create-voice-profile(workspace_id, name, tone={…dials…} OR writing_sample=<a strong on-brand excerpt>, tone_of_voice=[…], target_audience, dos, donts, content_size, pacing). Provide either a tone dials object or a writing_sample (≥50 chars) — the
server extracts tone from the sample. Map the guideline's We-Are/We-Are-Not into dos/donts.
- Evolving brand:
update-voice-profile(workspace_id, profile_id, …only changed fields…).
This is a partial update — omitted fields are preserved, so voice refines safely over time.
Know its limits: it accepts only the structured fields (name, tone dials,
tone_of_voice, target_audience, dos, donts, content_size, pacing,
speaker_mode, default_post_intent, business_dna_id, is_default). The profile's
prose fields (brand persona, custom rules, description) also drive the writer prompt but
are NOT editable through this tool — if the drift you're correcting lives in that prose,
say so honestly and point the user at the Bolta app to edit it; don't imply the evolve
call fixed it.
- Optional:
extract-business-dna(workspace_id, url=<brand site>, set_as_default=false)
first to seed Business DNA, then reference it when generating. set_as_default defaults
to true and silently demotes the existing default Business DNA — only omit it (or set
true) when the user explicitly wants the new record as the workspace default; confirm
first if a default already exists.
- If the guideline surfaced corrections to the brand identity itself — a sharper tagline,
updated positioning/overview, brand colors, local identity details, or image styling — apply
them with
update-business-dna(workspace_id, dna_id, fields={…only the changed keys…}).
It's a safe partial merge (omitted fields preserved), so users can just say "change our
tagline to X" or "our brand colors are navy and sky blue" and you edit exactly that. Call
get-business-dna first to show current values, and confirm before writing.
This is what makes brand voice foundational: the persisted profile flows into voice-generate,
ad-hoc drafts, and every hired agent automatically.
9. Save the document and hand off
Also save the human-readable guideline (session artifact) so brand-voice-enforce and
brand-voice-validate can consume it. Tell the user which profile was created/updated and that
every agent in this workspace now inherits the voice.
Failure handling
- No discovery signal at all → stop and route to
brand-voice-discover; don't fabricate.
voice-generate sample fails → still deliver the guideline + mapping; note the writer was
unavailable and the mapping is unvalidated end-to-end.
create-voice-profile requires a tone object or writing_sample — if the tone dials
aren't clear, pass a strong on-brand excerpt as writing_sample and let the server extract.
- Permission error on
create-voice-profile / update-voice-profile (needs voice:write) →
report the missing scope; still deliver the guideline document + voice-generate mapping so
the voice is usable without persistence.
- QA (Step 5) flags missing sections → fix before delivering; never ship a partial guideline.
Example
User: "Turn our discovery report into brand guidelines."
- Assemble report (+
get-business-dna for niche/business_name).
- Synthesize: 5 We-Are rows, tone matrix for LinkedIn/X/email, terminology tables.
- Score: aggregate High (published-post evidence strong); email row Medium (thin evidence).
- Open Qs: "Is dry humor OK in cold email? Recommend: keep it minimal, default off."
- QA pass → passes after adding evidence to one attribute.
- Mapping:
tone="professional, direct", dos=["lead with a number", "say platform not tool"], donts=["no 'thrilled to announce'","no hype adjectives"].
voice-generate(max_posts=1, topics=["feature launch"], ...) → on-brand.
- Persist:
create-voice-profile(workspace_id, name="Brand Voice", tone={…}, tone_of_voice= ["confident","proof-driven"], dos=[…], donts=[…], target_audience="DevOps leads") → save
guideline doc → "Created the 'Brand Voice' profile; every agent now writes in it."
1---2name: brand-voice-generate3description: Synthesize a discovery report into a finished, enforceable Bolta Brand Voice Guideline. Use this skill when the user asks to "generate brand guidelines", "create a style guide", "build our voice guide", "write our brand voice doc", "turn this into guidelines", or "codify how we sound". Produces a structured guideline (We Are / We Are Not, tone-by-context matrix, terminology, confidence scores, open questions) AND — critically — a ready-to-use `voice-generate` parameter mapping so the guideline immediately drives Bolta's writer and every agent. For gathering evidence first use brand-voice-discover; for writing on-brand content use brand-voice-enforce; for scoring content use brand-voice-validate.4---56# Brand Voice Guideline Generation78Turn discovered signal into a single source of truth for the brand's voice, then express it as9Bolta writer parameters so it's operational, not just a document.1011## When to use12After `brand-voice-discover`, or whenever the user wants a formal voice guide. If no discovery13report exists in the session, run discovery first (or gather at least DNA + published posts).1415## Tools this skill uses16| Tool | Why |17|-|-|18| `get-voice-context` | Anchor the guideline to Bolta's existing compiled voice, if any. |19| `list-business-dna` / `get-business-dna` | Confirm industry / audience / positioning for the mapping. |20| `extract-business-dna` | Optional — seed Business DNA by scraping the brand's website (needs a `url`; reaches the internet + uses credits). **Pass `set_as_default=false`** — it defaults to true and silently demotes the workspace's existing default DNA. |21| `update-business-dna` | **Edit** an existing DNA record — safe partial merge: pass only the changed keys in `fields`; omitted fields are preserved server-side. Covers tagline, colors/fonts/aesthetics, overview, local identity (city, service area, owner/staff), story, and image settings (logo placement, custom image instructions). |22| `list-voice-profiles` | Check whether a profile already exists (create new vs. evolve existing). |23| `create-voice-profile` | **Persist** the guideline as a native Bolta Voice Profile every agent then consumes. |24| `update-voice-profile` | **Evolve** an existing profile in place (partial update — omitted fields preserved). |25| `voice-generate` | Produce ONE sample draft to validate the mapping works end-to-end. |2627Synthesis structure comes from `references/guideline-template.md`; scoring from28`references/confidence-scoring.md`. QA is done inline (Step 5).2930## Prerequisites31- A discovery report (from `brand-voice-discover`) or equivalent gathered signal.32- `workspace_id` — reuse from discovery (resolve once via `list-workspaces`). Auth is automatic33 via the Bolta connector's OAuth grant — never ask for an API key. Default new content to34 Draft; confirm before persisting/overwriting a profile.35- `references/guideline-template.md` — output structure.36- `references/confidence-scoring.md` — how to score each section.3738## Workflow3940### 1. Assemble inputs41Take the discovery report. If thin, pull `get-voice-context` and `list-business-dna` /42`get-business-dna` to fill industry, audience, and positioning before synthesizing.4344### 2. Synthesize the guideline45Following `references/guideline-template.md`, produce every section:46- **We Are / We Are Not** — at least 4 rows, each attribute paired with its opposite boundary,47 each backed by evidence from discovery.48- **Brand personality, messaging framework, terminology** (must-use / preferred / avoid / never).49- **Tone-by-context matrix** — at least 3 contexts (e.g. LinkedIn, X, cold email, proposal),50 each scored on formality / energy / technical depth.51- **Content examples** — before/after showing the voice applied.5253### 3. Score confidence54Per `references/confidence-scoring.md`, assign High / Medium / Low to each section based on55evidence strength, volume, and source reliability (published posts and transcripts count as56behavioral evidence). Produce a confidence table and an aggregate weighted score.5758### 4. Surface open questions — each WITH a recommendation59For every gap or conflict, write an open question AND a recommended default the brand can60accept as-is. Never leave a decision hanging without a recommendation.6162### 5. QA63Guard the guideline before shipping it: verify all sections populated, 4+ We Are / We Are Not64rows, tone matrix covering 3+ contexts, 3+ attributes each with quoted evidence, confidence65assigned per section, every open question carrying a recommended default, sources attributed,66no PII, and the `voice-generate` parameter mapping present and faithful. Return pass or a67specific list of gaps and revise on them — never ship a partial guideline.6869### 6. Express as `voice-generate` parameters — the operational half70Map the guideline onto Bolta's writer params so it drives generation immediately (see the71"voice-generate parameter mapping" section of `references/guideline-template.md`):72- `tone` ← the dominant register from the We-Are attributes + default tone-matrix row, as a73 short **string** (e.g. `"professional, direct"`) — `voice-generate` takes a string here;74 the 0-100 dials object belongs to `create-voice-profile`/`update-voice-profile` only.75- `dos[]` ← the "We Are" attributes and must-use / preferred terminology, as imperative rules.76- `donts[]` ← the "We Are Not" boundaries and avoid / never terminology.77- `custom_rules` ← nuanced rules that don't fit dos/donts (structural, formatting, tone flexes).78- `context` ← positioning + audience summary.79- `business_name` / `niche` ← from Business DNA.80Present this block as copy-ready — it's what makes the guideline enforceable.8182### 7. Validate the mapping with one sample83Call `voice-generate` once with the mapped params (a single, low-`max_posts` sample on a84representative topic) to confirm the mapping yields on-brand output. Show the sample; if it85misses, tune the mapping and note what changed. Do not publish the sample.8687### 8. Persist into Bolta — the durable half88Write the guideline back into Bolta so it drives the writer AND every autonomous agent, not89just this session. Confirm with the user before creating/overwriting, then:90- `list-voice-profiles` → decide **create** vs **evolve**.91- **New brand:** `create-voice-profile(workspace_id, name, tone={…dials…} OR writing_sample=<a92 strong on-brand excerpt>, tone_of_voice=[…], target_audience, dos, donts, content_size,93 pacing)`. Provide **either** a `tone` dials object **or** a `writing_sample` (≥50 chars) — the94 server extracts tone from the sample. Map the guideline's We-Are/We-Are-Not into `dos`/`donts`.95- **Evolving brand:** `update-voice-profile(workspace_id, profile_id, …only changed fields…)`.96 This is a partial update — omitted fields are preserved, so voice refines safely over time.97 Know its limits: it accepts only the structured fields (`name`, `tone` dials,98 `tone_of_voice`, `target_audience`, `dos`, `donts`, `content_size`, `pacing`,99 `speaker_mode`, `default_post_intent`, `business_dna_id`, `is_default`). The profile's100 prose fields (brand persona, custom rules, description) also drive the writer prompt but101 are NOT editable through this tool — if the drift you're correcting lives in that prose,102 say so honestly and point the user at the Bolta app to edit it; don't imply the evolve103 call fixed it.104- Optional: `extract-business-dna(workspace_id, url=<brand site>, set_as_default=false)`105 first to seed Business DNA, then reference it when generating. `set_as_default` defaults106 to **true** and silently demotes the existing default Business DNA — only omit it (or set107 true) when the user explicitly wants the new record as the workspace default; confirm108 first if a default already exists.109- If the guideline surfaced corrections to the brand identity itself — a sharper tagline,110 updated positioning/overview, brand colors, local identity details, or image styling — apply111 them with `update-business-dna(workspace_id, dna_id, fields={…only the changed keys…})`.112 It's a safe partial merge (omitted fields preserved), so users can just say "change our113 tagline to X" or "our brand colors are navy and sky blue" and you edit exactly that. Call114 `get-business-dna` first to show current values, and confirm before writing.115116This is what makes brand voice foundational: the persisted profile flows into `voice-generate`,117ad-hoc drafts, and every hired agent automatically.118119### 9. Save the document and hand off120Also save the human-readable guideline (session artifact) so `brand-voice-enforce` and121`brand-voice-validate` can consume it. Tell the user which profile was created/updated and that122every agent in this workspace now inherits the voice.123124## Failure handling125- No discovery signal at all → stop and route to `brand-voice-discover`; don't fabricate.126- `voice-generate` sample fails → still deliver the guideline + mapping; note the writer was127 unavailable and the mapping is unvalidated end-to-end.128- `create-voice-profile` requires a `tone` object **or** `writing_sample` — if the tone dials129 aren't clear, pass a strong on-brand excerpt as `writing_sample` and let the server extract.130- Permission error on `create-voice-profile` / `update-voice-profile` (needs voice:write) →131 report the missing scope; still deliver the guideline document + `voice-generate` mapping so132 the voice is usable without persistence.133- QA (Step 5) flags missing sections → fix before delivering; never ship a partial guideline.134135## Example136User: "Turn our discovery report into brand guidelines."1371. Assemble report (+ `get-business-dna` for niche/business_name).1382. Synthesize: 5 We-Are rows, tone matrix for LinkedIn/X/email, terminology tables.1393. Score: aggregate High (published-post evidence strong); email row Medium (thin evidence).1404. Open Qs: "Is dry humor OK in cold email? Recommend: keep it minimal, default off."1415. QA pass → passes after adding evidence to one attribute.1426. Mapping: `tone="professional, direct"`, `dos=["lead with a number",143 "say platform not tool"]`, `donts=["no 'thrilled to announce'","no hype adjectives"]`.1447. `voice-generate(max_posts=1, topics=["feature launch"], ...)` → on-brand.1458. Persist: `create-voice-profile(workspace_id, name="Brand Voice", tone={…}, tone_of_voice=146 ["confident","proof-driven"], dos=[…], donts=[…], target_audience="DevOps leads")` → save147 guideline doc → "Created the 'Brand Voice' profile; every agent now writes in it."