Trigger Budgets

Field / PatternLimitMeasured as
Mechanical triggers (count)4,000count
Semantic triggers (count)500count
Semantic checks per turn (+5 per active quest)a per-turn evaluation budget, not a saved-content cap: the engine checks a trigger's mechanical conditions first and runs its story/action check only when they all pass15count
Per-trigger size (compact JSON)10,000compact JSON
Per-trigger conditions (count)5count
Per-trigger effects (count)10count
Trigger condition .text1,000raw characters
Trigger condition .value100JSON-encoded string
Trigger effect .text1,000raw characters
Trigger effect .value100JSON-encoded string
Trigger script fieldstring — size counted toward the per-trigger limit; no separate char cap

Narrative & Story

Field / PatternLimitMeasured as
storySettings.worldBackground5,000raw characters
storySettings.questGenerationGuidance5,000raw characters
narratorStyle2,000raw characters
death.instructions4,000raw characters
worldLore (entire section)1,000,000compact JSON
worldLore.*.text4,000raw characters
storyStarts (entry count)101count
storyStarts.* (each entry, compact JSON)8,000compact JSON

Catalogs

Field / PatternLimitMeasured as
items.*.description4,000raw characters
factions.*.basicInfo4,000raw characters
factions.*.hiddenInfo4,000raw characters
npcTypes.*.description8,000raw characters
npcs.* (each entry, compact JSON)8,000compact JSON
premadeCharacters (entry count)100count
premadeCharacters.* (each, compact JSON)20,000compact JSON
premadeCharacters.*.traits (count)40count

Geography

Field / PatternLimitMeasured as
realms.*.basicInfo100,000raw characters
regions.*.basicInfo4,000raw characters
regions.*.hiddenInfo4,000raw characters
locations.*.basicInfo4,000raw characters
locations.*.hiddenInfo4,000raw characters
locations.*.areas.*.description4,000raw characters
realms (entire section)100,000compact JSON

Mechanics Limits

Field / PatternLimitMeasured as
traits.*.description and traits.*.traitNarrativeEffects combined6,000raw characters
traits (entire section)1,750,000compact JSON
locations (entire section)2,000,000compact JSON
npcs (entire section)2,000,000compact JSON
npcTypes (entire section)500,000compact JSON
factions (entire section)100,000compact JSON
regions (entire section)500,000compact JSON
items (entire section)250,000compact JSON
traitCategories (entire section)100,000compact JSON
itemSettings (entire section)5,000compact JSON
gameModes (entire section)100,000compact JSON
gameModes.*.name120raw characters
gameModes.*.description500raw characters
gameModes.*.instructions5,000raw characters
gameModes.*.askTheNarratorPrompt1,000raw characters
gameModes.*.npcIntentInstructions5,000raw characters
Entire world config (compact JSON)12,500,000compact JSON
abilities (entry count)1,500count
abilities.*.description2,000raw characters
abilities.*.requirements (array length)10count
traits.*.requirements (array length)10count
Trait category maxSelections40count
abilities.*.bonusmust not exceed skillSettings.maxSkillSuccessLevel (balanced default 999) — Voyage clamps the applied contribution to that cap, so any bonus above it is silently wasted

AI Instructions Limits

Field / PatternLimitMeasured as
Each string leaf under a task (aiInstructions.<task>.<key>)5,000JSON-encoded string
Per task (aiInstructions.<task> total, whole task as compact JSON)20,000compact JSON
Each string leaf under aiInstructions.generateNPCIntents8,000JSON-encoded string
aiInstructions.generateStory total30,000compact JSON
aiInstructions.generateNPCIntents total40,000compact JSON
aiInstructions.generateNPCDetails total26,000compact JSON
aiInstructions.generateNPCUpdates total24,000compact JSON

Image Prompts

Field / PatternLimitMeasured as
Each imagePromptConfiguration field5,000raw characters
imagePromptConfiguration (all fields combined)15,000raw characters

Settings Caps

Field / PatternLimitMeasured as
combatSettings.damageTypes (entry count)40count
combatSettings.damageTypes.* (each)60raw characters
itemSettings.itemCategories (entry count)40count
itemSettings.itemCategories.* (each)60raw characters
itemSettings.itemSlots (slot count)60count
itemSettings.itemSlots.*.slot (slot name)64raw characters
itemSettings.itemSlots.*.category (slot category)60raw characters
itemSettings.currencyName64raw characters
attributeSettings.attributeNames (entry count)30count
attributeSettings.attributeNames.* (each)64raw characters
nameFilterSettings (entire section)150,000compact JSON
nameFilterSettings.*.replacements.* (each replacement)64raw characters

Hard caps enforced by Voyage Studio's validation. Exceeding any of them makes the wand validator reject the upload. Every figure in the tables above is pulled directly from the live Voyage schema, so they always reflect the currently enforced limits.

How each limit is measured

The same length can be counted several different ways depending on what is capped, and that difference is usually what makes a document that looks under the limit get rejected. Each limit above carries its own Measured as column, taken from the live schema; that column is the answer for any specific cap.

MeasureWhat counts
Raw lengthThe characters as typed: a newline, quote, or em dash each count as 1, exactly what a plain character counter shows.
Pretty-printed JSON (2-space indent)The whole object serialized with indentation, so keys, quotes, colons, braces, and the indent whitespace all count. Deeply nested entries cost more than their visible text.
Compact JSON (no whitespace)The object serialized without indentation: keys and punctuation count, but not the indent whitespace.
JSON-encoded stringThe value as it appears quoted in the JSON: the two wrapping quotes count, and each newline, quote, or backslash inside counts as 2 (it is escaped).

The aiInstructions per-task total is the sneakiest: each instruction key is capped on its own, but the task total measures the whole task object, so the key names and punctuation count on top of your instruction text. A task can sit under every per-key cap and still be over its task total.