diff --git a/.pql/changelog/ticket_history/2026-08.sql b/.pql/changelog/ticket_history/2026-08.sql index 4e21380e7..0cb938ef5 100644 --- a/.pql/changelog/ticket_history/2026-08.sql +++ b/.pql/changelog/ticket_history/2026-08.sql @@ -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; diff --git a/.pql/changelog/tickets/2026-08.sql b/.pql/changelog/tickets/2026-08.sql index 203635d03..ee4fb882b 100644 --- a/.pql/changelog/tickets/2026-08.sql +++ b/.pql/changelog/tickets/2026-08.sql @@ -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;