Top level, meta, mods, and start

The outside of the document: what identifies it, what it layers on, and where play begins.

Play has to begin somewhere
start.startingDungeon beats start.startingPoi, which beats start.startingArea. Set none of them and the world is valid and unplayable, so this is one of the few things reported as an error rather than a warning.
Six fields have no default
mods, start.postVictory, narrative.lore, narrative.loreThreads, items[].skillBonuses, and the lore clauses on a requirement are absent when unused, never written in as empty. Adding a default would change every world's fingerprint and stop every existing save loading.

The document

Document

FieldTypeReqDefaultWhat it does
formatnumber1Version of the module format itself, so a later reader knows how to migrate.
ididyesId of the module. Saves record it and refuse to load against a different one.
versionstringyesSemantic version of this module, as 1.0.0.
enginestring"^1.0.0"Engine version range this module expects.
extendsstringnullBase module to layer on, as id@version. Loaded first, this document merged over it.
modsobject[]Mods this game expects, pinned by id and content hash.
metaobjectyesTitle, author, and the rest of the shelf entry.
rulesobjectyesThe system. Attributes, resources, conditions, dice, progression.
contentobject{}The things. Abilities, items, monsters, NPCs, factions.
worldobject{}The places. Biomes, areas, points of interest, dungeons, maps.
narrativeobject{}The story. Text, dialogue, quests, lore, memory.
startobject{}Party size, character creation, and where play begins.

meta, mods, start

modsmods

FieldTypeReqDefaultWhat it does
ididyesId of the mod, matching its folder under mods/.
hashstringyesContent hash of the mod as pinned. A drifted mod is reported, not run silently.
targetengineeditor"engine"Whether the mod attaches to the engine at play time or to the editor.
requiredbooleanfalseTrue when the game does not run without it. False lets play continue unmodded.
notestring""What to say if the mod is missing or drifted. The author's own words.

metameta

FieldTypeReqDefaultWhat it does
titlestringyesDisplay name of the game.
authorstring""Who wrote it.
descriptionstring""A sentence or two for the shelf.
tagsid[][]Free labels for filtering and search.
licensestring""License string. Carried, never interpreted.

startstart

FieldTypeReqDefaultWhat it does
partySizenumber4How many characters the player makes and runs.
creationobject{}How those characters are built.
startingAreaworld.areasUsed only if no starting point of interest or dungeon is set.
startingPoiworld.pointsOfInterestPlace play begins at. Beats startingArea.
startingDungeonworld.dungeonsDungeon play begins in. Beats both of the above.
openingTextKeynarrative.textGrammarText pool read before anything else.
partyFollowobject{}How characters you are not steering keep up with you.
initialFlags{ string: string | number | boolean }{}World flags set before play begins.
victoryWhenpredicatePredicate that ends the run in victory once it holds.
defeatWhenpredicatePredicate that ends the run in defeat once it holds. A dead party is always defeat.
postVictoryendcontinueWhether reaching an ending stops play or lets it carry on.

creationstart.creation

FieldTypeReqDefaultWhat it does
attributePointsnumber27Points available to spend on attributes.
attributeCosts{ string: number }{}Cost to reach each attribute value, keyed by the value.
startingLevelnumber1Level characters begin at.
skillRanksnumber4Skill ranks available to spend.
allowedAncestriescontent.ancestries[][]Ancestries offered. Empty offers all of them.
allowedClassescontent.classes[][]Classes offered. Empty offers all of them.
startingItemsobject[][]Gear every character begins with, on top of their class kit.
startingCurrencynumber0Money the party begins with.

creation → startingItemsstart.creation.startingItems

FieldTypeReqDefaultWhat it does
itemcontent.itemsyesWhich item.
quantitynumber1How many.

partyFollowstart.partyFollow

FieldTypeReqDefaultWhat it does
catchUpDistancenumber3Tiles behind before a follower hurries.
catchUpStepsnumber2Extra steps a hurrying follower takes.

Layering one world on another

extends names a base world as id@version. The base loads first and your document merges over it. An add on can be twelve monsters instead of a copy of somebody else's game.

{ "id": "more_husks", "extends": "aurendel@1.0.0",
  "content": { "monsters": [ { "id": "husk", "xp": 25 },
                             { "id": "old_husk", "$delete": true } ] } }

Collections merge by id, not by position. Other objects merge key by key. Other arrays are replaced whole. { "$delete": true } removes an inherited entry. Cycles are rejected. Full detail on your own JSON.