# Format: RON

RON maps 1:1 onto serde-derived Rust structs: real enums for closed
sets, `Option` for the book's "—" cells, nested structs natively, and
`//` comments beside every interpreted value. The engine lock-test
parses every file into the canonical types below when the validator amendment lands.
Transcribe the sketch — don't invent.

**The typing rule — enums for semantics, string ids for content**
(the moddability doctrine, per the moddable-data amendment):

- **Compiled enums** ONLY for semantic sets the engine's code branches
 on: `Ability`, `Size`, `ArmorCategory`,
 `WeaponCategory`, `Skill`, `AlignmentConstraint`,
 `CraftTier`, `QualityTier`, `Rarity`, `MagicRarity`, `Recharge`,
 `ConditionComponent`, `ConditionFact` (and the
 structural shapes inside rows — `WeaponProperty`, `DexMod`,
 `ArmorClass`, `Damage`, `RecipeInput`, `Source`). Damage kinds and
 spell schools OPENED into registry files (`tables/damage_kinds.srd.ron`,
 `tables/schools.srd.ron`); creature types OPENED at
 (`tables/creature_types.srd.ron`) — the engine branches only on well-known
 ids (`types::damage`/`types::school`/`types::creature_type`). These are
 rules vocabulary; a mod adds a row without engine code, and only a NEW
 code branch (a new well-known const) is a recompile — the honest boundary.
 `CraftTier` IS the engine's `TradeTier` (: Apprentice /
 Journeyman / Master, prof bonus +0/+2/+4) — one ladder, two homes.
- **Open string ids** for content identifiers — weapon ids, armor ids,
 race ids, creature/archetype ids, CR keys — because mods add content:
 a new weapon must be a data row, not a recompile. Typo-safety is
 preserved by CROSS-REFERENCE RESOLUTION at parse/boot time: every id
 reference (`armor: ["chain_shirt", "shield"]`, `weapons: ["spear"]`,
 `cr: "1/8"`) must resolve against the loaded registries, failing
 LOUDLY with the file and reason — the same guarantee an enum gives,
 delivered at load instead of at compile (in the spirit of the no-magic-strings rule: no
 silently-missed lookups, ever).
- **Open VOCABULARIES get registry files**: when a set of
 tags is open but referenced across files — material classes,
 terrain tags — the vocabulary itself is a `tables/` registry, and
 every use (`MaterialInfo.class`, `Class(...)` inputs, buildings'
 `requires`) resolves against it at boot. Not enums, by the same
 rule: the engine never branches on a family name — family-level
 behavior, when it arrives, lands as PROPERTIES on the registry rows.
