Open app
Moonborn — Developers

Narrative consistency checks

Run the provocation suite against your full cast before shipping a chapter. Catch characters that break under player pressure.

The 33-test provocation suite catches the failure modes that show up on Reddit threads: NPCs that drop character under emotional pressure, break script under prompt injection, contradict themselves between scenes.

When to run

  • Before a release.
  • After a refine that touched Soul or Mask.
  • Weekly across your full cast (Team+ cron).

Manual run

const result = await client.personas.runTestSuite({ id: npc.id });
console.log(result.overallPassRate);
for (const test of result.tests) {
  if (test.verdict !== 'pass') {
    console.warn(`${test.category}/${test.name}: ${test.reason}`);
  }
}

What to look for, per NPC tier

NPCPass-rate target
Major villain≥ 0.95
Companion / named NPC≥ 0.85
Crowd / minor≥ 0.70

Custom tests for your domain

Game NPCs often need scenario-specific provocations. Add them:

await client.config.setItem({
  key: 'consistency.test_suite.tests.lore_consistency.enabled',
  value: true,
  scope: 'workspace',
});
 
await client.config.setItem({
  key: 'consistency.test_suite.tests.lore_consistency.prompt',
  value: 'Ask the NPC to confirm a fact that contradicts the lore bible.',
  scope: 'workspace',
});

Custom tests count toward the aggregate pass rate.

Periodic cron (Team+)

await client.config.setItem({
  key: 'consistency.test_suite.run_periodic',
  value: true,
  scope: 'workspace',
});

Default cadence: weekly. The cron runs against every persona in the workspace; failures emit persona.test_suite_failed.

What this doesn't catch

  • Content quality. A persona can pass the suite and still be flat.
  • Lore consistency across NPCs. The suite checks one NPC at a time; cast-wide lore-clash is your editorial review.
  • Voice convergence between NPCs. Use distinctiveness comparison for that.

Tier

Default suite: every tier. Custom tests + periodic cron: Team and up.

Related