---
name: audit-craft-config
description: Find out why CampaignStack's messages read the way they do, and fix the setting that causes it. Use when drafts sound generic, repeat themselves, promise something the company does not offer, or when someone says "the AI does not sound like us".
---

# Audit a workspace's craft configuration

A CampaignStack message is built from a dozen settings that live in different
places: the workspace's offer context and its five playbook sections, the
campaign's guidance and offer addendum, the outreach intents, the sender's voice
profile, and the node's own instructions. A bad message is almost never a bad
model. It is one of those settings saying something nobody remembers writing.

Work from the whole configuration down to one field. Do not start by reading
drafts: you will form a theory about the model and spend the session testing it.

## 1. Read the configuration and its warnings

```
campaignstack_get_craft_config_tree(workspaceId)
```

One read, everything that feeds a prompt, plus `warnings`. Each warning names
the tool and field that fixes it. Common ones and what they actually mean:

- `duplicate_across_levels` - the same sentence sits in two settings. Both reach
  the prompt, so the second copy can only add length or contradict the first.
  Delete one; the narrower level usually deserves to keep it.
- `tone_instruction` - an agent script or the `voice` section is describing how
  to sound. The sender's voice is measured from their real messages, so this
  overrides a measurement with a guess, and models satisfy a tone instruction by
  naming the tone ("just a casual note"). Replace it with what to DO at that
  stage of the thread.
- `campaign_goal_may_promise_beyond_offer` - the goal says you will give them
  something the offer never mentions. The craft will either drop the promise or
  invent one. Write the deliverable into `offerAddendum`.
- `greeting_is_not_a_fragment` - a whole message ended up in the voice profile's
  greeting list and is quoted back at the model as "opens with".
- `voice_corpus_thin` - the voice is mostly the platform default, not this
  person. More history has to be read before the voice means anything.

## 2. See the actual prompt

```
campaignstack_preview_craft_prompt(workflowId, nodeId, leadId, include: ["index"])
```

`index` lists the named blocks with their sizes. A block nobody expected, or one
three times the size of the rest, is usually the answer. Pull the text with
`include: ["system"]` only for the block you now suspect. This costs nothing.

## 3. Attribute a real draft

When a specific message read wrong:

```
campaignstack_explain_draft(craftAuditLogId | entryId)
```

Each sentence is attributed to the setting that produced it, and `fixes` names
the tool for each. Citations are verified against the prompt, so
`unattributed` means the model added it, which is a different problem from a
setting saying the wrong thing.

## 4. Change one thing

Use the tool the warning or the fix named. After the edit, re-run
`campaignstack_preview_craft_prompt` on the same node and lead and confirm the
block changed the way you expected. Change one setting at a time: two edits and
a re-read tell you nothing about which one worked.

## What not to do

- Do not add instructions telling the model to be shorter, warmer or more human.
  Length is enforced in code per channel, and tone comes from the voice profile.
  A tone instruction is how "keep it casual" becomes "just a casual note" in the
  message.
- Do not fix a draft by editing the draft. The next one is generated from the
  same configuration.
