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

29 KiB
Raw Blame History

title, workshop, participant, round, date
title workshop participant round date
Gestalt Round 1 — Morphology Algorithm Family + Game-Feel Constraints tile-derivation-contract Gestalt 1 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 04 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 312 m below the surrounding terrace. Oxbow lakes appear where prior meanders were cut off — these are ponds of still water on the floodplain, 420 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.32.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 (13 m, provides hard cover). Oxbow lakes are impassable unless frozen or bridged. River crossing is a chokepoint — the channel itself, 315 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 (28 m wide at floor) and deeply incised (1580 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 (26 m wide, 0.31.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 24 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 212 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 13 dune crests visible, with inter-dune troughs. The pattern repeats with seed-driven wavelength variation (0.71.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 1080 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 4080 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 (13 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, 28 m across, 520 m deep). Glassy, uneven surface with no vegetation.
  • A'a (older/rough): Sharply irregular surface with scoria ridges 14 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 13 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 (13 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 (315 m) that controlling one bank can meaningfully contest passage. The gorge floor must be narrow enough (28 m at the cliff base) that it cannot be flanked.

Constraint 4: The derivation must be legible at the Atlas layer

The Atlas (Phase 34 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 ~12 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.