# ADR 0001: Serializable simulation state is authoritative - **Status:** Accepted - **Date:** 2026-07-04 ## Context The prototype correctly separates `SimNPC` from `NpcVisual`, but authority is still split across simulation records and scene nodes: - `ResourceNode` owns remaining amount and reservations; - `WorldViewManager` resolves targets and writes the chosen target ID onto an NPC; - `SimulationManager` combines time, orchestration, action completion, player commands, and event publication; - the visual position of an active NPC can diverge from its stored simulation position. This is workable for one loaded flat map. It does not support reliable save/load, unloaded locations, deterministic replay, simulation fidelity changes, or a large data-only population. ## Decision Persistent mutable gameplay state will move into versioned, serializable records owned by a `WorldState`-style simulation model. - Definitions contain immutable action, profession, need, item, and location data. - State records contain people, resources, inventories, reservations, locations, current actions, and later relationships and history. - Systems are the only layer that authoritatively mutates those records. - Godot world nodes present records and provide active-world facts such as interaction transforms, navigation results, collision, and animation. - Presentation adapters may submit commands and query results, but may not choose actions or directly author persistent state. - References between records use stable IDs, never `Node`, `NodePath`, or scene ownership. - Active-world position must synchronize through an explicit adapter so unloading a visual does not erase or redefine the NPC's location. The simulation core must be runnable headlessly with a fixed clock, controlled random streams, and no dependency on a loaded gameplay scene. ## Staged migration 1. ✅ Add a deterministic clock, seeded random source, and scenario runner. 2. ✅ Introduce serializable village, NPC, and resource-state records. 3. ✅ Bind `ResourceNode` presentation to resource records instead of owning authoritative amount and reservation. 4. ✅ Move target choice and reservation coordination out of `WorldViewManager` into an action/target system with an active-world query adapter. 5. ✅ Split action selection, execution, and presentation travel. 6. ✅ Synchronize active position and prove visual unload/reload invariance. 7. Add save-slot persistence before schedules or relationships substantially expand mutable state. Schema v1 and its deterministic continuation contract are documented in [the simulation state schema](../SIMULATION_STATE_SCHEMA.md). Stable action/profession identity and immutable metadata are documented in [the simulation definitions](../SIMULATION_DEFINITIONS.md). System responsibilities and event flow are documented in [the action system architecture](../ACTION_SYSTEM_ARCHITECTURE.md). ## Consequences - Some current prototype APIs are transitional and should not be generalized as final architecture. - The Jajce scaffold may proceed far enough to validate terrain, navigation, and world-object placement, but beauty production pauses at the architecture gate. - New persistent features must define their state record and save behavior. - Headless scenarios become the preferred regression surface for simulation rules. ## Revisit when Revisit this decision only if measured prototype work shows that a different authority model materially simplifies deterministic persistence and simulation LOD without coupling rules to loaded scenes.