Constructibility: grounded or declared
The content tree — the contract for the
data/ tree.
Part of the ONE validator (data/validate.rs — boot,
the lock tests, CI’s validate_data bin, and the game’s --check-data
door all run the same pass). “Raw” is now
DEFINED: a good some building type innately produces. Every good must
be one of:
- raw — in at least one building’s
produceslist; - grounded craftable — has a recipe whose inputs all RECURSIVELY
ground out in raws (the DAG is walked; a
Classinput grounds if at least one material of the class grounds); - declared —
acquisition: Some(...)names a non-crafting source (future loot/quest goods; none needs it today). The narrate-or-declare pattern: nothing is unconstructible by accident.
Also enforced: NO recipe cycles (A needs B needs A fails the walk), and ORPHAN goods are flagged (nothing produces it, no recipe yields it, nothing consumes or uses it as a tool). All failures are loud, with file and reason. Tool BOOTSTRAP is explicitly allowed — smith’s tools are made with smith’s tools, because tool use is not a recipe input; worldgen seeds the first kit.