From 94990ec910136641e4b2a0f77735b014b80ba905 Mon Sep 17 00:00:00 2001 From: Jeroen Schweitzer Date: Tue, 21 Jul 2026 19:00:51 +0200 Subject: [PATCH] =?UTF-8?q?chore(meta):=20T-1143=20=E2=80=94=20Jeroen's=20?= =?UTF-8?q?LoD=20ruling=20(sub-district=20pixels=20over=20gradients;=20sea?= =?UTF-8?q?mless=20zoom-LoD;=20D-226(d)=20floor=20question=20flagged)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Fable 5 --- .pql/changelog/ticket_history/2026-07.sql | 7 +++++++ .pql/changelog/tickets/2026-07.sql | 5 +++++ 2 files changed, 12 insertions(+) diff --git a/.pql/changelog/ticket_history/2026-07.sql b/.pql/changelog/ticket_history/2026-07.sql index 7b82eb4c8..58a78767e 100644 --- a/.pql/changelog/ticket_history/2026-07.sql +++ b/.pql/changelog/ticket_history/2026-07.sql @@ -1599,3 +1599,10 @@ INSERT INTO ticket_history (ticket_record_id, field, old_value, new_value, chang 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 ('06FRA2DAZ2PDWE2YH76YBSQ2DW', 'status', 'in_progress', 'review', NULL, '2026-07-21 15:03:29', '2026-07-21 15:03:29.644', '2026-07-21 15:03:29.644', NULL, '190dbcb439bb02c1758b4c55f52c04c6', 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 ('06FRA2DAZ2PDWE2YH76YBSQ2DW', 'status', 'review', 'done', NULL, '2026-07-21 15:08:57', '2026-07-21 15:08:57.829', '2026-07-21 15:08:57.829', NULL, '9ed4da25de534fabf827b4f6989a10a9', 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 ('06FRA9Z84VKCZ3ECQDEGDW4MSW', 'status', 'backlog', 'in_progress', NULL, '2026-07-21 16:55:45', '2026-07-21 16:55:45.245', '2026-07-21 16:55:45.245', NULL, 'bc53fb15ce6f74470d7da22c01f52cb3', 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 ('06FR97DPEHANCYX2AC4021BSJC', 'description', 'Follow-on from Jeroen''s first descent (2026-07-21): even with T-1142 fixed, many interior windows are genuinely one morphology zone across 66km, and the composite''s absolute lightness modulation (0.7 + 0.3 x elev_q/100, D-226 T-1124 SS5) spans only ~1-3% lightness over a window whose local elev range is small — the window reads as a dead flat fill rather than terrain. Proposal to evaluate WITH Araminta (SS5 is her encoding): window-local contrast stretch — normalize lightness within the window''s own elev min..max (fixed band, e.g. 0.62..0.92) with a degenerate floor (single-value window stays honestly flat), deterministic per window, mirroring how the aliveness_probe elev panel achieved its 12-level local texture. Alternative/complement: a faint deterministic per-cell variation or contour hinting. Any change to the recorded SS5 encoding gets a one-line amendment note. Assess AFTER T-1142 lands — real clicks will then land on real terrain and the residual flatness can be judged on coastal vs interior windows. + +Scope expansion (Jeroen round-2, 2026-07-21): beyond window-local contrast, evaluate SUB-DISTRICT SAMPLING to de-block the composite at the data level — the D-227 invention fields (invent_primitives: warped envelope, scatter, character) are continuous at metre resolution and quarter granularity (512m, 4x4 per district) sits WITHIN the D-226(d) Atlas ceiling (the cap rules out chunk/tile mapping, not quarters). But classification (derive_district) is per-district today — finer sampling means a new derivation mode (e.g. sample the continuous primitives at quarter spacing and reuse the district''s classification for hue while modulating lightness/moisture per quarter, or classify per quarter at 16x the derive cost — n=32 window = 16384 quarter cells x ~7us = ~115ms background). Needs Dudley/Tyre on data feasibility + cost, Araminta on encoding. INTERIM already shipping in T-1145: linear-filtered texture rendering (presentation smoothing, no data change) — judge the residual need after both T-1145 and real-aim clicking land.', 'Follow-on from Jeroen''s first descent (2026-07-21): even with T-1142 fixed, many interior windows are genuinely one morphology zone across 66km, and the composite''s absolute lightness modulation (0.7 + 0.3 x elev_q/100, D-226 T-1124 SS5) spans only ~1-3% lightness over a window whose local elev range is small — the window reads as a dead flat fill rather than terrain. Proposal to evaluate WITH Araminta (SS5 is her encoding): window-local contrast stretch — normalize lightness within the window''s own elev min..max (fixed band, e.g. 0.62..0.92) with a degenerate floor (single-value window stays honestly flat), deterministic per window, mirroring how the aliveness_probe elev panel achieved its 12-level local texture. Alternative/complement: a faint deterministic per-cell variation or contour hinting. Any change to the recorded SS5 encoding gets a one-line amendment note. Assess AFTER T-1142 lands — real clicks will then land on real terrain and the residual flatness can be judged on coastal vs interior windows. + +Scope expansion (Jeroen round-2, 2026-07-21): beyond window-local contrast, evaluate SUB-DISTRICT SAMPLING to de-block the composite at the data level — the D-227 invention fields (invent_primitives: warped envelope, scatter, character) are continuous at metre resolution and quarter granularity (512m, 4x4 per district) sits WITHIN the D-226(d) Atlas ceiling (the cap rules out chunk/tile mapping, not quarters). But classification (derive_district) is per-district today — finer sampling means a new derivation mode (e.g. sample the continuous primitives at quarter spacing and reuse the district''s classification for hue while modulating lightness/moisture per quarter, or classify per quarter at 16x the derive cost — n=32 window = 16384 quarter cells x ~7us = ~115ms background). Needs Dudley/Tyre on data feasibility + cost, Araminta on encoding. INTERIM already shipping in T-1145: linear-filtered texture rendering (presentation smoothing, no data change) — judge the residual need after both T-1145 and real-aim clicking land. + +RULING (Jeroen, 2026-07-21, round-3 direction): the smooth-gradient rendering is INTERIM ONLY — he expects not to like it as the destination. The destination is SMALLER DETERMINISTICALLY-CALCULATED PIXELS (sub-district sampling, the sketch above), and the larger vision: SCROLL-ZOOM AS CONTINUOUS INFORMATION LoD — zooming in from the regional level progressively refines the sampled resolution seamlessly (no mode transition), ''zoom in to tile size from this level'' in his words. The design pass must therefore produce: (a) the granularity ladder the zoom traverses (district 2048m -> quarter 512m -> ? ), with derivation modes + per-window costs at each rung; (b) wire implications — finer windows multiply cell counts (quarter = 16x district cells/window); weigh against the windowed-family ceiling and the SS4 budget model (likely per-rung window requests reusing the same district_window carrier at different granularity, or a granularity param — design call); (c) THE FLOOR QUESTION back to Jeroen explicitly: ''tile size'' intersects the D-226(d) ceiling (chunk/tile output never Atlas-mapped; quarter is the current legal floor) — the pass presents the options (stop at quarter vs supersede D-226(d) for the window view) rather than assuming; (d) Araminta: encoding continuity across rungs (one colorizer family, hue stability as resolution refines). The COMPOSITE_SMOOTH linear-filter path ships until this lands, then is expected to be retired.', NULL, '2026-07-21 17:00:31', '2026-07-21 17:00:31.999', '2026-07-21 17:00:31.999', NULL, 'c2418a61461bee5600fd26e7e7081325', 2) ON CONFLICT(hash) DO NOTHING; diff --git a/.pql/changelog/tickets/2026-07.sql b/.pql/changelog/tickets/2026-07.sql index 70b053c78..37dc5fac5 100644 --- a/.pql/changelog/tickets/2026-07.sql +++ b/.pql/changelog/tickets/2026-07.sql @@ -2363,3 +2363,8 @@ INSERT INTO tickets (record_id, type, parent_record_id, title, description, stat 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 ('06FRA2DAZ2PDWE2YH76YBSQ2DW', 'task', '06FB0TNSRZXCHGS16BFHSSGSV4', 'Regional window round-2 friction — cover-fit, WASD plus edge-scroll pan, smoothed composite', 'Jeroen''s second hands-on descent (2026-07-21, KALLAST window): three items. (1) COVER-FIT: fit_window_view contains (min viewport dim) leaving large side margins in a wide viewport — change to cover (max viewport dim; the composite fills the screen edge to edge, data extends past the shorter axis into pan-space; the existing pan-edge refetch handles the view crossing window edges — verify no refetch churn at rest, i.e. the at-rest view inside one window must not trigger refetch when the window edge merely touches the viewport edge). (2) INPUT MODEL RULING: remove LMB-drag panning from the regional window entirely — clicks are reserved for map objects (settlements etc. will land in the window later). Pan = WASD + arrow keys (continuous, frame-rate independent, speed in screen px/s scaled by zoom) + EDGE SCROLLING (cursor within ~24px of a viewport edge pans toward it; disabled while the cursor is over UI). Wheel zoom unchanged. WASD/edge/zoom all set _user_adjusted. Esc still exits (keep the existing key path; W/A/S/D must not conflict with any current implant binding — check B/M etc. registry). Pole wall + wrap semantics unchanged and must keep working under the new pan inputs (extend the existing tests to drive WASD instead of drag; drag tests are REPLACED, not kept). (3) SMOOTHED COMPOSITE (interim presentation, pending the T-1143 design): render the window as an n x n Image/ImageTexture (one pixel per district, colors from the existing per-cell pipeline incl. overlays and ice tint) drawn scaled with LINEAR filtering instead of per-cell flat rects — GPU bilinear reads as terrain, not blocks; same treatment the planetary heightmap gets. Keep the per-cell path available if the overlay needs crisp mode later (a const toggle is fine). Record all three as one-line D-226 T-1124 SS5 amendment notes in the same PR (cover-fit supersedes the contain wording; input model supersedes drag-pan; smoothing noted as interim presentation pending T-1143). Live full-chain re-drive after (lead): WASD pan across a window edge, edge-scroll, cover assertion (no side margins at 16:9).', 'review', 'high', NULL, 'client', NULL, '2026-07-21 14:17:11.161', '2026-07-21 15:03:29.644', NULL, '2978c9f04b4e03ed4063c9bce640dcff', 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 ('06FRA2DAZ2PDWE2YH76YBSQ2DW', 'task', '06FB0TNSRZXCHGS16BFHSSGSV4', 'Regional window round-2 friction — cover-fit, WASD plus edge-scroll pan, smoothed composite', 'Jeroen''s second hands-on descent (2026-07-21, KALLAST window): three items. (1) COVER-FIT: fit_window_view contains (min viewport dim) leaving large side margins in a wide viewport — change to cover (max viewport dim; the composite fills the screen edge to edge, data extends past the shorter axis into pan-space; the existing pan-edge refetch handles the view crossing window edges — verify no refetch churn at rest, i.e. the at-rest view inside one window must not trigger refetch when the window edge merely touches the viewport edge). (2) INPUT MODEL RULING: remove LMB-drag panning from the regional window entirely — clicks are reserved for map objects (settlements etc. will land in the window later). Pan = WASD + arrow keys (continuous, frame-rate independent, speed in screen px/s scaled by zoom) + EDGE SCROLLING (cursor within ~24px of a viewport edge pans toward it; disabled while the cursor is over UI). Wheel zoom unchanged. WASD/edge/zoom all set _user_adjusted. Esc still exits (keep the existing key path; W/A/S/D must not conflict with any current implant binding — check B/M etc. registry). Pole wall + wrap semantics unchanged and must keep working under the new pan inputs (extend the existing tests to drive WASD instead of drag; drag tests are REPLACED, not kept). (3) SMOOTHED COMPOSITE (interim presentation, pending the T-1143 design): render the window as an n x n Image/ImageTexture (one pixel per district, colors from the existing per-cell pipeline incl. overlays and ice tint) drawn scaled with LINEAR filtering instead of per-cell flat rects — GPU bilinear reads as terrain, not blocks; same treatment the planetary heightmap gets. Keep the per-cell path available if the overlay needs crisp mode later (a const toggle is fine). Record all three as one-line D-226 T-1124 SS5 amendment notes in the same PR (cover-fit supersedes the contain wording; input model supersedes drag-pan; smoothing noted as interim presentation pending T-1143). Live full-chain re-drive after (lead): WASD pan across a window edge, edge-scroll, cover assertion (no side margins at 16:9).', 'done', 'high', NULL, 'client', NULL, '2026-07-21 14:17:11.161', '2026-07-21 15:08:57.829', NULL, 'f73aaf4a99a9b689490b82604723de89', 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 ('06FRA9Z84VKCZ3ECQDEGDW4MSW', 'bug', '06FBPPMZNNEV052DBYYY3A897C', 'Gameplay movement input leaks to the server while an implant screen is open', 'Found by Stig during T-1145 (2026-07-21), pre-existing: InputMapper._process() polls the D-054 move_north/west/south/east actions unconditionally and the queue flush path (input_mapper.gd -> main.gd flush_queue -> sim_bridge.send_input) never checks HudGroups.gameplay_occluded / is_app_active — so pressing WASD while ANY implant screen is open (Atlas, browser, wiki...) queues real movement commands to the server and walks the character blind behind the fullscreen overlay. Affects every implant screen equally; the companion is immune only because readers cannot send inputs (T-1130 matrix). Fix shape: gate the InputMapper poll (or the queue flush) on not HudGroups.gameplay_occluded — decide whether stance/other gameplay actions need the same gate while there (they do — audit the full polled action set). Regression test: occluded -> WASD poll queues nothing; unoccluded -> queues normally. Note: T-1145''s regional-window pan deliberately reads raw physical keycodes, architecturally independent of this fix.', 'in_progress', 'high', NULL, 'client', NULL, '2026-07-21 14:50:12.902', '2026-07-21 16:55:45.245', NULL, '446193b1e6cabf995a806614fbc77144', 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 ('06FR97DPEHANCYX2AC4021BSJC', 'task', '06FB0TNSRZXCHGS16BFHSSGSV4', 'Regional window legibility on quiet interiors — window-local elevation contrast', 'Follow-on from Jeroen''s first descent (2026-07-21): even with T-1142 fixed, many interior windows are genuinely one morphology zone across 66km, and the composite''s absolute lightness modulation (0.7 + 0.3 x elev_q/100, D-226 T-1124 SS5) spans only ~1-3% lightness over a window whose local elev range is small — the window reads as a dead flat fill rather than terrain. Proposal to evaluate WITH Araminta (SS5 is her encoding): window-local contrast stretch — normalize lightness within the window''s own elev min..max (fixed band, e.g. 0.62..0.92) with a degenerate floor (single-value window stays honestly flat), deterministic per window, mirroring how the aliveness_probe elev panel achieved its 12-level local texture. Alternative/complement: a faint deterministic per-cell variation or contour hinting. Any change to the recorded SS5 encoding gets a one-line amendment note. Assess AFTER T-1142 lands — real clicks will then land on real terrain and the residual flatness can be judged on coastal vs interior windows. + +Scope expansion (Jeroen round-2, 2026-07-21): beyond window-local contrast, evaluate SUB-DISTRICT SAMPLING to de-block the composite at the data level — the D-227 invention fields (invent_primitives: warped envelope, scatter, character) are continuous at metre resolution and quarter granularity (512m, 4x4 per district) sits WITHIN the D-226(d) Atlas ceiling (the cap rules out chunk/tile mapping, not quarters). But classification (derive_district) is per-district today — finer sampling means a new derivation mode (e.g. sample the continuous primitives at quarter spacing and reuse the district''s classification for hue while modulating lightness/moisture per quarter, or classify per quarter at 16x the derive cost — n=32 window = 16384 quarter cells x ~7us = ~115ms background). Needs Dudley/Tyre on data feasibility + cost, Araminta on encoding. INTERIM already shipping in T-1145: linear-filtered texture rendering (presentation smoothing, no data change) — judge the residual need after both T-1145 and real-aim clicking land. + +RULING (Jeroen, 2026-07-21, round-3 direction): the smooth-gradient rendering is INTERIM ONLY — he expects not to like it as the destination. The destination is SMALLER DETERMINISTICALLY-CALCULATED PIXELS (sub-district sampling, the sketch above), and the larger vision: SCROLL-ZOOM AS CONTINUOUS INFORMATION LoD — zooming in from the regional level progressively refines the sampled resolution seamlessly (no mode transition), ''zoom in to tile size from this level'' in his words. The design pass must therefore produce: (a) the granularity ladder the zoom traverses (district 2048m -> quarter 512m -> ? ), with derivation modes + per-window costs at each rung; (b) wire implications — finer windows multiply cell counts (quarter = 16x district cells/window); weigh against the windowed-family ceiling and the SS4 budget model (likely per-rung window requests reusing the same district_window carrier at different granularity, or a granularity param — design call); (c) THE FLOOR QUESTION back to Jeroen explicitly: ''tile size'' intersects the D-226(d) ceiling (chunk/tile output never Atlas-mapped; quarter is the current legal floor) — the pass presents the options (stop at quarter vs supersede D-226(d) for the window view) rather than assuming; (d) Araminta: encoding continuity across rungs (one colorizer family, hue stability as resolution refines). The COMPOSITE_SMOOTH linear-filter path ships until this lands, then is expected to be retired.', 'backlog', 'medium', NULL, 'client', NULL, '2026-07-21 12:19:16.212', '2026-07-21 17:00:31.999', NULL, 'dac8dd77af72f24a78d7ae8e15057504', 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);