Files
Soul_Game/FINDINGS.md
T
mmcghen 721acbd1aa South town MVP: world sim, seasons, granary, contrast test + findings
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>
2026-07-21 12:55:30 -04:00

5.0 KiB
Raw Blame History

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 34 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 490553).


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.