docs(decisions): add D-246 micro-habitat mosaic + D-247 native biospheres (amend D-228)
D-246 (architecture): intra-class micro-habitat mosaic — a voxel_mosaic()
sub-chunk noise band modulates the D-228 axes into spatially-coherent,
relief-conditioned micro-habitats; palette keyed on surface-class ×
climate-biome × biosphere-register; five new D-228 axis values front-loaded
for determinism; within-patch believability metric in scope. Governs T-1084.
D-247 (content): habitable Reach worlds were alive before humans — the
settlement timeline forbids terraforming from dead rock. An authored per-world
chirality bit gates whether native life is edible (Compatible) or
inedible-but-inert (Mirror); "safe" and "edible" are decoupled; colonization
is ecological war that grows an Earth-crop footprint outward from settlements.
Grounds D-246's native-vs-introduced register.
D-228 amended: +Vegetation{Meadow,Deadfall,Lichen}, +TerrainMaterial{Hardpan,Scree}.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -11,3 +11,31 @@ DECISIONS (user-resolved):
|
||||
5. FAMILY GATING (grounded default, accepted): flat families (AlluvialPlain, LavaField, BraidedDelta, DuneStrand, MeanderReach) take the full mosaic; dramatic families (CliffCoast, FjordWall, IncisedGorge) get a per-family-gated non-structural modulation pass (vegetation/material only — must not warp carved geometry), mirroring voxel_relief gating. WaterBody: none. <5 ms chunk budget verification is part of implementation (T-1081 harness precedent).
|
||||
|
||||
CODE TOUCHPOINTS (Si-verified 2026-07-02): detail_scatter.rs:87-96 (voxel_relief pattern to extend), seed.rs:84-118 (SeedDomain; pinned-discriminant test ~:267), voxel.rs:1907-1943 (scatter_vegetation — the per-voxel salt-and-pepper this replaces), voxel.rs:445-495 (post-dispatch modulation seam), believability.rs (ContrastMetrics; evaluate_criteria ~:319). Overlaps to reconcile in the axis table: tube_depression (voxel.rs:710-717, Lava vocab) and braided-delta gravel-bar scrub (voxel.rs:1069-1092, Gravel vocab).', NULL, '2026-07-02 07:42:06', '2026-07-02 07:42:06.753', '2026-07-02 07:42:06.753', NULL, 'c8ddbe0307a798f866d712faa648eed6', 2) ON CONFLICT(hash) DO NOTHING;
|
||||
INSERT INTO ticket_history (ticket_record_id, field, old_value, new_value, changed_by, changed_at, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FGSK19FGZAC3H25VRAV4JRFW', 'status', 'backlog', 'in_progress', NULL, '2026-07-02 14:25:53', '2026-07-02 14:25:53.593', '2026-07-02 14:25:53.593', NULL, '30748fd1dc15dfc3c076d31e6d7f2b7c', 2) ON CONFLICT(hash) DO NOTHING;
|
||||
INSERT INTO ticket_history (ticket_record_id, field, old_value, new_value, changed_by, changed_at, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FGSK19FGZAC3H25VRAV4JRFW', 'description', 'A third believability lever, distinct from T-1080 (macro field gradient) and T-1081 (relief): within a SINGLE terrain class the sub-chunk seed should paint a spatially-coherent mosaic of micro-habitats, generalized to ALL terrain types. Motivating case: the probe''s ''Wetland 100%'' should resolve into clearings, copses, creeks, meadows, bogs, marshes — and likewise for every other class. NOT D-210/T-948: D-210 SubBiomeVariant is a MACRO biome tag per attractor (Tundra vs TemperateForest vs Wetland) — ''which biome''. THIS is finer: the intra-class MICRO-mosaic (''texture within a class''), at sub-chunk (<64 m) scale. MECHANIC: district/biome picks the PALETTE; the sub-chunk seed (SeedDomain::Voxel) paints the MOSAIC, reusing the derive-don''t-store tier (detail_scatter.rs, domain_warp, D-227). Three properties: (1) spatially COHERENT — patches (copse/clearing/bog/meadow) are blobs via low-frequency noise; creeks are lines following micro-drainage; never per-tile salt-and-pepper. (2) causally CONDITIONED on micro-relief/micro-drainage/moisture/slope/aspect (bogs in wettest lows, meadows on drier rises, copses where drainage improves, creeks along micro-thalwegs) — legible, not random. (3) MODULATES the existing D-228 axes, not a new axis. PER-CLASS VOCAB (one mechanism, per-class data): Wetland: clearing/copse/creek/meadow/bog/marsh; Forest: glade/dense stand/deadfall/brook/fern undergrowth; Grassland: tussock/scrub island/wildflower/dry wash; Sand: dune crest/slack/hardpan/oasis/scrub clump; Rock: outcrop/scree/ledge/lichen/talus; Gravel: bar/active channel/vegetated island; Lava: fresh sheet/weathered crust/tube collapse/pioneer scrub. Needs a Q/D-record before implementation. Relates to T-948 (D-210 macro), T-1081 (relief, a conditioning input), T-1083 (protocol must measure intra-class mosaic diversity).
|
||||
|
||||
---
|
||||
Refinement (2026-07-02, /whats-next Si pass + user resolution): design gate resolved. First work item: write the Q/D-record (claim via `pql decisions claim D architecture`), pinning the five decisions below; then implement.
|
||||
|
||||
DECISIONS (user-resolved):
|
||||
1. MECHANISM: new `voxel_mosaic()` octave band in detail_scatter.rs (~[64,32,16,8] m) + `SeedDomain::VoxelMosaic = 12` (append-only; update the pinned-discriminant test in server/src/seed.rs) → organic blob patches. Creeks + wet/dry conditioning follow the existing voxel_relief field''s micro-thalwegs (creeks along lowest-relief paths; bogs in lows, meadows on rises). ~4 extra value_noise calls/voxel — same cost class as voxel_relief.
|
||||
2. VOCAB→AXES: expand D-228 enum VARIANTS (values on existing axes — not new axes) to cover the FULL shipped vocabulary NOW, all 7 classes. User rationale: palette composition affects the deterministic realization, so adding variants later would shift generated worlds — front-load the vocabulary. The complete axis-combination table for all 7×5–6 vocab items is the load-bearing content of the D-record, with a D-228 amendment for every item needing a new variant (deadfall / hardpan / lichen / fern-undergrowth have no honest existing mapping).
|
||||
3. PALETTE RESIDENCY: `server/data/mosaic_constants.toml`, runtime-loaded like climate_constants.toml (T-1080 precedent). Note: the TOML is part of the deterministic input surface — weight changes change realizations; expected during Q-123 calibration, freeze after.
|
||||
4. DoD METRIC IN SCOPE: add a within-patch intra-class variety field to ContrastMetrics (server/src/atlas/believability.rs) + a provisional criterion K≥3 distinct micro-features per sampled patch; Q-123 calibrates the final K. Matches the T-1081 precedent (mechanic + metric land together).
|
||||
5. FAMILY GATING (grounded default, accepted): flat families (AlluvialPlain, LavaField, BraidedDelta, DuneStrand, MeanderReach) take the full mosaic; dramatic families (CliffCoast, FjordWall, IncisedGorge) get a per-family-gated non-structural modulation pass (vegetation/material only — must not warp carved geometry), mirroring voxel_relief gating. WaterBody: none. <5 ms chunk budget verification is part of implementation (T-1081 harness precedent).
|
||||
|
||||
CODE TOUCHPOINTS (Si-verified 2026-07-02): detail_scatter.rs:87-96 (voxel_relief pattern to extend), seed.rs:84-118 (SeedDomain; pinned-discriminant test ~:267), voxel.rs:1907-1943 (scatter_vegetation — the per-voxel salt-and-pepper this replaces), voxel.rs:445-495 (post-dispatch modulation seam), believability.rs (ContrastMetrics; evaluate_criteria ~:319). Overlaps to reconcile in the axis table: tube_depression (voxel.rs:710-717, Lava vocab) and braided-delta gravel-bar scrub (voxel.rs:1069-1092, Gravel vocab).', 'A third believability lever, distinct from T-1080 (macro field gradient) and T-1081 (relief): within a SINGLE terrain class the sub-chunk seed should paint a spatially-coherent mosaic of micro-habitats, generalized to ALL terrain types. Motivating case: the probe''s ''Wetland 100%'' should resolve into clearings, copses, creeks, meadows, bogs, marshes — and likewise for every other class. NOT D-210/T-948: D-210 SubBiomeVariant is a MACRO biome tag per attractor (Tundra vs TemperateForest vs Wetland) — ''which biome''. THIS is finer: the intra-class MICRO-mosaic (''texture within a class''), at sub-chunk (<64 m) scale. MECHANIC: district/biome picks the PALETTE; the sub-chunk seed (SeedDomain::Voxel) paints the MOSAIC, reusing the derive-don''t-store tier (detail_scatter.rs, domain_warp, D-227). Three properties: (1) spatially COHERENT — patches (copse/clearing/bog/meadow) are blobs via low-frequency noise; creeks are lines following micro-drainage; never per-tile salt-and-pepper. (2) causally CONDITIONED on micro-relief/micro-drainage/moisture/slope/aspect (bogs in wettest lows, meadows on drier rises, copses where drainage improves, creeks along micro-thalwegs) — legible, not random. (3) MODULATES the existing D-228 axes, not a new axis. PER-CLASS VOCAB (one mechanism, per-class data): Wetland: clearing/copse/creek/meadow/bog/marsh; Forest: glade/dense stand/deadfall/brook/fern undergrowth; Grassland: tussock/scrub island/wildflower/dry wash; Sand: dune crest/slack/hardpan/oasis/scrub clump; Rock: outcrop/scree/ledge/lichen/talus; Gravel: bar/active channel/vegetated island; Lava: fresh sheet/weathered crust/tube collapse/pioneer scrub. Needs a Q/D-record before implementation. Relates to T-948 (D-210 macro), T-1081 (relief, a conditioning input), T-1083 (protocol must measure intra-class mosaic diversity).
|
||||
|
||||
---
|
||||
Refinement (2026-07-02, /whats-next Si pass + user resolution): design gate resolved. First work item: write the Q/D-record (claim via `pql decisions claim D architecture`), pinning the five decisions below; then implement.
|
||||
|
||||
DECISIONS (user-resolved):
|
||||
1. MECHANISM: new `voxel_mosaic()` octave band in detail_scatter.rs (~[64,32,16,8] m) + `SeedDomain::VoxelMosaic = 12` (append-only; update the pinned-discriminant test in server/src/seed.rs) → organic blob patches. Creeks + wet/dry conditioning follow the existing voxel_relief field''s micro-thalwegs (creeks along lowest-relief paths; bogs in lows, meadows on rises). ~4 extra value_noise calls/voxel — same cost class as voxel_relief.
|
||||
2. VOCAB→AXES: expand D-228 enum VARIANTS (values on existing axes — not new axes) to cover the FULL shipped vocabulary NOW, all 7 classes. User rationale: palette composition affects the deterministic realization, so adding variants later would shift generated worlds — front-load the vocabulary. The complete axis-combination table for all 7×5–6 vocab items is the load-bearing content of the D-record, with a D-228 amendment for every item needing a new variant (deadfall / hardpan / lichen / fern-undergrowth have no honest existing mapping).
|
||||
3. PALETTE RESIDENCY: `server/data/mosaic_constants.toml`, runtime-loaded like climate_constants.toml (T-1080 precedent). Note: the TOML is part of the deterministic input surface — weight changes change realizations; expected during Q-123 calibration, freeze after.
|
||||
4. DoD METRIC IN SCOPE: add a within-patch intra-class variety field to ContrastMetrics (server/src/atlas/believability.rs) + a provisional criterion K≥3 distinct micro-features per sampled patch; Q-123 calibrates the final K. Matches the T-1081 precedent (mechanic + metric land together).
|
||||
5. FAMILY GATING (grounded default, accepted): flat families (AlluvialPlain, LavaField, BraidedDelta, DuneStrand, MeanderReach) take the full mosaic; dramatic families (CliffCoast, FjordWall, IncisedGorge) get a per-family-gated non-structural modulation pass (vegetation/material only — must not warp carved geometry), mirroring voxel_relief gating. WaterBody: none. <5 ms chunk budget verification is part of implementation (T-1081 harness precedent).
|
||||
|
||||
CODE TOUCHPOINTS (Si-verified 2026-07-02): detail_scatter.rs:87-96 (voxel_relief pattern to extend), seed.rs:84-118 (SeedDomain; pinned-discriminant test ~:267), voxel.rs:1907-1943 (scatter_vegetation — the per-voxel salt-and-pepper this replaces), voxel.rs:445-495 (post-dispatch modulation seam), believability.rs (ContrastMetrics; evaluate_criteria ~:319). Overlaps to reconcile in the axis table: tube_depression (voxel.rs:710-717, Lava vocab) and braided-delta gravel-bar scrub (voxel.rs:1069-1092, Gravel vocab).
|
||||
|
||||
D-record written: D-246 (governance/decisions/architecture.md) pins all five resolved decisions + the full 32-row vocab→D-228 axis table + palette-key rule. D-228 amended to add the five new axis values (Vegetation::{Meadow,Deadfall,Lichen}, TerrainMaterial::{Hardpan,Scree}). D-246 is now the governing record for implementation; decision_ref D-227 kept as the derive-don''t-store parent.', NULL, '2026-07-02 18:26:37', '2026-07-02 18:26:37.203', '2026-07-02 18:26:37.203', NULL, 'c38329ce7eea51cd8aa53b0c5769da76', 2) ON CONFLICT(hash) DO NOTHING;
|
||||
|
||||
@@ -11,3 +11,31 @@ DECISIONS (user-resolved):
|
||||
5. FAMILY GATING (grounded default, accepted): flat families (AlluvialPlain, LavaField, BraidedDelta, DuneStrand, MeanderReach) take the full mosaic; dramatic families (CliffCoast, FjordWall, IncisedGorge) get a per-family-gated non-structural modulation pass (vegetation/material only — must not warp carved geometry), mirroring voxel_relief gating. WaterBody: none. <5 ms chunk budget verification is part of implementation (T-1081 harness precedent).
|
||||
|
||||
CODE TOUCHPOINTS (Si-verified 2026-07-02): detail_scatter.rs:87-96 (voxel_relief pattern to extend), seed.rs:84-118 (SeedDomain; pinned-discriminant test ~:267), voxel.rs:1907-1943 (scatter_vegetation — the per-voxel salt-and-pepper this replaces), voxel.rs:445-495 (post-dispatch modulation seam), believability.rs (ContrastMetrics; evaluate_criteria ~:319). Overlaps to reconcile in the axis table: tube_depression (voxel.rs:710-717, Lava vocab) and braided-delta gravel-bar scrub (voxel.rs:1069-1092, Gravel vocab).', 'backlog', 'high', NULL, 'server', 'D-227', '2026-06-28 05:55:34.396', '2026-07-02 07:42:06.753', NULL, '0cd112f1fc4f62f5b7a464dd51ae5205', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
|
||||
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FGSK19FGZAC3H25VRAV4JRFW', 'story', '06FGSJNP8YM537DJCC82ZD6544', 'Intra-class micro-habitat mosaic — seed-scattered sub-features within every terrain type', 'A third believability lever, distinct from T-1080 (macro field gradient) and T-1081 (relief): within a SINGLE terrain class the sub-chunk seed should paint a spatially-coherent mosaic of micro-habitats, generalized to ALL terrain types. Motivating case: the probe''s ''Wetland 100%'' should resolve into clearings, copses, creeks, meadows, bogs, marshes — and likewise for every other class. NOT D-210/T-948: D-210 SubBiomeVariant is a MACRO biome tag per attractor (Tundra vs TemperateForest vs Wetland) — ''which biome''. THIS is finer: the intra-class MICRO-mosaic (''texture within a class''), at sub-chunk (<64 m) scale. MECHANIC: district/biome picks the PALETTE; the sub-chunk seed (SeedDomain::Voxel) paints the MOSAIC, reusing the derive-don''t-store tier (detail_scatter.rs, domain_warp, D-227). Three properties: (1) spatially COHERENT — patches (copse/clearing/bog/meadow) are blobs via low-frequency noise; creeks are lines following micro-drainage; never per-tile salt-and-pepper. (2) causally CONDITIONED on micro-relief/micro-drainage/moisture/slope/aspect (bogs in wettest lows, meadows on drier rises, copses where drainage improves, creeks along micro-thalwegs) — legible, not random. (3) MODULATES the existing D-228 axes, not a new axis. PER-CLASS VOCAB (one mechanism, per-class data): Wetland: clearing/copse/creek/meadow/bog/marsh; Forest: glade/dense stand/deadfall/brook/fern undergrowth; Grassland: tussock/scrub island/wildflower/dry wash; Sand: dune crest/slack/hardpan/oasis/scrub clump; Rock: outcrop/scree/ledge/lichen/talus; Gravel: bar/active channel/vegetated island; Lava: fresh sheet/weathered crust/tube collapse/pioneer scrub. Needs a Q/D-record before implementation. Relates to T-948 (D-210 macro), T-1081 (relief, a conditioning input), T-1083 (protocol must measure intra-class mosaic diversity).
|
||||
|
||||
---
|
||||
Refinement (2026-07-02, /whats-next Si pass + user resolution): design gate resolved. First work item: write the Q/D-record (claim via `pql decisions claim D architecture`), pinning the five decisions below; then implement.
|
||||
|
||||
DECISIONS (user-resolved):
|
||||
1. MECHANISM: new `voxel_mosaic()` octave band in detail_scatter.rs (~[64,32,16,8] m) + `SeedDomain::VoxelMosaic = 12` (append-only; update the pinned-discriminant test in server/src/seed.rs) → organic blob patches. Creeks + wet/dry conditioning follow the existing voxel_relief field''s micro-thalwegs (creeks along lowest-relief paths; bogs in lows, meadows on rises). ~4 extra value_noise calls/voxel — same cost class as voxel_relief.
|
||||
2. VOCAB→AXES: expand D-228 enum VARIANTS (values on existing axes — not new axes) to cover the FULL shipped vocabulary NOW, all 7 classes. User rationale: palette composition affects the deterministic realization, so adding variants later would shift generated worlds — front-load the vocabulary. The complete axis-combination table for all 7×5–6 vocab items is the load-bearing content of the D-record, with a D-228 amendment for every item needing a new variant (deadfall / hardpan / lichen / fern-undergrowth have no honest existing mapping).
|
||||
3. PALETTE RESIDENCY: `server/data/mosaic_constants.toml`, runtime-loaded like climate_constants.toml (T-1080 precedent). Note: the TOML is part of the deterministic input surface — weight changes change realizations; expected during Q-123 calibration, freeze after.
|
||||
4. DoD METRIC IN SCOPE: add a within-patch intra-class variety field to ContrastMetrics (server/src/atlas/believability.rs) + a provisional criterion K≥3 distinct micro-features per sampled patch; Q-123 calibrates the final K. Matches the T-1081 precedent (mechanic + metric land together).
|
||||
5. FAMILY GATING (grounded default, accepted): flat families (AlluvialPlain, LavaField, BraidedDelta, DuneStrand, MeanderReach) take the full mosaic; dramatic families (CliffCoast, FjordWall, IncisedGorge) get a per-family-gated non-structural modulation pass (vegetation/material only — must not warp carved geometry), mirroring voxel_relief gating. WaterBody: none. <5 ms chunk budget verification is part of implementation (T-1081 harness precedent).
|
||||
|
||||
CODE TOUCHPOINTS (Si-verified 2026-07-02): detail_scatter.rs:87-96 (voxel_relief pattern to extend), seed.rs:84-118 (SeedDomain; pinned-discriminant test ~:267), voxel.rs:1907-1943 (scatter_vegetation — the per-voxel salt-and-pepper this replaces), voxel.rs:445-495 (post-dispatch modulation seam), believability.rs (ContrastMetrics; evaluate_criteria ~:319). Overlaps to reconcile in the axis table: tube_depression (voxel.rs:710-717, Lava vocab) and braided-delta gravel-bar scrub (voxel.rs:1069-1092, Gravel vocab).', 'in_progress', 'high', NULL, 'server', 'D-227', '2026-06-28 05:55:34.396', '2026-07-02 14:25:53.590', NULL, 'cdd766b50cd259b35aee899be9433cb8', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
|
||||
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FGSK19FGZAC3H25VRAV4JRFW', 'story', '06FGSJNP8YM537DJCC82ZD6544', 'Intra-class micro-habitat mosaic — seed-scattered sub-features within every terrain type', 'A third believability lever, distinct from T-1080 (macro field gradient) and T-1081 (relief): within a SINGLE terrain class the sub-chunk seed should paint a spatially-coherent mosaic of micro-habitats, generalized to ALL terrain types. Motivating case: the probe''s ''Wetland 100%'' should resolve into clearings, copses, creeks, meadows, bogs, marshes — and likewise for every other class. NOT D-210/T-948: D-210 SubBiomeVariant is a MACRO biome tag per attractor (Tundra vs TemperateForest vs Wetland) — ''which biome''. THIS is finer: the intra-class MICRO-mosaic (''texture within a class''), at sub-chunk (<64 m) scale. MECHANIC: district/biome picks the PALETTE; the sub-chunk seed (SeedDomain::Voxel) paints the MOSAIC, reusing the derive-don''t-store tier (detail_scatter.rs, domain_warp, D-227). Three properties: (1) spatially COHERENT — patches (copse/clearing/bog/meadow) are blobs via low-frequency noise; creeks are lines following micro-drainage; never per-tile salt-and-pepper. (2) causally CONDITIONED on micro-relief/micro-drainage/moisture/slope/aspect (bogs in wettest lows, meadows on drier rises, copses where drainage improves, creeks along micro-thalwegs) — legible, not random. (3) MODULATES the existing D-228 axes, not a new axis. PER-CLASS VOCAB (one mechanism, per-class data): Wetland: clearing/copse/creek/meadow/bog/marsh; Forest: glade/dense stand/deadfall/brook/fern undergrowth; Grassland: tussock/scrub island/wildflower/dry wash; Sand: dune crest/slack/hardpan/oasis/scrub clump; Rock: outcrop/scree/ledge/lichen/talus; Gravel: bar/active channel/vegetated island; Lava: fresh sheet/weathered crust/tube collapse/pioneer scrub. Needs a Q/D-record before implementation. Relates to T-948 (D-210 macro), T-1081 (relief, a conditioning input), T-1083 (protocol must measure intra-class mosaic diversity).
|
||||
|
||||
---
|
||||
Refinement (2026-07-02, /whats-next Si pass + user resolution): design gate resolved. First work item: write the Q/D-record (claim via `pql decisions claim D architecture`), pinning the five decisions below; then implement.
|
||||
|
||||
DECISIONS (user-resolved):
|
||||
1. MECHANISM: new `voxel_mosaic()` octave band in detail_scatter.rs (~[64,32,16,8] m) + `SeedDomain::VoxelMosaic = 12` (append-only; update the pinned-discriminant test in server/src/seed.rs) → organic blob patches. Creeks + wet/dry conditioning follow the existing voxel_relief field''s micro-thalwegs (creeks along lowest-relief paths; bogs in lows, meadows on rises). ~4 extra value_noise calls/voxel — same cost class as voxel_relief.
|
||||
2. VOCAB→AXES: expand D-228 enum VARIANTS (values on existing axes — not new axes) to cover the FULL shipped vocabulary NOW, all 7 classes. User rationale: palette composition affects the deterministic realization, so adding variants later would shift generated worlds — front-load the vocabulary. The complete axis-combination table for all 7×5–6 vocab items is the load-bearing content of the D-record, with a D-228 amendment for every item needing a new variant (deadfall / hardpan / lichen / fern-undergrowth have no honest existing mapping).
|
||||
3. PALETTE RESIDENCY: `server/data/mosaic_constants.toml`, runtime-loaded like climate_constants.toml (T-1080 precedent). Note: the TOML is part of the deterministic input surface — weight changes change realizations; expected during Q-123 calibration, freeze after.
|
||||
4. DoD METRIC IN SCOPE: add a within-patch intra-class variety field to ContrastMetrics (server/src/atlas/believability.rs) + a provisional criterion K≥3 distinct micro-features per sampled patch; Q-123 calibrates the final K. Matches the T-1081 precedent (mechanic + metric land together).
|
||||
5. FAMILY GATING (grounded default, accepted): flat families (AlluvialPlain, LavaField, BraidedDelta, DuneStrand, MeanderReach) take the full mosaic; dramatic families (CliffCoast, FjordWall, IncisedGorge) get a per-family-gated non-structural modulation pass (vegetation/material only — must not warp carved geometry), mirroring voxel_relief gating. WaterBody: none. <5 ms chunk budget verification is part of implementation (T-1081 harness precedent).
|
||||
|
||||
CODE TOUCHPOINTS (Si-verified 2026-07-02): detail_scatter.rs:87-96 (voxel_relief pattern to extend), seed.rs:84-118 (SeedDomain; pinned-discriminant test ~:267), voxel.rs:1907-1943 (scatter_vegetation — the per-voxel salt-and-pepper this replaces), voxel.rs:445-495 (post-dispatch modulation seam), believability.rs (ContrastMetrics; evaluate_criteria ~:319). Overlaps to reconcile in the axis table: tube_depression (voxel.rs:710-717, Lava vocab) and braided-delta gravel-bar scrub (voxel.rs:1069-1092, Gravel vocab).
|
||||
|
||||
D-record written: D-246 (governance/decisions/architecture.md) pins all five resolved decisions + the full 32-row vocab→D-228 axis table + palette-key rule. D-228 amended to add the five new axis values (Vegetation::{Meadow,Deadfall,Lichen}, TerrainMaterial::{Hardpan,Scree}). D-246 is now the governing record for implementation; decision_ref D-227 kept as the derive-don''t-store parent.', 'in_progress', 'high', NULL, 'server', 'D-227', '2026-06-28 05:55:34.396', '2026-07-02 18:26:37.202', NULL, '7edbe9dc6461eea90bf94ebcfe0b0687', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
|
||||
|
||||
@@ -311,6 +311,8 @@ line in place — keep the Q-record for the audit trail rather than deleting it.
|
||||
- [D-243: Spatial scale ladder — nested absolute containment with a single elastic planetary seam (resolves Q-110)](decisions/architecture.md#d-243-spatial-scale-ladder--nested-absolute-containment-with-a-single-elastic-planetary-seam-resolves-q-110) — _architecture_
|
||||
- [D-244: Asset rendering — 3D objects in-world; 2D limited to textures + flat artwork](decisions/architecture.md#d-244-asset-rendering--3d-objects-in-world-2d-limited-to-textures--flat-artwork) — _architecture_
|
||||
- [D-245: Nature-layer believability acceptance gate](decisions/architecture.md#d-245-nature-layer-believability-acceptance-gate) — _architecture_
|
||||
- [D-246: Intra-class micro-habitat mosaic — sub-chunk palette modulation of the D-228 axes](decisions/architecture.md#d-246-intra-class-micro-habitat-mosaic--sub-chunk-palette-modulation-of-the-d-228-axes) — _architecture_
|
||||
- [D-247: Native pre-existing biospheres + chirality food-safety bit — why the Reach is breathable, and half of it inedible](decisions/content.md#d-247-native-pre-existing-biospheres--chirality-food-safety-bit--why-the-reach-is-breathable-and-half-of-it-inedible) — _content_
|
||||
|
||||
## Open questions
|
||||
|
||||
|
||||
@@ -1586,6 +1586,7 @@ Technical foundation decisions that constrain implementation: engine, client-ser
|
||||
- **Region-level (shared by all tiles in a region, not stored per-tile):** **morphology zone** — fjord / delta / meander-reach / **alluvial-plain** / open-ocean / lake / sea / … — the whole-shape decision a single tile cannot see; it (a) governs which tile-tags get laid down, (b) carries affordances a tile can't (this inlet is a sheltered harbour), and (c) **owns the water-feature semantics** (river vs ocean vs lake vs sea) the per-tile `Water` axis deliberately omits. **Morphology resolves top-down (region → tile), never bottom-up** — a tile cannot know it is in a fjord from its neighbours; deriving it per-tile would produce the squaring the model exists to avoid. **Sub-biome, province, and the region's seasonal/clock state are likewise region properties** — the season is computed *once* per region per phase and inherited by its tiles. That single cheap seasonal state drives **water-height (flooding / tides), seasonal snow cover, weather, and the farmland crop cycle** alike — one calculation, many dynamic overlays (→ Q-105).
|
||||
- **Separate axes:** biome (climate / sub-biome — region-level, authority unresolved, Q-100; distinct from, but informs, the per-tile `Vegetation` cover), resource hints (bitmask: fertile / mineral / timber / groundwater).
|
||||
- **Cohesion matrix (anti-squaring at the material layer):** intra-region material + sub-biome scatter (a dirt patch in grass, a lone rock in beach sand) comes from a **global, position-keyed continuous noise field — never per-chunk** — so transitions never reveal chunk/grid seams. Straight lines appear **only when authored** (roads, plazas, field edges); a straight line must always have a placed cause, never be a generation-grid artifact. (Algorithm → Q-102.)
|
||||
- **Amended 2026-07-02 ([D-246](#d-246) — intra-class micro-habitat mosaic):** the `Vegetation` and `TerrainMaterial` vocabularies (left above "open, extended by the layers that own them") gain the values the sub-chunk micro-mosaic distributes over — `Vegetation::Meadow` (forb-rich herbaceous), `Vegetation::Deadfall` (dead woody debris — obstruction + fuel, no canopy concealment), `Vegetation::Lichen` (crustose/pioneer biological crust on rock/lava); `TerrainMaterial::Hardpan` (compacted flat crust — hard footing, does not slump like sand), `TerrainMaterial::Scree` (loose angular rock debris — unstable footing; the derived name is "talus" at a cliff foot, "scree" on an open slope). These are **new values on existing axes, not a new axis** — the composite schema is unchanged. They are front-loaded in one amendment (not grown incrementally) because each value is a distinct *selectable* outcome in the mosaic's weighted palette, so adding one later re-rolls the deterministic realization of every affected voxel. The full per-class vocab→axis table and the palette-key rule live in [D-246](#d-246).
|
||||
- **Rationale:** A flat enum explodes combinatorially (≈5×5×8 ≈ 200 mostly-incoherent variants), can't be queried by axis ("all water-adjacent tiles"), and grows a new variant for every new mechanic. Orthogonal axes are set independently by different cascade passes (material from sub-biome, water from drainage, shape from elevation), independently queryable, cheap to serialize, and compose without explosion. Names are visual/narrative and belong downstream of the simulation.
|
||||
- **Open sub-questions:** how far the `FloorMaterial` / `Vegetation` vocabularies are enumerated now vs deferred to the settlement layers; the exact morphology-zone vocabulary; the dynamic water-height model (→ Q-105).
|
||||
- **Implementation:** Phase 4+ (epic T-750), as the cascade reaches the tile layers. Today's `TileKind` (D-049 render stack) is the seed of the per-subtile axes; `SubBiomeVariant` (D-210) is the region biome axis.
|
||||
@@ -1873,4 +1874,59 @@ Technical foundation decisions that constrain implementation: engine, client-ser
|
||||
|
||||
---
|
||||
|
||||
*102 decisions (D-001 through D-245, excluding gaps). Last updated: 2026-06-28 (D-245 — nature-layer believability acceptance gate: the cascade's nature layers are "done" only when the believability litmus passes at randomly-sampled locations across all habitable bodies/seeds — multi-scale, never-repeating, coherence + non-stationarity + intra-class variety + relief + climate-appropriateness, automated screen under a human sign-off, budgeted→strict; enforced by T-1083, DoD for epic T-1079).*
|
||||
### D-246: Intra-class micro-habitat mosaic — sub-chunk palette modulation of the D-228 axes
|
||||
|
||||
- **Date:** 2026-07-02
|
||||
- **Decision:** Within a *single* terrain class the sub-chunk seed paints a **spatially-coherent mosaic of micro-habitats** — the third believability lever (after T-1080 meso non-stationarity and T-1081 voxel relief), and the mechanism that resolves the aliveness probe's "Wetland 100%" into clearings, copses, creeks, meadows, bogs and marshes (and the equivalent for every other class). The mosaic is a **derive-don't-store** ([D-227](#d-227)) modulation of the existing [D-228](#d-228) axes — never a new axis. Five load-bearing choices, resolved with Jeroen (2026-07-02, via the `/whats-next` refinement pass on [T-1084](../../.pql)):
|
||||
1. **Mechanism — a new sub-chunk noise band + relief-conditioned selection.** A `voxel_mosaic()` octave band at ≈8–64 m wavelengths (`[64, 32, 16, 8]` m — finer than T-1081's `voxel_relief` `[1024…128]` m sub-district band, so patches read distinct *inside* a single 64 m chunk), keyed by a new body-global `SeedDomain::VoxelMosaic = 12` (append-only; the pinned-discriminant guard in `seed.rs` gains a line). The field value indexes the class palette's cumulative weights to pick a micro-habitat, and the pick is **causally conditioned, not random** — the local `voxel_relief` micro-thalweg (lowest-relief band → the palette's *wet* entry: creek/bog/marsh/brook/active-channel; drier rises → meadow/glade/clearing) plus `moisture_q`. Creeks are **lines following the relief gradient**, not blobs; blobs are smooth (low-frequency value noise), never per-tile salt-and-pepper. This **replaces** the current `scatter_vegetation()` per-voxel seed-bit scatter (`voxel.rs:1907`) — which is exactly the salt-and-pepper the mosaic exists to kill.
|
||||
2. **Vocabulary front-loaded — all shipped micro-habitats mapped to D-228 axis values now.** Every micro-habitat is a `(TerrainMaterial, Vegetation, Water)` combination plus derived micro-relief/name. Where no honest existing value exists, a **new value is added to an existing axis** (never a new axis), and *all* of them land now rather than incrementally — because each value is a distinct selectable outcome in the weighted palette, so adding one later re-rolls the deterministic realization of every affected voxel. New values (amended into [D-228](#d-228)): `Vegetation::{Meadow, Deadfall, Lichen}`, `TerrainMaterial::{Hardpan, Scree}`. The table below is the **temperate/baseline register**; the biome variants (savanna gallery-copse, tundra thermokarst / lichen-heath, boreal muskeg / deadfall, …) fill the same niche spine per the Palette-key rule and are enumerated in T-1084 **before first generation** — so the table grows past these baseline rows, which is expected (and cheap — see Palette key).
|
||||
3. **Palette weights live in `server/data/mosaic_constants.toml`**, runtime-loaded like `climate_constants.toml` (the T-1080 precedent). The TOML is part of the **deterministic input surface** — weight edits change realizations, so they are expected only during Q-123 calibration and frozen after.
|
||||
4. **The believability metric is in scope for T-1084.** `ContrastMetrics` (`believability.rs`) gains a within-patch `micro_habitat_distinct` field (min distinct axis-triples across sampled same-class patches), and `evaluate_criteria` gains a provisional `≥ 3` criterion (K), calibrated by [Q-123](../questions/architecture.md#q-123) item 3. Mechanic and metric land together (the T-1081 precedent — it shipped both `voxel_relief` and `contrast.voxel_relief_m`).
|
||||
5. **Family gating mirrors `voxel_relief`.** The **flat** families (AlluvialPlain, LavaField, BraidedDelta, DuneStrand, MeanderReach) take the **full** mosaic — vegetation/material *and* a micro-relief nudge (dune crest/slack, bog lows) and Shallow-water creek carving. The **dramatic** families (CliffCoast, FjordWall, IncisedGorge) take a **non-structural** pass — vegetation/material only, **no elevation change** (a relief nudge would warp their carved geometry) — conditioned on their own generator geometry. WaterBody takes **none**. The `<5 ms`/chunk budget ([D-239](#d-239) §10) is verified in the T-1081 believability/budget harness as part of implementation (`voxel_mosaic` adds ≈4 `value_noise` calls on top of `voxel_relief`'s 4).
|
||||
- **Palette key — a lookup table on `(surface-class × climate-biome × biosphere-register)`** (reworked 2026-07-02; the original surface-class-only key was biome-blind). The mosaic selects a weighted micro-habitat palette from three deterministic inputs, no stored tag: **(1) surface-class** from the family generator's base output (`terrain == Wetland|Sand|Rock|Gravel|Lava` → that class; `terrain == Soil` split by dominant vegetation → Forest vs Grassland); **(2) climate-biome** from the district's `temperature_c` / `moisture_q` / `precipitation_class`, so one Grassland surface reads *savanna* vs *temperate meadow* vs *cold steppe* vs *tundra* — [D-210](#d-210) sub-biome realized as a *spatially-varying distribution*, and the fix for the biome-blindness a surface-class-only key leaves; **(3) biosphere-register** from [D-247](content.md#d-247) — native-mirror-wild vs introduced-Earth-managed (the D-228 wild→managed override precedence), which *skins* a niche (an alien mirror clade vs an Earth crop) without changing its gameplay semantics. A fixed **niche spine** (canopy / understory / wet-hollow / pioneer / bare) is the authoring scaffold climate + register fill differently — the vocabulary is authored per-niche, not as a free biome×class cross-product. **Table size is not a performance or storage constraint** (a text lookup stays flat well past ~100k entries and is negligible beside textures/models), so author *generously and expressively* where a biome earns distinct fills — though ~100k is headroom, **not** a target; the aim is coherent believability, bounded by the niche spine and taste. The **only** binding rule is determinism: the full vocabulary is fixed **before the mosaic generates its first world** (a later addition re-rolls every affected voxel), so T-1084 completes the table before generation, never after.
|
||||
- **Vocab → D-228 axis table** (the load-bearing content — items sharing a triple are separated by *derived* micro-relief/shape or *derived* name, per D-228's "names are derived, never stored"; **bold** = new axis value):
|
||||
|
||||
| Class (palette key) | Micro-habitat | TerrainMaterial | Vegetation | Water | Separated by |
|
||||
|---|---|---|---|---|---|
|
||||
| Wetland | clearing | Wetland | Barren | Dry | drier hummock (relief +) |
|
||||
| Wetland | copse | Wetland | Forest | Dry | — |
|
||||
| Wetland | creek | Wetland | Barren | Shallow | linear (micro-thalweg) |
|
||||
| Wetland | meadow | Wetland | **Meadow** | Dry | — |
|
||||
| Wetland | bog | Wetland | Scrub | Shallow | lowest relief |
|
||||
| Wetland | marsh | Wetland | Grass | Shallow | reed graminoid |
|
||||
| Forest | dense stand | Soil | Forest | Dry | base |
|
||||
| Forest | glade | Soil | Grass | Dry | open gap |
|
||||
| Forest | deadfall | Soil | **Deadfall** | Dry | — |
|
||||
| Forest | brook | Soil | Thicket | Shallow | linear riparian |
|
||||
| Forest | fern undergrowth | Soil | Thicket | Dry | renderer fern texture (cosmetic) |
|
||||
| Grassland | tussock | Soil | Grass | Dry | base |
|
||||
| Grassland | scrub island | Soil | Scrub | Dry | — |
|
||||
| Grassland | wildflower | Soil | **Meadow** | Dry | shares Meadow |
|
||||
| Grassland | dry wash | Gravel | Barren | Dry→Shallow | linear ephemeral channel |
|
||||
| Sand | dune crest | Sand | Barren | Dry | high relief |
|
||||
| Sand | slack | Sand | Grass | Dry | interdune low (relief −) |
|
||||
| Sand | hardpan | **Hardpan** | Barren | Dry | — |
|
||||
| Sand | oasis | Sand | Forest | Shallow | — |
|
||||
| Sand | scrub clump | Sand | Scrub | Dry | — |
|
||||
| Rock | outcrop | Rock | Barren | Dry | protruding (relief +) |
|
||||
| Rock | scree | **Scree** | Barren | Dry | open slope |
|
||||
| Rock | talus | **Scree** | Barren | Dry | derived name (cliff foot) |
|
||||
| Rock | ledge | Rock | Barren | Dry | flat step (relief) |
|
||||
| Rock | lichen | Rock | **Lichen** | Dry | — |
|
||||
| Gravel | bar | Gravel | Barren | Dry | base |
|
||||
| Gravel | active channel | Gravel | Barren | Shallow/Deep | flowing water |
|
||||
| Gravel | vegetated island | Gravel | Scrub | Dry | stabilized |
|
||||
| Lava | fresh sheet | Lava | Barren | Dry | base |
|
||||
| Lava | weathered crust | Lava | **Lichen** | Dry | shares Lichen |
|
||||
| Lava | tube collapse | Lava | Barren | Dry | depression (relief −); reconcile with existing `tube_depression`, `voxel.rs:710` |
|
||||
| Lava | pioneer scrub | Lava | Scrub | Dry | — |
|
||||
|
||||
- **New D-228 axis values** (append-only discriminants, [D-010](#d-010)): `Vegetation::Meadow = 7` (forb-rich flowering herbaceous — the wetland *meadow* and grassland *wildflower*), `Vegetation::Deadfall = 8` (dead woody debris — obstruction + fire fuel, no canopy concealment), `Vegetation::Lichen = 9` (crustose/pioneer biological crust — the rock *lichen* and lava *weathered crust*), `TerrainMaterial::Hardpan = 6` (compacted flat crust — hard fast footing, does not slump like sand), `TerrainMaterial::Scree = 7` (loose angular rock debris — unstable footing; *scree*/*talus* differ only by derived name). `Water` is unchanged (Dry/Shallow/Deep suffice). Adding these lights up exhaustive `match` arms across `voxel.rs`, `from_vegetation_class`, the renderer, and any serializer — an intentional compile-time checklist.
|
||||
- **Rationale:** T-1084's finding was that a class can pass every binding law ([D-239](#d-239) §8) and still render as one uniform material ("Wetland 100%"); [D-245](#d-245) makes *believability* the gate, and intra-class variety is one of its five necessary conditions. Reusing the T-1081 `detail_scatter` machinery (same enveloped-fBm core, one more octave band, one more `SeedDomain`) keeps the mechanism inside the derive-don't-store tier with no new architecture. Front-loading the whole vocabulary — rather than growing it as needs appear — is forced by determinism: the palette is a *weighted selection* the seed indexes, so every added value shifts the realization of already-generated worlds. Expressing micro-habitats as combinations of orthogonal axes (plus derived name/relief) rather than a flat `MicroHabitat` enum is the same anti-combinatorial-explosion logic as D-228 itself.
|
||||
- **Implementation:** [T-1084](../../.pql) (story under epic [T-1079](../../.pql)). Touchpoints: `detail_scatter.rs` (`voxel_mosaic()` + the `[64,32,16,8]` m band); `seed.rs` (`SeedDomain::VoxelMosaic = 12` + the pinned-discriminant guard); `voxel.rs` (new per-family-gated mosaic pass after the relief block ~`:495`; **replaces** `scatter_vegetation()` ~`:1907`; new axis-value `match` arms); `believability.rs` (`micro_habitat_distinct` + criterion); new `server/data/mosaic_constants.toml`. Budget verified in the T-1081 harness.
|
||||
- **Cross-reference:** [D-228](#d-228) (the axes this modulates — amended 2026-07-02 to add the five values), [D-227](#d-227) (derive-don't-store — the tier the mosaic lives in), [D-245](#d-245) (believability gate — this is condition 3, intra-class variety), [D-239](#d-239) §8 (binding laws — the mosaic stays inside them) / §10 (sub-chunk budget), [D-243](#d-243) §2 (the detail-scatter tier T-1081 and this extend), [D-247](content.md#d-247) (native-mirror vs introduced-Earth **biosphere register** — palette-key input 3; the mosaic is chirality-blind, but its register labels each niche native or introduced), [D-210](#d-210) / [T-948](../../.pql) (SubBiomeVariant — now **palette-key input 2**: the macro biome realized as the finer intra-class distribution, not a single tag). Tickets: T-1084 (this), T-1079 (epic), T-1081 (relief — a conditioning input + the reused machinery), T-1083 (enforcer — measures the mosaic), [Q-123](../questions/architecture.md#q-123) item 3 (calibrates K).
|
||||
- **Dissent:** None
|
||||
|
||||
---
|
||||
|
||||
*103 decisions (D-001 through D-246, excluding gaps). Last updated: 2026-07-02 (D-246 — intra-class micro-habitat mosaic: within a single terrain class the sub-chunk seed paints a spatially-coherent, relief-conditioned mosaic of micro-habitats by modulating the D-228 axes; a new `voxel_mosaic()` band + `SeedDomain::VoxelMosaic`, palette in `mosaic_constants.toml`, five new D-228 axis values front-loaded for determinism, within-patch believability metric in scope; T-1084 under epic T-1079).*
|
||||
|
||||
@@ -621,4 +621,25 @@ How narrative, NPCs, and world content are created: content tiers, NPC generatio
|
||||
|
||||
---
|
||||
|
||||
*47 decisions. Last updated: 2026-04-21 (D-193 Lattice Commission name resolved)*
|
||||
### D-247: Native pre-existing biospheres + chirality food-safety bit — why the Reach is breathable, and half of it inedible
|
||||
|
||||
- **Date:** 2026-07-02
|
||||
- **Decision:** Habitable Reach worlds are **not terraformed from dead rock — they were already alive when humans arrived.** The settlement timeline forbids anything else, and their native biospheres are what make them breathable. A per-world **chirality bit** then decides whether that native life is food.
|
||||
- **The timeline forbids terraforming-from-scratch.** Settlement runs Wave 1 (500–600 y ago) → Wave 5 (0–40 y ago); the whole Reach is ≤ ~600 years old. Canon already prices terraforming *above* that ceiling: Earth spent **800 years** terraforming one of its own worlds (GJ-0); Oshima Prime (GJ-79) holds only a *thin* atmosphere by continuous **terraforming infrastructure** that burns **8% of its working population**, and is framed as a burden and an anomaly. You cannot make a dead world breathable in the settlement window. Therefore **the good worlds were pre-alive** — a native biosphere ran the oxygen. "Implemented atmosphere" is the rare, expensive exception; **native life is the rule.**
|
||||
- **The chirality bit (Mass Effect's levo/dextro), an AUTHORED per-world property.** Each **living** world's biosphere is either **Compatible** ("levo" / Earth-standard handedness) or **Mirror** ("dextro" / opposite handedness). It is **authored, not derived** — the bit follows a world's economic/cultural identity, so a food/whiskey exporter is edible *by construction* and is never left to a coin flip. A rough **50/50 balance is a design target across canon-silent worlds**, not a per-world draw. Homochirality is the gate: our stereospecific enzymes only cleave one handedness.
|
||||
- **Compatible ("levo") → edible.** Native macromolecules share our handedness, so native life is digestible/nutritious and Earth crops interleave with it. Compatibility *permits* biochemical coupling — a Compatible world **can** be authored to host a native pathogen or a binding toxin, and Earth/native ecology can compete — but coupling is **not forced**: most Compatible worlds are benign gardens. **Edibility is guaranteed; hazard is an authored option.**
|
||||
- **Mirror ("dextro") → inedible, and *guaranteed* inert.** Mirror substrates pass through non-nutritively (starve on a full stomach); nothing native can infect or chirally poison you — *ever*. Safe to walk and study, valueless to harvest. The already-canon Solandar case (GJ-827: *"cannot infect humans and humans cannot eat them… available for study without the additional complexity of anyone dying from it"*) and the "no meaningful indigenous hazard" worlds (GJ-524).
|
||||
- **"Safe" ≠ "edible" — they are two independent axes.** *Bio-safe* (nothing hurts you) is broadly true and **guaranteed on Mirror**; *food-safe* (you can eat it) is the **Compatible-only** property. So attractive worlds can be safe in either sense, and they pull **opposite** bits — which is exactly why the bit is authored identity. Worked examples: **Arbour** (GJ-338B, "lovely, by invitation," families *grow their own estate-grade food*) is **Compatible** — a benign edible garden; **Solandar** (GJ-827) is **Mirror-inert** — alien life safe to study precisely *because* nothing can eat or infect anyone (opposite bits, both attractive). And **Keid** (GJ-166A, the Cadwal Conservancy) is **Compatible** too, but preserved for the *inverse* of Arbour's private reason: its **edible** alien biology is an exploitation target, and the Conservancy exists to keep capital from strip-mining it. **A preserve over something *valuable* is the stronger act of conservation** (we fence off rainforests because they are precious, not worthless) — and it fits Keid's canon of exclusivity, scarcity-as-leverage, and Perpetual-family gatekeeping far better than an inert biology would. Two preserve archetypes: *protect-the-inert-for-study* (Solandar) and *protect-the-valuable-from-capital* (Keid).
|
||||
- **The achiral seam (what always works regardless of the bit).** Chirality only governs molecular *recognition*. So **breathe the air, drink the water, mine the ore, burn native wood, build with it** all work on any living world (O₂/N₂/CO₂/H₂O, minerals, combustion, and structure are handedness-independent). Only **eat / metabolize / medicate / infect / chirally-poison** are gated by the bit. This is the seam that makes an inedible world a *setting*, not a prison: native biomass is an **industrial** resource (fuel, timber, feedstock), never a grocery or a pharmacy.
|
||||
- **Colonization is ecological *war*, not terraforming.** Two centuries can't build an atmosphere, but they are ample to **burn back native ecology and hold an Earth-crop perimeter.** So the Earth-chirality footprint is a **spatial field that grows outward from settlements over wave-time**: `P(introduced Earth ecology) ≈ f(distance-to-settlement, settlement_age, economic_tier, arability)`. Wave-1 capitals → broad established farmland; Wave-5 frontier → a thin beachhead in native wilds. Three policy states per locale: **converted** (Earth-managed core), **contested** (naturalized front — escapees vs native reclaiming; abandoned land reverting), **preserved** (native biosphere protected — either *from exploitation* because it is edible/valuable (Keid, GJ-166A, the Cadwal archetype) or *for study* because it is inert (the Solandar xenobotany economy, GJ-827)). Mirror worlds show *sharp two-biosphere fronts*; Compatible worlds show *blended, competing* ecology.
|
||||
- **Code hooks (bounded, verified derivation-safe).** A new body attribute `biosphere_class ∈ {NativeCompatible, NativeMirror, TerraformedSterile, Airless}`, read *once per body*, consumed downstream (food/economy/perception), touching **nothing** in voxel geometry. It is an **authored input, not a derivation** — chirality follows a world's authored economic/cultural identity (Arbour's estate families *grow their own food*; a coin flip could wrongly declare that biology inedible), so it is authored data, never seeded entropy. Home: wiki body frontmatter (where `substrate:` already lives) → a nullable `bodies.biosphere_class` column → the `BodyParams` read set (D-240). Canon-silent bodies take a **principled default inferred from `economic_base_primary` + `planet_class`** (still authored-data logic, not entropy), with explicit per-world overrides where canon speaks (Solandar=Mirror, Keid=Compatible, Oshima=`TerraformedSterile`, Arbour=Compatible). That frontmatter + schema + importer bundle **lands with the Miri continuity pass** (asset-pipeline: schema ships with its source + consumer) — **no column is needed for D-246**, whose native mosaic is chirality-agnostic. Provenance at the tile is a new **orthogonal overlay field** `VoxelColumn.biosphere ∈ {Native, Introduced}` (defaulted `Native`, `#[serde(default)]`), sitting beside `cover` — set `Native` by the wild/natural derivation (all of Phase 4) and `Introduced` by the future managed override, i.e. it is exactly D-228's **wild → economic/managed** precedence read as a label. Every voxel still resolves to a complete D-228 tuple; the bit adds no unset state and no new RNG.
|
||||
- **Scope.** The *biochemistry* is phase-independent canon. The *tile register* is Phase 4 — but only its **native** half exists now (the managed Earth-conversion layer is drawn later by the settlement/economic pass, D-166 outside-in). Food-supply economics is a Phase-2 consumer (already latent — agriculture-as-leverage, frontier net food importers). Foraging futility, predators that gore-but-don't-eat, absent native medicine, and Earth-blight-not-native-plague are **parked gameplay** (T-1036) — flagged, not designed here.
|
||||
- **Rationale:** "Implemented" is a false summit for a setting the same way it is for the cascade (cf. [D-245](../decisions/architecture.md#d-245)). The Reach's habitability was scattered across a dozen wiki entries as unexplained flavor ("alien biochemistries, incompatible, inedible, non-infectious — *almost always*"); this record supplies the single mechanism that predicts all of it *and* its exceptions, and turns "can I eat here?" into a legible, generatable world property. The 50/50 chirality boolean (vs a fuzzy "usually incompatible") is chosen because it makes both world-classes common enough to matter and gives the storyteller a hard axis. Native-life-not-terraforming is forced by the timeline math the setting already committed to. Touchstones: Mass Effect (levo/dextro food chirality), Vance's *Cadwal Chronicles* (the Conservancy world → Keid), the Bobiverse (convergent-but-alien niches), Hamilton's Commonwealth (non-animal/mega clades, the Primes), Card's descolada/Lusitania (a biosphere as one linked genetic system).
|
||||
- **Affects:** **Wiki continuity pass** (Miri) over the entries that already gesture at this, each assigned a chirality bit consistent with its authored identity — GJ-338B (Arbour — Compatible; estate-food garden), GJ-827 (Solandar — Mirror-inert research preserve), GJ-166A (Keid — Compatible; preserved *because* its edible native biology is an exploitation target — conservation against capital), GJ-524 (Mirror), GJ-684A (native + introduced coexisting), GJ-197 (Earth introductions thrive), GJ-79 (Oshima — `TerraformedSterile`), GJ-124 (Hạ Long — resolve whether its "protein" is native-Compatible harvest or Earth aquaculture). **Schema/code:** authored `bodies.biosphere_class` column + wiki frontmatter (nullable; principled default from `economic_base_primary`+`planet_class`, explicit overrides) — an **input, not a seed derivation** — landing with the continuity pass; `VoxelColumn.biosphere` overlay field. **Economy** (Burnelli): food-supply demand primitive keyed on `biosphere_class`. **[D-246](../decisions/architecture.md#d-246):** its palette register is now grounded as native-mirror-wild vs introduced-Earth-managed.
|
||||
- **Cross-reference:** [D-246](../decisions/architecture.md#d-246) (the mosaic register that consumes this — native vs introduced), [D-228](../decisions/architecture.md#d-228) (the wild→managed override stack this labels), [D-227](../decisions/architecture.md#d-227) (derive-don't-store — `biosphere` is a derived overlay), [D-166](../decisions/scope.md#d-166) (outside-in — the settlement pass draws the Earth-conversion layer), [D-188](../decisions/architecture.md#d-188) (`planet_class` — the sibling body attribute), [D-240](../decisions/architecture.md#d-240) (BodyParams read set `biosphere_class` joins), [D-245](../decisions/architecture.md#d-245) (believability — the conversion gradient supplies coherence + non-stationarity for free). Tickets: T-1084 (D-246 mosaic register), T-1079 (epic); a Miri continuity/vocabulary ticket to be filed.
|
||||
- **Raised by:** Jeroen — the native-life-not-terraforming premise (two centuries can't terraform but can wage ecological war), the mirror-/counter-chirality DNA-enzyme indigestibility mechanism, the Mass-Effect chirality food-safety boolean (~50/50 target), the authored-input-not-derivation call (Arbour's estate food; Keid = Compatible, preserved against exploitation of edible alien life; "safe" ≠ "edible"), and Keid-as-Cadwal — with Claude (timeline/canon verification, tile-derivation safety check, the wild/managed override mapping, and the consequence analysis), 2026-07-02, during the T-1084 (D-246) refinement conversation. Setting development + wiki continuity owned by **Miri**; food economics by **Burnelli**.
|
||||
- **Dissent:** None.
|
||||
|
||||
---
|
||||
|
||||
*48 decisions. Last updated: 2026-07-02 (D-247 — native pre-existing biospheres: habitable Reach worlds were alive before humans; an **authored** per-world chirality bit (~50/50 target) gates whether native life is edible (Compatible) or inedible-but-inert (Mirror) — "safe" and "edible" are decoupled; colonization is ecological war that grows an Earth-crop footprint outward from settlements; grounds the D-246 mosaic register; Miri + Burnelli own development).*
|
||||
|
||||
Reference in New Issue
Block a user