feat(simulation): district moisture spatial gradient (T-1080)

moisture_q was a single body constant (derive_moisture_q took only &BodyParams →
80 for every one of 2048 ocean-world districts), so vegetation/terrain/ecotones
were uniform — "nothing to fuzz" (the T-1080 believability bug).

- district_profile.rs: derive_moisture_q is now a body ceiling (hydrosphere+atmosphere)
  × per-district gradient — latitude (equator wet → pole dry), elevation (orographic/
  rain-shadow), continentality (100 − ocean_fraction_q). Integer/D-010, no new plumbing
  (elev_q/ocean_fraction_q/latitude_deg already reach build_district_profile). Mirrors
  D-240's temperature model. Coefficients in ClimateConstants + climate_constants.toml
  [moisture_gradient] (provisional; Q-123 calibrates). Tuned so a wet body stays mostly
  green with drier patches and a frozen body clamps mostly barren. + gradient unit test.
- region_profile.rs: region-tier moisture gets the region-latitude gradient (elevation/
  continentality are district-scale).
- Propagates to precipitation_class / vegetation_class / morphology_zone (all read
  moisture_q). D-239 §2 amended. Believability golden regenerated.

Probe (Arbour @ yolo): moisture_q distinct 1 → 49 (spread 0 → 48); 5/7 → 6/7 criteria.
Edict (frozen): moisture 0..20 ×21 — gradient within its low ceiling. Remaining fail
(vegetation-present) is the metric dividing by all-sampled incl. water on a 2/3-ocean
world — a Q-123 calibration concern, not a climate defect.

clippy --all-targets -D warnings clean; 1580 lib tests + harnesses pass.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-06-28 17:25:18 +02:00
co-authored by Claude Opus 4.8
parent cdc55032df
commit bb5069aa13
7 changed files with 171 additions and 23 deletions
+7 -7
View File
@@ -6,9 +6,9 @@
"voxel_sampled_districts": 64,
"contrast": {
"moisture_q": {
"min": 80,
"min": 32,
"max": 80,
"distinct": 1
"distinct": 49
},
"elev_q": {
"min": 0,
@@ -27,13 +27,13 @@
},
"morphology_zones": 9,
"vegetation_classes": 3,
"terrain_materials": 4
"terrain_materials": 3
},
"coherence": {
"water_districts": 46,
"water_districts_wet": 43,
"water_districts_wet": 44,
"drainage_samples": 10,
"drainage_monotonic": 8,
"drainage_monotonic": 9,
"vegetation_samples": 64,
"vegetated_districts": 11
}
@@ -45,9 +45,9 @@
"voxel_sampled_districts": 64,
"contrast": {
"moisture_q": {
"min": 20,
"min": 0,
"max": 20,
"distinct": 1
"distinct": 21
},
"elev_q": {
"min": 0,