52 KiB
The Steward — Learning and Reusable-Systems Roadmap
Purpose
This project is both a playable prototype and an advanced Godot curriculum. The goal is not merely to accumulate features. It is to understand, implement, measure, and document systems that can form the foundation of a later production game.
The roadmap prioritizes:
- learning through complete vertical behaviors;
- separating simulation from presentation;
- repeatable experiments and measurements;
- systems that survive save/load and scale changes;
- visible results suitable for building in public;
- avoiding premature architecture that has not been tested by gameplay.
How to use this roadmap
Each milestone should produce five outcomes:
- Concept learned — the Godot or simulation topic being studied.
- Playable proof — behavior a player can observe or influence.
- Reusable artifact — a system, pattern, benchmark, or tool.
- Exit test — an objective condition for calling the milestone complete.
- Retrospective — what worked, what failed, and what should change.
Do not advance because files exist. Advance when the exit test passes.
The current implementation has completed ResourceNode migration through player parity, the Jajce scaffold/navigation proof, and the mandatory architecture gate below. See ADR 0001.
Mandatory architecture gate
This gate sits between the first Jajce terrain/navigation proof and substantial beauty work, inventories, schedules, relationships, or population growth.
It requires:
- an explicit deterministic simulation clock;
- controlled, seedable random streams;
- a headless fixed-seed scenario runner and final-state checksum;
- versioned serializable records for current NPC, village, and resource state;
- authoritative resource amounts and reservations outside scene nodes;
- stable action/profession IDs and initial definitions;
- separate action selection, execution, target resolution, and visual travel;
- an active-world adapter for navigation facts and NPC position synchronization.
The gate is complete when the same scenario produces the same checksum without
loading main.tscn, and loading or unloading a visual does not change
authoritative NPC or resource state.
Status: complete. All architecture-gate slices are implemented:
SimulationClockadvances explicit fixed ticks while preserving remainder;- NPC decisions and visual wander requests use controlled per-NPC random streams derived from an exported simulation seed;
- a headless scenario verifies same-seed equality, different-seed divergence,
and a final-state checksum without loading
main.tscn. - versioned JSON records capture and restore current NPC, village, resource, clock, and RNG state;
- a save-at-tick-24 continuation test matches an uninterrupted 48-tick checksum and rejects unsupported schema versions.
SimulationManagerowns resource records and all amount/reservation mutation; ResourceNode binds by stable ID as presentation and interaction geometry;- an unload/rebind regression proves resource state remains authoritative while its scene node is absent.
- stable StringName IDs and validated custom resources define all current actions and professions;
- NPC duration/preference logic, resource target metadata, generation, and serialized references resolve through the definition registry.
- focused selection, execution, and target-resolution systems now own their respective rules;
- ActiveWorldAdapter supplies loaded-world facts, while WorldViewManager only supplies visual position and executes emitted travel requests.
- active movement synchronizes into authoritative NPC position state;
- persisted travel destinations let visuals unload/reload without changing actions, targets, reservations, positions, RNG state, or checksums.
The fixed-seed scenario runs without main.tscn, and visual lifecycle
invariance is covered headlessly. See
the action system architecture,
the simulation definitions and
the simulation state schema.
Three vertical slices
The long-term vision contains three major risks. Validate them separately before trying to combine the full game.
A. Simulation slice
A small village runs autonomously, exposes understandable decisions, creates history, and produces interesting failures without scripted quests.
B. Action slice
Movement, interaction, melee combat, companions, and small-group commands are fun in an isolated test environment.
C. World slice
One village, one route, and part of a town exchange people, goods, information, and conflict while the player moves between simulation fidelity levels.
The simulation garden is the first slice. A combat sandbox should begin before the simulation is “finished,” because combat feel is a separate high-risk problem.
Continuous learning practices
Keep a decision record
For meaningful architectural choices, record:
- problem;
- constraints;
- options considered;
- decision;
- consequences;
- conditions that would justify revisiting it.
This can later become a docs/decisions/ collection. Do not create records for
trivial edits.
Maintain reproducible scenarios
Important behaviors should have fixed seeds and known initial state:
- normal village day;
- food shortage;
- blocked workplace;
- exhausted worker;
- path failure;
- NPC death;
- relationship conflict;
- migration or faction pressure.
Scenarios make debugging, videos, balancing, and performance comparisons easier.
Measure before optimizing
Maintain a small benchmark ledger:
| Measurement | Example |
|---|---|
| Population | 10, 100, 1,000, 10,000 data-only agents |
| Simulated duration | one day, season, or year |
| Wall-clock runtime | total and per simulated tick |
| Update count | decisions and scheduled events processed |
| Memory | state and history footprint |
| Active visuals | navigation/animation cost |
| Determinism | final-state checksum for a known seed |
Pair systems with presentation
Every systems milestone should answer: “How can a viewer see this happening?” Every visual milestone should answer: “Which real state does this represent?”
Milestone 0 — Baseline and observability
Learn
- Godot project execution and scene-tree inspection;
- debugger, profiler, monitors, and remote scene tree;
- structured logging and debug overlays;
- establishing behavioral and performance baselines.
Build
- a simulation pause, single-step, speed control, and reset;
- selectable NPC debug panel;
- current need, task, task state, target, and task score display;
- deterministic scenario seed entry;
- concise event feed separate from verbose console logging;
- baseline performance capture for the existing three-NPC prototype.
Reusable artifact
A simulation debug console/overlay and scenario runner.
Exit test
From the running game, a developer can select any NPC and explain:
- what it is doing;
- why it selected that task;
- where it is going;
- when the task should complete;
- what state will change on completion.
The same seed and commands produce the same early simulation result.
Milestone 1 — Simulation/presentation boundaries
Learn
Node,RefCounted, andResourceresponsibilities;- signals versus direct calls;
- dependency direction;
- scene composition;
- typed GDScript and stable identifiers.
Build
- explicit simulation clock outside frame-dependent rules;
- stable IDs for NPCs and locations;
- serializable state records separated from immutable definitions;
- an adapter interface between simulation and active visual NPCs;
- smaller managers with focused responsibilities;
- removal of direct task-string-to-marker coupling from the core.
Reusable artifact
A minimal headless-capable simulation kernel with a Godot presentation adapter.
Exit test
The village can advance without instantiating NpcVisual scenes. Loading or
unloading an NPC visual does not change the authoritative NPC state.
Milestone 2 — Data-driven needs, professions, and actions
Learn
- custom
Resourcedefinitions; - utility AI and consideration curves;
- action preconditions, effects, duration, and interruption;
- dependency injection through definitions;
- debugging decision scores.
Build
- need definitions;
- profession definitions;
- action definitions for eat, rest, gather food, gather wood, patrol, and study;
- target discovery independent of hard-coded scene paths;
- utility considerations with full reason traces;
- reservations so multiple NPCs do not unrealistically claim one resource or workstation;
- explicit task failure and replanning behavior.
Reusable artifact
A generic action-selection system that can evaluate defined actions against agent and world state.
Exit test
A new profession and action can be added primarily through definitions and a small effect implementation. The inspector shows the winning score and rejected alternatives. NPCs recover from invalid or unavailable targets.
Milestone 3 — One complete material economy
The staged replacement of abstract task zones begins with the ResourceNode migration plan.
Learn
- inventories and item stacks;
- ownership, storage, reservations, and transactions;
- production recipes;
- world interaction points;
- consistency and invariant testing;
- structured economic events as authoritative facts.
Build
Implement one honest food chain:
source -> gather/harvest -> carry -> store -> retrieve -> prepare/eat
Include:
- item definitions;
- personal and building inventories;
- location-based storage;
- physical carrying for active NPCs;
- abstract transfer for distant agents;
- reservation and cancellation;
- spoilage only if it improves the initial loop;
- player participation in the same resource rules;
- structured gather, transfer, consume, deny, and depletion events carrying stable actor, target, location, and resource IDs.
Wood extraction already exists. Do not build a deeper wood production chain until the food chain is coherent.
Reusable artifact
Inventory, reservation, transaction, and production primitives.
Exit test
Every consumed unit of food can be traced to a source and a sequence of actions. No resource is created or destroyed except through an explicit, inspectable rule. A shortage is visible before the aggregate UI reports it.
Milestone 4 — Attractive simulation garden
The detailed environment and public-demo sequence is maintained in the build-in-public visual slice plan.
Learn
- Terrain3D regions, sculpting, texturing, LOD, and instancing;
- environment lighting, fog, sky, and post-processing;
- modular scene construction;
- navigation generation and validation;
- water and vegetation presentation;
- performance budgets for environment art.
Build
- a compact Jajce-inspired valley composition;
- ridge landmark, river/waterfall feature, bridge, mill area, farm, forest, homes, and workplaces;
- warm painterly environment treatment;
- replace capsules with simple stylized, animation-ready characters;
- readable profession props/colors;
- day/night presentation;
- cinematic/debug display toggle;
- stable navigation across all required work routes.
Reusable artifact
A terrain/world-building pipeline and environment performance checklist.
Exit test
A short clip communicates the setting, player perspective, NPC professions, and one production loop without narration or console output. The environment stays inside the agreed frame-time and memory budget on the development machine.
Milestone 5 — Time, schedules, and persistence
Learn
- authoritative game time;
- calendar and scheduled events;
- serialization and schema versioning;
- save migration;
- restoring active scenes from data;
- deterministic random streams.
Build
- time-of-day and calendar;
- work, meal, sleep, and discretionary schedule blocks;
- simulation event queue;
- versioned save format;
- save/load for people, inventories, tasks, locations, and village state;
- state validation after loading;
- separate random streams where useful.
Reusable artifact
A versioned world-state persistence layer and simulation scheduler.
Exit test
Save during travel, work, eating, and sleep; reload each save; then verify that the simulation resumes coherently. A deterministic headless scenario retains the same checksum across repeated runs.
Milestone 6 — Events, memories, and relationships
Learn
- event sourcing concepts without overcommitting to full event sourcing;
- relationship graphs;
- knowledge versus objective truth;
- memory selection and decay;
- social utility considerations;
- tooling for history inspection.
Build
- structured world event records;
- actor, target, witness, location, cause, and consequence links;
- relationship dimensions such as familiarity, affection, trust, fear, obligation, and hostility;
- NPC knowledge of witnessed or communicated events;
- memory importance and retention rules;
- visible social reactions;
- person and settlement history views.
Reusable artifact
An event/history store and relationship system with query APIs.
Exit test
Two NPCs exposed to different evidence can hold different beliefs about the same event. Their future choices visibly differ because of those memories and relationships.
Milestone 7 — Rumours and emergent opportunities
Learn
- information propagation;
- query systems;
- narrative framing from structured facts;
- objective generation;
- consequence-aware quest state;
- natural-language presentation separated from authoritative state.
Build
- rumour creation and transmission;
- information accuracy, secrecy, and distortion rules;
- detection of unresolved conditions;
- interested-party and capable-helper queries;
- opportunity/quest records that reference real entities and events;
- multiple valid resolution paths;
- consequence application to the source systems;
- concise dialogue/event text templates.
Reusable artifact
An emergent opportunity generator built over world-state queries.
Exit test
A shortage, theft, injury, debt, or disappearance creates an opportunity only when someone knows and cares about it. Resolving it changes the originating people, resources, relationships, and history without spawning quest-only duplicates.
Milestone 8 — Scalable spatial simulation and LOD
Learn
- spatial partitioning;
- relevance and interest management;
- scheduled/batched updates;
- data layout and allocation profiling;
- active/abstract entity transitions;
- statistical aggregation boundaries.
Build
- spatial index for people, buildings, and events;
- active, local-abstract, distant-individual, and settlement-aggregate modes;
- promotion/demotion between modes;
- abstract travel and work resolution;
- background settlement updates;
- performance harness for increasing population and history;
- safeguards preserving named people and unresolved events.
Reusable artifact
A simulation-LOD framework with measured transition invariants.
Exit test
The benchmark can simulate a target large population faster than real time while a smaller active population remains fully represented. Moving an NPC between fidelity levels preserves identity, inventory, task, relationships, and important history.
Simulation scaling baseline 01 sets the first local target at 600 data-only full-fidelity NPCs while preserving deterministic state. Baseline 02 keeps identical final checksums after one reusable per-tick population view and improves that case from 65.84 to 85.81 ticks per second. Revisit the target when world presentation or LOD enters the measured workload.
Loaded Resource Discovery 01 proves the first real spatial consumer. Exact loaded-anchor resolution remains near four inspected candidates from 18 through 1,800 resources, preserves every linear selected-target checksum, and keeps persistent authority outside the index.
Milestone 9 — Player interaction and social agency
Learn
- interaction targeting;
- context actions;
- UI state machines;
- dialogue presentation;
- reputation and permission systems;
- accessibility and feedback.
Build
- inspect people, storage, workplaces, and events;
- talk, trade, help, request, employ, threaten, or report where appropriate;
- priority influence through plausible institutions rather than omniscient sliders;
- reputation, authority, and social access;
- player participation in professions;
- feedback showing likely and actual consequences.
Reusable artifact
A context interaction framework connected to simulation actions and authority.
Exit test
The player can understand and resolve the simulation garden's food crisis in multiple systemic ways without using a developer menu.
Milestone 10 — Combat and companion sandbox
Begin this as a focused prototype before Milestones 6–9 are fully complete. Integrate it only after its fundamentals feel good.
Learn
- animation state machines and blending;
- hit detection and hurtboxes;
- root motion versus code-driven motion;
- input buffering;
- camera feedback;
- AI combat behavior;
- group commands and formations;
- combat profiling.
Build
- isolated combat test scene;
- responsive locomotion, attacks, defense, stagger, and recovery;
- clear targeting without excessive lock-on dependence;
- one companion with understandable autonomous behavior;
- a small command vocabulary;
- morale and retreat prototype;
- simulation consequences for injury, death, witnesses, and reputation.
Reusable artifact
A combatant state model, animation interface, damage/event model, and companion command layer.
Exit test
A short encounter is enjoyable when repeated without progression rewards. One companion can be directed without constant micromanagement, and combat outcomes produce valid world events.
Milestone 11 — Multiple settlements, factions, and mobility
Learn
- hierarchical simulation;
- settlement economies;
- faction goals and diplomacy;
- trade routes and migration;
- authority and governance;
- large-group command abstraction.
Build
- one village, one travel route, and one district or edge of the city;
- movement of goods, people, rumours, and threats;
- household and workplace membership;
- faction membership and offices;
- migration and recruitment;
- small-scale leadership progression;
- settlement and faction decision processes.
Reusable artifact
A regional simulation layer connecting local economies and social structures.
Exit test
An event in one settlement creates measurable consequences elsewhere through real movement or communication. The player can gain responsibility through systemic relationships and actions rather than a fixed promotion quest.
Milestone 12 — Integrated world slice
Learn
- production hardening;
- content pipelines;
- onboarding complex systems;
- balancing and telemetry;
- regression testing;
- profiling representative gameplay.
Build
- the simulation, action, and world slices connected;
- one coherent regional scenario;
- polished onboarding for observation, work, social interaction, and combat;
- save compatibility tests;
- performance budgets and regression scenarios;
- build-in-public demo mode;
- documented extraction boundaries for reusable systems.
Reusable artifact
A proven architecture and a set of tested subsystems ready to migrate or evolve into the production game.
Exit test
The player can begin as an ordinary person, form relationships, participate in the economy, encounter an emergent problem, fight or negotiate through it, and leave persistent consequences in another settlement.
Reuse checkpoints
At the end of each milestone, evaluate the system against this checklist:
- Does it run without the prototype's main scene?
- Are definitions separate from mutable state?
- Is state serializable and versioned where appropriate?
- Can it be tested with a fixed seed?
- Can presentation be replaced without rewriting its rules?
- Does it expose reason/debug information?
- Do measurements justify its complexity?
- Has at least one real gameplay feature exercised the API?
- Does persistent authority remain valid when its presentation node is absent?
- Can an active visual synchronize position without becoming the sole owner of location state?
Do not extract a plugin solely because a system might be reusable. Prefer a clear internal module until multiple real consumers establish a stable API.
Recommended implementation order from the current repository
Completed foundations:
- finite food and wood
ResourceNodeinstances; - NPC target selection, reservation, depletion, and authoritative yield;
- player parity through the same extraction contract;
- navigation-failure recovery and an initial headless contention scenario;
- executable flat-map baseline;
- 512 m Jajce Terrain3D seed, greybox landmarks, stable-ID resource placement, lookdev scene, and tested temporary navigation loop.
Completed after the architecture gate:
- location-based pantry state, NPC-carried food, and explicit deposit/withdraw/consume transactions;
- a headless conservation scenario covering the complete food loop;
- deterministic structured economic events for extraction, deposit, withdrawal, and consumption;
- persisted event identity/history and a visible carried-food prop derived from NPC inventory;
- a validated local quicksave with bounded file size, guarded slot names, atomic replacement recovery, F5/F9 controls, and active-visual rebuilding.
- an integrated Jajce beauty baseline with shaped Terrain3D data, a bounded six-layer palette, atmospheric lighting, shader water, foliage motion, building blockouts, and visible smoke/mist.
- definition-driven profession colors/props and a selected-NPC inspector fed by real decision branches, destinations, needs, and utility scores.
The first relationship consequence slice is complete:
- directed familiarity/trust records now live in a top-level relationship graph instead of NPC-local dictionaries;
- a successful known food-deposit event raises a hungry familiar NPC's trust and is retained as the exact causal event ID;
- that trust can redirect ordinary patrol work toward replenishing a low pantry for a starving acquaintance;
- the inspector displays the relationship values and completed event cause;
- schema migration, save/restore checksums, idempotence, and a neutral-control decision test cover the complete slice.
The first witnessed-knowledge slice is also complete:
KnownEventStateRecordkeeps per-NPC event references separate from objective event history;- successful food deposits are known by their actor and nearby living NPCs at event-record time, while distant NPCs remain uninformed;
- two equally familiar guards with different evidence now gain different trust and choose helping versus ordinary patrol;
- the inspector resolves and displays the selected NPC's latest known fact;
- schema v6 migration, invalid-reference rejection, deterministic save/load, and proximity/idempotence tests cover the complete slice.
The first communicated-knowledge slice is complete:
- first acquisition is persisted as performed, witnessed, communicated, or legacy, with the direct speaker retained for communicated facts;
- a villager arriving beside an already-working villager at a shared non-storage activity can receive one newest direct fact within 2.5 metres;
- communication references the original immutable event, changes only the listener's knowledge/relationship consequence, and cannot relay a heard fact again in this bounded phase;
- the inspector names who communicated the fact, and schema-v6 migration, malformed-provenance rejection, event-history invariance, save/checksum, and informed-choice regressions cover the complete slice.
The first importance/retention slice is complete:
- acquisition ticks order facts by when an NPC learned them rather than by the objective event ID;
- a current relationship cause is lasting, while each NPC keeps at most three other recent facts;
- a deterministic daily-sized review forgets recent facts at least one day old without deleting objective event history or rolling back trust;
- communication prefers lasting direct evidence, and a source-method snapshot keeps listener provenance valid after the teller forgets;
- the inspector shows lasting/recent counts, while schema-v7 migration, boundary, capacity, cause-protection, save/checksum, and informed-choice regressions cover the slice.
The compact history/reaction slice is complete:
- the selected-person inspector separates lasting-first retained memories from the NPC's own objective event history and keeps both lists bounded;
- remembered facts show performed, witnessed, communicated, or legacy provenance without copying authoritative events into presentation state;
- a real trust change blooms once above its observer, remains visible in cinematic mode, and is never persisted or replayed after visual rebuild;
- ranking, forgetting/objective-history separation, observer-only routing, checksum neutrality, restore, cinematic, and death regressions cover the slice.
This completes the first bounded Milestone 6 evidence-to-choice presentation path without claiming full belief simulation.
The first bounded Milestone 7 opportunity proof is complete:
- a positive NPC food withdrawal from
village_pantry, combined with the pantry currently being empty, is the exact shortage evidence; - the need opens only when a living critically hungry villager knows that event through performance, witnessing, or the existing one-hop communication contract;
- highest hunger and then lowest stable NPC ID select one interested villager, with at most one open pantry need;
- schema-v8 opportunity records retain stable NPC, event, storage, resource, and resolution IDs, and protect the trigger memory while the need is open;
- an exact later NPC food deposit or player resource extraction into the pantry resolves the same record through the real economy/event history;
- generation neither mutates the economy nor commands NPC work, and it adds no quest-only event, acceptance, reward, dialogue, multi-hop rumour, or generic quest framework.
The first build-in-public presentation checkpoint for that proof is also complete:
- authoritative pantry food selects a physical empty, low, or stocked pantry arrangement instead of leaving a generic storage crate unchanged;
- only the interested villager shows a restrained empty-bowl concern cue;
- a real NPC deposit changes the pantry props, clears concern, and produces one brief refill response, while restore derives the stable presentation without replaying that transient effect;
- the repeatable runtime capture now includes an empty/restocked close pair in the established elevated third-person visual language.
The outcome-defined pantry-crisis demo loop is complete:
F11reloads the authored seed and runs a measured 20–30 second cinematic sequence with the development UI hidden;- a real final-food withdrawal and consumption leave the physical pantry empty and open the knowledge-gated need for its worried witness;
- a trusted acquaintance selects ordinary
gather_food, reserves and visits a finite berry source, visibly carries its yield home, and autonomously selects the real pantry deposit; - that exact deposit resolves the opportunity, restores the physical stock, clears concern, and triggers the existing refill response;
- restrained captions and a camera handoff clarify the three beats without replacing state-driven world cues, while a runtime validator measures the unassisted route and a headless scenario verifies its full event chain.
The second bounded Milestone 7 consumer is complete:
- patrol or study that loses its definition-backed wood cost at completion
records one zero-transfer
task_blockedfact with stable action, woodpile, wood, and required-amount fields, without applying the work effect; - the performer and nearby witnesses retain that objective fact, and the
performer becomes the interested party for one
supply_missing_woodneed; - a real later NPC wood deposit or player tree extraction into the woodpile resolves the record through its exact existing event;
- interested-party death or evidence that remains unresolved for one simulated day invalidates the need deterministically, emits no quest-only fact, and releases the protected trigger memory;
- world schema v9, nested opportunity schema v2, wood-specific UI text, and focused headless/runtime regressions preserve the full open, resolved, and invalidated lifecycle;
- the two proven consumers now share
VillageOpportunitySystemand the common lifecycle fields, while their evidence and care rules remain explicit.
The first bounded capable-helper query is complete:
- an open need derives at most one living helper who knows its exact trigger, has an existing familiar directed relationship with at least 0.6 trust toward the interested villager, and is not that villager;
- the helper must either carry enough matching inventory to reach the target or have a matching enabled, NPC-usable, sufficiently stocked finite resource that is not reserved by someone else;
- ready inventory wins first, followed by higher trust, matching gather profession, familiarity, and lowest stable NPC ID;
OpportunityHelperResultexposes the exact opportunity, trigger, helper, action, inventory source or finite-source count, resource, relationship values, and concise reason without mutating RNG, tasks, reservations, resources, or persisted state;- food and wood scenarios re-derive the same result after restore, and the village summary explains the current helper route from real simulation facts.
The first bounded autonomous helper consumer is complete:
- when an NPC becomes idle,
SimulationManagerre-derives the current helper and passes that ephemeral result into ordinary action selection; - only the matching helper can select the reported gather/deposit action, and starvation, critical hunger, mourning, low energy, sleep, and meal behavior keep precedence;
- the resulting task uses the existing definition, target resolver, finite-node reservation, travel, extraction, inventory, and storage transaction paths;
- no helper assignment, acceptance, reward, opportunity-specific event, or RNG draw is added, while an in-progress ordinary task continues through the existing NPC save fields and task-start history;
- focused headless and Jajce runtime regressions prove autonomous selection, precedence, finite-source targeting, reservation, and restore-time re-query.
The first direct information-to-help path is complete:
- at an eligible shared activity, a speaker who performed or witnessed the active need's exact trigger discusses it before other retained direct facts;
- the transfer still references the original event, preserves the speaker and direct source method, stops after one hop, and creates no dialogue/event copy;
- a regression places a newer unrelated fact ahead under normal ranking, then proves active-need priority transfers only the trigger to the trusted capable listener;
- the newly informed villager is immediately re-derived as helper and, once idle, chooses the same ordinary autonomous gather/deposit path;
- a cardless warm-amber player HUD briefly shows the real need, named report, helper response, and resolution. It is signal-driven, survives debug-overlay hiding, and neither serializes nor replays after restore.
The bounded Milestone 7 player-response affordance is complete:
- an open need with no capable helper derives one ephemeral
OpportunityPlayerResponseResultonly when its real storage target has room and at least one matching enabled, stocked, player-usable finite source exists; - the result exposes the ordinary gather action, resource, destination, source count, opportunity, and trigger IDs without selecting a waypoint, accepting a quest, drawing RNG, or mutating simulation state;
- the existing cardless village-whisper ribbon says
YOU CAN HELPand explains the direct resource-to-storage interaction in one line, while the development summary exposes the exact derived route; - knowledge, relationship, inventory, or village-resource changes track the derived route in both directions: a newly unassisted need can surface the hint once, a capable helper removes it immediately, and resolution or invalidation replaces it with the existing close beat;
- reserved resources remain honestly player-usable because the current player extraction contract does not consume NPC reservations, while disabled, depleted, wrong-resource, and capacity-blocked sources do not qualify;
- unit, headless lifecycle, restore/checksum, real player extraction, and Jajce runtime regressions cover the slice without persisting or replaying HUD state.
This completes the bounded Milestone 7 simulation-garden proof. A known and cared-about shortage now produces an inspectable opportunity whose NPC and player responses both use the originating resource, relationship, knowledge, and event systems rather than quest-only duplicates.
The first Milestone 8 measurement slice is complete. A reusable schema-valid headless fixture and CLI runner now measure three fresh deterministic samples across 6, 60, and 600 NPCs plus 600 and 6,000 seeded event histories. The reviewed Apple M1 Max baseline reaches 65.84 ticks per second at 600 NPCs, but 10x population from 60 to 600 costs about 24.4x per tick and creates 20,950 objective events over 200 measured ticks. The machine-readable samples, workload exclusions, checksums, and local 50-ticks-per-second reference target live in Simulation scaling baseline 01.
The first measured optimization is also complete. SimulationPopulationView
builds stable-ID all/living/starving indexes once per tick, refreshes them after
each interleaved NPC update, and serves relationship/action queries without
entering saved state. Every baseline-02 checksum exactly matches baseline 01.
The 600-NPC case falls from 15,187.74 to 11,654.10 microseconds per tick, a
23.3% improvement, while small fixtures expose the expected fixed dictionary
cost. See
Simulation scaling baseline 02.
The first loaded-world spatial consumer is complete. ActiveWorldAdapter owns
a disposable 24 m horizontal grid of loaded finite ResourceNode anchors.
ActionTargetResolver expands through nearby ranges and stops only when
authoritative risk/comfort/priority bounds prove that no farther source can win.
Matched 18/180/1,800-source samples preserve every selected-target checksum;
the 1,800-source case falls from 6,448.00 to 46.94 microseconds per resolution.
Unload/rebind state authority, stable tie order, moved anchors, reservations,
player parity, and a deliberately far high-priority winner remain covered. See
Loaded Resource Discovery 01.
The authored-watercourse slice is complete. JajceWatercourse now gives the
deterministic terrain generator and both water ribbons one shared profile; the
generated Terrain3D data contains an upper stream, raised waterfall shelf,
plunge basin, and curved downstream channel. A matched Metal capture records
the result, and the Terrain3D-derived navigation mesh was rebaked and validated
against required village/resource routes.
The first authored foliage/resource workflow is complete. One riverbank cluster
uses three intentional MultiMesh batches for 28 fern, flower, and stone
instances plus two decorative trees, while only an existing stable-ID berry and
tree are finite ResourceNode anchors. Both anchors preserve the save contract
of eighteen resources, sit above the carved channel, and expose separate
terrain-snapped approach points. A forced village query expands beyond the
initial 24 m range and selects the nested berry exactly by ID.
The first amount-derived resource presentation slice is complete. A shared
ResourceAmountVisual contract reads the loaded ResourceNode's authoritative
amount and derives full, low, or depleted presentation without entering saved
state. Real player berry harvests remove fruit and leaf mass; real NPC wood
gathers thin the crown and ultimately leave a warm-cut stump. Restoring both
low and depleted snapshots rebinds the same nodes and reconstructs the same
visuals from ResourceStateRecord.amount_remaining alone.
The second authored foliage/resource workflow is complete. The existing
tree_forest_grove_01 and tree_forest_grove_02 anchors now form one bounded
forest edge with two decorative silhouette trees and 24 fern, mushroom, and
stone instances in three MultiMesh batches. Both stable IDs and definitions
remain authoritative, while village-facing interaction points sit beyond the
initial 24 m discovery radius and remain reachable on the Terrain3D-derived
navigation mesh. Real NPC depletion leaves the shared stump and restore
rebuilds the sparse standing tree from amount alone. The river and forest
clusters now share only the terrain-snap, bounded-instance, and anchor-layout
code proven by those two consumers.
The first identity-backed livestock slice is complete. Dunja has a stable animal ID, simulation-owned position and hunger/feed state, and a loaded cozy presentation whose persistent cue derives from that state. One exact operation serves both NPC and player feeding, consumes real food from the actor's current source, mutates only the target animal, and appends one economic fact. World-schema v10 save/restore preserves the result without replaying the transient response.
The first loaded-animal routine slice is complete. Dunja alternates between stable shelter and pasture IDs without RNG; her exact target and current position stay simulation-owned while the loaded scene follows the Jajce navigation map. Schema-v11 mid-route restore preserves the checksum, destination, and every NPC RNG stream. Unloading and re-instantiating the goat scene retains that same travel state, arrival is exact, and hunger stops movement before feeding.
The first multi-animal care slice is complete. Zora adds a second stable record, loaded presentation, and private shelter while sharing Dunja's pasture. When both goats are hungry, loaded target resolution chooses the nearest available interaction point, two villagers can retain independent exact claims, and feeding Zora leaves Dunja's hunger, feed history, and reservation untouched. Schema-v11 restore preserves both claim pairings and checksum. Loaded routine sites now distinguish private shelter ownership from shared species context without adding that authored-world fact to saved simulation state.
The named-pair playtest gate exposed and closed its first embodied-use gap.
PlayerInteractionResult now derives one exact, ephemeral context from the
same priority and stable target used by E: named animal care, finite-resource
harvest, pantry eating, guard work, or study. A cardless bottom-center prompt
shows the action and real availability, remains visible in cinematic mode, and
briefly reports success or blockage. Restore clears transient feedback and
re-derives the current prompt without adding saved state or drawing RNG.
NPC animal care is now physically honest:
village_pantry -> NPC inventory -> exact named goat. A caretaker reserves the
goat before visiting the pantry, keeps that stable claim through both travel
legs, visibly carries the withdrawn unit, and consumes only carried inventory
at delivery. One-unit contention records the late shortfall and releases only
the losing claim. A post-pickup restore preserves the inventory, exact goat,
destination, event count, and final checksum without a new saved phase field
or RNG draw.
Player-facing villager inspection now advances Milestone 9 without stealing the
existing E action. A quiet cardless field note chooses the nearest loaded,
living villager with stable-ID tie order, then re-reads that NPC's authoritative
name, action, exact target, task state, and carried inventory. It includes the
latest decision reason only while that trace still matches the live action.
Presentation unload clears the note; restore reacquires the replacement NPC
record, re-derives every saved fact, and honestly awaits the next ephemeral
decision reason. The query and HUD add no mutation, RNG draw, or saved state.
The next bounded slice should move from observation to one honest social affordance. When the nearby inspected villager is the interested person for an open village opportunity, surface that exact need. Show the already-proven finite-resource-to-storage route only when the authoritative player-response query can currently derive it; otherwise name the capable helper or honestly say why direct help is unavailable. Let the ordinary finite-resource harvest resolve the need without adding a dialogue tree, quest acceptance, rewards, a quest log, reputation, a generic conversation framework, or saved presentation state in that slice.
That observation-to-agency slice is now complete: the player-facing field note
surfaces the inspected villager's exact open need and the currently
authoritative response, and a real player harvest-to-pantry deposit resolves
it through the ordinary carry path. The player is also a real citizen now: a
persisted PlayerStateRecord tracks hunger, energy, and carried inventory,
gathering moves yield into that carried inventory, depositing restocks the
typed storage, and eating eases hunger from carried or pantry food. Player
restocks are witnessed and can raise a hungry familiar villager's directed
trust toward the player. The opportunity family grew to four types
(restock_empty_pantry, supply_missing_wood, feed_weak_villager, and
repair_home_roof), finite berry sources regrow toward an authored cap, and a
cold season halves gather yields and pauses regrowth to create recurring
scarcity.
The first conflict systems slice is also complete. ItemDefinition +
SimulationItems establish the extensible weapon/inventory contract.
ConflictSystem owns deterministic combatant records (health, weapons,
factions, hostility), the village and hill-tribe faction records, wolf hunger
attacks, the tribe war-motivation decision (tribe hunger + village surplus ->
desire; tribe strength vs NPC-derived village defence -> victory confidence;
watch one interval, then raid, plan, or abort), raid spawning, battle
resolution, and war consequences. Strong villagers take a real defend duty
action during raids. The player fights with an equipped sword and dash, has
persisted health, and can be downed by wolves or raiders before recovering.
Hostile raiders and wolves share a CreatureVisual movement root and are
described by data-driven EnemyDefinitions, so the next bear, bandit, or boar
is a definition plus a visual hook rather than a new movement or combat system.
Headless tests cover combat determinism, wolf attacks, enemy definitions,
player downing/recovery, defend duty, war motivation, raid-to-resolution
chains, player kills, and save/restore.
Recently completed:
Jajce Villager Field Note 12: a separate player-facing note selects the nearest loaded living villager and shows live name, action, task state, exact target, carried inventory, and a currently matching decision reason. It coexists with theEprompt, survives cinematic mode, clears on visual unload, and re-derives saved facts after restore without reviving transient reasoning or changing the schema.Jajce Care Delivery 11: NPCfeed_animalis now one compound, two-leg action from the real pantry through caretaker inventory to the exact reserved goat. Carried presentation, ordered transfer facts, late contention, conservation, and post-pickup deterministic continuation are proven without a schema bump or generic job framework.Jajce Context Action 10: one ephemeral result now keeps the displayedEprompt and executed stable target aligned across existing player interactions. Named goat care shows exact pantry availability and transient success/blockage, survives cinematic mode, and re-derives after restore without persistent UI state.Jajce Goat Pair 09: named goat Zora adds a second independent animal record and private shelter while sharing Dunja's pasture. Stable nearest targeting, simultaneous exact reservations, isolated feed mutation and events, deterministic routine ownership, and active-claim save/restore prove the multi-animal contract without a schema bump or herd system.Jajce Dunja Habitat 08: the first deterministic animal routine alternates shelter and pasture through real loaded navigation, preserves exact mid-route state across save/restore and presentation unload/reload, stops when hungry, bends grass while moving, and colocates goat-owned assets in a focused feature folder.Jajce Goat 07: named goat Dunja proves stable animal identity, exact pantry-conserving NPC/player feeding, deterministic hunger and save/restore, loaded target reservation, a state-derived hungry cue, and a transient cozy response that never enters persisted state.Jajce Forest Edge 06: two existing deep-forest tree IDs now anchor a restrained four-tree silhouette with 24 decorative understory instances. Both targets require expanded loaded-resource discovery, remain reachable, reuse amount-driven crowns/stumps, and preserve the eighteen-resource save contract through real NPC depletion and restore.Jajce Resource States 05: the authored river berry/tree now derive full, low, and depleted visuals from authoritative amounts. Player and NPC extraction drive the changes, save/restore reconstructs low and depleted states without visual save fields, and matched Metal frames record the berry thinning, sparse crown, fruitless remnant, and stump.Jajce Resource Grove 04: two existing river resources now live as nested stable-ID anchors inside a restrained decorative bank cluster. Twenty-eight understory instances use three MultiMesh batches, bespoke berry/tree visuals replace generic boxes, terrain-snapped approach points remain reachable, and a real far-source query proves parent-path-independent expanding discovery.Jajce River 03: deterministic Terrain3D generation now carves the upper stream, raised waterfall shelf, plunge basin, and curved downstream channel; shared watercourse geometry keeps both water ribbons aligned, soft masked mist replaces hard billboards, and the rebaked navigation mesh passes terrain-height and runtime resource-route checks.- Loaded-resource spatial discovery: a resource-specific active-world grid preserves exact score winners and lifecycle authority while reducing the reviewed 1,800-anchor query from 6.45 ms to 46.94 µs.
- Shared population query view: one transient per-tick all/living/starving index replaces repeated scarce-food relationship scans, preserves exact checksums, and improves the reviewed 600-NPC workload by 23.3%.
Jajce Center 02: matched before/after captures now document a larger summit citadel, cascading timber-plaster homes, terrain-following turquoise river, rock-framed waterfall, richer tree silhouettes, restrained conifer clusters, oversized butterflies, and short camera-local grass that bends around real player/NPC transforms without becoming simulation state.- Deterministic simulation scaling baseline: schema-valid full-fidelity fixtures, a repeatable CLI runner, and a fast headless regression now record population throughput, phase timing, serialized-state growth, history retention, event growth, and deterministic checksums before optimization.
- Simulation responsibility cleanup: storage/inventory transactions now live
in
VillageEconomy, ordered history and rate queries live inSimulationEventLog, andSimulationManagerexposes a shorter tick lifecycle while remaining the scene-tree façade. Dead prototype APIs and unused scene artifacts were removed, with the ownership map documented inARCHITECTURE_OVERVIEW.md. F10cinematic/debug presentation toggle that hides development UI, world labels, and NPC name/profession labels without changing simulation state;F12repeatable simulation-garden demo reset by reloading the current scene with the same authored seed and starting state.- Activity-site capacity enforcement for rest, study, and patrol target resolution, derived from NPC target claims rather than presentation-only counters.
- Terrain3D collision/navigation hardening began: scaffold and runtime tests now assert Terrain3D collision remains enabled, the hidden greybox ground no longer provides physics collision, and tested navigation routes stay close to the authored Terrain3D height field.
- The temporary greybox navigation source was replaced by a project-owned
Terrain3D-derived navigation mesh resource generated by
tools/bake_jajce_navigation.gd; route tests now also reject partial paths that do not reach their requested targets. Jajce Lookdev 01is captured and reviewed with a project-owned capture script and a daytime baseline image underdocs/baselines/.Simulation Garden 01is captured and reviewed frommain.tscnwith paired debug/cinematic baselines that verify live NPC visuals in the Terrain3D-backed village.- Runtime task glyphs preserve active NPC task intent in cinematic mode while leaving the simulation task state authoritative.
- Runtime first-read staging now includes a presentation camera preset and authored path strips that reveal the active village task loop.
- Landmark and work-site silhouette props make the ridge landmark, pantry, guard, study, and rest sites easier to identify without debug labels.
- Water and foreground silhouettes strengthened: river/waterfall shaders with multi-layer UV flow, fresnel edges, foam highlights, and sparkle; wider river and waterfall; fortress with crenellations, three turrets, and prominent ridge banner.
- Resource discovery expanded to 18 finite ResourceNodes across farming, deep-forest, river-bank, and mill-adjacent contexts with scored metadata.
- NPC schedules implemented: SLEEP/MEAL/WORK/DISCRETIONARY periods driven by simulation clock time-of-day. DayNightCycle synced to simulation clock. NPCs walk home to designated house positions at night, sleep to restore energy, eat at meal times, and work during the day. Starving NPCs always override sleep to seek food.
- Starvation balance reworked: hunger ~25/day, death threshold ~3 days of starvation (realistic ~6-7 day survival without food). Energy drain uses exact binary fractions for lossless JSON serialization.
- Wood inventory and woodpile storage: wood now follows the same gather→carry→deposit pattern as food. VillageWoodpile StorageNode receives wood deposits. Village wood syncs from storage. Economic events track all transfers. Patrol and study no longer produce benefits without paying their one-wood cost, and utility selection avoids those actions when wood is empty.
- Action completion costs are definition-backed: patrol and study share one
stored-resource contract across selection and execution. The inspector shows
readable unavailable reasons, and a late shortfall creates a persisted
task_blockedfact with stable action/resource/requirement fields without applying the work effect. - Structured event feed: EconomicEventRecord now supports narrative events (task started, NPC slept, NPC died) alongside economic transfers. Per-NPC event history with human-readable descriptions exposed in the inspector under a "Recent" timeline.
This order strengthens the simulation while regularly producing visible progress suitable for public development updates.
Subjects intentionally deferred
These are valuable future learning areas but should not distract from the first complete slices:
- multiplayer authority and replication;
- procedural terrain generation;
- machine-generated freeform dialogue;
- full historical demography;
- hundreds of item recipes;
- siege-scale combat;
- sophisticated market speculation;
- native GDExtension optimization;
- custom rendering technology.
Revisit them when a completed slice demonstrates a concrete need.