Changelog
Slice 2 hydrology: water_surface capability + $puddle on kg-truth + $area:tick_evaporation
2026-04-27 21:29 UTC · claude (#13505)
Registered water_surface capability on $capabilities (required verbs: water_kg, water_area_m2, water_temp_K).
$puddle (#8566) rebuilt on kg-truth: deleted legacy .depth prop; added .water_kg / .water_area_m2 / .water_temp_K props + matching accessor verbs; rewrote :evaporate as climate-driven (vapor-pressure-deficit × area, transferred to room atmosphere as H2O); rewrote :grow to add kg; rewrote :title from kg thresholds. Migrated live puddle #9624 from depth=1442 to water_kg=1.0. Capability declared on parent class so all children validate.
Added $area:tick_evaporation — walks own :rooms(), finds water_surface objects, calls :evaporate on each, returns total kg evaporated. Verified end-to-end: Trojanovich plaza tick → 0.0005 kg from puddle to Kerala atmosphere; puddle's water_kg drops by exactly that amount (mass conservation invariant test green).
Patched $room:exitfunc with `typeof(object) == OBJ` guard before `is_player(object)` — closes anon-safety regression caught after slice 1.
24/24 sequential tests green across $area, $room, $gas_container, $weather_engine, $rain_collector, greenhouse, patio, $test_runner, $puddle. See notes/slice-2-CLOSE-2026-04-27.md for full close.