chore(meta): T-1081 -> done (voxel-relief merged)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-06-28 21:23:38 +02:00
co-authored by Claude Opus 4.8
parent 1eb098129b
commit dc1d905ce0
2 changed files with 24 additions and 0 deletions
@@ -2825,3 +2825,4 @@ Verification: new believability metric `contrast.voxel_relief_m` (mean within-di
Deferred (Q-123 / follow-up): provisional VOXEL_RELIEF_SPAN_M=300 + the 8 m threshold need calibration; the ABSOLUTE elevation span is still the compressed elev_q/N base a per-body hypsometric relief model is the later refinement. D-239 amended (T-1081); Q-123 item 4 updated.', NULL, '2026-06-28 18:41:37', '2026-06-28 18:41:37.651', '2026-06-28 18:41:37.651', NULL, 'ceea6fa43cd99a8a108633e74a1d05f0', 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 ('06FGSJVW30PSP8K0XAWV02X7M0', 'status', 'in_progress', 'review', NULL, '2026-06-28 18:42:16', '2026-06-28 18:42:16.275', '2026-06-28 18:42:16.275', NULL, '9d6b1a825d080b890eb5e9c9176078bf', 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 ('06FGSJVW30PSP8K0XAWV02X7M0', 'status', 'review', 'done', NULL, '2026-06-28 19:23:32', '2026-06-28 19:23:32.948', '2026-06-28 19:23:32.948', NULL, 'b7e04ba50a83ebce14037ccec5ea1ac3', 2) ON CONFLICT(hash) DO NOTHING;
+23
View File
@@ -3800,3 +3800,26 @@ Root cause refined during impl: the coarse heightmap yields slope_q ≈ 0 even o
Verification: new believability metric `contrast.voxel_relief_m` (mean within-district elevation range over a 2 km transect a single 64 m chunk is narrower than the relief band). Arbour @ yolo: voxel relief 5 m 59 m, criteria 6/8 7/8 (remaining fail = the Q-123 vegetation-denominator item, not relief). Edict also 59 m. 1586 lib tests + believability harness (determinism + golden) green; clippy -D warnings clean.
Deferred (Q-123 / follow-up): provisional VOXEL_RELIEF_SPAN_M=300 + the 8 m threshold need calibration; the ABSOLUTE elevation span is still the compressed elev_q/N base a per-body hypsometric relief model is the later refinement. D-239 amended (T-1081); Q-123 item 4 updated.', 'review', 'high', NULL, 'server', 'D-227', '2026-06-28 05:54:50.008', '2026-06-28 18:42:16.275', NULL, '2487f66072b663853ae335b807756ddb', 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 ('06FGSJVW30PSP8K0XAWV02X7M0', 'story', '06FGSJNP8YM537DJCC82ZD6544', 'Near-zero voxel relief (0-3 m) — generated terrain has no hills or landmarks', 'Probe evidence (Arbour @ yolo): voxel elevation 0-3 m across nearly all sampled districts (only one snow upland reached 42-49 m). Flat terrain => nothing to navigate by, no landmarks, no ''specificity of place''. Either the heightmap relief is being flattened by the 512x256 working downsample + district derivation, or detail-scatter (D-227, derive-don''t-store) is not producing the mid-scale relief it is supposed to invent at the voxel tier. Direction to discuss: the relief envelope taken from the heightmap, detail-scatter amplitude, and whether the elev_q -> elevation_m mapping is collapsing the range. Believability gap.
---
Refinement (Si pass, 2026-06-28) READY. Four compounding causes (all confirmed):
1. elev_qelevation_m scale: generate_alluvial_plain uses `elev_q / 2` whole-body relief is 050 m (pancake). Other flat families similar (/2,/3,/4). The dramatic families (cliff/fjord/gorge) carry real internal relief; the flat ones (alluvial/lava/dune/braided/meander) don''t.
2. detail_scatter (D-227) is applied ONLY at the district tier (derive_district elev_q); it never reaches per-voxel elevation_m. So within a chunk relief = base ± 4 m micro-scatter = flat. The promised mid-scale (sub-district, ~tens-to-hundreds m) relief is missing at the voxel tier.
3. Envelope collapses to 0 on flat-slope districts (terrain_detail returns 0 when envelope==0) by design ("no mountain on an authored plain"); consider a small floor so even gentle land rolls.
4. WaterBody correctly keeps elevation_m=0 (sea level) must stay.
PLAN (data-driven, tune via probe like moisture):
- Add MID-SCALE rolling relief at the voxel tier: a detail-scatter octave term (sub-district wavelengths ~2562048 m) added to elevation_m for DRY-LAND columns, enveloped by district ruggedness (slope_q) so plains stay flat and rugged terrain rolls. f64 perturbation truncated to i32 (D-010, same as the warp). Applied centrally in derive_voxel_column (one site, like derive_cover) so all land families benefit.
- Bump the flat-family base scale from the compressed /N toward a believable span if the probe shows mountains still too low (per-body absolute relief = T-1032 follow-up).
- Add a VOXEL-RELIEF metric to believability.rs (mean within-chunk elevation range across sampled non-water districts) the current "elevation relief" criterion measures DISTRICT elev_q spread (already passes), not voxel relief, so it does not catch T-1081.
- VERIFY: probe per-location elevation range rises from ~0-3 m; the new voxel-relief criterion flips green. Determinism: integer/D-010.
Files: voxel.rs (generators + central relief), detail_scatter.rs (sub-district wavelengths), believability.rs (metric).
Implemented (2026-06-28, branch voxel-relief). The voxel tier now carries mid-scale relief (D-243 §2): a `voxel_relief` fBm pass at the 0.252 km octave band (detail_scatter.rs), body-global SeedDomain::VoxelRelief seed, added post-dispatch in derive_voxel_column, truncated to integer metres (D-010).
Root cause refined during impl: the coarse heightmap yields slope_q 0 even on high ground (Arbour max slope_q = 13), so the relief envelope is `slope_q*3 + elev_q` (elevation drives ruggedness), not slope alone. Applied to the FLAT families only (AlluvialPlain/LavaField/BraidedDelta/DuneStrand/MeanderReach) the dramatic families (Cliff/Fjord/Gorge) already carry strong internal relief and a position-varying field warps their features; WaterBody stays at sea level.
Verification: new believability metric `contrast.voxel_relief_m` (mean within-district elevation range over a 2 km transect a single 64 m chunk is narrower than the relief band). Arbour @ yolo: voxel relief 5 m 59 m, criteria 6/8 7/8 (remaining fail = the Q-123 vegetation-denominator item, not relief). Edict also 59 m. 1586 lib tests + believability harness (determinism + golden) green; clippy -D warnings clean.
Deferred (Q-123 / follow-up): provisional VOXEL_RELIEF_SPAN_M=300 + the 8 m threshold need calibration; the ABSOLUTE elevation span is still the compressed elev_q/N base a per-body hypsometric relief model is the later refinement. D-239 amended (T-1081); Q-123 item 4 updated.', 'done', 'high', NULL, 'server', 'D-227', '2026-06-28 05:54:50.008', '2026-06-28 19:23:32.948', NULL, '5e596b52592847d7bd59ba1614f819b8', 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);