721acbd1aa
Godot 4.7 C# world simulation per SPEC.md (with 2026-07-21 amendments). 15 NPCs, 5-state machine, demand-driven work, soul-imprint triad data model, seasons with winter frost, granary, need-based gift economy, selfish-soul contrast wiring, daily/per-villager/gift CSV logging. FINDINGS.md documents the four soak experiments: the dead paradise, the buffers winning, the emergent hungry gap, and the contrast test proving the four-town thesis (and that selfishness wins until the soul-consequence layer exists). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
108 lines
5.0 KiB
Markdown
108 lines
5.0 KiB
Markdown
# WorldSim — Soak Experiment Findings (July 2026)
|
||
|
||
Four long-run experiments against the South (Nature) town MVP. Each run:
|
||
15 NPCs, 256×256 world, seed 12345, ~240 simulated days (2 years) at
|
||
accelerated speed. Data: `soak_stats.csv` (daily), `soak_npc_days.csv`
|
||
(per-villager dominant states), `soak_gifts.csv` (every gift, with names).
|
||
|
||
---
|
||
|
||
## Run 1 — Baseline (no seasons): the dead paradise
|
||
|
||
**Setup:** constant regeneration, upkeep + food demand only.
|
||
|
||
**Result:** perfectly stable, perfectly inert. 200 days: wood held a ±1%
|
||
band, shelter condition pinned at 100%, **zero trades**, no roles — every
|
||
villager Socializing-dominant ~114 of 119 days, 78% of waking life idle.
|
||
The village completed all construction and expansion by day 3–4 and then
|
||
had nothing left to want.
|
||
|
||
**Lesson:** a village is a metabolism, not a project. Equilibrium without
|
||
pressure produces no society: no differentiation, no exchange, no
|
||
structure. Abundance makes generosity unobservable.
|
||
|
||
---
|
||
|
||
## Run 2 — Seasons (regen throttle only): the buffers win
|
||
|
||
**Setup:** 30-day seasons; winter cuts food regen to 5%, wood to 40%.
|
||
Granary added (clay walls — first clay use), need-based gift trigger.
|
||
|
||
**Result:** winter became a *worked* season — gathering 4,889 ticks/day vs
|
||
1,857 in summer, wild stocks visibly drained and refilled. But nourishment
|
||
ran the identical sawtooth year-round, the granary sat untouched at
|
||
150/150 through two winters, and trades stayed at **zero** across 240 days.
|
||
|
||
**Lesson:** three compounding buffers (the sustainability floor acting as a
|
||
~360-unit hidden savings account, personal pack reserves, wild food budget
|
||
exceeding winter need) meant scarcity never reached an individual. Pressure
|
||
that only raises labor doesn't create interdependence.
|
||
|
||
---
|
||
|
||
## Run 3 — Frost: the hungry gap
|
||
|
||
**Setup:** winter now *decays* standing food ~7%/day toward 15% (frost
|
||
kills the larder); granary draws deepened; anti-redeposit rule.
|
||
|
||
**Result:** the simulation came alive.
|
||
- **First trades in sim history: 21** (17 deep winter, 4 early spring) —
|
||
exactly when granary-empty met neighbor-with-food.
|
||
- **Granary sawtooth textbook**: full through autumn, empty by winter day
|
||
~25, refilled within 4 days of spring. Both years.
|
||
- **The sim reproduced the "hungry gap"** — a real agricultural phenomenon
|
||
neither designed nor named in the code: worst hunger (village nourishment
|
||
0.21) fell in *early spring*, after stores ran out but before the land
|
||
regrew past harvestable thresholds.
|
||
- Crisis cascaded: the food emergency pulled labor from heating (firewood
|
||
reserves dipped to 10, condition below 100% for the first time).
|
||
- Balanced: severe hunger, zero lasting health damage, both years.
|
||
|
||
**Lesson:** storage limits + decay + regrowth lag ⇒ emergent seasonality of
|
||
need. Sharing is a *response*, not a behavior: 480 days of abundance
|
||
produced zero exchanges; ten days of genuine need produced twenty-one.
|
||
Still missing: individual roles — identical souls in a global work queue
|
||
respond identically (winter gather ticks all within 490–553).
|
||
|
||
---
|
||
|
||
## Run 4 — The contrast test: 3 selfish souls among 12
|
||
|
||
**Setup:** villagers M/N/O run the East (Selfish) soul profile. Same
|
||
engine, same possibility space; only behavior weights differ: low
|
||
sustainability (strip nodes to ~15% vs the 50% commons floor), low
|
||
generosity (refuse gifts; excluded from asking), low community bias (no
|
||
communal work at all), high accumulation (double carry, standing hoard).
|
||
|
||
**Result — the four-town thesis validated:**
|
||
- Selfish villager-days: **0 build ticks** (vs 104/day for nature souls),
|
||
gather 69 vs 269, **rest 0** (never tired), socializing 1,369 vs 921.
|
||
A visible leisure class living off a working village.
|
||
- Gift network: 11 gifts, all nature→nature. The selfish never gave and
|
||
never needed to receive. First individual differentiation appeared:
|
||
**Villager_A gave 4 of 11 gifts** — the village's generous one.
|
||
- The 12 communal souls absorbed 15 souls' worth of burden without a
|
||
single ruin.
|
||
|
||
**The central finding: selfishness strictly won.** Most leisure, least
|
||
fatigue, fullest bellies, zero costs, no pushback. This is not a balance
|
||
bug — it is the empirical case for the game's soul layer. Economics alone
|
||
cannot make selfishness cost anything; that is the job of imprints,
|
||
debris, echoes, and social memory (the Unity POC's warmth-echo system).
|
||
The soul-consequence layer is not flavor on top of the economy — it is
|
||
the only thing standing between the South town and being farmed by the
|
||
East.
|
||
|
||
---
|
||
|
||
## Next
|
||
|
||
1. **Port the soul layer into the sim**: imprint triad accumulation,
|
||
social memory of gifts/refusals, consequences routed through behavior
|
||
(the generous get helped first; the ungenerous get asked last, served
|
||
last, remembered coldly). Rerun the contrast test; see if the village
|
||
organically stops carrying its parasites.
|
||
2. Instrumentation gap: per-villager nourishment/health in
|
||
`soak_npc_days.csv` (currently the village average hides who starves).
|
||
3. Save/load round-trip (SPEC §9 amendment) — still outstanding.
|