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: >4 Synthesize a discovery report into a finished, enforceable Bolta Brand Voice Guideline. Use5 this skill when the user asks to "generate brand guidelines", "create a style guide", "build6 our voice guide", "write our brand voice doc", "turn this into guidelines", or "codify how we7 sound". Produces a structured guideline (We Are / We Are Not, tone-by-context matrix,8 terminology, confidence scores, open questions) AND — critically — a ready-to-use9 `voice-generate` parameter mapping so the guideline immediately drives Bolta's writer and10 every agent. For gathering evidence first use brand-voice-discover; for writing on-brand11 content use brand-voice-enforce; for scoring content use brand-voice-validate.12---1314# Brand Voice Guideline Generation1516Turn discovered signal into a single source of truth for the brand's voice, then express it as17Bolta writer parameters so it's operational, not just a document.1819## When to use20After `brand-voice-discover`, or whenever the user wants a formal voice guide. If no discovery21report exists in the session, run discovery first (or gather at least DNA + published posts).2223## Tools this skill uses24| Tool | Why |25|-|-|26| `get-voice-context` | Anchor the guideline to Bolta's existing compiled voice, if any. |27| `list-business-dna` / `get-business-dna` | Confirm industry / audience / positioning for the mapping. |28| `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. |29| `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). |30| `list-voice-profiles` | Check whether a profile already exists (create new vs. evolve existing). |31| `create-voice-profile` | **Persist** the guideline as a native Bolta Voice Profile every agent then consumes. |32| `update-voice-profile` | **Evolve** an existing profile in place (partial update — omitted fields preserved). |33| `voice-generate` | Produce ONE sample draft to validate the mapping works end-to-end. |3435Synthesis structure comes from `references/guideline-template.md`; scoring from36`references/confidence-scoring.md`. QA is done inline (Step 5).3738## Prerequisites39- A discovery report (from `brand-voice-discover`) or equivalent gathered signal.40- `workspace_id` — reuse from discovery (resolve once via `list-workspaces`). Auth is automatic41 via the Bolta connector's OAuth grant — never ask for an API key. Default new content to42 Draft; confirm before persisting/overwriting a profile.43- `references/guideline-template.md` — output structure.44- `references/confidence-scoring.md` — how to score each section.4546## Workflow4748### 1. Assemble inputs49Take the discovery report. If thin, pull `get-voice-context` and `list-business-dna` /50`get-business-dna` to fill industry, audience, and positioning before synthesizing.5152### 2. Synthesize the guideline53Following `references/guideline-template.md`, produce every section:54- **We Are / We Are Not** — at least 4 rows, each attribute paired with its opposite boundary,55 each backed by evidence from discovery.56- **Brand personality, messaging framework, terminology** (must-use / preferred / avoid / never).57- **Tone-by-context matrix** — at least 3 contexts (e.g. LinkedIn, X, cold email, proposal),58 each scored on formality / energy / technical depth.59- **Content examples** — before/after showing the voice applied.6061### 3. Score confidence62Per `references/confidence-scoring.md`, assign High / Medium / Low to each section based on63evidence strength, volume, and source reliability (published posts and transcripts count as64behavioral evidence). Produce a confidence table and an aggregate weighted score.6566### 4. Surface open questions — each WITH a recommendation67For every gap or conflict, write an open question AND a recommended default the brand can68accept as-is. Never leave a decision hanging without a recommendation.6970### 5. QA71Guard the guideline before shipping it: verify all sections populated, 4+ We Are / We Are Not72rows, tone matrix covering 3+ contexts, 3+ attributes each with quoted evidence, confidence73assigned per section, every open question carrying a recommended default, sources attributed,74no PII, and the `voice-generate` parameter mapping present and faithful. Return pass or a75specific list of gaps and revise on them — never ship a partial guideline.7677### 6. Express as `voice-generate` parameters — the operational half78Map the guideline onto Bolta's writer params so it drives generation immediately (see the79"voice-generate parameter mapping" section of `references/guideline-template.md`):80- `tone` ← the dominant register from the We-Are attributes + default tone-matrix row, as a81 short **string** (e.g. `"professional, direct"`) — `voice-generate` takes a string here;82 the 0-100 dials object belongs to `create-voice-profile`/`update-voice-profile` only.83- `dos[]` ← the "We Are" attributes and must-use / preferred terminology, as imperative rules.84- `donts[]` ← the "We Are Not" boundaries and avoid / never terminology.85- `custom_rules` ← nuanced rules that don't fit dos/donts (structural, formatting, tone flexes).86- `context` ← positioning + audience summary.87- `business_name` / `niche` ← from Business DNA.88Present this block as copy-ready — it's what makes the guideline enforceable.8990### 7. Validate the mapping with one sample91Call `voice-generate` once with the mapped params (a single, low-`max_posts` sample on a92representative topic) to confirm the mapping yields on-brand output. Show the sample; if it93misses, tune the mapping and note what changed. Do not publish the sample.9495### 8. Persist into Bolta — the durable half96Write the guideline back into Bolta so it drives the writer AND every autonomous agent, not97just this session. Confirm with the user before creating/overwriting, then:98- `list-voice-profiles` → decide **create** vs **evolve**.99- **New brand:** `create-voice-profile(workspace_id, name, tone={…dials…} OR writing_sample=<a100 strong on-brand excerpt>, tone_of_voice=[…], target_audience, dos, donts, content_size,101 pacing)`. Provide **either** a `tone` dials object **or** a `writing_sample` (≥50 chars) — the102 server extracts tone from the sample. Map the guideline's We-Are/We-Are-Not into `dos`/`donts`.103- **Evolving brand:** `update-voice-profile(workspace_id, profile_id, …only changed fields…)`.104 This is a partial update — omitted fields are preserved, so voice refines safely over time.105 Know its limits: it accepts only the structured fields (`name`, `tone` dials,106 `tone_of_voice`, `target_audience`, `dos`, `donts`, `content_size`, `pacing`,107 `speaker_mode`, `default_post_intent`, `business_dna_id`, `is_default`). The profile's108 prose fields (brand persona, custom rules, description) also drive the writer prompt but109 are NOT editable through this tool — if the drift you're correcting lives in that prose,110 say so honestly and point the user at the Bolta app to edit it; don't imply the evolve111 call fixed it.112- Optional: `extract-business-dna(workspace_id, url=<brand site>, set_as_default=false)`113 first to seed Business DNA, then reference it when generating. `set_as_default` defaults114 to **true** and silently demotes the existing default Business DNA — only omit it (or set115 true) when the user explicitly wants the new record as the workspace default; confirm116 first if a default already exists.117- If the guideline surfaced corrections to the brand identity itself — a sharper tagline,118 updated positioning/overview, brand colors, local identity details, or image styling — apply119 them with `update-business-dna(workspace_id, dna_id, fields={…only the changed keys…})`.120 It's a safe partial merge (omitted fields preserved), so users can just say "change our121 tagline to X" or "our brand colors are navy and sky blue" and you edit exactly that. Call122 `get-business-dna` first to show current values, and confirm before writing.123124This is what makes brand voice foundational: the persisted profile flows into `voice-generate`,125ad-hoc drafts, and every hired agent automatically.126127### 9. Save the document and hand off128Also save the human-readable guideline (session artifact) so `brand-voice-enforce` and129`brand-voice-validate` can consume it. Tell the user which profile was created/updated and that130every agent in this workspace now inherits the voice.131132## Failure handling133- No discovery signal at all → stop and route to `brand-voice-discover`; don't fabricate.134- `voice-generate` sample fails → still deliver the guideline + mapping; note the writer was135 unavailable and the mapping is unvalidated end-to-end.136- `create-voice-profile` requires a `tone` object **or** `writing_sample` — if the tone dials137 aren't clear, pass a strong on-brand excerpt as `writing_sample` and let the server extract.138- Permission error on `create-voice-profile` / `update-voice-profile` (needs voice:write) →139 report the missing scope; still deliver the guideline document + `voice-generate` mapping so140 the voice is usable without persistence.141- QA (Step 5) flags missing sections → fix before delivering; never ship a partial guideline.142143## Example144User: "Turn our discovery report into brand guidelines."1451. Assemble report (+ `get-business-dna` for niche/business_name).1462. Synthesize: 5 We-Are rows, tone matrix for LinkedIn/X/email, terminology tables.1473. Score: aggregate High (published-post evidence strong); email row Medium (thin evidence).1484. Open Qs: "Is dry humor OK in cold email? Recommend: keep it minimal, default off."1495. QA pass → passes after adding evidence to one attribute.1506. Mapping: `tone="professional, direct"`, `dos=["lead with a number",151 "say platform not tool"]`, `donts=["no 'thrilled to announce'","no hype adjectives"]`.1527. `voice-generate(max_posts=1, topics=["feature launch"], ...)` → on-brand.1538. Persist: `create-voice-profile(workspace_id, name="Brand Voice", tone={…}, tone_of_voice=154 ["confident","proof-driven"], dos=[…], donts=[…], target_audience="DevOps leads")` → save155 guideline doc → "Created the 'Brand Voice' profile; every agent now writes in it."