# The Steward — Economic Event Stream

## Current contract

Every successful food movement creates one `EconomicEventRecord`:

```text
resource_extracted
storage_deposited
storage_withdrawn
item_consumed
```

Each record contains a monotonically increasing event ID, event type,
simulation tick, actor ID, source ID, destination ID, item ID, and transferred
amount. Actor `-1` identifies a player-triggered extraction until persistent
player identity is introduced.

Events are immutable facts about completed transfers. They do not perform the
transaction and are not replayed to reconstruct current state. Resource,
inventory, and storage records remain authoritative.

## Persistence and determinism

`SimulationStateRecord` schema v3 stores the ordered event stream and
`next_event_id`. Schema v1 and v2 saves migrate to an empty stream beginning at
ID zero. Parsing rejects duplicate event IDs and a next ID that could collide
with restored history.

The food-loop regression verifies this chain:

```text
bush -> NPC inventory -> village pantry -> NPC inventory -> consumed
```

It checks event order, stable IDs, exact quantities, conservation, and
save/restore continuity.

## Presentation

`npc_inventory_changed` is a transient presentation signal. The active
`NpcVisual` shows a small food sack whenever its authoritative inventory
contains food. A newly loaded visual derives the same state directly from the
NPC record, so unloading presentation does not lose the fact.

## Deliberate limits

The stream is currently kept in full for the small simulation garden. Before
large populations or long-running worlds, add measured retention,
archival/summary rules, and query indexes. Denied attempts, depletion,
witnesses, secrecy, causal links, and memories belong in later event/history
slices; they should extend this record family without making prose
authoritative.
