chore(meta): T-1125/T-1126/T-1127 to review — PR #182 up (coastline invention seam batch)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -1494,3 +1494,6 @@ Jeroen''s requirement (2026-07-17, mid-implementation — now D-254 SS3): the st
|
||||
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 ('06FPXB28V72K8ZPE5WSNJS1SP8', 'description', 'D-254 SS4 + Jeroen''s IA ruling (2026-07-17): a SEPARATE implant app (implant/browser), sibling to the Atlas — the six registry entities do not share the Atlas''s geographic drill-down. ONE ticket for all six per Jeroen (single review sees the whole surface). Scope: new client/ui/implant/apps/browser/ app.tres + app.gd + index/detail screen pairs for star systems, bodies, stations, corporations, commodities, trait templates — composed ENTIRELY from D-169 implant components (ImplantPanel/ImplantHeader/ImplantDataRow/ImplantTextBlock; no new UI primitives); wired to the six BrowseRequest endpoints; reachable from the standalone shell (and by design also from the in-game implant later — it is a normal implant app). Blocked by the browse-proxy ticket (data source) and the standalone-shell ticket (launch surface).', 'D-254 SS4 + Jeroen''s IA ruling (2026-07-17): a SEPARATE implant app (implant/browser), sibling to the Atlas — the six registry entities do not share the Atlas''s geographic drill-down. ONE ticket for all six per Jeroen (single review sees the whole surface). Scope: new client/ui/implant/apps/browser/ app.tres + app.gd + index/detail screen pairs for star systems, bodies, stations, corporations, commodities, trait templates — composed ENTIRELY from D-169 implant components (ImplantPanel/ImplantHeader/ImplantDataRow/ImplantTextBlock; no new UI primitives); wired to the six BrowseRequest endpoints; reachable from the standalone shell (and by design also from the in-game implant later — it is a normal implant app). Blocked by the browse-proxy ticket (data source) and the standalone-shell ticket (launch surface).
|
||||
|
||||
Note (D-254 SS3 addition, 2026-07-17): the implant/browser app manifest carries available_in_companion = true (the default). Because the companion shell is a generic implant host, this app appears in the standalone Atlas automatically the moment it registers — no companion-side wiring.', NULL, '2026-07-17 06:10:33', '2026-07-17 06:10:33.806', '2026-07-17 06:10:33.806', NULL, 'ad3e415206ac29b0827bddabff09ad45', 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 ('06FPS6QD5FG9TC2WXTDVA44FPW', 'status', 'in_progress', 'review', NULL, '2026-07-17 06:25:17', '2026-07-17 06:25:17.793', '2026-07-17 06:25:17.793', NULL, '6df5610c9e6e310eca58013dedf3f493', 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 ('06FPS6RRBF9HHAED5QKTKQCY1G', 'status', 'in_progress', 'review', NULL, '2026-07-17 06:25:17', '2026-07-17 06:25:17.795', '2026-07-17 06:25:17.795', NULL, '9f9b44c5ca4fbf811e14fab37259f6e2', 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 ('06FPS6TF9XDZPKZY8DHG1T0E2R', 'status', 'in_progress', 'review', NULL, '2026-07-17 06:25:17', '2026-07-17 06:25:17.795', '2026-07-17 06:25:17.795', NULL, 'f21585d66cc4ccd3c726186982f92eb5', 2) ON CONFLICT(hash) DO NOTHING;
|
||||
|
||||
@@ -41,3 +41,10 @@ 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 ('06FPS6QD5FG9TC2WXTDVA44FPW', 'T-1125', '2026-07-16 20:25:20.433', '2026-07-16 20:25:20.433', NULL, '038dc805ef92acd7dee8a595e6e615cd', 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 ('06FPS6RRBF9HHAED5QKTKQCY1G', 'T-1126', '2026-07-16 20:25:31.489', '2026-07-16 20:25:31.489', NULL, '6071898cc799f9c15a73af55811d0ac0', 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 ('06FPS6TF9XDZPKZY8DHG1T0E2R', 'T-1127', '2026-07-16 20:25:45.556', '2026-07-16 20:25:45.556', NULL, '5c926243538eabed84b7b1caeef6015c', 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 ('06FPX7FKG0Y6SYWEDPG4PJQHQ8', 'T-1128', '2026-07-17 05:47:53.095', '2026-07-17 05:47:53.095', NULL, '421f4dea46ee52fb5f4a1fcd51a0ace8', 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 ('06FPX7HZY1CK3VSTRXP1NP9VYW', 'T-1129', '2026-07-17 05:48:12.661', '2026-07-17 05:48:12.661', NULL, '93ec8aae3808dded1bb9c83bf01aaa30', 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 ('06FPXAS26J3BS7ZJVRFT5JDXP8', 'T-1130', '2026-07-17 06:02:17.087', '2026-07-17 06:02:17.087', NULL, '07d4ac36124812a581ddafb80aea00eb', 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 ('06FPXATGN8QJAJVR0WCRHJS2TG', 'T-1131', '2026-07-17 06:02:28.907', '2026-07-17 06:02:28.907', NULL, '2de895d0cbdb322fc846fe5d3ef766b7', 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 ('06FPXAWGRH9QK5QKV7584Q92Z8', 'T-1132', '2026-07-17 06:02:45.321', '2026-07-17 06:02:45.321', NULL, '5f9dc6445a815983ca5dfab226d80004', 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 ('06FPXB28V72K8ZPE5WSNJS1SP8', 'T-1133', '2026-07-17 06:03:32.441', '2026-07-17 06:03:32.441', NULL, '032b367fbbe155baa75568ca8a82b754', 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 ('06FPXB41KV1J008A140B9CFD7M', 'T-1134', '2026-07-17 06:03:46.974', '2026-07-17 06:03:46.974', NULL, '7c1ba6caa5e39e27a2dae1507a8adf9d', 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);
|
||||
|
||||
@@ -2083,3 +2083,31 @@ Jeroen''s requirement (2026-07-17, mid-implementation — now D-254 SS3): the st
|
||||
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 ('06FPXB28V72K8ZPE5WSNJS1SP8', 'task', '06FPX7FKG0Y6SYWEDPG4PJQHQ8', 'Data browser UI — implant/browser app, six index+detail screens', 'D-254 SS4 + Jeroen''s IA ruling (2026-07-17): a SEPARATE implant app (implant/browser), sibling to the Atlas — the six registry entities do not share the Atlas''s geographic drill-down. ONE ticket for all six per Jeroen (single review sees the whole surface). Scope: new client/ui/implant/apps/browser/ app.tres + app.gd + index/detail screen pairs for star systems, bodies, stations, corporations, commodities, trait templates — composed ENTIRELY from D-169 implant components (ImplantPanel/ImplantHeader/ImplantDataRow/ImplantTextBlock; no new UI primitives); wired to the six BrowseRequest endpoints; reachable from the standalone shell (and by design also from the in-game implant later — it is a normal implant app). Blocked by the browse-proxy ticket (data source) and the standalone-shell ticket (launch surface).
|
||||
|
||||
Note (D-254 SS3 addition, 2026-07-17): the implant/browser app manifest carries available_in_companion = true (the default). Because the companion shell is a generic implant host, this app appears in the standalone Atlas automatically the moment it registers — no companion-side wiring.', 'backlog', 'high', NULL, 'client', NULL, '2026-07-17 06:03:32.441', '2026-07-17 06:10:33.805', NULL, 'eb0ef4abc9fd3af3d0069db6aee6433a', 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 ('06FPS6QD5FG9TC2WXTDVA44FPW', 'story', '06FGSJNP8YM537DJCC82ZD6544', 'D-227 invented detail does not feed district classification — the orbit-to-jet-plane bridge ends at ~500km', 'T-1123 zoom-ladder finding (2026-07-16, first-ever look at district-resolution maps; images in .cache/screenshots/district-windows, evidence /tmp/district-windows). At w256 (524km) the district layer reads as coherent geography (coastal band sequences, legible coasts — but bilinear-smooth: rounded corners of ~156km heightmap pixels visible, no invented bays). At w64 (131km) it degenerates to razor-straight gradient stripes; at w16 (33km) a single flat color. MECHANISM (code-grounded by Dudley): derive_district classifies morphology from ocean_fraction_q = RAW BILINEAR of the ocean mask (district_profile.rs:1318 — no domain warp, no scatter), and the D-227 detail-scatter amplitude is slaved to local_slope of the coarse heightmap (1301-1303) — near zero on low-relief coastal plains, so invention collapses exactly where coastlines live. The scatter itself works (visible as cloudy texture in w256 elev panels) but barely feeds classification and never feeds the coastline. NEEDED: the D-227 invention (interpolation + domain warp + detail-scatter) must carry geographic content into district classification — warped coastline sampling, slope-independent scatter floor, invented drainage/relief between heightmap pixels. This is the heart of the Phase-4 deliverable (deterministic walkable-world data that reads as geography) and blocks T-1124''s regional map view being worth looking at below ~500km. Determinism verified byte-identical cross-process — the substrate is sound; it is the content of the invention that is missing. Reproduce: cargo run --bin aliveness_probe -- --body GJ380c --seed 42 --render /tmp/out --window 64.
|
||||
|
||||
Jeroen''s design ruling (2026-07-17, pre-refinement): CRINKLE SHOULD VARY. The invented coastline/terrain detail must not be a single global roughness constant or uniform scatter floor — its amplitude and character vary from place to place. Candidate drivers to pin during refinement/implementation (lead''s interpretation, Si to ground in what derive_district already carries): geological context (tectonic_class, glaciation_grade — fjord coasts jagged, deltas smooth, cliff coasts sharp, alluvial plains gentle), climate signals, and seeded spatial heterogeneity so stretches of the same coast differ. The variation itself must be deterministic (seed+position), per D-227/D-010.
|
||||
|
||||
Jeroen''s ruling, elaborated (2026-07-17): derive coastline variation from EXISTING body settings + lat/long — do not author new knobs. Some places fjordy, some smooth; some planets have tectonics, some are prone to higher erosion. Two driver tiers: (1) BODY-level — the variation already in body parameters (planet_class, atmosphere, hydrosphere, axial tilt, radius, and whatever tectonic/erosion signals exist or are derivable from them) sets each body''s coastline character envelope; (2) POSITION-level — latitude/longitude and the derived district context (glaciation_grade, tectonic_class, climate bands) modulate within it: high-latitude glaciated coasts go fjordy, humid climates erode smooth, arid/tectonic coasts stay sharp. The point: two planets should have recognisably different coastline personalities, and one planet''s coasts should vary by where you are — all deterministic from seed+body+position, zero new authored data.
|
||||
|
||||
Jeroen, further (2026-07-17): ''more ocean is more wet and rainy, for instance'' — hydrosphere/ocean coverage as a tier-1 driver chain: large hydrosphere -> wetter, rainier climate -> HIGHER EROSION -> smoother, more mature coastlines (and more dendritic/eroded relief); small hydrosphere / thin atmosphere -> dry -> sharp, young, uneroded coasts. Erosion-proneness therefore need not be a new authored field — it is derivable from hydrosphere + atmosphere + precipitation, compounding with the tectonic/glaciation drivers. Note for implementation: hydrosphere already feeds moisture derivation (T-1034 fixed the vocab fall-through), so part of this chain exists — the new link is wet/rainy feeding COASTLINE/relief character, not just biome wetness.
|
||||
|
||||
---
|
||||
Gap resolution (2026-07-17, Si review + Jeroen''s rulings):
|
||||
|
||||
1. TILT/D-240: DROPPED — no axial tilt input; D-240 stays intact. latitude_deg alone carries the position-tier polar effects (glaciation_grade is already latitude/temperature-derived). Tier-1 envelope CONFIRMED as what exists: planet_class + hydrosphere + atmosphere + body_radius_km (BodyParams, body_params_reader.rs:14-20). No tectonic-activity or erosion field exists — tectonic_class derives from planet_class (derive_tectonic_class always falls to its planet_class branch in production); erosion-proneness is DERIVED from hydrosphere + atmosphere + precipitation per Jeroen''s chain. Do not hunt for richer body signals; they are not there.
|
||||
|
||||
2. CIRCULARITY: ACCEPT STALE INPUT — glaciation_grade reads the UNWARPED raw-bilinear ocean_fraction_q (one-step-stale, deterministic, coarse ~156km-pixel value anyway). Document on the call site. tectonic_class is cheap to hoist to the top of derive_district (needs only BodyParams).
|
||||
|
||||
3. SCOPE: BOTH PATHS — the invention must feed derive_district (on-demand: probe + future T-1124 view) AND the production derive_district_profile (district_profile.rs:1062-1134, the batch path BodyWorldState stores — currently has NO scatter at all; the paths silently diverged). Implementer may unify the shared classification core if cleaner than duplicating — his call, reviewers verify. Believability goldens (server/tests/golden/believability.json) WILL regenerate — expected and acknowledged via UPDATE_GOLDEN=1; report the metric deltas (contrast/coherence blocks) in the PR as evidence of improvement, not just churn.
|
||||
|
||||
Si verification facts for the implementer:
|
||||
- Direct reusable precedents: climate_edge_warp (region_profile.rs:477-513) — warp-the-sampling with a distinct hash path, exactly the pattern for ocean_fraction_q; domain_warp.rs (T-1026, stateless (seed,body,pos)->offset); detail_scatter.rs voxel_mosaic (T-1084) proves slope-INDEPENDENT position-keyed scatter is established. Longitude variation comes free via position-keyed noise on world-metre coords — no explicit longitude plumbing needed.
|
||||
- Fix shape (from the ticket + rulings): warp the ocean-mask sampling position (invented bays/capes), slope-independent scatter floor whose AMPLITUDE/CHARACTER varies by the two driver tiers (body envelope: planet_class/hydrosphere/atmosphere/radius -> personality incl. erosion-smoothness; position: latitude, glaciation_grade, tectonic_class, climate bands -> fjordy vs smooth vs sharp), plus seeded heterogeneity so same-coast stretches differ. All deterministic seed+body+position (D-227/D-010); continuous across district/region boundaries (D-243 edge-fuzz discipline — character never steps on a line).
|
||||
- Acceptance: (a) before/after zoom ladders (aliveness_probe --render, same bodies/windows as T-1123: GJ380c/GJ820Bc/GJ244Ad at w256/w64/w16) reviewed by Jeroen — the primary artifact; (b) believability metrics moved not regressed; new coastline-legibility criterion work belongs to open Q-123, not this ticket. (c) determinism byte-compare as in T-1123.
|
||||
- Performance: no per-district budget record exists; do the D-246-style check — verify derive_district cost stays same order (~8us was the T-1123 measurement) and the believability/derivation harness budgets stay green.', 'review', 'high', 'dudley', 'server', 'D-227', '2026-07-16 20:25:20.427', '2026-07-17 06:25:17.792', NULL, '9447b6c049bb753b47f64c389ed384c7', 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 ('06FPS6TF9XDZPKZY8DHG1T0E2R', 'task', '06FGSJNP8YM537DJCC82ZD6544', 'Frozen bodies read temperate-green on district morphology maps — render glaciation_grade', 'T-1123 zoom-ladder finding: GJ244Ad (frozen planet_class, temp panel pegged at the -60C clamp floor, vegetation solid Barren) still renders temperate-green morphology — the 17-zone MorphologyZone vocabulary (T-1027, FROZEN per its own contract) has no ice/glacial zone, and glaciation_grade is a separate DistrictProfile field nothing renders. Do NOT reopen the frozen vocab by default: the likely fix is rendering glaciation_grade as a modifier/overlay on the morphology color (ice-tinting affected zones) in both the T-1123 probe renderer and the future T-1124 view — or, if the team decides an ice zone belongs in the vocabulary after all, that is a deliberate amendment to the freeze decision, not a drive-by. Images: .cache/screenshots/district-windows gj244ad_w256_morphology.png vs _temp.png.
|
||||
|
||||
Refinement (2026-07-17, Si review): READY. Upstream verified HEALTHY — glaciation derivation (derive_glaciation_grade_from_climate, district_profile.rs:339-366) is correctly wired and even gates the Fjord family; GJ244Ad moisture clears the gate floor. This is purely a rendering gap: aliveness_probe render_window_panels computes the full DistrictProfile and discards .glaciation_grade (line ~458 reads only morphology_zone). SCOPE RULING (lead): probe-only THIS ticket — per-pixel ice tint blended on the morphology panel keyed on glaciation_grade (+ optionally a 6th dedicated glaciation panel; PANEL_NAMES/bufs are array-driven, cheap). The wire+client half (glaciation: Vec<u8> parallel array inside DistrictGridLayer + build_district_grid + protocol.gd + _draw_gen_district — governance-UNCONSTRAINED per the D-226 growth-ceiling reading: the cap governs new top-level Option layers, not per-cell fields inside a shipped layer; elev_q precedent) is DEFERRED to T-1124''s design pass, which owns the which-fields-ship-at-district-resolution question. Freeze contract confirmed: D-239 SS6 — tint is classifier-tuning territory, no MorphologyZone vocab reopen; an ice zone would need its own explicit D-amendment (not pursued).', 'review', 'medium', 'dudley', 'server', NULL, '2026-07-16 20:25:45.551', '2026-07-17 06:25:17.795', NULL, '2c8c127a9e8b7d3844311fb551df7cfa', 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 ('06FPS6RRBF9HHAED5QKTKQCY1G', 'bug', '06FGSJNP8YM537DJCC82ZD6544', 'derive_vegetation is ocean-blind — district maps paint Forest across open ocean', 'T-1123 zoom-ladder finding: derive_vegetation(temp, moisture, elev, near_water) has no ocean/water-mask input — GJ380c w256 renders solid Forest across ~250km of OpenOcean districts (see .cache/screenshots/district-windows gj380c_w256_veg.png vs _morphology.png). Voxel-level water generators mask this in-world, but any district-resolution Atlas view (T-1124) will show forested oceans. Fix: vegetation classification should return a None/Marine class when the district''s morphology/ocean_fraction says water (reuse ocean_fraction_q already computed in derive_district).
|
||||
|
||||
Gap resolution (2026-07-17, Si review + Jeroen): (1) GATE: morphology-derived — pass the already-computed morphology water verdict (OpenOcean/Lake) into the vegetation call; vegetation and morphology can NEVER disagree by construction; no fourth threshold is born. (2) VARIANT: Marine, appended at discriminant 6 (after RiparianThicket=5); update the load-bearing vegetation_class_discriminants_pinned test; document that Ord position is non-semantic (the density-ladder doc does not extend to Marine). (3) SEQUENCING: blocked by T-1125 (edge added) — classify against the warped/invented coastline, not the smooth one. Si facts: the ticket phrase near_water is a TRAP — derive_vegetation''s 4th param is near_perennial_water (riparian/river proximity), unrelated to ocean; do not reuse it. voxel.rs consumers are wildcard-safe (ocean districts route to the WaterBody generator upstream per D-239/T-1082) — no changes needed there. aliveness_probe.rs vegetation_rgb is an EXHAUSTIVE match and will fail to compile until it gets a Marine color — extend the palette deliberately (ocean blue distinct from morphology water tones). D-239 gets an implementation-addendum note recording the Marine variant (its §8 climate-vegetation law predates a water class).', 'review', 'medium', 'dudley', 'server', NULL, '2026-07-16 20:25:31.484', '2026-07-17 06:25:17.795', NULL, 'bfd6b2dbc9fb45181a41d85fb890c398', 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);
|
||||
|
||||
Reference in New Issue
Block a user