diff --git a/.pql/changelog/ticket_history/2026-07.sql b/.pql/changelog/ticket_history/2026-07.sql index d5b7e7a9f..4cb8ca4b1 100644 --- a/.pql/changelog/ticket_history/2026-07.sql +++ b/.pql/changelog/ticket_history/2026-07.sql @@ -1682,3 +1682,5 @@ INSERT INTO ticket_history (ticket_record_id, field, old_value, new_value, chang RE-SCOPED (Jeroen, 2026-07-22): ''we are aiming for not coloring in the cities at the moment — the nature layer (geo and wild growth) first,'' matching D-166''s outside-in order. SPLIT this ticket''s overlay set into two waves. WAVE 1 (this ticket, promoted): the NATURE overlays — gen_l1_rivers/basins/attractors onto the ladder (rivers as per-rung refining features: trunk rivers at Region, tributaries at District, streams at Quarter — the wire/derivation question of serving river skeletons windowed is the real work), plus named natural features (rivers/oceans/ranges labels) if cheap. WAVE 2 (deferred until the nature layer stands, per Jeroen): everything civilizational — city markers + sidebar, settlements/quarters footprints, roads/rail, POL/POP/CRP/gate markers. Do not port wave 2 with wave 1.', NULL, '2026-07-22 16:32:58', '2026-07-22 16:32:58.189', '2026-07-22 16:32:58.189', NULL, '9eb8e20a198920c024087e6153d4806b', 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 ('06FRPCJ4KD6SB9TB8TH9SJH1E0', 'status', 'backlog', 'review', NULL, '2026-07-22 18:59:22', '2026-07-22 18:59:22.418', '2026-07-22 18:59:22.418', NULL, 'ec51e983461658e7857f3c04a1ff73e5', 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 ('06FRPCJ4KD6SB9TB8TH9SJH1E0', 'status', 'review', 'done', NULL, '2026-07-22 19:29:52', '2026-07-22 19:29:52.281', '2026-07-22 19:29:52.281', NULL, 'd56f979255d7655437b286362d412900', 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 ('06FRNAHD35YPZHJWMJCRZK62Z4', 'status', 'backlog', 'in_progress', NULL, '2026-07-22 20:24:43', '2026-07-22 20:24:43.745', '2026-07-22 20:24:43.745', NULL, '43b44fba8bd2305f8d2fbfab666c1f51', 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 ('06FRMPY76TYY76FSBV2Y5P8QHM', 'status', 'backlog', 'in_progress', NULL, '2026-07-22 20:24:43', '2026-07-22 20:24:43.752', '2026-07-22 20:24:43.752', NULL, '50ed7f47477b51cebebc4604d38cc94e', 2) ON CONFLICT(hash) DO NOTHING; diff --git a/.pql/changelog/tickets/2026-07.sql b/.pql/changelog/tickets/2026-07.sql index b4fc54f30..2711e250e 100644 --- a/.pql/changelog/tickets/2026-07.sql +++ b/.pql/changelog/tickets/2026-07.sql @@ -2469,3 +2469,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 ('06FRPEJ6TVFXRBEZPSP40677G4', 'task', '06FBPPMZNNEV052DBYYY3A897C', 'Root-cause the dropped tile-arrival repaint edge (self-heal poll is compensating)', 'PR #193 review (Tyre, finding 3): the cold-start fix ships a bounded self-healing _process redraw (atlas_window_viewer.gd ~887: redraw viewer+overlay every frame while _tile_mode and has_pending_tiles()) — architecturally acceptable (goes quiet the instant tiles complete, spy-tested) but honestly a poll compensating for a signal-driven repaint contract the team could not fully trust under cold-server timing: some queue_redraw edge was observed dropped in live rounds (black mosaic with correct data/geometry/textures) and was never exactly pinned. Root-cause the dropped edge (candidates from the live dossier: tile_ready ordering vs draw scheduling, overlay-vs-viewer redraw routing under deferred frees, RenderingServer timing on texture upload) so the poll can be retired and so other renderers do not copy the poll pattern as gospel. Keep the self-heal until the edge is pinned AND a regression exists.', 'backlog', 'low', NULL, 'client', NULL, '2026-07-22 19:08:00.086', '2026-07-22 19:08:00.086', NULL, 'a7911cd3eedb2d309d5f128e8c108754', 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 ('06FRPF77A790HCWZH78AVZ7T8M', 'task', '06FBPPMZNNEV052DBYYY3A897C', 'Scripted cold-launch integration test tier (fresh server, connection zero, tiles arrive, non-black frame)', 'PR #193 review (Tyre, finding 1): T-1163 (every cold first launch black) was only findable by a human launching the real stack cold — ~3500 unit tests were green with the bug live, and every scripted verification drive used a warm server (second connection), the exact luck that masked the bug. File the missing test tier: a scripted cold-launch integration test that (1) spawns a FRESH release server process (never pre-warmed — build via make build-server-release, SR_SERVER_BIN override), (2) drives the first-ever client connection through the real Atlas descent into a body (SceneTree -s script, atlas_standalone.tscn, nav.push + _on_body_selected — the live-drive harness shape in tooling/, untyped autoload refs per the harness conventions), (3) asserts all tiles arrive within a deadline (tile_set.is_fully_arrived() or per-tile window non-null), and (4) asserts a non-black rendered frame (capture via root.get_texture().get_image(), assert mean luminance above a floor). Compose from existing pieces: the visual_capture/server_process helpers and the run-visual entry. This is the tier that would have caught T-1163 on day one; it also becomes the permanent home for the cold acceptance run /pr-review now performs by hand. Not a gate hook initially — a make target (make test-cold-launch) runnable on demand and in review.', 'backlog', 'medium', NULL, 'client', NULL, '2026-07-22 19:10:52.241', '2026-07-22 19:10:52.241', NULL, '0ad401e6728e37e8f499bc04b32cba9d', 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 ('06FRPCJ4KD6SB9TB8TH9SJH1E0', 'bug', '06FB0TNSRZXCHGS16BFHSSGSV4', 'Cold first launch starves: whole-response Pending never reaches the retry path', 'Jeroen''s make atlas launch showed a black map zooming into any body. Root cause (after four disproven theories, each killed by verification): a stone-cold body answers the first window request with whole-response status Pending (only the whole-body cache-hit branch sets Ready — layer_proxy.rs serve path), and atlas_window_request.gd on_response()''s first check (status != Ready -> return) swallowed it before the retry machinery could run — retries frozen at 0 forever, DERIVING state never resolves. Second connections worked by luck (first connection''s request warms the whole-body cache -> Ready -> healthy path), which also masked the bug in every warm-server verification drive. Affected BOTH tile-mosaic and single-window first descents. Fix (branch ladder-cold-start): status-first branching per the atlas_generation_proxy reference shape (Pending -> retry; NotFound/Error -> immediate give-up, replacing the elapsed-retries ceiling), deterministic exponential backoff + per-tile stagger, wire-accurate regressions through the real fan-out plus single-window mirrors, Dudley''s connection-zero bridge_tcp pin, self-healing tile repaint, ImplantApp re-entry guard + immediate-free panel clears, legend re-fit, visible DERIVING TERRAIN state, and make atlas moving to a RELEASE server via SR_SERVER_BIN. Cold acceptance verified live: first connection, fresh release server — DERIVING at 2s, terrain painting tile-by-tile by 5s, all six tiles converged, legend one-legend-tall.', 'done', 'critical', NULL, 'client', 'D-226', '2026-07-22 18:59:15.227', '2026-07-22 19:29:52.281', NULL, 'a106f9a9ccd78c7ccecc1e98e5e45862', 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 ('06FRNAHD35YPZHJWMJCRZK62Z4', 'story', '06FB0TNSRZXCHGS16BFHSSGSV4', 'Extend deterministic invention octaves into the Atlas window path — coastline crinkle and terrain texture at rung scale', 'Jeroen, 2026-07-22, after first hands-on with the shipped ladder: ''zero detail on lower levels, just a green field, and the green-blue transition is a fade — it should be a more detailed coastline.'' Root cause confirmed by octave audit: the window classification consumes terrain_detail whose octaves span 32768-4096m (OCTAVE_WAVELENGTHS_M, detail_scatter.rs:33) and coast_invention whose warp octaves span 262144-16384m (WARP_OCTAVE_WAVELENGTHS_M, coast_invention.rs:56) — so at Quarter spacing (512m) the sampled field is genuinely smooth (~8 cells per finest terrain wave; ~32 per finest coast wave). The ladder''s TRANSPORT reaches 512m but its CONTENT floor is 4km/16km. The finer bands already exist (VOXEL_OCTAVE_WAVELENGTHS_M 1024-128m ''the rolling hills a walking character navigates by''; MOSAIC 64-8m) but feed only the Phase-5 voxel path — never the window derivation. Work: (a) extend coast_warp octaves below 16km down through quarter-visible wavelengths (bays/headlands/islets appearing as you zoom — THE headline visual ask) with min_wavelength_m cutoff discipline per rung; (b) feed the sub-district relief band into Quarter-rung classification (derive_at_metres already takes the cutoff — decide which bands activate per rung and re-bench; the T-1149 bench harness is the tool); (c) re-tune MIN_WL_BANDS_M to match the extended ladder; (d) determinism goldens updated deliberately (this CHANGES derived output — a golden-regeneration commit with rationale, not silent). Costs measured before merge per the T-1149 discipline. Visual acceptance: a coastal Quarter capture must show structurally more coastline detail than the same coast at District — the differentiation Araminta flagged as never yet demonstrated. Pairs with T-1161 (NEAREST at sparse rungs) — together these answer both of Jeroen''s specific complaints. + +SCOPE CLARIFICATION (Jeroen, 2026-07-22): the current aim is the NATURE layer — geo + wild growth — per D-166''s outside-in order; cities/settlements stay uncolored for now. This ticket''s octave extension therefore covers not just coast + relief but VEGETATION PATCHINESS as spatial content: forests as massifs at region scale resolving to distinct woods (district), copses and clearings (quarter), desert/steppe transitions as shapes — the invention fields (detail_scatter character/envelope) driving per-rung vegetation patterning in the BASE layer rather than uniform per-cell class tint. His words: ''even the nature layer should produce rivers, forests, copses, bushes, deserts, elevation.'' Rivers are T-1156''s nature half (see its re-scope); this ticket owns the continuous-field content (coastline, relief, vegetation/moisture patchiness).', 'in_progress', 'high', NULL, 'server', 'D-226', '2026-07-22 16:30:36.314', '2026-07-22 20:24:43.745', NULL, '2db49e462687fc954e369b94f61f1e83', 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 ('06FRMPY76TYY76FSBV2Y5P8QHM', 'task', '06FB0TNSRZXCHGS16BFHSSGSV4', 'Per-rung composite filter policy — NEAREST at sparse rungs, LINEAR where density earns it', 'PR #192 review (Araminta, follow-up): COMPOSITE_SMOOTH''s GPU bilinear stretch at Region rung reads as a near-featureless soft gradient at 204.8 km/cell (capture 02-region-mid.png) — technically honest LoD (interpolating BETWEEN real derived samples, letter-compliant with ''never magnified interpolation'') but visually indistinguishable from the coarse-composite-stretched experience the mandate was written to kill: the spirit is violated at sparse rungs. Implement a per-rung filter policy: crisp NEAREST at Region/orbital (the COMPOSITE_SMOOTH := false path already exists byte-compatible per the file''s own doc — make it per-rung runtime instead of compile-time), keep LINEAR at District/Quarter where cell density reads as texture rather than smoothing-over-absence. Araminta owns the rung-by-rung call — get her sign-off on which rungs get which filter (and whether the threshold should key on on-screen px-per-cell rather than rung identity). Supersedes the remaining half of the old T-1155 COMPOSITE_SMOOTH-retirement framing — reconcile with that ticket when picking this up.', 'in_progress', 'medium', NULL, 'client', 'D-226', '2026-07-22 15:04:58.422', '2026-07-22 20:24:43.752', NULL, '1fccf6d354c85047254ac68098a44822', 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);