Trigger Budgets

Field / PatternLimitMeasured as
Mechanical triggers (count)500count
Semantic triggers (count)200count
Per-trigger size (compact JSON)10,000compact JSON
Per-trigger conditions (count)5count
Per-trigger effects (count)5count
Trigger condition .text1,000raw characters
Trigger condition .value100raw characters
Trigger effect .text1,000raw characters
Trigger effect .value100raw characters
Trigger script field0n/a

Narrative & Story

Field / PatternLimitMeasured as
storySettings.worldBackground5,000raw characters
storySettings.questGenerationGuidance5,000raw characters
narratorStyle2,000raw characters
death.instructions4,000raw characters
worldLore (entire section)500,000pretty-printed JSON
worldLore.*.text4,000raw characters
storyStarts (entry count)100count
storyStarts.* (each entry, pretty JSON)8,000pretty-printed 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

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,000pretty-printed JSON

Mechanics Limits

Field / PatternLimitMeasured as
traits.*.description4,000raw characters
locations (entire section)1,000,000pretty-printed JSON
npcs (entire section)1,000,000pretty-printed JSON
npcTypes (entire section)500,000pretty-printed JSON
factions (entire section)100,000pretty-printed JSON
regions (entire section)500,000pretty-printed JSON
items (entire section)100,000pretty-printed JSON
traitCategories (entire section)100,000pretty-printed JSON
itemSettings (entire section)5,000pretty-printed JSON
gameModes (entire section)100,000pretty-printed JSON
gameModes.*.name120raw characters
gameModes.*.description500raw characters
gameModes.*.instructions5,000raw characters
gameModes.*.askTheNarratorPrompt1,000raw characters
Entire world config (pretty JSON)10,000,000pretty-printed JSON
abilities (entry count)1,000count
abilities.*.description2,000raw characters
abilities.*.requirements (array length)10count
abilities.*.bonus0n/a

AI Instructions Limits

Field / PatternLimitMeasured as
Each string leaf under a task (aiInstructions.<task>.<key>)5,000raw characters
Per task (aiInstructions.<task> total, sum of instruction chars)20,000raw characters

Image Prompts

Field / PatternLimitMeasured as
imagePromptConfiguration.npcs / .locations / .regions5,000raw characters
imagePromptConfiguration (combined npcs+locations+regions)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,000pretty-printed JSON
nameFilterSettings.*.replacements.* (each replacement)64raw characters

import SizeLimitsTables from "~/components/static/SizeLimitsTables.astro";

Hard caps enforced by the Voyage editor's validation. Exceeding these causes the wand validator to reject the document. Every figure below is derived directly from the live Voyage schema, so the grouped tables and the per-section "Size limits" rows in each section hero always reflect the current enforced limits.

Note (How limits are measured):

  • Raw character length (value.length in JS, len(value) in Python) -- used for every individual string field: description, basicInfo, hiddenInfo, narratorStyle, death.instructions, aiInstructions leaf strings, storySettings.worldBackground, storySettings.questGenerationGuidance, trigger condition/effect text and value fields, and similar. Counts every codepoint as 1 -- newlines count as 1 char, em dashes count as 1 char. This is what the Voyage editor's character counter reports and what the engine enforces.
  • Pretty-printed JSON (json.dumps(obj, indent=2)) -- used for all section totals (items, factions, regions, npcs, npcTypes, locations, worldLore, traitCategories, itemSettings) and for storyStarts per-entry. The structure is serialized with 2-space indentation, and that indentation counts toward the limit -- every nesting level adds 2 spaces per line against your budget, so deeply nested entries cost more than their text alone.
  • Compact JSON (json.dumps(obj)) -- used for individual NPC entries and individual trigger entries.