---
name: tune-voice
description: Inspect, refresh or correct the voice CampaignStack writes in for a sender. Use when drafts do not sound like the person, after they have sent many new messages, when the voice looks thin, or when a phrase keeps appearing that they would never write.
---

# Tune the voice

Messages are written in the sender's voice, measured from their real
LinkedIn messages. It belongs to the person: one profile per human per
language, shared by all their accounts. Code computes the numbers; a model
writes only the prose and summary. The fix is usually more evidence or one
small correction.

## 1. Read it

```
campaignstack_get_identities(include: {voice: {}, accounts: {}})
```

Per language: `core` (fingerprint, signature and banned phrases,
punctuation, emoji set, `confidence`), `overlays` per situation
(`linkedin:dm:cold|early|established`, `linkedin:note`, `linkedin:comment`,
`linkedin:post`) with openers, greetings, sign-offs, length and exemplars,
plus `readableSummary` and `active`.

Read the summary and two exemplars to the person. Ask: is this you?

## 2. Diagnose

- Low `confidence.messages` or few overlays: thin history. Refresh.
- A missing situation borrows from the nearest one: also history.
- A wrong phrase, greeting or habit: correct it (step 4).
- `active: false` means someone switched it off. It stays off until the
  person asks.
- Voice looks right, drafts still sound off: look for tone words in the
  playbook `voice` section (skill `audit-craft-config`).

## 3. Refresh

```
campaignstack_refresh_identity_voice(identityId)
```

Re-reads the linked accounts' messages and rebuilds the profile in the
background. Costs credits (refunded on failure): say so first. Read it
again when done.

## 4. Correct one field

```
campaignstack_edit_identity(identityId, language, core?, overlays?,
  readableSummary?)
```

`core` and `overlays` REPLACE the stored object. Take the current one,
change one field (add to `bannedPhrases`, drop a wrong `signaturePhrases`
entry, trim a greeting that is a whole sentence) and send the whole object
back. Show the before and after, and write on the person's yes.

## 5. Undo

`include: {voiceHistory: {}}` lists versions;
`campaignstack_edit_identity(identityId, language, restoreVoiceVersionId)`
restores one.

## 6. Check

`campaignstack_preview_craft_prompt(workflowId, nodeId, leadId)` shows the
voice block the next message is written from.
