chore(meta): close T-1240 — Region reads as terrain, acceptance ladder shot
relief_grad across the cold ladder: Global 0.00, Region 1.08, District 0.30, Quarter 0.07. Closure note records the two premises the ticket got wrong (Nyquist is the aliasing limit, not a legibility one) and the coast-warp trade taken at Region, with its reversal path. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -663,3 +663,110 @@ observable; before it, relief_q never arrived and the rung was flat for a
|
||||
different reason entirely.', NULL, '2026-08-16 16:23:17', '2026-08-16 16:23:17.190', '2026-08-16 16:23:17.190', NULL, '42875477f1917d72cd064d584df2b11f', 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 ('06FXRSY7QWD8J5X6G1N86WMKEC', 'status', 'backlog', 'in_progress', NULL, '2026-08-17 07:08:40', '2026-08-17 07:08:40.539', '2026-08-17 07:08:40.539', NULL, 'e4ccc5d347b5aa663e2b1f2807859e94', 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 ('06FXRSY7QWD8J5X6G1N86WMKEC', 'status', 'in_progress', 'in_progress', NULL, '2026-08-17 07:08:54', '2026-08-17 07:08:54.825', '2026-08-17 07:08:54.825', NULL, '7e81011477963b0c4e59458537164e4a', 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 ('06FXRSY7QWD8J5X6G1N86WMKEC', 'description', 'Found during T-1213 (2026-08-07). MIN_WL_BANDS_M (layer_proxy.rs) is built from 2*DISTRICT_M (4,096 m) and 2*QUARTER_M (1,024 m) -- Nyquist for a sample spacing equal to the rung''s CELL SIZE. That was correct while a rung fixed SPACING; after D-255''s extent inversion a rung fixes EXTENT and District''s spacing is 2048/540 = 3.8 m, so its true Nyquist floor is ~7.6 m. The bands are off by roughly the canvas cell count (~540x). This is the same class of defect as the Global 2x1 wire-extent sentinel the D-258 amendment documents: a constant that was correct under the pre-inversion model and silently outlived it. The code even states the consequence as though intended -- district_profile.rs''s comment reads ''At District''s real Nyquist floor (4,096 m) every VOXEL_OCTAVE_WAVELENGTHS_M entry is truncated, so relief is always exactly 0.0 there''. IMPORTANT SCOPE NOTE, verified before filing: this is currently INERT for the step canvas. step_canvas_viewer._fire_request() calls request_now(body, rung, center, extent) with no min_wl_m, so it defaults to 0, and quantize_min_wl_m(0) returns 0 (the leading sentinel band) -- no truncation happens on the served path. It therefore only affects the legacy layer_proxy district-window consumer. It is NOT the cause of the flat District/Quarter rungs; that is elev_q''s 80 m quantisation (0-100 across MAX_REGION_ELEVATION_KM = 8.0 km), measured at d1 mean 0.02 with the cutoff already disabled. Fix: derive the cutoff from the resolved canvas spacing rather than the rung cell size. Check the layer_proxy consumer''s expectations first -- MIN_WL_BANDS_M is shared, carries a const assert tying band 4 to OCTAVE_WAVELENGTHS_M[3], and is part of the cache key, so a change there is not local.
|
||||
|
||||
---
|
||||
NO LONGER INERT IN CONSEQUENCE (2026-08-16, found via T-1213). This ticket''s own
|
||||
scope note says the stale cutoff "is NOT the cause of the flat District/Quarter
|
||||
rungs". That was correct, and it is now the cause of something else: it caps
|
||||
REGION.
|
||||
|
||||
With relief_q reaching the renderer (T-1213 fixed a missing protocol decode) and
|
||||
driving a hillshade, Region renders as a fine uniform stucco — texture at the
|
||||
pixel scale, no landform. District and Quarter, on the same code, read as real
|
||||
terrain (lum p1-p99 74.43 and 73.72 against Region''s 54.30).
|
||||
|
||||
The reason is sampling, and it is this ticket: a Region cell is 379 m of ground,
|
||||
while the relief field''s own content sits in the 128-1024 m composition band plus
|
||||
192 m inclusions. The field is at or below Nyquist for that sampling, so every
|
||||
neighbouring cell differs by an essentially independent draw and the gradient the
|
||||
hillshade reads is ALIASING rather than slope. Because min_wl_m defaults to 0 on
|
||||
the served path, nothing truncates the octaves Region cannot resolve — which is
|
||||
precisely the fix this ticket proposes ("derive the cutoff from the resolved
|
||||
canvas spacing rather than the rung cell size").
|
||||
|
||||
So the visible symptom to fix against is now concrete: Region should show the
|
||||
same kind of ridge-and-valley form District does, at its own scale, and it will
|
||||
once the octaves below its sampling resolution are cut. The T-1213 work made this
|
||||
observable; before it, relief_q never arrived and the rung was flat for a
|
||||
different reason entirely.', 'Found during T-1213 (2026-08-07). MIN_WL_BANDS_M (layer_proxy.rs) is built from 2*DISTRICT_M (4,096 m) and 2*QUARTER_M (1,024 m) -- Nyquist for a sample spacing equal to the rung''s CELL SIZE. That was correct while a rung fixed SPACING; after D-255''s extent inversion a rung fixes EXTENT and District''s spacing is 2048/540 = 3.8 m, so its true Nyquist floor is ~7.6 m. The bands are off by roughly the canvas cell count (~540x). This is the same class of defect as the Global 2x1 wire-extent sentinel the D-258 amendment documents: a constant that was correct under the pre-inversion model and silently outlived it. The code even states the consequence as though intended -- district_profile.rs''s comment reads ''At District''s real Nyquist floor (4,096 m) every VOXEL_OCTAVE_WAVELENGTHS_M entry is truncated, so relief is always exactly 0.0 there''. IMPORTANT SCOPE NOTE, verified before filing: this is currently INERT for the step canvas. step_canvas_viewer._fire_request() calls request_now(body, rung, center, extent) with no min_wl_m, so it defaults to 0, and quantize_min_wl_m(0) returns 0 (the leading sentinel band) -- no truncation happens on the served path. It therefore only affects the legacy layer_proxy district-window consumer. It is NOT the cause of the flat District/Quarter rungs; that is elev_q''s 80 m quantisation (0-100 across MAX_REGION_ELEVATION_KM = 8.0 km), measured at d1 mean 0.02 with the cutoff already disabled. Fix: derive the cutoff from the resolved canvas spacing rather than the rung cell size. Check the layer_proxy consumer''s expectations first -- MIN_WL_BANDS_M is shared, carries a const assert tying band 4 to OCTAVE_WAVELENGTHS_M[3], and is part of the cache key, so a change there is not local.
|
||||
|
||||
---
|
||||
NO LONGER INERT IN CONSEQUENCE (2026-08-16, found via T-1213). This ticket''s own
|
||||
scope note says the stale cutoff "is NOT the cause of the flat District/Quarter
|
||||
rungs". That was correct, and it is now the cause of something else: it caps
|
||||
REGION.
|
||||
|
||||
With relief_q reaching the renderer (T-1213 fixed a missing protocol decode) and
|
||||
driving a hillshade, Region renders as a fine uniform stucco — texture at the
|
||||
pixel scale, no landform. District and Quarter, on the same code, read as real
|
||||
terrain (lum p1-p99 74.43 and 73.72 against Region''s 54.30).
|
||||
|
||||
The reason is sampling, and it is this ticket: a Region cell is 379 m of ground,
|
||||
while the relief field''s own content sits in the 128-1024 m composition band plus
|
||||
192 m inclusions. The field is at or below Nyquist for that sampling, so every
|
||||
neighbouring cell differs by an essentially independent draw and the gradient the
|
||||
hillshade reads is ALIASING rather than slope. Because min_wl_m defaults to 0 on
|
||||
the served path, nothing truncates the octaves Region cannot resolve — which is
|
||||
precisely the fix this ticket proposes ("derive the cutoff from the resolved
|
||||
canvas spacing rather than the rung cell size").
|
||||
|
||||
So the visible symptom to fix against is now concrete: Region should show the
|
||||
same kind of ridge-and-valley form District does, at its own scale, and it will
|
||||
once the octaves below its sampling resolution are cut. The T-1213 work made this
|
||||
observable; before it, relief_q never arrived and the rung was flat for a
|
||||
different reason entirely.
|
||||
|
||||
---
|
||||
CLOSED 2026-08-18 (9b146f9e1). The cutoff is derived from the resolved canvas
|
||||
spacing, which is what this ticket asked for — but two of its own premises turned
|
||||
out to be wrong, and both were corrected by measurement rather than argument.
|
||||
|
||||
WRONG PREMISE 1 — "the fix is Nyquist". The ticket reasons in Nyquist terms
|
||||
("District''s true Nyquist floor is ~7.6 m"). Implemented at 2 x spacing, Region
|
||||
barely moved: lum p1-p99 56.16 -> 59.73, and the relief field''s mean cell-to-cell
|
||||
gradient stayed at 18.24 steps. Nyquist is the ALIASING limit — the point below
|
||||
which a wave is indistinguishable from a slower one — not a legibility one. Two
|
||||
samples per cycle is unaliased and still renders jagged.
|
||||
|
||||
The rungs that already read as terrain say what the real bar is: District
|
||||
reconstructs its finest surviving octave at 34 samples per cycle (gradient 0.30)
|
||||
and Quarter at 135 (0.07). Shipped at 8 samples per cycle
|
||||
(SMOOTH_SAMPLES_PER_WAVELENGTH), which puts Region at 1.08 gradient and 70.01
|
||||
spread — the same order as the rungs that work.
|
||||
|
||||
WRONG PREMISE 2 — my own, in the 2026-08-16 note above: I wrote that the stucco
|
||||
was the relief field aliasing, then after the 2x attempt failed I blamed the
|
||||
CLIENT stipple instead. Both were guesses. Surfacing the terrain layer''s own mean
|
||||
|relief_q gradient| in the capture readout answered it in one shot: 18.24 steps
|
||||
per cell at Region means 144 m of relief between NEIGHBOURING cells. The server
|
||||
was sending noise; the stipple was innocent. That diagnostic ships with the fix,
|
||||
for the same reason `plane_variety` shipped with T-1213 — a noisy field and a
|
||||
renderer inventing noise look identical, and one number separates them.
|
||||
|
||||
THE TRADE, taken deliberately. An 8x floor also truncates the coast warp''s 2,048
|
||||
and 1,024 m octaves at Region — the band T-1160 added for "one coastline at every
|
||||
rung". A test here asserted that band must survive; it now asserts the opposite,
|
||||
with the reasoning recorded in the test body: a 1,024 m coastline wiggle at
|
||||
379.3 m per cell is 2.7 samples per cycle, so drawing it draws noise rather than
|
||||
coastline character, and a rung cannot show shape finer than its own cell. The
|
||||
warp is amplitude-capped sub-pixel on the working grid, so the loss is small.
|
||||
Reversal path, if a future pass disagrees: a relief-only floor threaded through
|
||||
derive_at_metres — NOT a lower multiple, which takes the stucco back.
|
||||
|
||||
SCOPE ACTUALLY TOUCHED. Only the step-canvas served path. layer_proxy''s
|
||||
MIN_WL_BANDS_M, its const assert and its cache key are UNCHANGED — the ticket
|
||||
warned that a change there is not local, and none was needed: the fix is a
|
||||
spacing-derived floor at the canvas builder, a pure function of (rung, extent,
|
||||
body_radius), all three already in the step-canvas cache key. Global is exempt
|
||||
(its ~70 km floor would silence the whole warp band, and its orbital derive
|
||||
leaves relief_q flat at 50). District and Quarter floor below every octave in
|
||||
play and derive byte-identically — pinned by
|
||||
`floor_is_inert_at_the_rungs_that_already_resolve_their_band`, and confirmed by
|
||||
the derivation/believability goldens passing untouched.
|
||||
|
||||
LEFT OPEN, not part of this ticket: Quarter''s contour banding (the stipple
|
||||
lattice quantising the hillshade into dotted rings), and MIN_WL_BANDS_M itself,
|
||||
which remains stale for the legacy layer_proxy district-window consumer. Neither
|
||||
blocks the ladder.', NULL, '2026-08-18 18:48:58', '2026-08-18 18:48:58.820', '2026-08-18 18:48:58.820', NULL, '3652f53a400647d1a1e07722c3c80134', 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 ('06FXRSY7QWD8J5X6G1N86WMKEC', 'status', 'in_progress', 'done', NULL, '2026-08-18 18:49:07', '2026-08-18 18:49:07.177', '2026-08-18 18:49:07.177', NULL, 'd6123093737518a1816712cc77e11bf0', 2) ON CONFLICT(hash) DO NOTHING;
|
||||
|
||||
@@ -692,3 +692,163 @@ same kind of ridge-and-valley form District does, at its own scale, and it will
|
||||
once the octaves below its sampling resolution are cut. The T-1213 work made this
|
||||
observable; before it, relief_q never arrived and the rung was flat for a
|
||||
different reason entirely.', 'in_progress', 'medium', NULL, 'server', 'D-255', '2026-08-07 13:26:56.703', '2026-08-17 07:08:54.825', NULL, '4300fa437b31a5f8e2b89999c882fcd8', 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;
|
||||
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 ('06FXRSY7QWD8J5X6G1N86WMKEC', 'task', '06FB0TNSRZXCHGS16BFHSSGSV4', 'MIN_WL_BANDS_M octave cutoffs are pre-extent-inversion (stale, currently inert)', 'Found during T-1213 (2026-08-07). MIN_WL_BANDS_M (layer_proxy.rs) is built from 2*DISTRICT_M (4,096 m) and 2*QUARTER_M (1,024 m) -- Nyquist for a sample spacing equal to the rung''s CELL SIZE. That was correct while a rung fixed SPACING; after D-255''s extent inversion a rung fixes EXTENT and District''s spacing is 2048/540 = 3.8 m, so its true Nyquist floor is ~7.6 m. The bands are off by roughly the canvas cell count (~540x). This is the same class of defect as the Global 2x1 wire-extent sentinel the D-258 amendment documents: a constant that was correct under the pre-inversion model and silently outlived it. The code even states the consequence as though intended -- district_profile.rs''s comment reads ''At District''s real Nyquist floor (4,096 m) every VOXEL_OCTAVE_WAVELENGTHS_M entry is truncated, so relief is always exactly 0.0 there''. IMPORTANT SCOPE NOTE, verified before filing: this is currently INERT for the step canvas. step_canvas_viewer._fire_request() calls request_now(body, rung, center, extent) with no min_wl_m, so it defaults to 0, and quantize_min_wl_m(0) returns 0 (the leading sentinel band) -- no truncation happens on the served path. It therefore only affects the legacy layer_proxy district-window consumer. It is NOT the cause of the flat District/Quarter rungs; that is elev_q''s 80 m quantisation (0-100 across MAX_REGION_ELEVATION_KM = 8.0 km), measured at d1 mean 0.02 with the cutoff already disabled. Fix: derive the cutoff from the resolved canvas spacing rather than the rung cell size. Check the layer_proxy consumer''s expectations first -- MIN_WL_BANDS_M is shared, carries a const assert tying band 4 to OCTAVE_WAVELENGTHS_M[3], and is part of the cache key, so a change there is not local.
|
||||
|
||||
---
|
||||
NO LONGER INERT IN CONSEQUENCE (2026-08-16, found via T-1213). This ticket''s own
|
||||
scope note says the stale cutoff "is NOT the cause of the flat District/Quarter
|
||||
rungs". That was correct, and it is now the cause of something else: it caps
|
||||
REGION.
|
||||
|
||||
With relief_q reaching the renderer (T-1213 fixed a missing protocol decode) and
|
||||
driving a hillshade, Region renders as a fine uniform stucco — texture at the
|
||||
pixel scale, no landform. District and Quarter, on the same code, read as real
|
||||
terrain (lum p1-p99 74.43 and 73.72 against Region''s 54.30).
|
||||
|
||||
The reason is sampling, and it is this ticket: a Region cell is 379 m of ground,
|
||||
while the relief field''s own content sits in the 128-1024 m composition band plus
|
||||
192 m inclusions. The field is at or below Nyquist for that sampling, so every
|
||||
neighbouring cell differs by an essentially independent draw and the gradient the
|
||||
hillshade reads is ALIASING rather than slope. Because min_wl_m defaults to 0 on
|
||||
the served path, nothing truncates the octaves Region cannot resolve — which is
|
||||
precisely the fix this ticket proposes ("derive the cutoff from the resolved
|
||||
canvas spacing rather than the rung cell size").
|
||||
|
||||
So the visible symptom to fix against is now concrete: Region should show the
|
||||
same kind of ridge-and-valley form District does, at its own scale, and it will
|
||||
once the octaves below its sampling resolution are cut. The T-1213 work made this
|
||||
observable; before it, relief_q never arrived and the rung was flat for a
|
||||
different reason entirely.
|
||||
|
||||
---
|
||||
CLOSED 2026-08-18 (9b146f9e1). The cutoff is derived from the resolved canvas
|
||||
spacing, which is what this ticket asked for — but two of its own premises turned
|
||||
out to be wrong, and both were corrected by measurement rather than argument.
|
||||
|
||||
WRONG PREMISE 1 — "the fix is Nyquist". The ticket reasons in Nyquist terms
|
||||
("District''s true Nyquist floor is ~7.6 m"). Implemented at 2 x spacing, Region
|
||||
barely moved: lum p1-p99 56.16 -> 59.73, and the relief field''s mean cell-to-cell
|
||||
gradient stayed at 18.24 steps. Nyquist is the ALIASING limit — the point below
|
||||
which a wave is indistinguishable from a slower one — not a legibility one. Two
|
||||
samples per cycle is unaliased and still renders jagged.
|
||||
|
||||
The rungs that already read as terrain say what the real bar is: District
|
||||
reconstructs its finest surviving octave at 34 samples per cycle (gradient 0.30)
|
||||
and Quarter at 135 (0.07). Shipped at 8 samples per cycle
|
||||
(SMOOTH_SAMPLES_PER_WAVELENGTH), which puts Region at 1.08 gradient and 70.01
|
||||
spread — the same order as the rungs that work.
|
||||
|
||||
WRONG PREMISE 2 — my own, in the 2026-08-16 note above: I wrote that the stucco
|
||||
was the relief field aliasing, then after the 2x attempt failed I blamed the
|
||||
CLIENT stipple instead. Both were guesses. Surfacing the terrain layer''s own mean
|
||||
|relief_q gradient| in the capture readout answered it in one shot: 18.24 steps
|
||||
per cell at Region means 144 m of relief between NEIGHBOURING cells. The server
|
||||
was sending noise; the stipple was innocent. That diagnostic ships with the fix,
|
||||
for the same reason `plane_variety` shipped with T-1213 — a noisy field and a
|
||||
renderer inventing noise look identical, and one number separates them.
|
||||
|
||||
THE TRADE, taken deliberately. An 8x floor also truncates the coast warp''s 2,048
|
||||
and 1,024 m octaves at Region — the band T-1160 added for "one coastline at every
|
||||
rung". A test here asserted that band must survive; it now asserts the opposite,
|
||||
with the reasoning recorded in the test body: a 1,024 m coastline wiggle at
|
||||
379.3 m per cell is 2.7 samples per cycle, so drawing it draws noise rather than
|
||||
coastline character, and a rung cannot show shape finer than its own cell. The
|
||||
warp is amplitude-capped sub-pixel on the working grid, so the loss is small.
|
||||
Reversal path, if a future pass disagrees: a relief-only floor threaded through
|
||||
derive_at_metres — NOT a lower multiple, which takes the stucco back.
|
||||
|
||||
SCOPE ACTUALLY TOUCHED. Only the step-canvas served path. layer_proxy''s
|
||||
MIN_WL_BANDS_M, its const assert and its cache key are UNCHANGED — the ticket
|
||||
warned that a change there is not local, and none was needed: the fix is a
|
||||
spacing-derived floor at the canvas builder, a pure function of (rung, extent,
|
||||
body_radius), all three already in the step-canvas cache key. Global is exempt
|
||||
(its ~70 km floor would silence the whole warp band, and its orbital derive
|
||||
leaves relief_q flat at 50). District and Quarter floor below every octave in
|
||||
play and derive byte-identically — pinned by
|
||||
`floor_is_inert_at_the_rungs_that_already_resolve_their_band`, and confirmed by
|
||||
the derivation/believability goldens passing untouched.
|
||||
|
||||
LEFT OPEN, not part of this ticket: Quarter''s contour banding (the stipple
|
||||
lattice quantising the hillshade into dotted rings), and MIN_WL_BANDS_M itself,
|
||||
which remains stale for the legacy layer_proxy district-window consumer. Neither
|
||||
blocks the ladder.', 'in_progress', 'medium', NULL, 'server', 'D-255', '2026-08-07 13:26:56.703', '2026-08-18 18:48:58.815', NULL, '7594ac8497738d4474acf52db20a23fc', 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;
|
||||
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 ('06FXRSY7QWD8J5X6G1N86WMKEC', 'task', '06FB0TNSRZXCHGS16BFHSSGSV4', 'MIN_WL_BANDS_M octave cutoffs are pre-extent-inversion (stale, currently inert)', 'Found during T-1213 (2026-08-07). MIN_WL_BANDS_M (layer_proxy.rs) is built from 2*DISTRICT_M (4,096 m) and 2*QUARTER_M (1,024 m) -- Nyquist for a sample spacing equal to the rung''s CELL SIZE. That was correct while a rung fixed SPACING; after D-255''s extent inversion a rung fixes EXTENT and District''s spacing is 2048/540 = 3.8 m, so its true Nyquist floor is ~7.6 m. The bands are off by roughly the canvas cell count (~540x). This is the same class of defect as the Global 2x1 wire-extent sentinel the D-258 amendment documents: a constant that was correct under the pre-inversion model and silently outlived it. The code even states the consequence as though intended -- district_profile.rs''s comment reads ''At District''s real Nyquist floor (4,096 m) every VOXEL_OCTAVE_WAVELENGTHS_M entry is truncated, so relief is always exactly 0.0 there''. IMPORTANT SCOPE NOTE, verified before filing: this is currently INERT for the step canvas. step_canvas_viewer._fire_request() calls request_now(body, rung, center, extent) with no min_wl_m, so it defaults to 0, and quantize_min_wl_m(0) returns 0 (the leading sentinel band) -- no truncation happens on the served path. It therefore only affects the legacy layer_proxy district-window consumer. It is NOT the cause of the flat District/Quarter rungs; that is elev_q''s 80 m quantisation (0-100 across MAX_REGION_ELEVATION_KM = 8.0 km), measured at d1 mean 0.02 with the cutoff already disabled. Fix: derive the cutoff from the resolved canvas spacing rather than the rung cell size. Check the layer_proxy consumer''s expectations first -- MIN_WL_BANDS_M is shared, carries a const assert tying band 4 to OCTAVE_WAVELENGTHS_M[3], and is part of the cache key, so a change there is not local.
|
||||
|
||||
---
|
||||
NO LONGER INERT IN CONSEQUENCE (2026-08-16, found via T-1213). This ticket''s own
|
||||
scope note says the stale cutoff "is NOT the cause of the flat District/Quarter
|
||||
rungs". That was correct, and it is now the cause of something else: it caps
|
||||
REGION.
|
||||
|
||||
With relief_q reaching the renderer (T-1213 fixed a missing protocol decode) and
|
||||
driving a hillshade, Region renders as a fine uniform stucco — texture at the
|
||||
pixel scale, no landform. District and Quarter, on the same code, read as real
|
||||
terrain (lum p1-p99 74.43 and 73.72 against Region''s 54.30).
|
||||
|
||||
The reason is sampling, and it is this ticket: a Region cell is 379 m of ground,
|
||||
while the relief field''s own content sits in the 128-1024 m composition band plus
|
||||
192 m inclusions. The field is at or below Nyquist for that sampling, so every
|
||||
neighbouring cell differs by an essentially independent draw and the gradient the
|
||||
hillshade reads is ALIASING rather than slope. Because min_wl_m defaults to 0 on
|
||||
the served path, nothing truncates the octaves Region cannot resolve — which is
|
||||
precisely the fix this ticket proposes ("derive the cutoff from the resolved
|
||||
canvas spacing rather than the rung cell size").
|
||||
|
||||
So the visible symptom to fix against is now concrete: Region should show the
|
||||
same kind of ridge-and-valley form District does, at its own scale, and it will
|
||||
once the octaves below its sampling resolution are cut. The T-1213 work made this
|
||||
observable; before it, relief_q never arrived and the rung was flat for a
|
||||
different reason entirely.
|
||||
|
||||
---
|
||||
CLOSED 2026-08-18 (9b146f9e1). The cutoff is derived from the resolved canvas
|
||||
spacing, which is what this ticket asked for — but two of its own premises turned
|
||||
out to be wrong, and both were corrected by measurement rather than argument.
|
||||
|
||||
WRONG PREMISE 1 — "the fix is Nyquist". The ticket reasons in Nyquist terms
|
||||
("District''s true Nyquist floor is ~7.6 m"). Implemented at 2 x spacing, Region
|
||||
barely moved: lum p1-p99 56.16 -> 59.73, and the relief field''s mean cell-to-cell
|
||||
gradient stayed at 18.24 steps. Nyquist is the ALIASING limit — the point below
|
||||
which a wave is indistinguishable from a slower one — not a legibility one. Two
|
||||
samples per cycle is unaliased and still renders jagged.
|
||||
|
||||
The rungs that already read as terrain say what the real bar is: District
|
||||
reconstructs its finest surviving octave at 34 samples per cycle (gradient 0.30)
|
||||
and Quarter at 135 (0.07). Shipped at 8 samples per cycle
|
||||
(SMOOTH_SAMPLES_PER_WAVELENGTH), which puts Region at 1.08 gradient and 70.01
|
||||
spread — the same order as the rungs that work.
|
||||
|
||||
WRONG PREMISE 2 — my own, in the 2026-08-16 note above: I wrote that the stucco
|
||||
was the relief field aliasing, then after the 2x attempt failed I blamed the
|
||||
CLIENT stipple instead. Both were guesses. Surfacing the terrain layer''s own mean
|
||||
|relief_q gradient| in the capture readout answered it in one shot: 18.24 steps
|
||||
per cell at Region means 144 m of relief between NEIGHBOURING cells. The server
|
||||
was sending noise; the stipple was innocent. That diagnostic ships with the fix,
|
||||
for the same reason `plane_variety` shipped with T-1213 — a noisy field and a
|
||||
renderer inventing noise look identical, and one number separates them.
|
||||
|
||||
THE TRADE, taken deliberately. An 8x floor also truncates the coast warp''s 2,048
|
||||
and 1,024 m octaves at Region — the band T-1160 added for "one coastline at every
|
||||
rung". A test here asserted that band must survive; it now asserts the opposite,
|
||||
with the reasoning recorded in the test body: a 1,024 m coastline wiggle at
|
||||
379.3 m per cell is 2.7 samples per cycle, so drawing it draws noise rather than
|
||||
coastline character, and a rung cannot show shape finer than its own cell. The
|
||||
warp is amplitude-capped sub-pixel on the working grid, so the loss is small.
|
||||
Reversal path, if a future pass disagrees: a relief-only floor threaded through
|
||||
derive_at_metres — NOT a lower multiple, which takes the stucco back.
|
||||
|
||||
SCOPE ACTUALLY TOUCHED. Only the step-canvas served path. layer_proxy''s
|
||||
MIN_WL_BANDS_M, its const assert and its cache key are UNCHANGED — the ticket
|
||||
warned that a change there is not local, and none was needed: the fix is a
|
||||
spacing-derived floor at the canvas builder, a pure function of (rung, extent,
|
||||
body_radius), all three already in the step-canvas cache key. Global is exempt
|
||||
(its ~70 km floor would silence the whole warp band, and its orbital derive
|
||||
leaves relief_q flat at 50). District and Quarter floor below every octave in
|
||||
play and derive byte-identically — pinned by
|
||||
`floor_is_inert_at_the_rungs_that_already_resolve_their_band`, and confirmed by
|
||||
the derivation/believability goldens passing untouched.
|
||||
|
||||
LEFT OPEN, not part of this ticket: Quarter''s contour banding (the stipple
|
||||
lattice quantising the hillshade into dotted rings), and MIN_WL_BANDS_M itself,
|
||||
which remains stale for the legacy layer_proxy district-window consumer. Neither
|
||||
blocks the ladder.', 'done', 'medium', NULL, 'server', 'D-255', '2026-08-07 13:26:56.703', '2026-08-18 18:49:07.176', NULL, 'b79d8865e3da7d586bf8c724de2d34b2', 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;
|
||||
|
||||
Reference in New Issue
Block a user