The map. Give each a snake_case id. Exits are one-way lines (add the return too). A lock needs a flag β a puzzle or object can set it.
Physical things a puzzle rewards or an object gives/needs. Just id + name here.
Information the party discovers. The text is engine-owned β the AI can reveal a clue but never rewrites it. A clue must have a source (an object action or puzzle that reveals it), or the validator flags it.
Interactive things that change state (a clock, a drawer, a safe). Each action can reveal a clue, set a flag, need an item, and flip the object to a new state.
The engine judges these. Pick a solution type; a wrong answer is a wrong answer. Gate a puzzle behind the clues it needs; solving it sets a flag that can open a door. Never require a class β talents give traction, not access.