diff --git a/.pql/changelog/ticket_history/2026-07.sql b/.pql/changelog/ticket_history/2026-07.sql index be9add8df..46ca376e1 100644 --- a/.pql/changelog/ticket_history/2026-07.sql +++ b/.pql/changelog/ticket_history/2026-07.sql @@ -1411,3 +1411,5 @@ 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 ('06FPQXK8D6YVWVC2TB2ZR25K6G', 'assigned_to', NULL, 'stig', NULL, '2026-07-16 17:31:07', '2026-07-16 17:31:07.367', '2026-07-16 17:31:07.367', NULL, '35ca5550701796deddc807d8768da485', 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 ('06FPQXK8D6YVWVC2TB2ZR25K6G', 'status', 'in_progress', 'review', NULL, '2026-07-16 18:36:30', '2026-07-16 18:36:30.146', '2026-07-16 18:36:30.146', NULL, '49e8cbce555de010d3c9dc571f34aacf', 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 ('06FPQXK8D6YVWVC2TB2ZR25K6G', 'status', 'review', 'done', NULL, '2026-07-16 19:43:56', '2026-07-16 19:43:56.313', '2026-07-16 19:43:56.313', NULL, 'fe698fe8c23007f9007197b370476c38', 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 ('06FPRZX1PJ55V7462N56ME2QZ0', 'status', 'backlog', 'in_progress', NULL, '2026-07-16 19:55:54', '2026-07-16 19:55:54.663', '2026-07-16 19:55:54.663', NULL, '326347510db12702d6ec7bea396a3df5', 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 ('06FPRZX1PJ55V7462N56ME2QZ0', 'assigned_to', NULL, 'dudley', NULL, '2026-07-16 19:56:02', '2026-07-16 19:56:02.144', '2026-07-16 19:56:02.144', NULL, 'e1f4abe4a51a17463c14dbe68e85f24f', 2) ON CONFLICT(hash) DO NOTHING; diff --git a/.pql/changelog/tickets/2026-07.sql b/.pql/changelog/tickets/2026-07.sql index 5fc1fbed2..fa35f6532 100644 --- a/.pql/changelog/tickets/2026-07.sql +++ b/.pql/changelog/tickets/2026-07.sql @@ -1948,3 +1948,7 @@ 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 ('06FPQXK8D6YVWVC2TB2ZR25K6G', 'task', '06FBPPMZNNEV052DBYYY3A897C', 'Atlas screenshot capture matrix + golden smoke (visual_capture extension)', 'Jeroen''s ask (2026-07-16): in-game Atlas screenshots at several zoom levels across a varied body sample, treated as goldens for smoke tests. Recon (this session) mapped the path — reuse, don''t rebuild: extend client/tests/visual_capture.gd with an atlas-matrix mode (one Godot boot looping body x zoom x overlay-set), scenarios modeled on visual_scenarios.gd atlas_gen_open (currently GJ71c-hardcoded — parameterize); server lifecycle per tests/run-visual (--test-mode --port 0, parse LISTENING, SR_LIVE=1 — Atlas data is 100% systems.db regardless of world); waits on SimBridge.atlas_layers_received/city_names_received (status Ready) not fixed delays; capture via the existing _capture() (frame_post_draw -> save_png); xvfb-run + --rendering-driver opengl3, NEVER --headless (blank PNGs under dummy driver). Promote a curated subset into client/tests/golden/visual/ + tests/visual.json (existing tooling/visual-diff tolerance machinery, make visual-update). Known warts: no public zoom/pan setter on AtlasViewer (reach into _view_zoom/_view_offset + _apply_transform per existing convention, or add a small set_view() API); Sol uses the legacy markers path (exclude); async races need per-shot wait/timeout. Body sample suggestion: GJ380c, GJ144e, GJ338Bd, GJ820Bc, GJ251c (honest T-1116 water/no-roads exhibit), + a frozen body and a moon.', 'review', 'medium', 'stig', 'client', NULL, '2026-07-16 17:25:38.537', '2026-07-16 18:36:30.141', NULL, '4785da2d375c52d86af946406a1031f4', 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 ('06FPRTBJWG6Z7B8H5S115E2K74', 'task', '06FBPPMZNNEV052DBYYY3A897C', 'Shared live-server GdUnit helper — dedupe spawn/handshake/send-receive across roundtrip suites', 'PR #180 root-cause fallout (2026-07-16): test_input_roundtrip.gd and test_sprint2_proof.gd copy-paste the entire live-server harness (spawn + port retry + handshake + _send_and_receive) — which is why the T-1068 stance-cooldown pacing fix (COOLDOWN_TICKS post-ack spacing) existed in sprint2_proof but never reached input_roundtrip, producing today''s gate flake (MoveEast silently discarded by the D-053 Walk cooldown under load; root-caused with server trace logs). Extract a shared GdUnit helper (e.g. client/tests/helpers/live_server_harness.gd) carrying: port-retry spawn (server binds AFTER ~250ms init — death-during-connect retries on a fresh port), handshake+startup exchange, drain-then-send-then-wait with wall-clock deadline, and D-053 cooldown pacing. Port both suites onto it; any future live-roundtrip suite starts there. All three hardening rounds from today (port collision, wall-clock deadline, cooldown pacing) must survive the extraction with their comments intact.', 'backlog', 'medium', NULL, 'client', NULL, '2026-07-16 19:31:17.860', '2026-07-16 19:31:17.860', NULL, '441fe4bbf5e7ce46cce39ded40c01116', 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 ('06FPQXK8D6YVWVC2TB2ZR25K6G', 'task', '06FBPPMZNNEV052DBYYY3A897C', 'Atlas screenshot capture matrix + golden smoke (visual_capture extension)', 'Jeroen''s ask (2026-07-16): in-game Atlas screenshots at several zoom levels across a varied body sample, treated as goldens for smoke tests. Recon (this session) mapped the path — reuse, don''t rebuild: extend client/tests/visual_capture.gd with an atlas-matrix mode (one Godot boot looping body x zoom x overlay-set), scenarios modeled on visual_scenarios.gd atlas_gen_open (currently GJ71c-hardcoded — parameterize); server lifecycle per tests/run-visual (--test-mode --port 0, parse LISTENING, SR_LIVE=1 — Atlas data is 100% systems.db regardless of world); waits on SimBridge.atlas_layers_received/city_names_received (status Ready) not fixed delays; capture via the existing _capture() (frame_post_draw -> save_png); xvfb-run + --rendering-driver opengl3, NEVER --headless (blank PNGs under dummy driver). Promote a curated subset into client/tests/golden/visual/ + tests/visual.json (existing tooling/visual-diff tolerance machinery, make visual-update). Known warts: no public zoom/pan setter on AtlasViewer (reach into _view_zoom/_view_offset + _apply_transform per existing convention, or add a small set_view() API); Sol uses the legacy markers path (exclude); async races need per-shot wait/timeout. Body sample suggestion: GJ380c, GJ144e, GJ338Bd, GJ820Bc, GJ251c (honest T-1116 water/no-roads exhibit), + a frozen body and a moon.', 'done', 'medium', 'stig', 'client', NULL, '2026-07-16 17:25:38.537', '2026-07-16 19:43:56.313', NULL, 'b73fb765676495e74735564b36e0d8db', 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 ('06FPRZX1PJ55V7462N56ME2QZ0', 'task', '06FB0TNSRZXCHGS16BFHSSGSV4', 'District-window map renderer — zoom-ladder PNGs from derive_district (aliveness_probe --render)', 'Jeroen (2026-07-16, reviewing the T-1120 screenshots): all Atlas captures are planetary-level; the orbit-to-jet-plane bridge (district-resolution deterministic biome maps) has never been SEEN. Recon verified the fast path: extend server/src/bin/aliveness_probe.rs with --render --window : after the existing cascade_for_body + anchor-district computation (lines 34-113), loop an NxN district window around the anchor calling derive_district(seed, body_id, params, ta, (dx,dy), climate) PER CELL (district_profile.rs:1256 — the pure on-demand 2km carrier; do NOT index bws.districts, that is the coarse gcpr=8 eager grid) and write PNGs via the png crate (pattern at heightmap.rs:184-193): morphology zones (transliterate the 17-entry MORPHOLOGY_COLORS palette from atlas_marker_overlay.gd:65-83 into a Rust [[u8;3];17]), plus elev_q / temperature_c / moisture_q / vegetation_class panels. Deliverable: zoom-ladder image sets (e.g. 256x256 and 64x64 district windows) for 2-3 bodies anchored on settlements, demonstrating the deterministic orbital->district bridge. Quarter/block rendering is OUT of scope (no windowable pure function at that tier).', 'backlog', 'high', NULL, 'server', 'D-243', '2026-07-16 19:55:31.636', '2026-07-16 19:55:31.636', NULL, 'd83709a31f2ff298e8dd6e77f3b71b42', 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 ('06FPRZZ0P42NHC1QR5S3737EV4', 'task', '06FB0TNSRZXCHGS16BFHSSGSV4', 'Design: Atlas regional map view — windowed district-resolution biome/climate screen (D-226)', 'Jeroen (2026-07-16): the Atlas needs the jet-plane altitude — a windowed district-resolution (2km-cell) map screen bridging the planetary canvas and the (never-mapped, D-226(d)) chunk/voxel world. Today the viewer is one whole-body texture with client-side pan/zoom; AtlasLayerRequest is {body_id, up_to} whole-body only — no rect/window/LOD machinery exists anywhere (recon-verified). Design pass (Tyre data shape + Araminta encoding, the T-1112 pattern): (1) windowed request protocol — rect/center+radius params on a new or extended layer request, served by calling derive_district per cell (district_profile.rs:1256, pure/on-demand — NOT the coarse eager grid); (2) which fields ship at district resolution (morphology, elev_q, temperature, moisture, vegetation — wire-integer discipline per D-010); (3) the screen: entry from a planetary-map click/settlement, second canvas vs zoom-threshold LOD swap, overlay/legend reuse; (4) budget: window size caps, caching, re-request-on-pan. Record as a D-226 amendment. District resolution is ABOVE the D-226(d) quarter-skeleton floor — in remit. Wiring is a follow-up ticket once the design is recorded. Natural batch-mates: T-1118 (climate overlay) + T-1119 (quarter glyphs). T-1123 (server-side window renderer) is the data-side proof and shares the per-cell derive pattern.', 'backlog', 'high', NULL, 'client', 'D-226', '2026-07-16 19:55:47.761', '2026-07-16 19:55:47.761', NULL, '5905b9c55f52b02ef75c079bae812df1', 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 ('06FPRZX1PJ55V7462N56ME2QZ0', 'task', '06FB0TNSRZXCHGS16BFHSSGSV4', 'District-window map renderer — zoom-ladder PNGs from derive_district (aliveness_probe --render)', 'Jeroen (2026-07-16, reviewing the T-1120 screenshots): all Atlas captures are planetary-level; the orbit-to-jet-plane bridge (district-resolution deterministic biome maps) has never been SEEN. Recon verified the fast path: extend server/src/bin/aliveness_probe.rs with --render --window : after the existing cascade_for_body + anchor-district computation (lines 34-113), loop an NxN district window around the anchor calling derive_district(seed, body_id, params, ta, (dx,dy), climate) PER CELL (district_profile.rs:1256 — the pure on-demand 2km carrier; do NOT index bws.districts, that is the coarse gcpr=8 eager grid) and write PNGs via the png crate (pattern at heightmap.rs:184-193): morphology zones (transliterate the 17-entry MORPHOLOGY_COLORS palette from atlas_marker_overlay.gd:65-83 into a Rust [[u8;3];17]), plus elev_q / temperature_c / moisture_q / vegetation_class panels. Deliverable: zoom-ladder image sets (e.g. 256x256 and 64x64 district windows) for 2-3 bodies anchored on settlements, demonstrating the deterministic orbital->district bridge. Quarter/block rendering is OUT of scope (no windowable pure function at that tier).', 'in_progress', 'high', NULL, 'server', 'D-243', '2026-07-16 19:55:31.636', '2026-07-16 19:55:54.662', NULL, '3713c77be183aef75c2e86e8b2e20997', 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 ('06FPRZX1PJ55V7462N56ME2QZ0', 'task', '06FB0TNSRZXCHGS16BFHSSGSV4', 'District-window map renderer — zoom-ladder PNGs from derive_district (aliveness_probe --render)', 'Jeroen (2026-07-16, reviewing the T-1120 screenshots): all Atlas captures are planetary-level; the orbit-to-jet-plane bridge (district-resolution deterministic biome maps) has never been SEEN. Recon verified the fast path: extend server/src/bin/aliveness_probe.rs with --render --window : after the existing cascade_for_body + anchor-district computation (lines 34-113), loop an NxN district window around the anchor calling derive_district(seed, body_id, params, ta, (dx,dy), climate) PER CELL (district_profile.rs:1256 — the pure on-demand 2km carrier; do NOT index bws.districts, that is the coarse gcpr=8 eager grid) and write PNGs via the png crate (pattern at heightmap.rs:184-193): morphology zones (transliterate the 17-entry MORPHOLOGY_COLORS palette from atlas_marker_overlay.gd:65-83 into a Rust [[u8;3];17]), plus elev_q / temperature_c / moisture_q / vegetation_class panels. Deliverable: zoom-ladder image sets (e.g. 256x256 and 64x64 district windows) for 2-3 bodies anchored on settlements, demonstrating the deterministic orbital->district bridge. Quarter/block rendering is OUT of scope (no windowable pure function at that tier).', 'in_progress', 'high', 'dudley', 'server', 'D-243', '2026-07-16 19:55:31.636', '2026-07-16 19:56:02.144', NULL, '962a3df16d9dc62be308e3d1065de065', 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);