Brand voice variants
Lineage and fork-tree governance for brand teams that need formal vs casual, B2B vs B2C, or EN vs DE variants of the same brand persona — without losing the through-line.
The problem
Brand teams routinely need multiple voice variants of the same character: a formal version for sales materials, a casual one for social, a stricter regulatory version for finance, a German variant for the DACH region. Maintaining six system prompts that should all feel like "the same brand" is a slow drift into inconsistency — and a hidden quality risk every time someone tweaks one and forgets the others.
How Moonborn solves it
Personas are a versioned, forkable graph. Three capabilities do the heavy lifting:
- Fork tree with attribution. Every variant is linked to its ancestor. The lineage view shows who forked what, when, and why.
- Refine modes. Lock preserves a specific layer (Soul intact, edit Mask). Cascade lets you edit Soul and have Self/Mask/Surface regenerate from the new core. Manual fine-tunes a single field. Refine runs axis transforms — "darker," "warmer," "more authoritative" — against the existing persona.
- Distinctiveness measurement. Cosine distance against a baseline (ChatGPT default, a brand baseline, or any other persona) ensures every variant still reads as you.
Workflow
- Generate the canonical brand persona.
- Fork it per variant.
- Refine each fork via the appropriate mode — usually a Mask refine for tone or a Surface refine for locale.
- Audit each variant against the canonical for distinctiveness.
- Deploy each behind its own persona ID (or via the OpenAI-compatible endpoint with
model: "persona://<variant_id>").
const canonical = await client.personas.create({
intent: 'Brand voice for Moonborn — Character Consistency Engine. Scholarly, character-centric, technically precise. Editorial restraint.',
});
const casual = await client.personas.fork(canonical.id, {
refine: { mode: 'mask', axis: 'warmer', amount: 0.4 },
note: 'Social media variant',
});
const formal = await client.personas.fork(canonical.id, {
refine: { mode: 'mask', axis: 'more-authoritative', amount: 0.3 },
note: 'Sales materials variant',
});
const tr = await client.personas.fork(canonical.id, {
refine: { mode: 'surface', fields: { language: 'tr' } },
note: 'Turkish locale',
});Lineage as governance
The lineage view shows the full fork tree, the attribution chain, and the audit log for every edit. The audit log is immutable, hash-chained, and retained for at least a year — longer on Enterprise. Schema migrations across major persona versions are handled by a migration job, not by hand-editing rows.
For regulated industries, this turns "brand drift" into a metric and a queue, not a guess.
What this unlocks
- A/B test brand voice variants in production without losing track of which is which.
- Per-market localization with the four-layer model intact across locales — see Soul, Self, Mask, Surface.
- Brand-guideline compliance via distinctiveness score thresholds. A variant that scores below the threshold against the canonical is flagged before it ships.
Tier
Pro tier or above for fork, refine, and distinctiveness measurement. Free tier supports read-only fork-tree viewing for shared marketplace personas.
Next
- Quickstart on persona generation: Quickstart.
- Concept primer on the four layers: Soul, Self, Mask, Surface.
- API reference for fork / refine on API reference.