chore(meta): reconcile Layer-4 street/footprint cluster + file dispatch ticket

Si vet (2026-06-07) of the next batch found the same drift as T-985/986: the street &
footprint geometry already landed under T-957. Marked done with evidence notes:
- T-989 morphology->street-pattern lookup (street_topology/derive_corridors)
- T-990 corridor/access-point network (Prim-MST, ±45° snap)
- T-991 BSP footprint subdivision + D-233 coverage + D-234b waterfront rule
- T-976 (parent) — all four geometry deliverables done+tested

Filed T-1022 for the genuine residual: the Layer-3 -> Layer-4 GenerateSkeleton
dispatch (founding_orientation wiring) that activates the dormant geometry in
production. A distinct cross-layer concern, not street geometry.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-06-07 10:10:35 +02:00
co-authored by Claude Opus 4.8
parent 2deeac210d
commit ebed754229
2 changed files with 57 additions and 0 deletions
+26
View File
@@ -12,3 +12,29 @@ Closed via board reconciliation (pql migration cleanup, 2026-06-06): zone_type_f
INSERT INTO ticket_history (ticket_id, field, old_value, new_value, changed_by, changed_at, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('T-984', 'status', 'backlog', 'in_progress', NULL, '2026-06-06 21:35:56', '2026-06-06 21:35:56', '2026-06-06 21:35:56', NULL, 'd7710baccc79933eece6c4be27d0b1eb', 1) ON CONFLICT(hash) DO NOTHING;
INSERT INTO ticket_history (ticket_id, field, old_value, new_value, changed_by, changed_at, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('T-984', 'status', 'in_progress', 'review', NULL, '2026-06-06 21:43:52', '2026-06-06 21:43:52', '2026-06-06 21:43:52', NULL, '49cb8f31f0e1add464069915a0fafd15', 1) ON CONFLICT(hash) DO NOTHING;
INSERT INTO ticket_history (ticket_id, field, old_value, new_value, changed_by, changed_at, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('T-984', 'status', 'review', 'done', NULL, '2026-06-06 21:48:14', '2026-06-06 21:48:14', '2026-06-06 21:48:14', NULL, 'a13bd29649481189f02af3a131b73389', 1) ON CONFLICT(hash) DO NOTHING;
INSERT INTO ticket_history (ticket_id, field, old_value, new_value, changed_by, changed_at, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('T-976', 'status', 'backlog', 'done', NULL, '2026-06-07 08:10:16', '2026-06-07 08:10:16', '2026-06-07 08:10:16', NULL, '464c8d7f835aba8128e9d4d57db3daf8', 1) ON CONFLICT(hash) DO NOTHING;
INSERT INTO ticket_history (ticket_id, field, old_value, new_value, changed_by, changed_at, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('T-990', 'status', 'backlog', 'done', NULL, '2026-06-07 08:10:16', '2026-06-07 08:10:16', '2026-06-07 08:10:16', NULL, '61ad160f8a87aa8f2327675ef0e6d808', 1) ON CONFLICT(hash) DO NOTHING;
INSERT INTO ticket_history (ticket_id, field, old_value, new_value, changed_by, changed_at, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('T-989', 'status', 'backlog', 'done', NULL, '2026-06-07 08:10:16', '2026-06-07 08:10:16', '2026-06-07 08:10:16', NULL, '92361ba43c4db796e7f80e9567a46606', 1) ON CONFLICT(hash) DO NOTHING;
INSERT INTO ticket_history (ticket_id, field, old_value, new_value, changed_by, changed_at, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('T-991', 'status', 'backlog', 'done', NULL, '2026-06-07 08:10:16', '2026-06-07 08:10:16', '2026-06-07 08:10:16', NULL, 'd43293d77581bcfb5fedfb323183d38b', 1) ON CONFLICT(hash) DO NOTHING;
INSERT INTO ticket_history (ticket_id, field, old_value, new_value, changed_by, changed_at, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('T-989', 'description', 'Lookup: per morphology zone, which D-215 arrangement patterns are legal + the street-shape constraint (fjord/canyon->ribbon|hub-spoke, delta->hub-spoke w/ bridge nodes, alluvial-plain->any, island->hub-spoke, mountain-pass->ribbon). Prevents radial cities in fjords.', 'Lookup: per morphology zone, which D-215 arrangement patterns are legal + the street-shape constraint (fjord/canyon->ribbon|hub-spoke, delta->hub-spoke w/ bridge nodes, alluvial-plain->any, island->hub-spoke, mountain-pass->ribbon). Prevents radial cities in fjords.
Closed via Si vet (2026-06-07): street_topology() + derive_corridors() implemented/consumed/tested in skeleton_gen.rs under T-957. Drift.', NULL, '2026-06-07 08:10:16', '2026-06-07 08:10:16', '2026-06-07 08:10:16', NULL, 'e41703e3dc47fb3c2e18466c84131566', 1) ON CONFLICT(hash) DO NOTHING;
INSERT INTO ticket_history (ticket_id, field, old_value, new_value, changed_by, changed_at, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('T-990', 'description', 'Fill the chunk_layout/corridors/access_points stubs: street network within/between blocks, district entries/exits, +/-45 deg pathfinding cap (D-096), no curves; straight lines only where authored (D-228 cohesion).', 'Fill the chunk_layout/corridors/access_points stubs: street network within/between blocks, district entries/exits, +/-45 deg pathfinding cap (D-096), no curves; straight lines only where authored (D-228 cohesion).
Closed via Si vet (2026-06-07): AccessPoint/CorridorSpine/ChunkLayout filled with real geometry (Prim-MST, snap45 ±45° cap), wired + tested in skeleton_gen.rs under T-957. Drift.', NULL, '2026-06-07 08:10:17', '2026-06-07 08:10:17', '2026-06-07 08:10:17', NULL, '32e611d2f71ce769d5295f47b8f5e2fe', 1) ON CONFLICT(hash) DO NOTHING;
INSERT INTO ticket_history (ticket_id, field, old_value, new_value, changed_by, changed_at, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('T-991', 'description', 'Subdivide a block into building plots + interstitial (parks/lots/gardens), respecting density (D-220) + BulkClass roofed-coverage (D-233). Waterfront footprint rule: pier/quay geometry (no setback, dock-orthogonal) on the water-facing edge, standard frontage inland.', 'Subdivide a block into building plots + interstitial (parks/lots/gardens), respecting density (D-220) + BulkClass roofed-coverage (D-233). Waterfront footprint rule: pier/quay geometry (no setback, dock-orthogonal) on the water-facing edge, standard frontage inland.
Closed via Si vet (2026-06-07): bsp() + subdivide_block_footprints() + D-233 coverage + D-234b waterfront rule implemented + tested in skeleton_gen.rs under T-957. Drift. Waterfront dormant until the Layer-3→Layer-4 dispatch lands (new ticket).', NULL, '2026-06-07 08:10:17', '2026-06-07 08:10:17', '2026-06-07 08:10:17', NULL, '3258f43401b1cf5495f923e07b88683f', 1) ON CONFLICT(hash) DO NOTHING;
INSERT INTO ticket_history (ticket_id, field, old_value, new_value, changed_by, changed_at, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('T-976', 'description', 'Fill the Layer-4 skeleton stub fields (chunk_layout/corridors/access_points) with real geometry, per D-234. (a) Morphology zone -> permitted street patterns lookup gating the D-215 arrangement patterns (fjord/canyon -> ribbon|hub-spoke, delta -> hub-spoke following channels w/ bridges as forced nodes, alluvial-plain -> any, island -> hub-spoke, mountain-pass -> ribbon). (b) Street/corridor network + district access_points within/between blocks (+/-45 deg cap, D-096; no curves). (c) Block footprint subdivision into building plots + interstitial space (parks/lots/gardens), respecting density (D-220) and BulkClass roofed-coverage fraction (D-233). (d) Waterfront footprint rule: pier/quay geometry on water-facing edge, standard frontage inland. Depends on 957 (skeleton).
Refinement (2026-05-26): READY behind 1006/957. Two-layer streets (D-234 refined): corridors = MST/least-cost graph over access-points + reservations + landmarks (Civ6 arterials, the audit graph; ribbon = MST on linear nodes, hub-spoke = MST + forced centroid hub); chunk_layout = +/-45 grid lattice per block (Civ4 local), modulated by D-096 Grid/Organic. Morphology -> permitted-pattern lookup gates D-215. Bridge node = waterfront block on a corridor (no separate type). Footprint subdivision = recursive bisection over the 128x128 integer grid, aggregate roofed area within the BulkClass coverage range. Waterfront = pier/quay on the water-facing edge. CorridorSpine/AccessPoint typed structs defined in 1006. Files: skeleton_gen.rs, generator.rs.
---
Largely SUBSUMED by #957 (2026-06-06): the footprint subdivision (BSP + D-233 coverage), the street network (typed AccessPoint/CorridorSpine/ChunkLayout, morphology-gated arterials per D-234a, ±45° local lattice), and the waterfront rule (D-234b) all landed in skeleton_gen.rs as one coherent walkable-quarter deliverable. REMAINING scope: the per-block-EDGE open-water adjacency refinement — applying pier geometry to the exact block edges that touch water — which needs Layer-1 terrain water-adjacency threaded to the quarter via the Layer-3 placement -> Layer-4 GenerateSkeleton dispatch (city_context_reader still stubs founding_orientation=Cardinal). Blocked on that dispatch; the waterfront rule is implemented and activates when real per-settlement orientation flows.', 'Fill the Layer-4 skeleton stub fields (chunk_layout/corridors/access_points) with real geometry, per D-234. (a) Morphology zone -> permitted street patterns lookup gating the D-215 arrangement patterns (fjord/canyon -> ribbon|hub-spoke, delta -> hub-spoke following channels w/ bridges as forced nodes, alluvial-plain -> any, island -> hub-spoke, mountain-pass -> ribbon). (b) Street/corridor network + district access_points within/between blocks (+/-45 deg cap, D-096; no curves). (c) Block footprint subdivision into building plots + interstitial space (parks/lots/gardens), respecting density (D-220) and BulkClass roofed-coverage fraction (D-233). (d) Waterfront footprint rule: pier/quay geometry on water-facing edge, standard frontage inland. Depends on 957 (skeleton).
Refinement (2026-05-26): READY behind 1006/957. Two-layer streets (D-234 refined): corridors = MST/least-cost graph over access-points + reservations + landmarks (Civ6 arterials, the audit graph; ribbon = MST on linear nodes, hub-spoke = MST + forced centroid hub); chunk_layout = +/-45 grid lattice per block (Civ4 local), modulated by D-096 Grid/Organic. Morphology -> permitted-pattern lookup gates D-215. Bridge node = waterfront block on a corridor (no separate type). Footprint subdivision = recursive bisection over the 128x128 integer grid, aggregate roofed area within the BulkClass coverage range. Waterfront = pier/quay on the water-facing edge. CorridorSpine/AccessPoint typed structs defined in 1006. Files: skeleton_gen.rs, generator.rs.
---
Largely SUBSUMED by #957 (2026-06-06): the footprint subdivision (BSP + D-233 coverage), the street network (typed AccessPoint/CorridorSpine/ChunkLayout, morphology-gated arterials per D-234a, ±45° local lattice), and the waterfront rule (D-234b) all landed in skeleton_gen.rs as one coherent walkable-quarter deliverable. REMAINING scope: the per-block-EDGE open-water adjacency refinement — applying pier geometry to the exact block edges that touch water — which needs Layer-1 terrain water-adjacency threaded to the quarter via the Layer-3 placement -> Layer-4 GenerateSkeleton dispatch (city_context_reader still stubs founding_orientation=Cardinal). Blocked on that dispatch; the waterfront rule is implemented and activates when real per-settlement orientation flows.
Closed via Si vet (2026-06-07): all four D-234 geometry deliverables (morphology gating, corridor/access-point net, BSP footprint subdivision, waterfront rule) landed + tested under T-957. The genuine residual — Layer-3→Layer-4 GenerateSkeleton dispatch (founding_orientation wiring) — is a distinct cross-layer concern, split into its own ticket.', NULL, '2026-06-07 08:10:17', '2026-06-07 08:10:17', '2026-06-07 08:10:17', NULL, '0bf05b1329e6529cd4b29276ddf86c16', 1) ON CONFLICT(hash) DO NOTHING;
+31
View File
@@ -174,3 +174,34 @@ Closed via board reconciliation (pql migration cleanup, 2026-06-06): zone_type_f
INSERT INTO tickets (id, type, parent_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('T-984', 'task', 'T-957', 'BuildingPropertyTag + FloorExtent/FloorHeightProfile structs; replace BlockSkeleton String stubs', 'Define BuildingPropertyTag (zone_type_id, footprint, extent, entry_class, flavor_ref, era/era_cause, initial_condition) + FloorExtent{base_floor,floor_count,FloorHeightProfile::{Uniform|Variable}}. Resolves Q-104: floor_at_voxel_z / voxel_range_for_floor pure fns. Replaces era/society_profile/zone_palette/chunk_layout String stubs in generator.rs.', 'in_progress', 'high', NULL, 'server', 'D-229', '2026-05-25 19:11:10', '2026-06-06 21:35:56', NULL, '8fb7fbe395fbeb0f735effbed6a4b76f', 1) ON CONFLICT(id) DO UPDATE SET type=excluded.type, parent_id=excluded.parent_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 (id, type, parent_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('T-984', 'task', 'T-957', 'BuildingPropertyTag + FloorExtent/FloorHeightProfile structs; replace BlockSkeleton String stubs', 'Define BuildingPropertyTag (zone_type_id, footprint, extent, entry_class, flavor_ref, era/era_cause, initial_condition) + FloorExtent{base_floor,floor_count,FloorHeightProfile::{Uniform|Variable}}. Resolves Q-104: floor_at_voxel_z / voxel_range_for_floor pure fns. Replaces era/society_profile/zone_palette/chunk_layout String stubs in generator.rs.', 'review', 'high', NULL, 'server', 'D-229', '2026-05-25 19:11:10', '2026-06-06 21:43:52', NULL, 'b5107baa0e4a74c5d468914f2f62e59a', 1) ON CONFLICT(id) DO UPDATE SET type=excluded.type, parent_id=excluded.parent_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 (id, type, parent_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('T-984', 'task', 'T-957', 'BuildingPropertyTag + FloorExtent/FloorHeightProfile structs; replace BlockSkeleton String stubs', 'Define BuildingPropertyTag (zone_type_id, footprint, extent, entry_class, flavor_ref, era/era_cause, initial_condition) + FloorExtent{base_floor,floor_count,FloorHeightProfile::{Uniform|Variable}}. Resolves Q-104: floor_at_voxel_z / voxel_range_for_floor pure fns. Replaces era/society_profile/zone_palette/chunk_layout String stubs in generator.rs.', 'done', 'high', NULL, 'server', 'D-229', '2026-05-25 19:11:10', '2026-06-06 21:48:14', NULL, '7739d98f77bc126ce5f89e0377b8a1d1', 1) ON CONFLICT(id) DO UPDATE SET type=excluded.type, parent_id=excluded.parent_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 (id, type, parent_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('T-990', 'task', 'T-976', 'Street/corridor network + district access_points geometry (+/-45 cap)', 'Fill the chunk_layout/corridors/access_points stubs: street network within/between blocks, district entries/exits, +/-45 deg pathfinding cap (D-096), no curves; straight lines only where authored (D-228 cohesion).', 'done', 'high', NULL, 'server', 'D-234', '2026-05-25 19:11:23', '2026-06-07 08:10:16', NULL, '28939e66128261359f28b02b991fc98a', 1) ON CONFLICT(id) DO UPDATE SET type=excluded.type, parent_id=excluded.parent_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 (id, type, parent_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('T-989', 'task', 'T-976', 'Morphology -> permitted street-pattern lookup gating D-215 patterns', 'Lookup: per morphology zone, which D-215 arrangement patterns are legal + the street-shape constraint (fjord/canyon->ribbon|hub-spoke, delta->hub-spoke w/ bridge nodes, alluvial-plain->any, island->hub-spoke, mountain-pass->ribbon). Prevents radial cities in fjords.', 'done', 'high', NULL, 'server', 'D-234', '2026-05-25 19:11:22', '2026-06-07 08:10:16', NULL, '88a0886b544efde7c246e7b23be62057', 1) ON CONFLICT(id) DO UPDATE SET type=excluded.type, parent_id=excluded.parent_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 (id, type, parent_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('T-991', 'task', 'T-976', 'Block footprint subdivision + interstitial + waterfront rule', 'Subdivide a block into building plots + interstitial (parks/lots/gardens), respecting density (D-220) + BulkClass roofed-coverage (D-233). Waterfront footprint rule: pier/quay geometry (no setback, dock-orthogonal) on the water-facing edge, standard frontage inland.', 'done', 'high', NULL, 'server', 'D-234', '2026-05-25 19:11:25', '2026-06-07 08:10:16', NULL, 'bb13e3b01c93ab4ddbff2aa5ecab7ebf', 1) ON CONFLICT(id) DO UPDATE SET type=excluded.type, parent_id=excluded.parent_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 (id, type, parent_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('T-976', 'story', 'T-750', 'Layer 4 — street & footprint geometry (morphology-gated, D-234)', 'Fill the Layer-4 skeleton stub fields (chunk_layout/corridors/access_points) with real geometry, per D-234. (a) Morphology zone -> permitted street patterns lookup gating the D-215 arrangement patterns (fjord/canyon -> ribbon|hub-spoke, delta -> hub-spoke following channels w/ bridges as forced nodes, alluvial-plain -> any, island -> hub-spoke, mountain-pass -> ribbon). (b) Street/corridor network + district access_points within/between blocks (+/-45 deg cap, D-096; no curves). (c) Block footprint subdivision into building plots + interstitial space (parks/lots/gardens), respecting density (D-220) and BulkClass roofed-coverage fraction (D-233). (d) Waterfront footprint rule: pier/quay geometry on water-facing edge, standard frontage inland. Depends on 957 (skeleton).
Refinement (2026-05-26): READY behind 1006/957. Two-layer streets (D-234 refined): corridors = MST/least-cost graph over access-points + reservations + landmarks (Civ6 arterials, the audit graph; ribbon = MST on linear nodes, hub-spoke = MST + forced centroid hub); chunk_layout = +/-45 grid lattice per block (Civ4 local), modulated by D-096 Grid/Organic. Morphology -> permitted-pattern lookup gates D-215. Bridge node = waterfront block on a corridor (no separate type). Footprint subdivision = recursive bisection over the 128x128 integer grid, aggregate roofed area within the BulkClass coverage range. Waterfront = pier/quay on the water-facing edge. CorridorSpine/AccessPoint typed structs defined in 1006. Files: skeleton_gen.rs, generator.rs.
---
Largely SUBSUMED by #957 (2026-06-06): the footprint subdivision (BSP + D-233 coverage), the street network (typed AccessPoint/CorridorSpine/ChunkLayout, morphology-gated arterials per D-234a, ±45° local lattice), and the waterfront rule (D-234b) all landed in skeleton_gen.rs as one coherent walkable-quarter deliverable. REMAINING scope: the per-block-EDGE open-water adjacency refinement — applying pier geometry to the exact block edges that touch water — which needs Layer-1 terrain water-adjacency threaded to the quarter via the Layer-3 placement -> Layer-4 GenerateSkeleton dispatch (city_context_reader still stubs founding_orientation=Cardinal). Blocked on that dispatch; the waterfront rule is implemented and activates when real per-settlement orientation flows.', 'done', 'high', NULL, 'server', 'D-234', '2026-05-25 19:08:51', '2026-06-07 08:10:16', NULL, 'ca9736daa736199a6b42e5ec8480f44c', 1) ON CONFLICT(id) DO UPDATE SET type=excluded.type, parent_id=excluded.parent_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 (id, type, parent_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('T-989', 'task', 'T-976', 'Morphology -> permitted street-pattern lookup gating D-215 patterns', 'Lookup: per morphology zone, which D-215 arrangement patterns are legal + the street-shape constraint (fjord/canyon->ribbon|hub-spoke, delta->hub-spoke w/ bridge nodes, alluvial-plain->any, island->hub-spoke, mountain-pass->ribbon). Prevents radial cities in fjords.
Closed via Si vet (2026-06-07): street_topology() + derive_corridors() implemented/consumed/tested in skeleton_gen.rs under T-957. Drift.', 'done', 'high', NULL, 'server', 'D-234', '2026-05-25 19:11:22', '2026-06-07 08:10:16', NULL, '4722707ad6d0e46c5cdc8517e5055ffa', 1) ON CONFLICT(id) DO UPDATE SET type=excluded.type, parent_id=excluded.parent_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 (id, type, parent_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('T-990', 'task', 'T-976', 'Street/corridor network + district access_points geometry (+/-45 cap)', 'Fill the chunk_layout/corridors/access_points stubs: street network within/between blocks, district entries/exits, +/-45 deg pathfinding cap (D-096), no curves; straight lines only where authored (D-228 cohesion).
Closed via Si vet (2026-06-07): AccessPoint/CorridorSpine/ChunkLayout filled with real geometry (Prim-MST, snap45 ±45° cap), wired + tested in skeleton_gen.rs under T-957. Drift.', 'done', 'high', NULL, 'server', 'D-234', '2026-05-25 19:11:23', '2026-06-07 08:10:17', NULL, '2c06b9a4c9b0639b76c0863ad6eeb776', 1) ON CONFLICT(id) DO UPDATE SET type=excluded.type, parent_id=excluded.parent_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 (id, type, parent_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('T-991', 'task', 'T-976', 'Block footprint subdivision + interstitial + waterfront rule', 'Subdivide a block into building plots + interstitial (parks/lots/gardens), respecting density (D-220) + BulkClass roofed-coverage (D-233). Waterfront footprint rule: pier/quay geometry (no setback, dock-orthogonal) on the water-facing edge, standard frontage inland.
Closed via Si vet (2026-06-07): bsp() + subdivide_block_footprints() + D-233 coverage + D-234b waterfront rule implemented + tested in skeleton_gen.rs under T-957. Drift. Waterfront dormant until the Layer-3→Layer-4 dispatch lands (new ticket).', 'done', 'high', NULL, 'server', 'D-234', '2026-05-25 19:11:25', '2026-06-07 08:10:17', NULL, '8e22d493fb2a1896b1bda85f273817c3', 1) ON CONFLICT(id) DO UPDATE SET type=excluded.type, parent_id=excluded.parent_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 (id, type, parent_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('T-976', 'story', 'T-750', 'Layer 4 — street & footprint geometry (morphology-gated, D-234)', 'Fill the Layer-4 skeleton stub fields (chunk_layout/corridors/access_points) with real geometry, per D-234. (a) Morphology zone -> permitted street patterns lookup gating the D-215 arrangement patterns (fjord/canyon -> ribbon|hub-spoke, delta -> hub-spoke following channels w/ bridges as forced nodes, alluvial-plain -> any, island -> hub-spoke, mountain-pass -> ribbon). (b) Street/corridor network + district access_points within/between blocks (+/-45 deg cap, D-096; no curves). (c) Block footprint subdivision into building plots + interstitial space (parks/lots/gardens), respecting density (D-220) and BulkClass roofed-coverage fraction (D-233). (d) Waterfront footprint rule: pier/quay geometry on water-facing edge, standard frontage inland. Depends on 957 (skeleton).
Refinement (2026-05-26): READY behind 1006/957. Two-layer streets (D-234 refined): corridors = MST/least-cost graph over access-points + reservations + landmarks (Civ6 arterials, the audit graph; ribbon = MST on linear nodes, hub-spoke = MST + forced centroid hub); chunk_layout = +/-45 grid lattice per block (Civ4 local), modulated by D-096 Grid/Organic. Morphology -> permitted-pattern lookup gates D-215. Bridge node = waterfront block on a corridor (no separate type). Footprint subdivision = recursive bisection over the 128x128 integer grid, aggregate roofed area within the BulkClass coverage range. Waterfront = pier/quay on the water-facing edge. CorridorSpine/AccessPoint typed structs defined in 1006. Files: skeleton_gen.rs, generator.rs.
---
Largely SUBSUMED by #957 (2026-06-06): the footprint subdivision (BSP + D-233 coverage), the street network (typed AccessPoint/CorridorSpine/ChunkLayout, morphology-gated arterials per D-234a, ±45° local lattice), and the waterfront rule (D-234b) all landed in skeleton_gen.rs as one coherent walkable-quarter deliverable. REMAINING scope: the per-block-EDGE open-water adjacency refinement — applying pier geometry to the exact block edges that touch water — which needs Layer-1 terrain water-adjacency threaded to the quarter via the Layer-3 placement -> Layer-4 GenerateSkeleton dispatch (city_context_reader still stubs founding_orientation=Cardinal). Blocked on that dispatch; the waterfront rule is implemented and activates when real per-settlement orientation flows.
Closed via Si vet (2026-06-07): all four D-234 geometry deliverables (morphology gating, corridor/access-point net, BSP footprint subdivision, waterfront rule) landed + tested under T-957. The genuine residual — Layer-3→Layer-4 GenerateSkeleton dispatch (founding_orientation wiring) — is a distinct cross-layer concern, split into its own ticket.', 'done', 'high', NULL, 'server', 'D-234', '2026-05-25 19:08:51', '2026-06-07 08:10:17', NULL, '5ed1002e5a9b4cc2d4ddd2d81aa44e0d', 1) ON CONFLICT(id) DO UPDATE SET type=excluded.type, parent_id=excluded.parent_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 (id, type, parent_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('T-1022', 'story', 'T-750', 'Layer-3 -> Layer-4 GenerateSkeleton dispatch (founding_orientation wiring)', 'Wire Layer-3 settlement placement to Layer-4 quarter generation so the already-implemented Layer-4 geometry runs in production with real per-settlement orientation. Today there is NO production call site that dispatches GenerateSkeleton from a placement: city_context_reader.rs:484 stubs founding_orientation=Cardinal, so the implemented D-234b waterfront rule (and morphology-correct streets) stay dormant.
Scope: on GenCompletion::BodyAnalyzed, iterate state.placements and submit one GenerateSkeleton work item per placed settlement, building CityGenerationContext from each CityPlacement (context_from_read_set, city_context_reader.rs:~462) and overriding founding_orientation with the attractor-matched CityPlacement.founding_orientation (already computed in attractor_matching.rs:~535, carried on CityPlacement:~63).
Call sites: plugin.rs BodyAnalyzed handler (~84), gen_queue.rs GenerateSkeleton arm, city_context_reader.rs (stub at 484), attractor_matching.rs. Q-109 (multi-source/station dispatch) is adjacent but non-blocking for the planetary path. Surfaced by Si vetting (2026-06-07): T-976/989/990/991 geometry is done+tested but dormant without this dispatch.', 'backlog', 'high', NULL, 'server', 'D-234', '2026-06-07 08:10:17', '2026-06-07 08:10:17', NULL, '28ff6766a8a1d9c86c0d7e7a9e8801fb', 1) ON CONFLICT(id) DO UPDATE SET type=excluded.type, parent_id=excluded.parent_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);