Reverts the home-range bound on exploration and the homestead anchor-clamp.
A town that must range far to eat now relocates for real - the South
drifting inland after a hard winter, an East scout wandering across the
map and homesteading where they land (some homes now 648 units from the
anchor). Kept the identity-hash explore direction (no southward bias) and
the centroid-relative communal cohesion clamp (that follows migration, it
doesn't fight it). Towns still hold distinct cultures and stable
populations - migration is emergent, not collapse.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Root cause of towns (East worst) drifting south: when an exploring soul was
at its anchor with no outward vector, the fallback direction was
Vector2(PersonalityModifier, 1 - Abs(PersonalityModifier)) - and with
PersonalityModifier tiny (+-0.2) that Y-component was always ~+0.9. +Y is
south, so every town's explorers got shoved into the southern corner. East
showed it worst (selfish souls strip resources fastest, so they explore
most). Now the at-anchor direction comes from the soul's identity hash,
spread around the full compass.
Supporting fixes: exploration is bounded to a ~140-unit home range (forage
out and back, don't march to the horizon); private homesteads clamp to
within 120 units of the town anchor (selfish souls sprawl on their OWN
land, not into a neighbor's). Result: every East home now founds near the
east anchor (x~870 vs the anchor's 962), none in South's territory, and
East is the healthiest town.
Also widened the map view (880 -> 1060px) to use more of the window - the
world grew to 1152 but the render was a fixed square, so it looked no bigger.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Root cause of the homeless East: FoundOwnShelter searched all buildings by
proximity (within 30 units), so a lone selfish builder who wandered off to
gather wood for the walls came back, missed their own foundation, and
founded a NEW one - 5,900+ abandoned foundations per run, none finished.
Fix (per the exploration architecture): structures are known like resource
nodes. NPCs gain a KnownStructures set; a builder registers the home they
lay and returns to it via known-structures memory however far they roamed,
instead of re-founding. Children inherit their family's known buildings.
Result: 5,953 -> 31 founding events, East now houses itself with COMPLETED
homes and is the best-fed town (0.84), still lowest-knowledge/highest-debris
as selfishness should be.
Also expanded the world 768 -> 1152 with towns pushed to wider cardinal
points and resources scaled to area, giving the four cultures more room and
less accidental center overlap. Full 240-day four-town run in 189s.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Shelters now wear their town's culture color on the map (North cool-blue,
South green, West gold, East red), dimmed by wear; granaries stay green,
ruins dark. And bonds can now cross town lines: usually you pair within
your own people (that's who you're near), but a wanderer who warms to
someone from another town shacks up across cultures - the first quiet
thread of contact between two peoples. When two towns share a roof, the
house is drawn split diagonally, half each culture, visible across the map.
Mechanics: buildings track their top-two resident home-towns (recomputed
with occupancy, throttled to every 30 ticks since it's map-only); the
bonding rule dropped its same-town requirement. A 240-day run produced
126 bonds, 40 of them cross-town (East+North, West+South, all combos),
with populations still balanced - inter-cultural contact without
destabilizing the towns.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
An all-selfish town had founded zero buildings ever - selfish souls never
do communal work, and with no nature souls to build shelters they could
freeride on, the whole East slept rough forever. That was too absolute:
the East's design is "personal wealth infrastructure," not homelessness.
Selfish souls now build a shelter for THEMSELVES after enough rough nights
- private property, founded where they sleep (no clustering to the town
center), never for anyone else. Required routing homeless-with-stone
selfish souls into the Building state (three paths previously sent them
straight to Socializing) and moving the homeless-stone gather rule ahead
of the communal-only block.
Result: East houses itself (11 private homesteads over a run) as scattered
homes vs the others' clustered villages - a visible cultural signature.
And the verdict sharpens: East is now fed and housed but still lowest
knowledge and highest debris. Selfishness's cost is soul-marks and
ignorance, not homelessness.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Exploration addendum stage 1: per-NPC known-nodes. NPCs gather only from
resources they've personally sensed (radius 22) or been told about;
founders seed with home ground, children inherit parents' maps, node
knowledge diffuses between neighbors like skills. Starving NPCs venture
outward and sense as they go - non-random needs-driven exploration, the
seed of first contact. Repopulation preserved (seeding + survival food
fallback): all towns fed, population stable 86-109 over 240 days.
Debug screen rebuilt: the ~68-row per-villager roster (overflowing at
four-town scale) replaced with a per-town summary - pop, fed%, knowledge,
debris, state breakdown, buildings, culture-colored, plus world
births/deaths. Scales to any population.
Performance: added phase timers and measured instead of guessing - npc.Tick
was 94% of cost, O(n^2) via TickResting calling RestingOccupancy (full
population scan) per building per resting NPC. Fixed with a once-per-tick
occupancy cache on Building. npc phase ~4x faster and now linear; full
240-day four-town run in 180s, faster than the pre-exploration baseline.
Profiling scaffolding removed.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Children from bonds (Phase B): death no longer auto-spawns a replacement;
bonded, fed, adult pairs conceive, logistic-damped toward a per-town
carrying capacity. Population is now dynamic - births vs deaths, a band
not a fixed count. Towns anchored to their cardinal seeds (build-centroid
70% weighted to the fixed compass point) so settlements stay planted
instead of drifting to map-center - North now founds at ~(388,139) by its
(384,130) seed vs West's prior 100+ cell drift.
Tuning took three passes (logged in FINDINGS): explosion, then die-out,
then a generational-gap bug where founders aged out of fertility before
their children matured. Fix: wide fertility window + generous rate.
Result: births 108 ~= deaths 104, healthy population band, and the
four-town thesis sharpened into demographics - North/South thrive
soul-clean, West shrinks with debris, East collapses to a starving
remnant. Selfishness now literally fails to sustain a population.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Route the two remaining full-population scans (a hungry villager seeking
someone with food; a trader seeking a partner) through the NPC spatial
grid with a 60-cell reach instead of scanning all ~80 villagers. Realistic
reach, cheaper at scale.
(A resource-node spatial index was also tried and reverted: benchmarked
~13% slower - at ~1,260 nodes the linear array scan is cache-friendly and
beats a dictionary-of-lists ring search. The node scan was never the
bottleneck; profile before optimizing next time.)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
CSVs now write to soak/ instead of the project root. A .gdignore there
stops the Godot editor from importing CSV columns as translation files -
which had been silently generating 50+ .translation and .import files per
run. Only the .gdignore is tracked; the CSVs stay ignored. Root is clean.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The soak_*.csv debug outputs are regenerated every run and were churning
thousands of lines per commit (npc_days.csv alone is 730KB, fully
overwritten each run). Findings live curated in FINDINGS.md, so the raw
CSVs and their Godot .import metadata don't belong in history. Ignored
going forward; files stay on disk so runs are unaffected. Also tracks
the SpatialGrid script UID.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
World scaled 3x (768x768) with all four towns at compass points, each
running its own soul culture: North generational, South nature, West
materialist (new profile), East selfish. Two new resources: Ore (metal
tier) and Herb (medicine - mends health, reason to forage, trade good).
Spatial hash grid replaces O(n^2) proximity scans (soul pressure,
neighbor, teacher) - 3.6x headless speedup at ~80 NPCs. First social
verb beyond work: pair-bonds - settled adults who keep warm company pair
up; warmth now accrues from proximity not only gifts; bonds break at
death. Reproduction deferred (bonds-first per plan).
The four-town thesis fully realized on one engine (240-day run):
North know 1.27 clean, South nourish 0.85 clean, West prosperous but
debris 0.23, East hungriest 0.60 and lowest knowledge 1.08. Positive
cultures stay soul-clean, negative ones carry real debris, all from
behavior weights - nothing scripted. 99 bonds, 80 deaths, four living
societies.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
SPEC §5 built: three skill domains (forage/woodcraft/masonry) that pay
off and grow by practice; proximity diffusion soul-calibrated by
absorption x teaching-drive; and mortality - the piece that makes
knowledge generational. Elders die (~150-230 days), everything unshared
dies with them, a youth comes of age near knowing nothing. North soul
(absorption 1.6, teaching 0.9) vs South (1.0, 0.3); East teaches no one.
Two findings: (1) headless soaks were contaminated by orphaned child
processes writing later runs' CSVs - fixed with StopAfterDays clean
self-terminate; (2) passive diffusion barely helped - the North's real
culture is the young seeking elders on purpose, so added deliberate
teacher-seeking and youths now cradle beside the wisest elder. North
now leads knowledge at every checkpoint, but a stable town approaches
the ceiling regardless, so teaching is a recovery advantage not an
equilibrium one. The crisis-recovery experiment is the real test, noted
in FINDINGS as next.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Granary satiation: hunger scars motivate storage only until town
capacity could carry a winter (pop x 45); sprawl of ~10 granaries falls
to the sated level. Quarry return: packs stuck with undroppable stone
after rebuilds made starving porters; unneeded stone goes back to the
quarry (matter conserved, packs unclogged).
Also corrects the record: run 10's zero-ruin year-2 claim came from
CSV contamination by orphaned headless child processes (console wrapper
kills didn't kill the tree). Clean verified result now: year-1
catastrophe and rebuild, then year-2 at 0.77 nourishment, zero new
ruins, 100% condition, textbook granary sawtooth.
Open in FINDINGS: accessible stone exhaustion plateaus housing below
population - a Phase 3 economy question (deeper quarrying, stockpiles).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Recovery blocker was material, not motivational. Two fixes: (1) harvest
floors and commons debris apply only to living, regenerating resources -
stone does not regrow, so "leave half" merely stranded the world supply
and kept the homeless homeless forever; minerals now quarry to depletion
for every soul equally. (2) Matter conservation: idle variety-gathering
touches only renewables, and packs may only shed what the land replaces
- lossy make-room had milled 900+ stone to dust during demand flapping.
Verified over 260 headless days: year-1 winter still wrecks the naive
town, it rebuilds in 20 days, famine survivors found the first granaries
from hunger memory, and year-2 winter passes with zero ruins on stored
reserves. The town has a history now: naive youth, catastrophe,
learning, resilient maturity.
Remaining tuning in FINDINGS.md: granary sprawl, post-famine nourishment.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Fixes (headless-verified): homes founded at the habitual sleeping spot
within reach of the community (not at distant stone mines); night sends
everyone to bed so beds are used and rough nights actually occur; a bed
must exist at arrival - floor-sleepers at full shelters now count as
unsheltered. Diagnostics added: incomplete_sites stat column, founding
logs.
Open (documented in FINDINGS.md, paused by request): the loop builds
forward but cannot rebuild after loss - winter crises ruin shelters and
recovery stalls (4 foundings in 240 days, no granary after two famines).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Priority inversion fix: the homeless-gather-stone rule preempted all
communal work, so once everyone was homeless the town gathered stone
forever while half-built walls waited for wood that never came. Now
construction sites are first among works, homeless stone-gathering and
founding defer while any shelter is under construction, and granaries
require hunger memory + surplus (no more day-5 granary sprawl).
Run 7 logged in FINDINGS.md: in a needs-driven economy, priority
ordering is the constitution.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Removes every predetermined construction trigger (shelters-per-capita
cap, granary-at-five-shelters milestone). Buildings now emerge from
lived need:
- Shelters have real bed capacity (3 + modules). A full house turns you
away; three nights sleeping outside and a person gathers stone and
raises a roof where they actually live. When nobody sleeps outside,
nobody builds. Ruined shelters spill their sleepers, so settlements
can migrate over time.
- The first granary is founded by memory: someone who has truly starved
stockpiles food once the land gives again and builds storage where the
harvest is. A second granary appears only when the first fills.
- Emergent consequence: freeriders compete for beds but never build,
so scarce housing squeezes them into the open. The village never
decides to punish them; the housing supply does.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Runs 5-6 logged in FINDINGS.md (soul layer validated: nature debris
0.000 vs selfish 0.225 after two years; the ledger works).
Towns are now real spatial structure: TownDef seeds (South at the
bottom of the map, North at the top), NPCs affiliate with a home town,
communal duty serves your own settlement (buildings are town-tagged,
founding uses the town centroid and per-town shelter caps), and each
town raises its own shelters and granary. Generational (North) soul
profile added — temperament only until the knowledge system lands.
Map shows town labels; rosters and CSVs carry town columns.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Run 5 findings: justice arrived (selfish health 31-64 vs nature 100, all
108 refusals theirs) but two pathologies emerged: the whole village maxed
others-regard debris because the commons penalty line (50%) sat above the
nature harvest floor (45%) and debris had no clearing path; and warmth-
weighted asking + near-total gift transfers produced a 2,501-gift winter
food-swapping loop.
Fixes: commons line lowered to 40% (respectful harvesting never grazes
it; strip-harvesting lives deep inside it); gifts capped at 3 with a
kept reserve of 5; asking gated on genuine hunger; and giving now heals
the giver slightly (-0.003 others-regard vs +0.02 per refusal) — harm
stays an order of magnitude easier than healing.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Ports the Unity POC soul systems into the sim:
- Warmth echoes: villagers remember who fed them (+0.15) and who turned
them away (-0.25). Ask-for-food targeting runs on memory, not
omniscience; the remembered-cold are not asked. Echoes fade daily.
- Refusing the hungry while holding food marks the refuser (others-regard
debris) and is logged; empty-handed is not refusal.
- Harvesting below the 50% commons line marks the taker per unit taken.
- Soul-to-soul atmospheric pressure (SoulFieldSystem port): encased souls
darken nearby atmospheres, clear souls lighten them.
- Debris costs biologically: nourishment drains faster and meals restore
less as the soul encases.
- Instrumentation: avg_debris + refusals in daily stats; per-villager
nourish/health/debris; refusals in the contact log; map dots dim with
encasement.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
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>