diff --git a/.pql/changelog/ticket_history/2026-07.sql b/.pql/changelog/ticket_history/2026-07.sql index 479b47dbd..af1d01d2b 100644 --- a/.pql/changelog/ticket_history/2026-07.sql +++ b/.pql/changelog/ticket_history/2026-07.sql @@ -1736,3 +1736,5 @@ T-1156 review forward-note (Tyre, PR #195 Q1): when this ticket redesigns the bi T-1172 retirement dependency (Tyre''s clip ruling): when this ticket''s course invention terminates courses at the invented coast with continuous geometry, RETIRE the T-1172 draw-time water clip in the same change (marker comment at the clip site in atlas_window_nature_overlay.gd) — suppressed offshore mouths return with real coast-terminus geometry here. Also: the clip''s strict-drop behavior at Region 205km cells (accepted amputation of final coastal dots) is superseded by real course termini. Mouth semantics follow-up (Jeroen''s capture question, 2026-07-23): two mouth-placement oddities to resolve when courses/termini become real geometry here — (1) inland-reading mouths: the raw-coast mouth cell can sit landward of the drawn coastline (the mirror of T-1172''s offshore case; not clipped since it''s on drawn land) — mouths should move to the course''s actual invented-coast terminus; (2) pole-edge drains: drainage.rs counts rivers draining off the grid''s top/bottom edge as ''mouths'', rendering double-rings in polar ice with no sea adjacent — revisit whether these render as mouths at all (probably not; they are grid artifacts, not river-meets-sea events).', NULL, '2026-07-23 10:14:21', '2026-07-23 10:14:21.616', '2026-07-23 10:14:21.616', NULL, 'c7763d4d559c04562995b482fbc99e86', 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 ('06FRV2GT1FQVATWX641KY9K66C', 'status', 'backlog', 'in_progress', NULL, '2026-07-23 10:16:37', '2026-07-23 10:16:37.345', '2026-07-23 10:16:37.345', NULL, '00600e9065760bae47f0e410dfaa155f', 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 ('06FRV224PD3NMWKR1AAC0J0D58', 'status', 'backlog', 'in_progress', NULL, '2026-07-23 10:16:37', '2026-07-23 10:16:37.347', '2026-07-23 10:16:37.347', NULL, '6459dedd47ca4ca7384c9aaf0e934ea1', 2) ON CONFLICT(hash) DO NOTHING; diff --git a/.pql/changelog/tickets/2026-07.sql b/.pql/changelog/tickets/2026-07.sql index 981aed3fd..6d81159c7 100644 --- a/.pql/changelog/tickets/2026-07.sql +++ b/.pql/changelog/tickets/2026-07.sql @@ -2545,3 +2545,11 @@ T-1156 review forward-note (Tyre, PR #195 Q1): when this ticket redesigns the bi T-1172 retirement dependency (Tyre''s clip ruling): when this ticket''s course invention terminates courses at the invented coast with continuous geometry, RETIRE the T-1172 draw-time water clip in the same change (marker comment at the clip site in atlas_window_nature_overlay.gd) — suppressed offshore mouths return with real coast-terminus geometry here. Also: the clip''s strict-drop behavior at Region 205km cells (accepted amputation of final coastal dots) is superseded by real course termini. Mouth semantics follow-up (Jeroen''s capture question, 2026-07-23): two mouth-placement oddities to resolve when courses/termini become real geometry here — (1) inland-reading mouths: the raw-coast mouth cell can sit landward of the drawn coastline (the mirror of T-1172''s offshore case; not clipped since it''s on drawn land) — mouths should move to the course''s actual invented-coast terminus; (2) pole-edge drains: drainage.rs counts rivers draining off the grid''s top/bottom edge as ''mouths'', rendering double-rings in polar ice with no sea adjacent — revisit whether these render as mouths at all (probably not; they are grid artifacts, not river-meets-sea events).', 'backlog', 'medium', NULL, 'server', 'D-227', '2026-07-23 05:54:25.931', '2026-07-23 10:14:21.616', NULL, '558a64a097fc55802e86813ae6a3ea53', 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 ('06FRV2GT1FQVATWX641KY9K66C', 'story', '06FB0TNSRZXCHGS16BFHSSGSV4', 'Invent river courses below heightmap resolution — deterministic warped polylines between D8 cells', 'Named experience gap from T-1156 wave 1 (Si audit + lead, 2026-07-23): the D8 river skeleton lives at heightmap working-grid resolution (512x256 — ~76.6 km per river cell on Lendel). Wave 1''s per-rung class filtering makes planetary/Region river courses real, but at District (2 km cells, ~65 km window) and Quarter the geometry is SPARSER THAN THE WINDOW — a window typically contains zero or one river cell, so ''tributaries at District, streams at Quarter'' cannot materialize as visible courses from the stored skeleton alone. The fix is the linear-feature analog of T-1162''s coast crinkle: deterministically INVENT river course geometry between/below D8 cells — domain-warped polyline interpolation between adjacent river cells (seeded per body+cell pair, D-227 discipline, elevation-aware so courses prefer invented-terrain valleys where feasible), refining with rung the same way the coast warp refines the coastline. Also the natural home for reconciling rivers with T-1162''s invented relief (a wave-1 known gap: drawn rivers may cross invented hills — acceptable at 76 km dot spacing, glaring once courses are continuous). Depends on wave 1''s carrier (river_class on RiverNetwork) landing first. + +T-1156 review forward-note (Tyre, PR #195 Q1): when this ticket redesigns the binning corner, consider PER-BASIN anchoring as an explicit option — every watershed gets its own trunk regardless of the body''s dominant river (the right eventual model once basins are player-inspectable), at the cost of a second normalization pass and a cross-basin legibility decision at Region scale (several equal-weight ''trunks'' of wildly different magnitude undersell the dominant drainage). The wave-1 global-per-body anchor is correct for ''show the main river system at a glance''. Single revisit points: classify_river_cell (server) and RIVER_CLASS_VISIBLE_BY_RUNG (client). + +T-1172 retirement dependency (Tyre''s clip ruling): when this ticket''s course invention terminates courses at the invented coast with continuous geometry, RETIRE the T-1172 draw-time water clip in the same change (marker comment at the clip site in atlas_window_nature_overlay.gd) — suppressed offshore mouths return with real coast-terminus geometry here. Also: the clip''s strict-drop behavior at Region 205km cells (accepted amputation of final coastal dots) is superseded by real course termini. + +Mouth semantics follow-up (Jeroen''s capture question, 2026-07-23): two mouth-placement oddities to resolve when courses/termini become real geometry here — (1) inland-reading mouths: the raw-coast mouth cell can sit landward of the drawn coastline (the mirror of T-1172''s offshore case; not clipped since it''s on drawn land) — mouths should move to the course''s actual invented-coast terminus; (2) pole-edge drains: drainage.rs counts rivers draining off the grid''s top/bottom edge as ''mouths'', rendering double-rings in polar ice with no sea adjacent — revisit whether these render as mouths at all (probably not; they are grid artifacts, not river-meets-sea events).', 'in_progress', 'medium', NULL, 'server', 'D-227', '2026-07-23 05:54:25.931', '2026-07-23 10:16:37.340', NULL, '59af2c27ebbc4dc29c857ebe7486fb70', 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 ('06FRV224PD3NMWKR1AAC0J0D58', 'story', '06FB0TNSRZXCHGS16BFHSSGSV4', 'Thread drainage skeleton into derive_at_metres as per-cell riparian signal (near_perennial_water)', 'derive_at_metres (district_profile.rs:1461-1469) hardcodes near_perennial_water = false into derive_vegetation, so district/quarter windows cannot render riparian bands (RiparianScrub/RiparianThicket) or the hyper-arid micro-oasis (:421) even where a trunk river crosses the cell. After T-1156 puts rivers on the ladder, this surfaces as a visible mismatch: a drawn river over vegetation painted barren. Fix: thread the Layer-1 river-cell set into the window derive and compute per-cell near_perennial_water as a ''within riparian-band distance of a river cell'' test. Rivers sample the drainage GEOGRAPHY; vegetation''s moisture influence rides T-1162''s perturbed moisture_q — never a re-derivation of base moisture (forward contract from T-1156 wave-1 ruling 3, Tyre 2026-07-23). Re-pin the believability/derivation golden harnesses. Gated: not wave 1.', 'in_progress', 'medium', NULL, 'server', 'D-226', '2026-07-23 05:52:25.779', '2026-07-23 10:16:37.347', NULL, 'c10756f4af995db8039bf94bf5f27423', 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);