- Moved explosion-disease base infection chance reads into `DiseaseRegistry` while preserving protein/niterop disease multipliers.
- Moved serving-food nutrition and hunger-relief reads into `FoodRegistry`, including laxative's zero hunger relief.
- Routed direct love/fight/sleep item eating through `EffectRegistry` while preserving the previous bite-specific stress, fear, and sleep-disease chance behavior.
- Routed sleep drug, rain-water item, and water-bowl field visuals through `item_visual_registry.js`; added water-bowl icon-generation support.
- Updated documentation after inspecting the current game surface: field choices, startup flow, tool groups, chart/family/debug surfaces, localStorage settings, and validation fallback when Node is unavailable.
- Removed unused `css/styles.css` shim and no-op `js/ui_family.js` loader entry; refactored duplicate world initialization and allocation-heavy live-count paths.
- Removed the friend-only panic chain that made only a best friend follow a panic target.
- Added general nearby panic contagion: any nearby live tarinai in panic can cause another tarinai to panic. Neuroticism, distance, and current stress affect the probability.
- Added / completed visible action reasons for:
- eating all food and effect items
- eating grass, ant corpses, and zunchi
- drinking / touching water
- resting near stone, bed, and nest box
- sunbathing
- zunchi-slave avoidance
- being pinched / dragged
- firecracker blast panic
- explosion-disease blast panic
- falling object / stone / genkotsu impact
- high-speed ball collision
- high-speed tarinai collision
- intimidation, intimidation escape, fights, birth ritual, and thaw surprise
- fence-blocked path give-up
- Added state labels for `sunbath`, `ant_attack`, `ant_intimidate`, and `frozen`.
- Expanded target labels for all current tool/item target types, including medicine/effect items, ant corpses, ant nests, firecrackers, pushpins, signboards, and fences.
- Verification performed:
-`node --check` over every `js/*.js`
- state-label coverage scan: no uncovered tarinai states
- Fixed `Maximum call stack size exceeded` caused by `ui_helpers.htmlEscape()` calling the global `escapeHtml()` while `ui_selected.escapeHtml()` called back into `TarinaiUIHelpers.htmlEscape()`.
- Made `TarinaiUIHelpers.htmlEscape()` a pure escaping function and loaded `ui_helpers.js` before `ui_selected.js`.
- Added a guard in `ui_selected.escapeHtml()` so it never delegates to itself.
- Added a data URL favicon link to stop the browser's default `/favicon.ico` 404 request.
- Bumped static asset version to `15.24.0` in `app_manifest.json`, `index.html`, `service-worker.js`, and `js/version.js` to avoid stale cached scripts.
- Reduced target-label duplication: item labels now come from `TOOL_DEFINITIONS` / `toolLabel()`, with `text_catalog.js` holding only non-tool overrides.
- Removed the remaining synchronous family-tree DFS fallback blocks in `ui_family_data.js` and `ui_family_render.js`; both now use `TarinaiFamilyGraph.connectedComponents()`.
- Simplified the remaining manual ant proximity fallback in `tarinai_needs_items.js` to `world.nearbyAnts()`.
- Verification: all `js/*.js` and `service-worker.js` pass `node --check`.
- Further shortened hash text while preserving gameplay state.
- Removed individual observation history/name fields from hash exports:
- names
- former names
- parent display names
- personality daily history
- mystery drug history
- recent change records
- per-individual observation records
- Replaced long family keys in hash payload with compact numeric family references.
- Encoded live IDs like `t12` as numeric IDs in hash payload and restored them on load.
- Packed tarinai core gameplay stats into fixed compact rows.
- Kept gameplay-critical data:
- needs/status
- position and movement-relevant values
- personality and genetics
- parent/child links
- relationships
- diseases
- zunchi slave state
- item effects
- oshibyo/zunchi stock
- sunbath/fear/fall gameplay timers
- items, machines, ants, frozen tarinai
- Flattened item base records remains active from V6 export.
- Hash remains ASCII base64url + gzip for copy/paste and editor durability.
## 15.32.0 - Hash V7 base91/name preservation
- Added `TARINAI_SAVE_V7:` hash export.
- V7 uses gzip plus a 91-character printable ASCII transport alphabet instead of base64url.
- V7 keeps individual names in compact hash exports.
- V7 excludes dead tarinai rows from compact hash exports so family graph history does not revive/save dead individuals.
- V7 filters parent/child and relationship links to living or frozen individuals; pending frozen death notices remain gameplay data.
- V7 stores selected numeric tarinai stats as relative deltas from common defaults while preserving the existing compact numeric precision.
- V1-V6 import support remains.
## 15.33.0 - Hash V8 current-only compact save
- Hash exports now use `TARINAI_SAVE_V8:` only. Old hash import compatibility was intentionally removed for the alpha save format.
- Added an untouched-initial-colony sentinel. Initial colonies now export as a compact reset marker plus names instead of full entity/item rows, targeting roughly 100 characters for the initial state depending on generated names.
- Frozen individual save data no longer preserves pending death notices or relationship/memory records.
- Dead family nodes remain omitted from compact hash saves.
- Individual names are preserved in V8 compact saves.
- V8 keeps printable ASCII transport using the 91-character alphabet, with an explicit compressed/uncompressed mode marker.
## 15.34.0 - Hash V9 binary compact format
- Removed the V8 initial-state-only save sentinel. All states now use the same compact format.
- Export hash format is now `TARINAI_SAVE_V9:` and legacy hash imports are rejected during alpha.
- Replaced JSON-based compact hashes with a dedicated binary packet plus printable ASCII Base94 transport.
- Stopped saving elapsed day count in compact hash; loaded compact hashes restore day as 1.
- Kept custom individual names, while default four-character names made only from `は / う / ぅ / っ` are packed as 2-bit character codes.
- Replaced saved tarinai/item IDs and family keys with array-index references; IDs are regenerated on load.
- Uses default-relative numeric deltas, optional timer tags, boolean bit fields, and 0.1-unit integer coordinates.