From 627e02f7ba0806347f6815b8bc20e8529b95f2b7 Mon Sep 17 00:00:00 2001 From: Jeroen Schweitzer Date: Fri, 17 Jul 2026 08:31:45 +0200 Subject: [PATCH] =?UTF-8?q?chore(meta):=20file=20T-1135=20=E2=80=94=20spli?= =?UTF-8?q?t=20character=20spawn=20out=20of=20world-setup=20(T-1130=20foll?= =?UTF-8?q?ow-up)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Fable 5 --- .pql/changelog/ticket_idmap/2026-07.sql | 1 + .pql/changelog/tickets/2026-07.sql | 1 + 2 files changed, 2 insertions(+) diff --git a/.pql/changelog/ticket_idmap/2026-07.sql b/.pql/changelog/ticket_idmap/2026-07.sql index e038f77d3..77f44c0ef 100644 --- a/.pql/changelog/ticket_idmap/2026-07.sql +++ b/.pql/changelog/ticket_idmap/2026-07.sql @@ -48,3 +48,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 ('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); +INSERT INTO ticket_idmap (record_id, ticket_id, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FPXHCT46V340D1AJZRKBHJN4', 'T-1135', '2026-07-17 06:31:11.655', '2026-07-17 06:31:11.655', NULL, '9c14910a4fb21b72b6ce4e3d99318617', 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 82c1b4657..b7a5c83f7 100644 --- a/.pql/changelog/tickets/2026-07.sql +++ b/.pql/changelog/tickets/2026-07.sql @@ -2111,3 +2111,4 @@ Refinement (2026-07-17, Si review): READY. Upstream verified HEALTHY — glaciat 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); +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 ('06FPXHCT46V340D1AJZRKBHJN4', 'task', '06FPX7FKG0Y6SYWEDPG4PJQHQ8', 'Split character spawn out of monolithic world-setup — reader-only servers carry an inert PlayerCharacter', 'T-1130 deviation 3 (Oscar, 2026-07-17): setup_proof_room/setup_gauntlet spawn the PlayerCharacter unconditionally, so a server whose first and only connection is a Reader (D-254 spawn-mode companion) still gets an inert, unpiloted PlayerCharacter entity in its ECS world. Harmless today — nothing drives it, no Player exists to send inputs, and the Reader never learns of it since readers receive no ObserverSnapshot — but it is dead state in every companion-spawned world and would confuse future world-inspection tooling. Fix: split character spawn into its own setup path invoked on Player installation (first-connection Player or a future mid-session Player attach), not at world build. Documented at the call site in server/src/main.rs. Also noted in the same report, not ticketed separately: there is no cap on total reader COUNT (per-reader inbound frame cap only, 8/tick) — worst-case per-tick reader cost is O(N x 8); acceptable for loopback-only scope, revisit if the companion ever leaves loopback.', 'backlog', 'low', NULL, 'server', NULL, '2026-07-17 06:31:11.649', '2026-07-17 06:31:11.649', NULL, '4d8235ad2809e0f407c5ac7d23a510e0', 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);