Files
settled-reach/docs/workshops/tile-derivation-contract/gestalt-round1.md
T
jpmschweitzerandClaude Opus 4.8 fa8b6ebf08 docs(governance): file D-239 tile derivation contract, resolve Q-101
Resolves Q-101 — how a coarse Layer-1 cell + seed becomes coherent ~1m
voxel geometry across the scale jumps. The tile-derivation-contract
workshop output:

- three-carrier refinement chain RegionProfile -> ChunkContext -> VoxelColumn,
  pure deterministic, no authoring at the derivation layers
- district-temperature climate primitive (2x2 km, C, nullable) + separate
  moisture; everything climatic derives from temperature(+moisture)
- scattered, transient freeze/snow model (freshwater +5..-10, sea ice own
  band, snow moisture-gated; forms cold phase / melts warm phase)
- stateless f64-to-voxel domain warp (anti-squaring)
- 8 morphology families over a frozen 17-zone vocabulary, gated decision tree
- seams prevented at source (gate ordering + build-time matrix); valid
  geomorphic seams kept sharp + warped

Includes workshop brief, round-1 positions, and workshop-outcomes.md.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 12:14:55 +02:00

596 lines
29 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
title: "Gestalt Round 1 — Morphology Algorithm Family + Game-Feel Constraints"
workshop: tile-derivation-contract
participant: Gestalt
round: 1
date: 2026-06-07
---
# Gestalt Round 1: The Morphology Family and What Terrain Must Do
Let me break down what this actually means mechanically. We have two distinct
problems that must be solved simultaneously: (1) the classification logic that
selects which algorithm runs for a given region, and (2) the game-feel contract
that algorithm must satisfy. These are not separable — an algorithm that is
geologically plausible but produces flat, featureless terrain at the 64 m chunk
scale is a failed algorithm regardless of its realism score.
---
## Framing: What the Morphology Algorithm Actually Produces
Tyre's API contract gives each morphology family a clean interface:
- **Receives:** `ChunkContext` (RegionProfile + warped position + elevation grid +
flow data)
- **Produces:** `ElevationDelta: i16` per voxel column (signed integer metres,
delta from base heightmap)
That `ElevationDelta` output is then consumed by the material/vegetation/water
derivation steps. So the morphology family's job is: given a region's coarse
character, produce the fine-grain elevation variation within each chunk that (a)
reads as physically coherent and (b) produces tactically interesting geometry.
The D-228 axis for "shape / geometry" is explicitly `f(elevation-step × material)` —
sand slumps, rock faces go vertical. The morphology algorithm drives `elevation`;
material drives how that elevation is expressed as renderable geometry. These two
together produce cover, line-of-sight, and chokepoints.
---
## Part 1: The Six Morphology Families
I am enumerating eight families, not six — six is the minimum; eight is what the
world actually needs. The selector logic is why this makes sense: some of these
are statistically rare (fjord, lava field) but their game-feel is so distinct
that collapsing them into a broader family would produce detectable sameness.
### Selection Logic Overview
The selector is a decision tree over integer inputs. All inputs are available in
`RegionProfile` as Tyre has sketched it. I will specify what each input node
needs to be, and flag one addition.
**Inputs required (all integer or enum — D-010 compliant):**
| Input | Type | Source |
|-------|------|--------|
| `slope_class` | `Flat / Gentle / Steep / Cliff` | 3×3 elevation kernel, already in RegionProfile |
| `drainage_class` | `None / Ephemeral / Perennial / Major` | D8 flow accumulation |
| `sea_level_margin` | `i32` metres | elevation − sea_level |
| `lithology` | enum | body params + elevation strata |
| `glaciation` | `u8` grade 0–4 | body params (temperature + tectonic age) |
| `tectonic_class` | `Passive / Active / Volcanic` | body params (new — see below) |
| `sub_biome` | enum | D-210 |
**One addition to RegionProfile I need:** `tectonic_class: TectonicClass` (Passive /
Active / Volcanic). This is a body-level parameter (like `hydrosphere` and
`tectonic_activity`) that modulates which high-energy families are eligible. A
geologically dead body cannot produce lava fields or fault scarps. This keeps the
classification honest and prevents algorithm outputs that contradict the body's
established character.
---
### Family 1: Meander Reach
**Selection context:**
- `slope_class` = Flat or Gentle
- `drainage_class` = Perennial or Major
- `sea_level_margin` > +20 m (above tidal influence)
- `glaciation` <= 1 (not glaciated)
- `lithology` = Alluvial or Sedimentary
**What the algorithm produces:**
A sinuous channel with a defined thalweg (deepest flow line), pointbar deposits
on the inside of bends, and a cutbank face on the outside. The active floodplain
is 3–12 m below the surrounding terrace. Oxbow lakes appear where prior meanders
were cut off — these are ponds of still water on the floodplain, 4–20 m across.
The meander geometry is driven by a parametric sine-distortion of the D8 flow
direction at chunk scale, with the amplitude controlled by `meander_intensity`
(already in `RegionProfile`). The sinuosity parameter (ratio of channel length
to valley length) ranges 1.3–2.8 depending on `meander_intensity`.
**ElevationDelta range:** −8 to +4 m (channel is below floodplain; terrace is
above; total relief within a 64 m chunk is modest).
**Tactical character:** Long sight lines broken by river banks and terrace edges.
The pointbar is open ground with poor cover; the cutbank is a steep earthen wall
(1–3 m, provides hard cover). Oxbow lakes are impassable unless frozen or bridged.
River crossing is a chokepoint — the channel itself, 3–15 m wide, forces engagement
on the banks. Meander bends create natural flanking ambush positions where the bank
curves away from a pursuer's sightline.
---
### Family 2: Incised Gorge / Badland
**Selection context:**
- `slope_class` = Steep or Cliff
- `drainage_class` = Perennial or Major
- `sea_level_margin` > +50 m (high above sea level)
- `tectonic_class` = Active (or high uplift rate from body params)
- `lithology` = Sedimentary or Metamorphic
**What the algorithm produces:**
A V-shaped or slot canyon geometry. The channel is narrow (2–8 m wide at floor)
and deeply incised (15–80 m below the surrounding plateau). Canyon walls are
vertical or near-vertical rock faces. At the top, the plateau surface continues
at the base heightmap elevation. Talus slopes appear at the base of cliff faces
(coarser scree — Gravel lithology — where the cliff transitions to channel floor).
Within a 64 m chunk, a gorge manifests as: the plateau surface at base elevation
(flat or gently rolling), a cliff edge dropping sharply, the canyon floor, and
the far cliff rising again. Not every chunk contains the full cross-section —
chunks on the plateau see only the cliff edge; chunks on the floor see only walls.
**ElevationDelta range:** −80 to 0 m (plateau stays at base; gorge cuts downward).
**Tactical character:** Extreme vertical asymmetry — the dominant tactical variable.
A character on the plateau rim has total LOS advantage over the floor, can fire
down, cannot be flanked from below. But cliff faces are un-climbable without gear
(a mechanical constraint the tile data supports: Cliff shape on Rock material =
impassable). Gorge floors are extremely exposed if the rim is held. Gorge passages
are decisive chokepoints — a party controlling a narrow canyon floor controls the
route. The slot geometry creates situations where the player cannot retreat without
crossing the enemy's field of fire.
---
### Family 3: Braided Delta / Distributary Fan
**Selection context:**
- `slope_class` = Flat or Gentle
- `drainage_class` = Major
- `sea_level_margin` between −5 and +15 m (near sea level)
- `lithology` = Alluvial
- NOT `glaciation` >= 3
**What the algorithm produces:**
Multiple shallow, anastomosing channels (2–6 m wide, 0.3–1.5 m deep) dividing
and rejoining across a nearly-flat fan surface. Islands of slightly higher ground
(natural levees and splays) sit between channels. The whole surface is within 2–4 m
of sea level; many tiles are waterlogged or tidal-flat state at high water.
Channel positions are driven by a multi-seed Voronoi partition of the chunk area
with D8 flow direction as an attractor — each Voronoi center generates a channel
branch. The `meander_intensity` parameter controls how much the branches deviate
from a straight downslope path.
**ElevationDelta range:** −2 to +3 m (almost flat; channels are slight incisions;
levees are slight rises).
**Tactical character:** Mobility is the dominant constraint. The network of small
channels fragments the surface into irregular islands — movement requires knowing
which crossings are wadeable (Shallow Water at low tide) vs blocked (Deep Water
at high tide). The Q-105 tidal/seasonal water model makes the same terrain
tactically different at different times of day. Cover is minimal (low, flat
vegetation, no high ground) but concealment is high (dense reed beds, tall grass,
poor LOS in all directions). Ambushes are set in reed cover; pursuit is slow;
routing is non-obvious.
---
### Family 4: Dune Strand / Aeolian Plain
**Selection context:**
- `sea_level_margin` between −2 and +30 m
- `lithology` = Sand
- `sub_biome` = Arid or Coastal
- `drainage_class` = None or Ephemeral
- `slope_class` = Flat or Gentle
**What the algorithm produces:**
Transverse or barchan dune forms, oriented perpendicular to `dune_orientation`
(compass octant in RegionProfile — prevailing wind). Dune height 2–12 m;
inter-dune corridors are flat sand at base elevation. The slip face (steep lee
side, ~32° angle of repose) is the sharp edge; the windward stoss side is gentle.
Within a 64 m chunk: typically 1–3 dune crests visible, with inter-dune troughs.
The pattern repeats with seed-driven wavelength variation (0.7–1.4× nominal spacing)
to prevent visible periodicity.
**ElevationDelta range:** −3 to +12 m (troughs below base; crests above).
**Tactical character:** Dune crests are the key terrain feature — short-range cover
on the stoss side (the gentle approach), sudden exposure on the slip face (the sharp
drop). Crest control is inherently ephemeral in the sense that the geometry forces
skyline exposure — you are visible from anywhere on the stoss side the moment you
crest. The inter-dune corridors are covered routes but lead into bowls with no
exit cover. Movement slows on loose sand (a material-driven movement penalty).
LOS is extremely range-dependent: from a dune top you see far; in a trough you see
perhaps 20 m.
---
### Family 5: Cliff Coast / Sea Stack
**Selection context:**
- `sea_level_margin` between −20 and +10 m
- `slope_class` = Steep or Cliff
- `lithology` = Rock or Metamorphic (NOT Sand — that is Dune Strand)
- `glaciation` <= 1
**What the algorithm produces:**
A wave-cut platform at or just below sea level, then a cliff face rising 10–80 m
to a clifftop plateau. The cliff face is sheer rock (Cliff shape, Rock material,
impassable). Sea stacks are isolated rock pillars standing in shallow water
offshore — generated as local elevation spikes in the sub-sea zone where a noise
field exceeds a lithology-dependent threshold (hard rock produces stacks; soft rock
produces a smooth platform).
The clifftop is the base heightmap elevation; the platform and stack geometry are
ElevationDelta downward from there (platform −10 to −30 m relative to clifftop,
meaning near sea level; stacks are +0 to +20 m above sea level but below the main
cliff top).
**ElevationDelta range:** −30 to 0 m (cliff is a step-down to the coast; no upward
delta from clifftop).
**Tactical character:** Unambiguous dominance of the high ground. Cliff-edge
positions are impregnable from below (cliff face is impassable) and exposed from
above. Clifftop defenders have infinite LOS over the ocean approach. Attackers from
the sea face a wall. The wave-cut platform, when exposed at low tide, is a
short-duration tactical route — accessible only during specific water states (the
Q-105 tidal model), creating timed-window scenarios. Sea stacks provide intermediate
cover in an otherwise featureless marine approach — the only interrupt of a long
open crossing.
---
### Family 6: Fjord Wall / Glaciated Inlet
**Selection context:**
- `sea_level_margin` between −50 and +200 m
- `slope_class` = Cliff (required)
- `glaciation` >= 2
- `lithology` = Rock or Metamorphic
**What the algorithm produces:**
Near-vertical rock walls rising from deep water. The U-shaped cross-section
(glacial, not V-shaped fluvial) means the wall base is at or below sea level and
the wall face continues upward to the fjord rim hundreds of meters above. Hanging
valleys produce waterfalls (a narrow shelf partway up the wall where a tributary
glacier once entered). The water within the fjord is deep (ElevationDelta far
below sea level on the water side).
At the 64 m chunk scale: most fjord wall chunks are almost entirely cliff face.
The only variation is whether the chunk is at the waterline (bottom of cliff meets
water), mid-wall (continuous cliff face), or near the rim (cliff top with overhanging
vegetation at the edge). Hanging valley shelves appear occasionally as a narrow
flat ledge at a consistent elevation band across the wall.
**ElevationDelta range:** −200 to +50 m (deep water below; wall can rise significantly
above base heightmap where the hanging valley creates a ledge).
**Tactical character:** Maximum verticality. The fjord is effectively a sealed
corridor — the wall faces are impassable; movement is restricted to the narrow
strip at the water's edge (when it exists) or to the fjord rim. The hanging valley
shelves are the critical feature: a narrow ledge 40–80 m above the waterline that
provides fire positions looking down the full length of the fjord. Controlling a
hanging valley shelf means controlling the entire fjord below. Approach by water is
extremely exposed — no cover, walls on both sides, no retreat options.
---
### Family 7: Alluvial Plain / Floodplain Terrace
**Selection context:**
- `slope_class` = Flat
- `drainage_class` = None or Ephemeral (no active major channel in this region)
- `sea_level_margin` > +5 m
- `lithology` = Alluvial or Sedimentary
- `glaciation` <= 1
**What the algorithm produces:**
The default "open country" family. Low-relief terrain with gentle undulation from
a filtered noise field. Occasional low terrace edges (1–3 m) mark former floodplain
levels. Isolated stone outcrops (lithology-dependent) provide local relief. The
dominant feature is the long sight line — this is the family where LOS extends to
the full render distance.
**ElevationDelta range:** −3 to +5 m (mild undulation, terrace edges).
**Tactical character:** This is the exposed terrain family, and it is here by design.
The game needs open ground — not every biome should be a maze of cover. Alluvial
plains force movement decisions about crossing open ground, using dead ground
(slight hollows where elevation puts you below the local crestline), and timing
movement to reach scattered cover (the occasional outcrop or terrace edge). The
terrace edges are the key tactical micro-feature: a 2 m earthen drop that provides
hard cover from one direction but exposes you from the other.
---
### Family 8: Lava Field / Volcanic Surface
**Selection context:**
- `tectonic_class` = Volcanic
- `lithology` = Lava (basalt)
- `sub_biome` = Volcanic or Barren
**What the algorithm produces:**
Two sub-types depending on lava flow age (body parameter):
- **Pahoehoe (fresh/smooth):** Gently rolling surface with occasional lava tubes
(collapsed tunnels — impassable gaps, 2–8 m across, 5–20 m deep). Glassy,
uneven surface with no vegetation.
- **A'a (older/rough):** Sharply irregular surface with scoria ridges 1–4 m high.
Near-impassable except along flow channels where the surface smoothed.
**ElevationDelta range:** −20 to +8 m (lava tubes cut down; scoria ridges add height).
**Tactical character:** Irregular terrain with extreme movement costs on A'a surface
(material: Lava, movement penalty severe). Lava tubes are natural ambush corridors —
narrow, enclosed, high-concealment, but with no exit options once committed. The
pahoehoe surface, while traversable, produces a distinctive movement sound profile
(glassy clicks vs soft dirt) that may affect stealth mechanics.
---
## Part 2: The Selection Decision Tree
This is the classifier that produces `MorphologyFamily` from `RegionProfile`. It
is a deterministic decision tree, not a probability distribution — each input
combination maps to exactly one primary family (with a secondary family for
boundary blending, as Tyre's API already anticipates).
```
if tectonic_class == Volcanic AND lithology == Lava:
→ LavaField
else if sea_level_margin IN [-200, +10] AND slope_class IN [Steep, Cliff]:
if glaciation >= 2:
→ FjordWall
else:
→ CliffCoast
else if sea_level_margin IN [-5, +15] AND drainage_class == Major AND lithology == Alluvial:
→ BraidedDelta
else if lithology == Sand AND drainage_class IN [None, Ephemeral]:
→ DuneStrand
else if drainage_class IN [Perennial, Major] AND slope_class IN [Steep, Cliff]
AND sea_level_margin > +50:
→ IncisedGorge
else if drainage_class IN [Perennial, Major] AND slope_class IN [Flat, Gentle]
AND sea_level_margin > +20:
→ MeanderReach
else:
→ AlluvialPlain ← the default / open-country family
```
**Why AlluvialPlain is the fallback:** It is the correct geological answer for
"didn't meet any special conditions." It is also the most tactically important
family to have abundant — players need open ground. If everything is a special
terrain family, every encounter becomes a cave-fight.
**Secondary family for blending:** When a chunk sits on a region boundary, the
secondary family is the result of running this tree on the adjacent `RegionProfile`.
The families that blend gracefully (MeanderReach + AlluvialPlain) are common and
well-behaved. The families that do NOT blend gracefully (FjordWall + DuneStrand)
should never be adjacent — and if the world generates that adjacency, it indicates
a body parameter inconsistency that the body-params validator should flag.
---
## Part 3: Family Transition Boundaries — Where the Families Actually Meet
These are the terrain edges that players will encounter most often. They are
not smooth transitions — they are geomorphological discontinuities, and that is
correct. The domain warp (Tyre's mechanism) prevents the discontinuity from
aligning with a chunk grid line, but the discontinuity itself should be sharp.
**Meander Reach → Alluvial Plain:**
The river floodplain (Meander) transitions to the surrounding upland (Alluvial)
at the terrace edge. This is the most common transition in lowland terrain.
Tactically: crossing from open plain to the floodplain means descending the terrace
edge — a 1–3 m earthen step that provides cover in one direction.
**Incised Gorge → Alluvial Plain:**
The plateau continues as AlluvialPlain; the gorge cuts into it. From the surface,
this appears as a sudden cliff edge. The transition is the most dramatic visible
boundary in the game — you walk across open ground and the terrain simply drops
away. Tactically: the cliff edge is a LOS boundary — you cannot see into the gorge
until you are at the rim.
**Braided Delta → Meander Reach:**
Moving upstream, the multi-channel delta collapses into a single meandering channel.
The transition is gradual — channels reduce in number, ground height increases
slightly. Tactically: the covered, fragmented delta gives way to the more open
meander terrain.
**Cliff Coast → Alluvial Plain:**
Clifftop terrain is AlluvialPlain at the heightmap elevation; below is CliffCoast.
The transition is the cliff edge — same character as Gorge → Plain but coastal.
**Fjord Wall → AlluvialPlain (at the fjord head):**
At the landward end of a fjord, the walls close off and the valley floor becomes
accessible. This narrow valley floor is AlluvialPlain — a classic settlement site.
Tactically: the fjord head is the one location where the wall-dominated fjord opens
into traversable terrain. It is always a strategic point.
---
## Part 4: Game-Feel Constraints the Contract Must Satisfy
This is the section I am most insistent on. The morphology algorithm family must
satisfy these constraints, or it fails as a design — regardless of geological
fidelity. These are not aesthetic preferences; they are mechanical requirements
that flow from D-008 (action design) and the five pillars.
### Constraint 1: Every chunk must contain at least one tactical decision point
A "tactical decision point" is any terrain feature that creates a meaningful
choice about movement, positioning, or engagement: a crest, a bank, a chokepoint,
a crossing, a blind corner, a piece of cover.
Alluvial plain is the hardest family to satisfy this constraint — flat terrain
with no features is not interesting. The solution: the terrace edges (1–3 m
earthen drops, never absent from AlluvialPlain chunks) and the isolated outcrops
(seed-driven, present in ~60% of chunks) always provide at least one feature.
The constraint is violated if an algorithm produces a perfectly flat, featureless
64×64 m surface. This must be checked during family implementation.
### Constraint 2: Cover and concealment must be distinct
D-228's composite tile schema gives us the tools: `TerrainMaterial` (hard cover
— does a rock stop a projectile), `Vegetation` (soft cover / concealment — does
a reed bed block LOS), and `elevation` / shape (geometric cover — am I below
the crestline). These are orthogonal axes, and a well-designed morphology family
exploits the distinction.
- Meander pointbar: low elevation (no geometric cover) + dense Vegetation
(concealment) + Alluvial soil (no hard cover) → concealment without protection
- Gorge cliff face: Cliff shape (un-crossable) + Rock material (hard cover) + no
Vegetation → hard cover with no concealment
- Dune crest: geometric cover only (elevation blocks LOS from below) + no hard cover
(sand stops nothing) + no concealment (bare sand, no vegetation)
- Reed delta: Vegetation concealment + no geometric cover + no hard cover → the
ambush terrain
The morphology algorithm must place these in combination, not uniformly. A family
that produces uniform concealment throughout is not interesting. The good terrain
is the one where the player has to read the ground to understand which tiles give
which kind of protection.
### Constraint 3: Verticality must create asymmetric engagement conditions
D-008 explicitly calls for Z-levels and vertical asymmetry. The terrain derivation
is the source of that asymmetry at the world level (buildings create it at the
settlement level). The constraints:
- **The high ground must be visibly identifiable** from the approach. Players should
be able to see that the gorge rim dominates the floor, that the dune crest exposes
them, that the fjord shelf controls the inlet. The rendered geometry must make this
legible — and that geometry comes from the ElevationDelta values the morphology
algorithm produces.
- **The high ground must not be universally dominant.** If every elevated position
is trivially superior, the game collapses to "whoever controls the high ground
wins." The counter: (a) the high ground is often exposed from range (silhouette),
(b) close terrain (gorge wall, dense reed bed) negates ranged advantages, (c) the
cliff face is impassable from below but also from above (you cannot exploit the
position you cannot reach). The morpology algorithm must produce terrain where
the high ground advantage is real but contestable.
- **Chokepoints must be narrow enough to matter.** A river ford that is 50 m wide
is not a chokepoint. The meander algorithm must produce crossings narrow enough
(3–15 m) that controlling one bank can meaningfully contest passage. The gorge
floor must be narrow enough (2–8 m at the cliff base) that it cannot be flanked.
### Constraint 4: The derivation must be legible at the Atlas layer
The Atlas (Phase 3–4 deliverable) must show morphology zone boundaries as visible
map features — players planning movement at the region scale need to read the terrain.
This means:
- `RegionProfile.morphology_zone` must map cleanly to a distinct Atlas color / icon
— Tyre's API already provides this; I am confirming the family vocabulary supports
this legibility.
- The transition between families must be visible at Atlas resolution (the 1 km
region scale) even though the texture of that transition is driven by chunk-scale
geometry. A "MeanderReach region" on the Atlas should look like a floodplain, not
just a flat-colored zone.
### Constraint 5: Seasonal and dynamic state must change tactical character, not just appearance
Q-105 ties the tidal and seasonal water model to derived tile states. The morphology
families that depend on this model are BraidedDelta and MeanderReach — both produce
floodplain terrain where the Q-105 water-height determines which tiles are passable.
The contract: the morphology algorithm must produce ElevationDelta values that, when
combined with the regional water-height model, create a genuine tactical difference
between high-water and low-water states. "The delta floods at high tide" must mean
"you cannot cross the delta at high tide, period" — not "the color of the water
tiles changes." This requires the delta channel elevations to be genuinely below
the Q-105 high-water threshold, and the island levees to be genuinely above it.
This is an explicit coupling between the morphology algorithm's ElevationDelta
output and the Q-105 model's water-height range. The contract must pin this:
BraidedDelta and MeanderReach algorithms must produce elevations relative to
sea_level such that:
- `channel_floor_elevation ≈ sea_level − 0.5 to sea_level + 0.5 m`
- `levee_elevation ≈ sea_level + 1 to sea_level + 3 m`
- `high_water_height ≈ sea_level + 1 to sea_level + 1.5 m` (Q-105 tidal term)
This puts channels under water at high tide and levees dry at low tide — a real
tactical difference.
---
## Part 5: What I Need From Other Participants
**From Tyre:**
- Confirmation that `tectonic_class` can be added to `RegionProfile` without
touching the D8 / Layer-1 pipeline. My expectation: it derives from body params
(already available at the region classification stage), so it is a free addition.
- The morphology algorithm's contract for its per-chunk warp offset interaction.
Specifically: does the warp apply before or after the algorithm sees the
ElevationDelta? My position: warp applies to the spatial query position, not to
the ElevationDelta output. The algorithm produces a delta for the warped position;
material derivation then runs on that delta. This keeps the algorithm implementations
simple.
- Clarification on the secondary family blending: when `blend_weight < 255`,
does the caller blend two ElevationDelta values (one per family), or does each
family produce its own full `TileAxes` and the caller blends those? I prefer
blending ElevationDelta only — material/vegetation derivation from a blended
elevation is cleaner than blending two independent material sets.
**From Miri:**
- Which families need sub-region variation that cannot be expressed by the algorithm
alone? My expectation: MeanderReach needs oxbow lake positions (a secondary zone
within a meander region chunk). I propose this is handled by the algorithm
internally — oxbow lake detection runs a simple cutoff test on meander radius
vs wavelength, producing a local sub-feature without requiring a second region
classification. Miri should confirm this matches how real oxbow lakes form
(spoiler: it does — they form when meander radius exceeds a threshold relative
to channel width, exactly the kind of threshold test the algorithm can implement).
- Confirmation that the 8 families cover the morphology diversity the worldbuilder
expects. I anticipate Miri will want to add a Mountain Pass family (which I have
omitted as a deliberate choice — see note below).
**Note on Mountain Pass:** D-234 references "mountain-pass → ribbon only (streets
linear along the terrain axis)" as a morphology zone affecting settlement. I have
not included MountainPass as a distinct morphology FAMILY because a mountain pass
is not a terrain-generating algorithm — it is an Incised Gorge at high elevation
with specific access semantics. The RegionProfile's `morphology_zone` can carry
MountainPass as a zone classification (distinct from IncisedGorge in semantics and
Atlas display) while using the IncisedGorge algorithm for geometry. This keeps the
algorithm count lean without losing the semantic distinction D-234 requires.
**From Troblum:**
- Performance validation on the algorithm implementations. The families I am most
concerned about are BraidedDelta (multi-seed Voronoi is potentially expensive)
and FjordWall (the hanging valley shelf detection may require neighbor lookups).
Both should be implementable in ~1–2 ms/chunk; Troblum should stress-test.
---
## Summary Table
| Family | Primary Selector | ElevationDelta | Key Tactical Feature |
|--------|-----------------|----------------|---------------------|
| MeanderReach | Flat + Perennial/Major + above tide | −8 to +4 m | River crossing chokepoints; bank cover |
| IncisedGorge | Steep/Cliff + Perennial + high elevation + Active | −80 to 0 m | Extreme vertical asymmetry; floor exposed |
| BraidedDelta | Flat + Major + near sea level + Alluvial | −2 to +3 m | Tidal-cycle movement changes; concealment |
| DuneStrand | Sand + arid/coastal + no drainage | −3 to +12 m | Crest exposure; dead-ground corridors |
| CliffCoast | Near sea level + Steep/Cliff + non-glaciated + Rock | −30 to 0 m | Timed access via wave-cut platform |
| FjordWall | Cliff + glaciated >= 2 + Rock | −200 to +50 m | Hanging valley fire positions; sealed corridor |
| AlluvialPlain | Fallback (no special conditions) | −3 to +5 m | Open ground; terrace edges; long LOS |
| LavaField | Volcanic + Lava lithology | −20 to +8 m | Movement cost; tube ambush corridors |
The algorithm-family vocabulary doubles as the `MorphologyZone` vocabulary for D-228
region-level semantics, with MountainPass added as a zone classification (not a
distinct algorithm) for D-234 compatibility.