diff --git a/.pql/changelog/ticket_history/2026-07.sql b/.pql/changelog/ticket_history/2026-07.sql index be8cfeac8..0c72505a8 100644 --- a/.pql/changelog/ticket_history/2026-07.sql +++ b/.pql/changelog/ticket_history/2026-07.sql @@ -1691,3 +1691,5 @@ SCOPE CLARIFICATION (Jeroen, 2026-07-22): the current aim is the NATURE layer 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). REFINEMENT RESOLUTIONS (lead, 2026-07-22, from Si audit): (1) Bench baseline: none recorded anywhere — implementer runs server/tests/zoom_ladder_bench.rs (cargo test --release --test zoom_ladder_bench -- --ignored --nocapture) BEFORE any code change to establish the pre-change baseline, and again after; both sets of numbers go in the PR. (2) ''Goldens'' corrected: no golden file pins derive_at_metres/invent_primitives today (derivation_harness.json is voxel-chain; cascade_layer1.json is heightmap-river). Explicit scope: ADD a golden fixture for the window-derivation path (mirroring derivation_harness.rs''s pattern) so this and every future octave change gets a deliberate-regen commit discipline. (3) Vegetation patchiness confirmed NET-NEW, in scope (not split): today derive_vegetation (district_profile.rs:398-490) is pure per-cell classification with no positional field. Build the vegetation invention mechanism mirroring coast_invention.rs''s two-tier envelope+character model (Jeroen''s nature-first ruling is the direction; the tiered invention-field pattern is the established shape to imitate). Non-blocking notes: VOXEL octaves feeding Quarter classification does NOT conflict with D-226(d) — that ruling caps request granularity, not contributing wavelengths (coast warp already crosses scales the other way); MIN_WL_BANDS_M (layer_proxy.rs:415-421) needs new entries once the ladder extends, quantize_min_wl_m generalizes as-is.', NULL, '2026-07-22 20:27:10', '2026-07-22 20:27:10.426', '2026-07-22 20:27:10.426', NULL, '9c68eb51f80be06b8ba7236a1fed554c', 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', 'in_progress', 'review', NULL, '2026-07-22 21:12:56', '2026-07-22 21:12:56.083', '2026-07-22 21:12:56.083', NULL, 'de22bdfa1dc98f8ff39accf77465af08', 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', 'in_progress', 'review', NULL, '2026-07-22 21:12:56', '2026-07-22 21:12:56.086', '2026-07-22 21:12:56.086', NULL, '3f36b034fae900e91aae07591e26f2fd', 2) ON CONFLICT(hash) DO NOTHING; diff --git a/.pql/changelog/ticket_idmap/2026-07.sql b/.pql/changelog/ticket_idmap/2026-07.sql index 9c6d98f46..c5e1fa4a1 100644 --- a/.pql/changelog/ticket_idmap/2026-07.sql +++ b/.pql/changelog/ticket_idmap/2026-07.sql @@ -80,3 +80,4 @@ INSERT INTO ticket_idmap (record_id, ticket_id, created_at, updated_at, deleted_ INSERT INTO ticket_idmap (record_id, ticket_id, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FRPEGNSG7VVR602MTT4VDCEW', 'T-1164', '2026-07-22 19:07:47.535', '2026-07-22 19:07:47.535', NULL, 'a6f29e587f56a6cbc822281a6ee56d92', 2) ON CONFLICT(record_id) DO UPDATE SET ticket_id=excluded.ticket_id, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > ticket_idmap.updated_at OR (excluded.updated_at = ticket_idmap.updated_at AND excluded.hash > ticket_idmap.hash); INSERT INTO ticket_idmap (record_id, ticket_id, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FRPEJ6TVFXRBEZPSP40677G4', 'T-1165', '2026-07-22 19:08:00.091', '2026-07-22 19:08:00.091', NULL, '864a7d91fd2fbc7ca277a1ae9fc8c833', 2) ON CONFLICT(record_id) DO UPDATE SET ticket_id=excluded.ticket_id, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > ticket_idmap.updated_at OR (excluded.updated_at = ticket_idmap.updated_at AND excluded.hash > ticket_idmap.hash); INSERT INTO ticket_idmap (record_id, ticket_id, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FRPF77A790HCWZH78AVZ7T8M', 'T-1166', '2026-07-22 19:10:52.247', '2026-07-22 19:10:52.247', NULL, '78091c0dc323d292ca54c95963de61e6', 2) ON CONFLICT(record_id) DO UPDATE SET ticket_id=excluded.ticket_id, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > ticket_idmap.updated_at OR (excluded.updated_at = ticket_idmap.updated_at AND excluded.hash > ticket_idmap.hash); +INSERT INTO ticket_idmap (record_id, ticket_id, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FRQ9J882SWNAWV87YV393V78', 'T-1167', '2026-07-22 21:05:58.342', '2026-07-22 21:05:58.342', NULL, 'b5a4200093aa4a64c1d3bb252450451d', 2) ON CONFLICT(record_id) DO UPDATE SET ticket_id=excluded.ticket_id, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > ticket_idmap.updated_at OR (excluded.updated_at = ticket_idmap.updated_at AND excluded.hash > ticket_idmap.hash); diff --git a/.pql/changelog/tickets/2026-07.sql b/.pql/changelog/tickets/2026-07.sql index 8064dc420..eda06eedb 100644 --- a/.pql/changelog/tickets/2026-07.sql +++ b/.pql/changelog/tickets/2026-07.sql @@ -2478,3 +2478,10 @@ INSERT INTO tickets (record_id, type, parent_record_id, title, description, stat 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). REFINEMENT RESOLUTIONS (lead, 2026-07-22, from Si audit): (1) Bench baseline: none recorded anywhere — implementer runs server/tests/zoom_ladder_bench.rs (cargo test --release --test zoom_ladder_bench -- --ignored --nocapture) BEFORE any code change to establish the pre-change baseline, and again after; both sets of numbers go in the PR. (2) ''Goldens'' corrected: no golden file pins derive_at_metres/invent_primitives today (derivation_harness.json is voxel-chain; cascade_layer1.json is heightmap-river). Explicit scope: ADD a golden fixture for the window-derivation path (mirroring derivation_harness.rs''s pattern) so this and every future octave change gets a deliberate-regen commit discipline. (3) Vegetation patchiness confirmed NET-NEW, in scope (not split): today derive_vegetation (district_profile.rs:398-490) is pure per-cell classification with no positional field. Build the vegetation invention mechanism mirroring coast_invention.rs''s two-tier envelope+character model (Jeroen''s nature-first ruling is the direction; the tiered invention-field pattern is the established shape to imitate). Non-blocking notes: VOXEL octaves feeding Quarter classification does NOT conflict with D-226(d) — that ruling caps request granularity, not contributing wavelengths (coast warp already crosses scales the other way); MIN_WL_BANDS_M (layer_proxy.rs:415-421) needs new entries once the ladder extends, quantize_min_wl_m generalizes as-is.', 'in_progress', 'high', NULL, 'server', 'D-226', '2026-07-22 16:30:36.314', '2026-07-22 20:27:10.426', NULL, '8214e16a3533672f9be060e37410d066', 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 ('06FRQ9J882SWNAWV87YV393V78', 'task', '06FBPPMZNNEV052DBYYY3A897C', 'Clear the 27 pre-existing gdlint problems on main (client/scripts + client/ui)', 'Found during nature-octaves /pr-process (2026-07-22): gdlint over client/scripts/ + client/ui/ reports 27 problems on main (e.g. class-definitions-order in atlas screens like system_screen.gd:511-512). The pre-push gate runs the gdUnit suite but NOT gdlint, so this debt accumulates invisibly; /pr-process''s zero-warnings step only catches NEW warnings by diffing against main. Fix the 27 (or suppress with commented justification where intentional), then consider adding gdlint to the pre-push gate''s client path so the count stays at zero.', 'backlog', 'low', NULL, 'client', NULL, '2026-07-22 21:05:58.336', '2026-07-22 21:05:58.336', NULL, '12ba8e9e1da015faf665138d7876ed54', 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). + +REFINEMENT RESOLUTIONS (lead, 2026-07-22, from Si audit): (1) Bench baseline: none recorded anywhere — implementer runs server/tests/zoom_ladder_bench.rs (cargo test --release --test zoom_ladder_bench -- --ignored --nocapture) BEFORE any code change to establish the pre-change baseline, and again after; both sets of numbers go in the PR. (2) ''Goldens'' corrected: no golden file pins derive_at_metres/invent_primitives today (derivation_harness.json is voxel-chain; cascade_layer1.json is heightmap-river). Explicit scope: ADD a golden fixture for the window-derivation path (mirroring derivation_harness.rs''s pattern) so this and every future octave change gets a deliberate-regen commit discipline. (3) Vegetation patchiness confirmed NET-NEW, in scope (not split): today derive_vegetation (district_profile.rs:398-490) is pure per-cell classification with no positional field. Build the vegetation invention mechanism mirroring coast_invention.rs''s two-tier envelope+character model (Jeroen''s nature-first ruling is the direction; the tiered invention-field pattern is the established shape to imitate). Non-blocking notes: VOXEL octaves feeding Quarter classification does NOT conflict with D-226(d) — that ruling caps request granularity, not contributing wavelengths (coast warp already crosses scales the other way); MIN_WL_BANDS_M (layer_proxy.rs:415-421) needs new entries once the ladder extends, quantize_min_wl_m generalizes as-is.', 'review', 'high', NULL, 'server', 'D-226', '2026-07-22 16:30:36.314', '2026-07-22 21:12:56.083', NULL, '23b7115954f41d981596fc7808db7913', 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.', 'review', 'medium', NULL, 'client', 'D-226', '2026-07-22 15:04:58.422', '2026-07-22 21:12:56.086', NULL, '46a96cf3fdb3f1e820a1e0d1a077e5b1', 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);