The World's Math Is Data
The engine contains no arithmetic. It contains a reader for arithmetic that lives on the Genre Overlay.
resolution.mode None | Flat | Linear | Table
resolution.dice notation and DIRECTION
resolution.statTable the curve, if the world uses one
resolution.statCeiling the cap The Loom generates against
resolution.derivedStats what the world builds out of its stats
statCeiling is the one that gets forgotten. The Loom reads it as the capability ceiling for everything it generates. Blank means unbounded, and unbounded means a starting character with the strength of a siege engine because nothing said otherwise.
Why data and not code
Because one schema then serves a d20 world, a 2d6 world, a dice pool, and a world with no dice at all — without a single conditional anywhere in the engine.
A character sheet reads resolutionMode and renders what that world actually runs. None is a complete, supported configuration meaning the sheet is deliberately narrative, and it renders as such rather than as a page of empty stat boxes.
Derived stats are computed, never stored
Health, defence, carry, initiative — whatever your world builds out of its stats — are expressions evaluated on read. Nothing is written. Change the formula on the Overlay and every sheet in the project updates at once.
Never write a value into a computed field. It is stripped on the way to the server, and the check that catches it is the only reason anyone would ever know.