diff --git a/.pql/changelog/ticket_history/2026-06.sql b/.pql/changelog/ticket_history/2026-06.sql index 0ac0d0e0c..37191cf05 100644 --- a/.pql/changelog/ticket_history/2026-06.sql +++ b/.pql/changelog/ticket_history/2026-06.sql @@ -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; diff --git a/.pql/changelog/tickets/2026-06.sql b/.pql/changelog/tickets/2026-06.sql index 452f8405a..7a84d423f 100644 --- a/.pql/changelog/tickets/2026-06.sql +++ b/.pql/changelog/tickets/2026-06.sql @@ -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_q→elevation_m scale: generate_alluvial_plain uses `elev_q / 2` → whole-body relief is 0–50 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 ~256–2048 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.25–2 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);