Brand Voice Discovery
Gather every available signal about how the brand sounds — what Bolta already stores, what
the brand has already published, and anything the user uploads — then output a structured
discovery report that brand-voice-generate turns into a guideline. Do not invent voice;
only surface, rank, and reconcile evidence.
When to use
The starting point of the brand-voice loop, or any time the user wants to understand their
current voice signal before committing to a guideline. Run this first when no session
guideline exists.
Tools this skill uses
| Tool |
Why |
list-workspaces |
Resolve workspace_id (start here). |
list-business-dna / get-business-dna |
Existing Business DNA — industry, audience, positioning. |
list-voice-profiles / get-voice-profile |
Any Voice Profiles already stored in Bolta. |
get-voice-context |
Bolta's compiled voice context (tone, dos/donts, exemplars) if one exists. |
list-accounts |
Connected platforms — shows where the brand actually speaks. |
list-workspace-posts |
Published posts (status=published) — these ARE primary voice evidence. Add include_metrics=true for per-post engagement. |
extract-business-dna |
Scrape the brand's website into a Business DNA record (needs a url; reaches the internet + uses AI credits). The fastest cold-start source. Pass set_as_default=false — it defaults to true and silently demotes the workspace's existing default DNA. |
update-business-dna |
Fix what discovery finds wrong in the stored DNA — safe partial merge: only the keys sent in fields change, everything omitted is preserved. Tagline, overview, colors/fonts, local identity, story, image settings. |
Two more sources need no tool call: the brand's website (you can read public pages
directly since ChatGPT has internet access) and what ChatGPT already knows about a
recognizable brand. Both are supporting evidence — always confirm against the brand-owned
Bolta signal, never let outside knowledge override what the brand actually publishes.
Heavy parsing of uploads and posts is done inline using the analysis behaviors below.
Prerequisites
workspace_id — resolve once via list-workspaces and reuse it for every call. Auth is
automatic via the Bolta connector's OAuth grant — never ask for an API key. Default any new
content to Draft; confirm before publish/delete.
- Optional user uploads: brand docs (PDF/PPTX/DOCX/MD/TXT), sales/interview transcripts, or
pasted sample copy. Parse these inline: brand documents and transcripts via the
signal-distiller behavior (Step 5), and the brand's own published posts via the
voice-archaeologist behavior (Step 4). A brand website URL is a strong optional input too
(Step 3).
Workflow
1. Resolve the workspace
Call list-workspaces; use the active workspace's id. If several exist, confirm which one
with the user. Never guess a UUID.
2. Pull existing Bolta signal
In parallel where possible:
list-business-dna → get-business-dna for each record (industry, audience, positioning).
If the user spots something stale or wrong in a record while reviewing it ("that tagline is
old", "we moved — the city is wrong", "our colors are navy and sky blue now"), fix it
conversationally with update-business-dna(workspace_id, dna_id, fields={…changed keys only…}) — it's a safe partial merge, omitted fields are preserved, so a one-field
correction can't wipe the rest. Confirm the change before writing.
list-voice-profiles → get-voice-profile for each profile (stored tone, dos/donts, exemplars).
get-voice-context — the compiled context Bolta's writer already uses, if any.
list-accounts — which platforms are connected (context for where the voice lives).
This is authoritative brand-owned signal; weight it highest.
3. Pull website + external signal
If the user gives (or you can infer) the brand's website, use it — it's the fastest cold-start
source and often the clearest statement of positioning and voice:
- Read the public site directly (homepage, about, product pages) for headline voice, value
props, and terminology; and/or call
extract-business-dna with the url to structure it
into a Business DNA record you can reference later. Pass set_as_default=false — the
param defaults to true and silently demotes the workspace's existing default Business DNA.
Only set it true (or omit it) when the user explicitly wants the extracted record to
become the default, and confirm first if a default already exists.
- If the brand is recognizable, you may draw on what ChatGPT already knows about it — but treat
this as a hypothesis to confirm, never as fact. State that it's external knowledge.
Rank this below brand-owned Bolta signal and published posts: the website says how the
brand wants to sound; the posts show how it actually sounds. When they disagree, the posts win
and the gap becomes an open question.
4. Pull published-content evidence
Call list-workspace-posts with status=published and include_metrics=true — each post
then carries per-platform engagement (views, likes, comments, reposts) alongside its text.
The default page is 50 posts (max 100); page through with limit/page so the evidence
isn't silently truncated to the first page. Published posts are behavioral voice evidence —
how the brand actually talks in public. Excavate the brand's lived voice from Bolta's own
evidence (the voice-archaeologist behavior): pull the published posts with their
per-post metrics, and the review signal (list-reviews, list-recurring-reviews)
— what the team approved untouched vs. edited vs. rejected. Extract voice attributes each
backed by a quoted real post, ranked by consistency; mark attributes that correlate with
higher engagement as "proven" not just "present"; treat systematic edits (always cutting hype,
always adding a number) as implicit rules and rejected phrasings as "We Are Not" candidates.
Redact customer names/PII from quotes. Weak evidence = 1 post; strong = a pattern across 8+.
5. Classify and parse uploads
For each user-provided asset, distill it inline using the signal-distiller behavior:
turn uploaded materials (decks, one-pagers, brand books, transcripts, site copy) into Bolta's
structured models — Business DNA {industry, audience, positioning, offer} and Voice Profile
fields {tone dials OR a writing_sample excerpt, tone_of_voice[], dos[], donts[],
target_audience, terminology: must-use/preferred/avoid/never}. Attribute every field to its
source; leave ungrounded fields empty rather than inventing; prefer a strong on-brand
writing_sample over guessing precise tone dials when material is qualitative. Where uploaded
materials disagree with the brand's shipped posts, flag it as an open question rather than
silently picking one. Transcripts (sales calls, founder interviews) often carry the truest,
unscripted voice signal. Keep only the structured extractions.
6. Reconcile and rank
Merge every source into one picture. Rank sources by reliability (brand-owned DNA/Voice
Profiles > published posts > brand documents > transcripts > pasted samples), noting recency
and volume. Flag conflicts explicitly (e.g. DNA says "formal", published posts read casual).
7. Output the discovery report
Produce a structured report:
- Ranked sources — each with type, reliability weight, recency, and volume.
- Extracted attributes — candidate "We Are" traits, each with the evidence behind it.
- Terminology signal — words the brand uses / avoids.
- Tone-by-context observations — how register shifts by platform/topic.
- Conflicts — where sources disagree, with both readings.
- Gaps — attributes with thin or no evidence.
- Open questions — what
brand-voice-generate must resolve, each with a suggested default.
Failure handling
- No workspace / permission error → report the missing scope (
get-my-capabilities) and stop.
- No Business DNA, Voice Profiles, or voice context yet → say so plainly; lean on published
posts and uploads. A brand-new workspace with no posts and no uploads = not enough signal;
ask the user for sample content rather than fabricating a voice.
- No published posts → note the gap; discovery still proceeds from DNA/uploads, but flag that
behavioral evidence is missing so confidence will be lower downstream.
- Upload unreadable → report which asset failed and continue with the rest.
Example
User: "Analyze our brand voice — here's our pitch deck and last quarter's posts are in Bolta."
list-workspaces → workspace_id.
list-business-dna/get-business-dna → SaaS, ops leaders, "developer-first" positioning;
list-voice-profiles empty; get-voice-context empty; list-accounts → LinkedIn + X.
list-workspace-posts(status=published, include_metrics=true) → 40 posts → voice-archaeologist pass → "direct,
proof-driven, dry humor; avoids hype; LinkedIn more formal than X."
- Pitch deck → signal-distiller pass → terminology ("platform" not "tool"), 3 messaging pillars.
- Reconcile: deck says "visionary", posts read "pragmatic" → conflict flagged.
- Report: 5 ranked sources, 6 candidate attributes with evidence, 1 conflict, 2 gaps,
3 open questions → hand to
brand-voice-generate.
1---2name: brand-voice-discover3description: Discover and inventory a brand's voice signal before any guideline is written. Use this skill when the user asks to "discover our brand voice", "analyze my brand", "learn my brand voice from my website", "figure out how we sound", "extract brand voice from our site", "audit our brand", gives a brand URL, or uploads brand docs, style notes, sales-call transcripts, or past posts and wants them turned into voice signal. Pulls from four sources: the brand's website, what's already in Bolta, the brand's own published posts, and anything the user provides. This is the research step — it gathers and ranks evidence but does NOT synthesize the finished guideline (use brand-voice-generate) or write content (use brand-voice-enforce).4---56# Brand Voice Discovery78Gather every available signal about how the brand sounds — what Bolta already stores, what9the brand has already published, and anything the user uploads — then output a structured10discovery report that `brand-voice-generate` turns into a guideline. Do not invent voice;11only surface, rank, and reconcile evidence.1213## When to use14The starting point of the brand-voice loop, or any time the user wants to understand their15current voice signal before committing to a guideline. Run this first when no session16guideline exists.1718## Tools this skill uses19| Tool | Why |20|-|-|21| `list-workspaces` | Resolve `workspace_id` (start here). |22| `list-business-dna` / `get-business-dna` | Existing Business DNA — industry, audience, positioning. |23| `list-voice-profiles` / `get-voice-profile` | Any Voice Profiles already stored in Bolta. |24| `get-voice-context` | Bolta's compiled voice context (tone, dos/donts, exemplars) if one exists. |25| `list-accounts` | Connected platforms — shows where the brand actually speaks. |26| `list-workspace-posts` | Published posts (`status=published`) — these ARE primary voice evidence. Add `include_metrics=true` for per-post engagement. |27| `extract-business-dna` | Scrape the brand's **website** into a Business DNA record (needs a `url`; reaches the internet + uses AI credits). The fastest cold-start source. **Pass `set_as_default=false`** — it defaults to true and silently demotes the workspace's existing default DNA. |28| `update-business-dna` | Fix what discovery finds wrong in the stored DNA — safe partial merge: only the keys sent in `fields` change, everything omitted is preserved. Tagline, overview, colors/fonts, local identity, story, image settings. |2930Two more sources need no tool call: the **brand's website** (you can read public pages31directly since ChatGPT has internet access) and **what ChatGPT already knows** about a32recognizable brand. Both are supporting evidence — always confirm against the brand-owned33Bolta signal, never let outside knowledge override what the brand actually publishes.34Heavy parsing of uploads and posts is done inline using the analysis behaviors below.3536## Prerequisites37- `workspace_id` — resolve once via `list-workspaces` and reuse it for every call. Auth is38 automatic via the Bolta connector's OAuth grant — never ask for an API key. Default any new39 content to Draft; confirm before publish/delete.40- Optional user uploads: brand docs (PDF/PPTX/DOCX/MD/TXT), sales/interview transcripts, or41 pasted sample copy. Parse these inline: brand documents and transcripts via the42 signal-distiller behavior (Step 5), and the brand's own published posts via the43 voice-archaeologist behavior (Step 4). A brand website URL is a strong optional input too44 (Step 3).4546## Workflow4748### 1. Resolve the workspace49Call `list-workspaces`; use the active workspace's `id`. If several exist, confirm which one50with the user. Never guess a UUID.5152### 2. Pull existing Bolta signal53In parallel where possible:54- `list-business-dna` → `get-business-dna` for each record (industry, audience, positioning).55 If the user spots something stale or wrong in a record while reviewing it ("that tagline is56 old", "we moved — the city is wrong", "our colors are navy and sky blue now"), fix it57 conversationally with `update-business-dna(workspace_id, dna_id, fields={…changed keys58 only…})` — it's a safe partial merge, omitted fields are preserved, so a one-field59 correction can't wipe the rest. Confirm the change before writing.60- `list-voice-profiles` → `get-voice-profile` for each profile (stored tone, dos/donts, exemplars).61- `get-voice-context` — the compiled context Bolta's writer already uses, if any.62- `list-accounts` — which platforms are connected (context for where the voice lives).63This is authoritative brand-owned signal; weight it highest.6465### 3. Pull website + external signal66If the user gives (or you can infer) the brand's website, use it — it's the fastest cold-start67source and often the clearest statement of positioning and voice:68- Read the public site directly (homepage, about, product pages) for headline voice, value69 props, and terminology; and/or call `extract-business-dna` with the `url` to structure it70 into a Business DNA record you can reference later. Pass `set_as_default=false` — the71 param defaults to true and silently demotes the workspace's existing default Business DNA.72 Only set it true (or omit it) when the user explicitly wants the extracted record to73 become the default, and confirm first if a default already exists.74- If the brand is recognizable, you may draw on what ChatGPT already knows about it — but treat75 this as a hypothesis to confirm, never as fact. State that it's external knowledge.76Rank this **below** brand-owned Bolta signal and published posts: the website says how the77brand wants to sound; the posts show how it actually sounds. When they disagree, the posts win78and the gap becomes an open question.7980### 4. Pull published-content evidence81Call `list-workspace-posts` with `status=published` and `include_metrics=true` — each post82then carries per-platform engagement (views, likes, comments, reposts) alongside its text.83The default page is 50 posts (max 100); page through with `limit`/`page` so the evidence84isn't silently truncated to the first page. Published posts are behavioral voice evidence —85how the brand actually talks in public. Excavate the brand's lived voice from Bolta's own86evidence (the **voice-archaeologist** behavior): pull the published posts with their87per-post metrics, and the review signal (`list-reviews`, `list-recurring-reviews`)88— what the team approved untouched vs. edited vs. rejected. Extract voice attributes each89backed by a quoted real post, ranked by consistency; mark attributes that correlate with90higher engagement as "proven" not just "present"; treat systematic edits (always cutting hype,91always adding a number) as implicit rules and rejected phrasings as "We Are Not" candidates.92Redact customer names/PII from quotes. Weak evidence = 1 post; strong = a pattern across 8+.9394### 5. Classify and parse uploads95For each user-provided asset, distill it inline using the **signal-distiller** behavior:96turn uploaded materials (decks, one-pagers, brand books, transcripts, site copy) into Bolta's97structured models — Business DNA {industry, audience, positioning, offer} and Voice Profile98fields {tone dials OR a `writing_sample` excerpt, `tone_of_voice`[], `dos`[], `donts`[],99`target_audience`, terminology: must-use/preferred/avoid/never}. Attribute every field to its100source; leave ungrounded fields empty rather than inventing; prefer a strong on-brand101`writing_sample` over guessing precise tone dials when material is qualitative. Where uploaded102materials disagree with the brand's shipped posts, flag it as an open question rather than103silently picking one. Transcripts (sales calls, founder interviews) often carry the truest,104unscripted voice signal. Keep only the structured extractions.105106### 6. Reconcile and rank107Merge every source into one picture. Rank sources by reliability (brand-owned DNA/Voice108Profiles > published posts > brand documents > transcripts > pasted samples), noting recency109and volume. Flag conflicts explicitly (e.g. DNA says "formal", published posts read casual).110111### 7. Output the discovery report112Produce a structured report:113- **Ranked sources** — each with type, reliability weight, recency, and volume.114- **Extracted attributes** — candidate "We Are" traits, each with the evidence behind it.115- **Terminology signal** — words the brand uses / avoids.116- **Tone-by-context observations** — how register shifts by platform/topic.117- **Conflicts** — where sources disagree, with both readings.118- **Gaps** — attributes with thin or no evidence.119- **Open questions** — what `brand-voice-generate` must resolve, each with a suggested default.120121## Failure handling122- No workspace / permission error → report the missing scope (`get-my-capabilities`) and stop.123- No Business DNA, Voice Profiles, or voice context yet → say so plainly; lean on published124 posts and uploads. A brand-new workspace with no posts and no uploads = not enough signal;125 ask the user for sample content rather than fabricating a voice.126- No published posts → note the gap; discovery still proceeds from DNA/uploads, but flag that127 behavioral evidence is missing so confidence will be lower downstream.128- Upload unreadable → report which asset failed and continue with the rest.129130## Example131User: "Analyze our brand voice — here's our pitch deck and last quarter's posts are in Bolta."1321. `list-workspaces` → workspace_id.1332. `list-business-dna`/`get-business-dna` → SaaS, ops leaders, "developer-first" positioning;134 `list-voice-profiles` empty; `get-voice-context` empty; `list-accounts` → LinkedIn + X.1353. `list-workspace-posts(status=published, include_metrics=true)` → 40 posts → voice-archaeologist pass → "direct,136 proof-driven, dry humor; avoids hype; LinkedIn more formal than X."1374. Pitch deck → signal-distiller pass → terminology ("platform" not "tool"), 3 messaging pillars.1385. Reconcile: deck says "visionary", posts read "pragmatic" → conflict flagged.1396. Report: 5 ranked sources, 6 candidate attributes with evidence, 1 conflict, 2 gaps,140 3 open questions → hand to `brand-voice-generate`.