diff --git a/.pql/changelog/ticket_history/2026-07.sql b/.pql/changelog/ticket_history/2026-07.sql index 58a78767e..83317f37a 100644 --- a/.pql/changelog/ticket_history/2026-07.sql +++ b/.pql/changelog/ticket_history/2026-07.sql @@ -1606,3 +1606,4 @@ Scope expansion (Jeroen round-2, 2026-07-21): beyond window-local contrast, eval 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; +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', 'in_progress', 'review', NULL, '2026-07-21 17:52:07', '2026-07-21 17:52:07.607', '2026-07-21 17:52:07.607', NULL, '3c63f148664245c3e75cb1db2ee27052', 2) ON CONFLICT(hash) DO NOTHING; diff --git a/.pql/changelog/tickets/2026-07.sql b/.pql/changelog/tickets/2026-07.sql index 9936f2dfb..e2173c85a 100644 --- a/.pql/changelog/tickets/2026-07.sql +++ b/.pql/changelog/tickets/2026-07.sql @@ -2369,3 +2369,4 @@ Scope expansion (Jeroen round-2, 2026-07-21): beyond window-local contrast, eval 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); 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 ('06FRBK72KQBDCBPEV4CF9M0PA0', 'task', '06FBPPMZNNEV052DBYYY3A897C', 'Hunt leaked scene-tree pollers contaminating gdUnit full-suite runs', 'Evidence from the T-1146 fix round (branch implant-input-gate, commit 4af3dd260): at least one node leaked into the persistent gdUnit scene tree by an earlier suite (a) consumes SimBridge.poll_snapshot() every frame — starving any later live test that polls directly (poll_snapshot is consume-and-clear), and (b) while SimBridge sits in ambient test_mode=true + CONNECTED, applies TestHarness mock snapshots into GameState.current_tick every frame for the REST OF THE RUN (observed current_tick ~15-18 before the input-gate suites even connected; a freshly spawned server then panicked with ''InputQueue: tick ordering violated, last=16 new=3''). The T-1146 live suite now defends itself (signal capture + SimBridge neutralization in before_test, see test_input_gate_live.gd comments), but the leak itself remains: it burns CPU across ~3.4k tests and will bite the next live-pipeline suite that doesn''t know to defend. Hunt: instrument the gdUnit root''s children between suites (a one-off print of get_children() after each suite, or a before_test tripwire asserting no unexpected siblings) to identify which suite leaks the polling node — candidates are suites instantiating main.tscn or harness-driven scenes (test_checklist, test_client_p2/p3, test_free_camera, test_audio_sprint13, test_p0_regressions, test_hub_teleport, test_camera_anchor). Fix at the source (auto_free/queue_free discipline or explicit teardown), then consider removing the now-redundant defensive layers or keeping them as belt-and-braces (document either way).', 'backlog', 'medium', NULL, 'client', NULL, '2026-07-21 17:50:24.925', '2026-07-21 17:50:24.925', NULL, 'f071dd295ce09bdd1070dcd6d8c724e9', 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.', 'review', 'high', NULL, 'client', NULL, '2026-07-21 14:50:12.902', '2026-07-21 17:52:07.607', NULL, '7ad09fbe0ce12206745a1d08785822e8', 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);