docs(meta): D-258 — ids, not fields; biome and terrain are two maps
Supersedes the same morning's shape; its four rulings stand. - Scope, measured: 257 bodies with an atmosphere (airless deferred, with room left in the format). Full 1024x512. - Ruling 5: bake class ids only. What a class IS lives in class tables, authored as TOML and imported into systems.db under the stamp, so a definition is written once, can grow, and changes every world without a re-bake. Per-pixel temperature and moisture are dropped: ~38 MiB for a within-class gradient that bilinear class mixing and the climate model mostly recover, and that the simulator often clamps flat anyway. - Ruling 6: terrain type and biome are separate maps. compute_biome already computes the Whittaker class first and then paints terrain over it, so biomemap takes it pre-override and terrainmap carries the override. Terrain carries no climate, and the biome underneath always does. - Open: the anomaly scatter's story features (placement, and a 3% rate Jeroen calls high, for a balancing pass). - Records the mountain-rock units bug fixed in the previous commit, and sulfuric scrub's unreachable elevation window, left as found. T-1295, T-1215, T-1297 re-shaped to match. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -2463,7 +2463,26 @@ Technical foundation decisions that constrain implementation: engine, client-ser
|
||||
|
||||
**Supersedes, in part,** the server's gridunit-scale climate origination (latitude, lapse, greenhouse and hydrosphere in `derive_temperature_c`/`derive_moisture_q`) wherever a baked input exists. Airless and gas bodies, and bodies not yet baked, keep the current derive. [D-239](#d-239)'s climate-to-class laws (the treeline, the riparian band) are not repealed; they operate inside the scatter.
|
||||
|
||||
**Open, measured before the bake is committed:** the on-disk format and resolution. The server downsamples to 512×256 anyway, and the temperature and moisture fields compress far worse than a class grid, so the repository cost across ~2,600 bodies must be measured, not assumed.
|
||||
**Open, measured before the bake is committed:** the on-disk format and resolution. The server downsamples to 512×256 anyway, and the temperature and moisture fields compress far worse than a class grid, so the repository cost across ~2,600 bodies must be measured, not assumed. *(Measured and superseded the same day — see the next amendment.)*
|
||||
|
||||
- **Amendment (2026-09-25, later the same day — ids, not fields; biome and terrain are two maps):** supersedes the *Shape* of the previous amendment. Its four rulings stand.
|
||||
|
||||
**Measured scope and cost** (T-1295). The heightmap bake set is 267 bodies. Airless bodies are **out of scope for now** (Jeroen: *"we are focussing on habitable worlds first"*). The format keeps room for them: classes 19–36 already cover lava, dust, ferric and lunar ground. That leaves **257 bodies** with an atmosphere. Full resolution was chosen, 1024×512, matching `heightmap.png`. A biome id map costs ~12 KiB per body, ~3 MiB in total. Per-pixel temperature and moisture would have cost ~38 MiB.
|
||||
|
||||
**Ruling 5 — the bake carries class ids only; what a class *is* lives in a class table.** Per-pixel temperature and moisture are not baked. Their one advantage, a pixel's position *inside* its class, is mostly recovered elsewhere. Borders blend, because a cell's climate is its classes' values weighted by the bilinear class mix. The server's climate model supplies the rest within the class's range. The loss was also smaller than it looked: the simulator clamps temperature per planet class, and on some bodies (GJ204c, GJ68e) the field is one value everywhere. In exchange, a class's definition (climate envelope, flora, cover, palette, ground grammar) is authored **once**, can grow, and changes every world without a re-bake. That is the seed-and-template pattern `wiki/economics/` already follows. The table reaches the server the way every authored TOML does: `reach ledger import` loads it into `systems.db` under the generator stamp, and the server never reads `tooling/`. Today the source is `tooling/domains/atlas/planet/biomes.toml`. Whether it moves into `wiki/` beside the economics seeds is not decided here.
|
||||
|
||||
**Ruling 6 — terrain type and biome are separate maps** (Jeroen: *"so we separate terrain type and biome maybe?"*). The simulator already computes them apart. `compute_biome` gives every land pixel its temperature × moisture (Whittaker) class first, then overwrites it with terrain rules: ocean depth, ice, high snow, mountain rock, lava and ash, and the dry, lunar and ferric ground. So the bake writes two maps:
|
||||
|
||||
- **`biomemap.png`**: the climate and life class, taken **before** the terrain overrides. It covers every land pixel, including under rock and ice, and is empty on thin-atmosphere bodies, which skip the Whittaker table.
|
||||
- **`terrainmap.png`**: the landform or substrate class where a terrain rule applies, 0 where the ground is simply its biome.
|
||||
|
||||
This removes the gap that made id-only look lossy. Terrain classes carry no climate and biome classes always do, so climate comes from the biome everywhere on land: rock inside a tropical zone is tropical mountain climate, cooled by altitude. The class tables split the same way, a **biome table** (climate envelope, flora, cover) and a **terrain table** (substrate, and landform hints for the server's morphology derive).
|
||||
|
||||
**A third kind of content is in the same grid, and is not placed yet: story features.** The simulator's anomaly scatter repaints about 3% of land cells: a volcanic vent in a forest, an oasis lake with vegetation rings in a desert, a geothermal shrub patch in tundra. At 37 km per cell these are region-scale features, not ground cover. Whether they ride the terrain map, become features the server places, or wait is open. So is their rate: Jeroen, *"3% is high. but that is for a balancing pass."*
|
||||
|
||||
**Defects found while reading the source.** `compute_biome` receives absolute kelvin, but two rules compared it to `0.35`, a 0–1 threshold, from the generator's first commit (f84275edf). **Mountain rock could never fire.** Fixed in T-1295: both rules now compare against the world's own normalised temperature, which is what `0.35` can only have meant and what `compute_moisture` already uses. A test pins the rule firing and holding back, mutation-proven. **Sulfuric scrub is unreachable independently of the units:** it converts rock only at `elev_norm` 0.25–0.65, while rock exists only above 0.65. It is left as found, since making it reachable is a design call. The committed reliefmaps and globes were rendered with the bug; the bake reflects the fix.
|
||||
|
||||
**Tickets re-scoped:** [T-1295](../../.pql) bakes the two id maps; [T-1215](../../.pql) loads class fractions from both; [T-1297](../../.pql) takes climate from the biome table rather than per-pixel fields; the class tables and their import are part of T-1295.
|
||||
|
||||
---
|
||||
|
||||
|
||||
Reference in New Issue
Block a user