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:
2026-08-18 20:49:24 +02:00
co-authored by Claude Opus 5
parent 9b146f9e1f
commit 646db131a9
2 changed files with 267 additions and 0 deletions
+107
View File
@@ -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;
+160
View File
@@ -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;