Open app
Moonborn — Developers

Voice variant lineage governance

Brand-team workflow for keeping locale + tone variants close to the canonical persona — review queue, distinctiveness gates, audit trail.

When a brand persona forks into many variants (locales, tones, sub- brands), drift is the failure mode. This guide is the governance loop.

1. Pin the canonical

Make the canonical persona the workspace baseline:

await client.config.setItem({
  key: 'consistency.distinctiveness.custom_baseline_persona_id',
  value: canonical.id,
  scope: 'workspace',
});
 
await client.config.setItem({
  key: 'consistency.distinctiveness.min_score',
  value: 0.65,
  scope: 'workspace',
});

Every variant now scores against your brand, not chatgpt-default. Below 0.65 = drift toward generic.

2. Lock the brand DNA on forks

When a marketer or designer forks, force Soul + Self + Mask lock so only Surface changes:

const variant = await client.personas.fork({
  id: canonical.id,
  refine: {
    mode: 'lock',
    lockLayers: ['soul', 'self', 'mask'],
    edits: { 'surface.language': 'de' },
  },
});

3. Review queue via webhooks

Subscribe to persona.audit_failed. Any variant whose audit drops below threshold post-refine lands in your review queue:

await client.webhooks.createWebhook({
  url: 'https://your-app.com/brand/qa',
  events: ['persona.audit_failed'],
});

4. Diff trail

Every refine is a version in the lineage tree. Diff in the product UI, or pair with Git sync for pull-request review.

5. Sunset stale variants

A variant abandoned for > 90 days should be archived, not deleted:

await client.personas.archive({ id: variant.id });

Archive preserves lineage; downstream forks (if any) keep working.

Honest scope

Governance is a workflow; Moonborn provides the substrate (lineage graph, distinctiveness gates, webhooks). The actual review loop — who approves what, on what cadence — lives in your team's runbook.

Related