From 17cad2bbf9e7e4f8cf8cf2558f519ab56f127278 Mon Sep 17 00:00:00 2001 From: Jeroen Schweitzer Date: Thu, 16 Jul 2026 19:31:40 +0200 Subject: [PATCH] =?UTF-8?q?chore(meta):=20activate=20T-1120=20=E2=80=94=20?= =?UTF-8?q?Atlas=20screenshot=20capture=20matrix=20+=20goldens=20(stig)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .pql/changelog/ticket_history/2026-07.sql | 2 ++ .pql/changelog/tickets/2026-07.sql | 2 ++ 2 files changed, 4 insertions(+) diff --git a/.pql/changelog/ticket_history/2026-07.sql b/.pql/changelog/ticket_history/2026-07.sql index bde8b38f0..a5a7f24d5 100644 --- a/.pql/changelog/ticket_history/2026-07.sql +++ b/.pql/changelog/ticket_history/2026-07.sql @@ -1407,3 +1407,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 ('06FNTXF0JB8E6PDQRASQ18E9ER', 'status', 'in_progress', 'review', NULL, '2026-07-16 17:08:34', '2026-07-16 17:08:34.005', '2026-07-16 17:08:34.005', NULL, 'bc87116dbb3c7aa92437d29d457a2b51', 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 ('06FNTXEM9NM5M5SX9WQAAA40SC', 'status', 'review', 'done', NULL, '2026-07-16 17:24:54', '2026-07-16 17:24:54.844', '2026-07-16 17:24:54.844', NULL, '8a99c8b7ea756572523471e9dc89ccf2', 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 ('06FNTXF0JB8E6PDQRASQ18E9ER', 'status', 'review', 'done', NULL, '2026-07-16 17:24:54', '2026-07-16 17:24:54.846', '2026-07-16 17:24:54.846', NULL, '71b133f7f788c56ae887746d097290e9', 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', 'backlog', 'in_progress', NULL, '2026-07-16 17:30:59', '2026-07-16 17:30:59.851', '2026-07-16 17:30:59.851', NULL, '724b47769f20cc8e6035e910bdd088fb', 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', '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; diff --git a/.pql/changelog/tickets/2026-07.sql b/.pql/changelog/tickets/2026-07.sql index 863a4fc55..c68747478 100644 --- a/.pql/changelog/tickets/2026-07.sql +++ b/.pql/changelog/tickets/2026-07.sql @@ -1942,3 +1942,5 @@ Key implementation facts (Si-verified against post-PR#178 main): 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 ('06FPQXFFHXEEDQEM7PGXAH3534', 'task', '06FB0TNSRZXCHGS16BFHSSGSV4', 'Atlas climate overlay — render region_grid (temp/season/weather/moisture) in the viewer', 'Follow-up to T-1113 (merged PR #179): the server now serves RegionGridLayer (dense row-major; season/weather repr(u8) discriminants, mean_temp deci-degC i16 with i16::MIN airless sentinel, moisture_q u8) through AtlasLayerResponse.region_grid, and protocol.gd passes it through. Build the client overlay per the D-226 incremental-overlay pattern: OVERLAY_DEFS gen_* id (atlas_viewer.gd), _draw_gen_* renderer (atlas_marker_overlay.gd — a region-grid fill analogous to _draw_gen_district but at region granularity), GENERATION_LEGEND entry (atlas_legend_panel.gd). Pick ONE visual channel (mean temp ramp is the obvious first; season/weather as tooltip or variant overlays). Also add a populated region_grid wire fixture (all three committed fixtures carry nil — noted in PR #179).', 'backlog', 'medium', NULL, 'client', 'D-226', '2026-07-16 17:25:07.599', '2026-07-16 17:25:07.599', NULL, 'ade35c5892731c5c656f4a09c7d625ac', 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 ('06FPQXHDSMSVD3VADV38NG9STW', 'task', '06FB0TNSRZXCHGS16BFHSSGSV4', 'Wire QuarterFootprintLayer per the D-226 T-1112 amendment (six touch points)', 'Implements the design recorded in the D-226 amendment (2026-07-16, T-1112, merged PR #179). Six touch points, each named in the amendment SS4: (1) ZoningType gains PartialOrd/Ord derives mirroring DistrictType''s T-994 precedent (enables the dominant_zoning declaration-order tie-break); (2) AtlasLayerResponse.quarter_footprints field + build_quarter_footprint_layer() mirroring build_district_grid, keyed off non-empty state.quarters, aggregates keyed by city_id (join via the same deterministic QuarterId derivation the dispatch uses); (3) protocol.gd passthrough; (4) OVERLAY_DEFS gen_* id (atlas_viewer.gd); (5) _draw_gen_* scaled-glyph renderer anchored on the L3 settlement dot — shape=dominant district type, color=density ramp on the settlement-gold family, zoom-gated at SETTLEMENT_LABEL_MIN_ZOOM (atlas_marker_overlay.gd); (6) GENERATION_LEGEND entry (atlas_legend_panel.gd). Five aggregate fields: density_avg_pct u8, dominant_district_type, dominant_zoning, landmark_count u8, corridor_count u8; landmark/corridor tooltip-only per the D-226(d) ceiling.', 'backlog', 'medium', NULL, 'server', 'D-226', '2026-07-16 17:25:23.533', '2026-07-16 17:25:23.533', NULL, 'b6b8cd20b3fe7d1229c917674d46b0cc', 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.', 'backlog', 'medium', NULL, 'client', NULL, '2026-07-16 17:25:38.537', '2026-07-16 17:25:38.537', NULL, '1cfe732a65ed0be3d7f4724c2ec2389c', 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.', 'in_progress', 'medium', NULL, 'client', NULL, '2026-07-16 17:25:38.537', '2026-07-16 17:30:59.850', NULL, '928251ffd5e5a560ae63e5dc0eb0f14c', 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.', 'in_progress', 'medium', 'stig', 'client', NULL, '2026-07-16 17:25:38.537', '2026-07-16 17:31:07.362', NULL, '49c742f3db16af2adc379a3ff145acdc', 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);