- Added item-bucket dirty tracking, `ensureItemBuckets()`, `itemById()`, `liveItemsOfType()`, and `addItem()` to keep type buckets and id lookup coherent after runtime item additions.
- Routed common item creation paths through `World.addItem()` for placements, rain water, grass growth/spawn, zunchi burst/spawn, ant corpses/nests, Tarinai death traces, and constructed owned structures.
- Expanded runtime diagnostics with bucket dirty state, item id-map size, and bucket rebuild counters.
- Reworked several hot item lookups to use buckets or id-map helpers where safe.
- Updated regression checks for item-bucket helper availability and direct item push documentation.
- Added final pre-save runtime-polish report and remaining-work split note.
- Did not touch save migration, population/family limits, or family-tree UI.
# Patch Notes 15.24.31
## 15.24.31
- Version: `15.24.31`.
- Build: `social-balance-runtime-polish`.
- Fixed social-action balance regression where conflict could dominate too often after ActionSpec migration.
- Reduced normal conflict pressure, lowered fight/intimidation priority, and raised mate/bond selection weight.
- Added pair-level fight cooldown guards so one pair/individual cannot trigger repeated fight starts in the same burst.
- Shortened intimidation/defeated display timers.
- Preserved fight mochi as a strong forced exception while reducing ordinary proximity-fight probability.
- Added regression checks for social balance constants and fight re-entry guards.
- Did not touch save migration, population/family limits, or family-tree UI.
# Patch Notes 15.24.30
## 15.24.30
- Version: `15.24.30`.
- Build: `action-spec-sunbath-runtime-check`.
- Moved `sunbath` into `createSunbathActionSpec()` and registered it directly in `TARINAI_ACTION_DEFINITIONS`.
- Removed the remaining `configureTarinaiNeedActions()` late-binding bridge.
- Kept the existing sunbath body/timer subsystem intact; player-visible sunbath behavior should remain unchanged.
- Updated regression checks so late action patching is treated as a failure.
- Did not touch save migration, population/family limits, or family-tree UI.
# Patch Notes 15.24.29
## 15.24.29
- Migrated social/fear/combat/mate/birth runtime actions into ActionSpec factories.
- Kept family data, family tree UI, population limits, and save migration untouched.
- Added regression checks for pass 3 ActionSpec migration.
- Build: `action-spec-social-runtime-check`.
# Patch Notes 15.24.28
## 15.24.28
- Added centralized behavior-text composition through `composeTarinaiBehaviorText()` and `patchBehaviorTextFromComposer()`.
- Added `textTarinaiAction()` to the ActionSpec lifecycle helpers.
- Kept existing explicit live behavior text as the default display fallback so player-facing wording does not churn during normal observation.
- Added a player-visible diff check comparing the current build against the initial 15.24.20 ZIP.
- Kept save migration, population/family caps, and family-tree UI out of scope.
# Patch Notes 15.24.25
## 15.24.25
- Added `scripts/regression_check.py` and `docs/REGRESSION_CHECKLIST.md` to freeze the current generated-file, syntax, and ActionSpec lifecycle baseline.
- Expanded `js/tarinai_action_spec.js` with explicit lifecycle helpers: `selectTarinaiActionTarget`, `canStartTarinaiAction`, `startTarinaiAction`, `tickTarinaiAction`, `finishTarinaiAction`, and `failTarinaiAction`.
- Routed priority/action eligibility through `canStartTarinaiAction()` while preserving legacy fallback behavior.
- Added finish/fail lifecycle calls for completed or failed action ticks.
- Kept save migration, population caps, family caps, and family-tree UI out of scope.
# Patch Notes 15.24.23
## 15.24.23
- Added coarse-grained spatial invalidation via `markSpatialDirty()` + `ensureSpatial()` for the main update loop.
- Reduced redundant spatial rebuilds around item, ball, ant, and Tarinai update phases while keeping direct `rebuildSpatial()` calls compatible.
- Added per-type item buckets in `updateItemCounts()` and switched ball-ball collision setup to `itemsOfType("ball")`.
- Reworked render layering into a cached dynamic render stack so expensive y-sort work runs on a short interval or count/signature change, not every paint.
- Kept population and family-tree UI behavior unchanged.