From a378ef862ceda459593cee6de937f4c151a27d7a Mon Sep 17 00:00:00 2001 From: Jeroen Schweitzer Date: Sun, 26 Jul 2026 13:36:26 +0200 Subject: [PATCH] =?UTF-8?q?chore(meta):=20pql=20changelog=20=E2=80=94=20T-?= =?UTF-8?q?1206=20filed=20(synthetic-overflow=20ocean-guard=20gap,=20from?= =?UTF-8?q?=20PR=20#215=20review)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Fable 5 --- .pql/changelog/ticket_history/2026-07.sql | 1 + .pql/changelog/tickets/2026-07.sql | 2 ++ 2 files changed, 3 insertions(+) diff --git a/.pql/changelog/ticket_history/2026-07.sql b/.pql/changelog/ticket_history/2026-07.sql index b0f451db2..05638969d 100644 --- a/.pql/changelog/ticket_history/2026-07.sql +++ b/.pql/changelog/ticket_history/2026-07.sql @@ -3133,3 +3133,4 @@ SWEEP COMPLETE (2026-07-25/26). Root cause pinned to ONE commit: f4c72e148 (2026 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 ('06FSP4MX7C66N76V31EB88YC78', 'status', 'in_progress', 'done', NULL, '2026-07-26 10:50:38', '2026-07-26 10:50:38.896', '2026-07-26 10:50:38.896', NULL, 'a73745109833b6478ce0d7ff2ed673b5', 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 ('06FSP7HT5ES8D83VZA6ETACRAW', 'status', 'in_progress', 'review', NULL, '2026-07-26 10:55:32', '2026-07-26 10:55:32.378', '2026-07-26 10:55:32.378', NULL, '77078d2928d2421bb00ca4e4dcc49faa', 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 ('06FSP7HT5ES8D83VZA6ETACRAW', 'status', 'review', 'done', NULL, '2026-07-26 11:04:45', '2026-07-26 11:04:45.800', '2026-07-26 11:04:45.800', NULL, '2b689e1630b210f11ed9686a9e71a913', 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 ('06FPPM0KP850FN6WQ5PDEX9ZS4', 'status', 'in_progress', 'review', NULL, '2026-07-26 11:05:39', '2026-07-26 11:05:39.748', '2026-07-26 11:05:39.748', NULL, '5142f5aa2521703fbb4e3500a1f59079', 2) ON CONFLICT(hash) DO NOTHING; diff --git a/.pql/changelog/tickets/2026-07.sql b/.pql/changelog/tickets/2026-07.sql index 6002607eb..1ca221583 100644 --- a/.pql/changelog/tickets/2026-07.sql +++ b/.pql/changelog/tickets/2026-07.sql @@ -5310,3 +5310,5 @@ Batch-7 Si pre-answer (2026-07-25): the ticket''s question (1) is RESOLVED — t SWEEP COMPLETE (2026-07-25/26). Root cause pinned to ONE commit: f4c72e148 (2026-03-13, ''update all 18 briefings for v0.2 pivot'') — adjacent-id transcription slips from the Where''s the Fun? workshop batch (eea3f3cf2), copied forward by every later briefing-maintenance pass, never a renumbering. Eleven mis-citations fixed on main across five briefings: gore.md (D-131->D-130 emergent-moral-arc — lead-verified against D-130''s near-verbatim body; D-131->D-136 first-moment), mellanie.md (D-131->D-136, D-134->D-126 x2), ozzie.md (D-126->D-134, D-131->D-136, D-134->D-126), stig.md (D-126->D-134 x2, D-131->D-136), nigel.md (D-136->D-137 x3, plus a knock-on the sweep''s grep could not see: D-137->D-120 x2 ''no skill ceiling'' — found when the D-136->D-137 fix would have created contradictory D-137 citations in one file; D-120 verified as the real record, scope.md, itself SUPERSEDED). The slip family: D-126<->D-134 swapped; D-136 as D-131; D-137 as D-136; D-130 as D-131; D-120 as D-137. Sprint/discussion archives verified already-correct (all postdate the workshop and cite current meanings) — no annotations needed. Governance records themselves correct, untouched. Remaining 13 briefings from the same commit: T-1205.', 'done', 'medium', 'clerk', 'server', NULL, '2026-07-25 20:58:36.219', '2026-07-26 10:50:38.896', NULL, 'eb63bfa9711770fedfcecd1773145fad', 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 ('06FSP7HT5ES8D83VZA6ETACRAW', 'story', '06FB0TNSRXDCJS4P9Z5JQ1DAAM', 'Furniture/props asset production', 'Per-class production story (T-1049 breakdown, batch 6). Brief: docs/assets/briefs/furniture-props.md — interior furniture + small props (manifest categories furniture|props), D-257 toon treatment, conventions.md naming/mask/footprint_tiles rules. FIRST acceptance: promote + rename the 4 promotable spike GLBs (baroque_table, modernist_chair, scifi_desk + props/lion_statue) into client/assets/models/ + manifest.json per D-241 — no new generation needed; vw_beetle stays excluded (Q-067 car deferral, see briefs/deferred.md). Note: spike GLB binaries are gitignored — regenerate or restore locally at promotion time per the spike README.', 'review', 'medium', 'justine', 'visual', NULL, '2026-07-25 21:11:17.291', '2026-07-26 10:55:32.377', NULL, '474e9e9adcb6e92a49c2e579afc16c0f', 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 ('06FSP7HT5ES8D83VZA6ETACRAW', 'story', '06FB0TNSRXDCJS4P9Z5JQ1DAAM', 'Furniture/props asset production', 'Per-class production story (T-1049 breakdown, batch 6). Brief: docs/assets/briefs/furniture-props.md — interior furniture + small props (manifest categories furniture|props), D-257 toon treatment, conventions.md naming/mask/footprint_tiles rules. FIRST acceptance: promote + rename the 4 promotable spike GLBs (baroque_table, modernist_chair, scifi_desk + props/lion_statue) into client/assets/models/ + manifest.json per D-241 — no new generation needed; vw_beetle stays excluded (Q-067 car deferral, see briefs/deferred.md). Note: spike GLB binaries are gitignored — regenerate or restore locally at promotion time per the spike README.', 'done', 'medium', 'justine', 'visual', NULL, '2026-07-25 21:11:17.291', '2026-07-26 11:04:45.800', NULL, '1c43a93489231cdc6de78c332629c085', 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 ('06FPPM0KP850FN6WQ5PDEX9ZS4', 'bug', '06FB0TNSRZXCHGS16BFHSSGSV4', 'Road graph: 0 routable edges on water-heavy bodies — placements land in water-majority routing cells, every A* pair drops', 'Found during T-1076 (road-hub refinement) verification: several real bodies (GJ251c, GJ380c) produce 0 routable road edges because settlement placements land in water-majority routing cells, so every A* pair is dropped. PRE-EXISTING behavior (T-1038''s core had the same drop path) but now more visible with hub/spur semantics and on the Atlas road overlay. Candidate fixes per Dudley: coastal-cell routing relaxation (allow routing through coast-adjacent cells at a cost penalty) or a placement nudge (settlements snap out of water-majority cells at L3). Affects the Atlas planet-browsing experience directly: water-heavy bodies show settlements but no roads.', 'review', 'medium', 'dudley', 'server', NULL, '2026-07-16 14:23:57.874', '2026-07-26 11:05:39.747', NULL, '1252d97642a956cfc7ac7c09bd2f3cf2', 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 ('06FSWCYA60VHFK44J09WW78FY0', 'bug', '06FB0TNSRZXCHGS16BFHSSGSV4', 'Synthetic-overflow settlement placement has no ocean-mask guard — can land in open water', 'Found during the PR #215 review fix round (T-1116, Tyre finding 3 follow-through): attractor_matching.rs::synthetic_attractor (the D-211 Phase-4 overflow path, PlainCenter at min-spacing) takes no heightmap/TerrainAnalysis argument — it derives positions by pure grid arithmetic (grid_h/2, grid_w/4, spacing-walk) with zero ocean_mask check. Every EXTRACTED attractor type is land-guaranteed (features.rs::extract_attractors filters !ocean_mask, D-209), but a synthetic-overflow settlement can be placed in open water — visible as an ocean-stranded settlement marker on the Atlas. T-1116''s routing relaxation degrades this case gracefully (surrogate anchor within ring 3, else an isolated unrouted node — never a panic or a water road), but the placement guarantee itself is the gap. Documented in road_graph.rs''s anchor comment and the D-210 amendment (PR #215). Fix shape: thread the ocean mask (or TerrainAnalysis) into synthetic_attractor and nudge/reject water candidates deterministically — mind D-211''s seed-derived-position promise (any nudge must be a pure function of seed + terrain, no RNG state change). Verify by hunting a real body whose synthetic overflow currently lands in water (none observed yet — GJ251c/GJ380c placements are all extracted attractors) or a synthetic fixture.', 'backlog', 'medium', NULL, 'server', NULL, '2026-07-26 11:33:42.064', '2026-07-26 11:33:42.064', NULL, 'e0bed269a11d67a500af60b6b4edb65f', 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);