diff --git a/.pql/changelog/ticket_history/2026-07.sql b/.pql/changelog/ticket_history/2026-07.sql index 12aa7d586..6eb5eba89 100644 --- a/.pql/changelog/ticket_history/2026-07.sql +++ b/.pql/changelog/ticket_history/2026-07.sql @@ -1160,3 +1160,8 @@ INSERT INTO ticket_history (ticket_record_id, field, old_value, new_value, chang 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 ('06FB0TNSRZKXHAYMT7Q6WW3XDC', 'status', 'in_progress', 'review', NULL, '2026-07-11 08:34:23', '2026-07-11 08:34:23.130', '2026-07-11 08:34:23.130', NULL, '2bb7676b99d3663b810cddc0a345e2c4', 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 ('06FBPTXQGAX5GT4PTTBQYGJCV4', 'status', 'in_progress', 'review', NULL, '2026-07-11 08:34:23', '2026-07-11 08:34:23.130', '2026-07-11 08:34:23.130', NULL, '38f22584bb357e186b0b816bc16e55d3', 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 ('06FM4VQCXZ9JEXPCM4ZQD5WXNW', 'status', 'in_progress', 'review', NULL, '2026-07-11 08:34:23', '2026-07-11 08:34:23.130', '2026-07-11 08:34:23.130', NULL, '50bab55442eba405f747c5002ec8093d', 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 ('06FMZZ0184R5B8YMFJW5NWPNXW', 'parent_id', 'T-959', 'T-750', NULL, '2026-07-11 12:54:35', '2026-07-11 12:54:35.373', '2026-07-11 12:54:35.373', NULL, 'b09eacf8ed0d8a96f8e56e5a462dcf02', 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 ('06FB0TNSRZWSSHC2S5KPKAZ5QR', 'status', 'review', 'done', NULL, '2026-07-11 12:54:38', '2026-07-11 12:54:38.771', '2026-07-11 12:54:38.771', NULL, 'c8a1836a9b45795bfe1399605218a60d', 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 ('06FM4VQCXZ9JEXPCM4ZQD5WXNW', 'status', 'review', 'done', NULL, '2026-07-11 12:54:38', '2026-07-11 12:54:38.778', '2026-07-11 12:54:38.778', NULL, 'cc484b2a90166dec75547367ee9d8f59', 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 ('06FB0TNSRZKXHAYMT7Q6WW3XDC', 'status', 'review', 'done', NULL, '2026-07-11 12:54:38', '2026-07-11 12:54:38.779', '2026-07-11 12:54:38.779', NULL, 'e957e4e756f5d5c35c87c2c4c0152512', 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 ('06FBPTXQGAX5GT4PTTBQYGJCV4', 'status', 'review', 'done', NULL, '2026-07-11 12:54:38', '2026-07-11 12:54:38.779', '2026-07-11 12:54:38.779', NULL, 'fe7d55a6b7e05931138edfd2ab6038eb', 2) ON CONFLICT(hash) DO NOTHING; diff --git a/.pql/changelog/tickets/2026-07.sql b/.pql/changelog/tickets/2026-07.sql index dad42a101..8e4182cc4 100644 --- a/.pql/changelog/tickets/2026-07.sql +++ b/.pql/changelog/tickets/2026-07.sql @@ -1164,3 +1164,37 @@ Refinement (/whats-next 2026-07-08): triage dispositions RESOLVED (user): - Q-105: CLAIM THE D-RECORD NOW (user decision) — design the region transient mechanics as part of this ticket: seasonal phase stepping, tidal term, weather term, snow/ice depth rise/fall, crop-cycle cadence, recompute-on-phase-change; grounded in D-243 §3/§4 region-clock structure (T-1078) and the three shipped punts (freeze/snow model, region climate stack, water-body gen). Claim via pql decisions claim D architecture; resolve Q-105 against it. Deliverables: governance notes for all four Q-records + the new Q-105 D-record. This ticket gates T-959''s start.', 'review', 'medium', NULL, 'server', NULL, '2026-06-12 10:40:59', '2026-07-11 08:34:23.130', NULL, '8081e7d8a6e0e4a9620dd98b7765275d', 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 ('06FM4VQCXZ9JEXPCM4ZQD5WXNW', 'task', '06FB0TNSRZKXHAYMT7Q6WW3XDC', 'Operations-surface fill — BulkClass-driven built-infrastructure tag over the non-roofed block remainder (D-233)', 'D-233: for bulk-industry blocks (BulkSolid/BulkLiquid), the non-roofed remainder is operations surface (haul roads, ore pads, conveyor runs, tank berms) — tagged built economic infrastructure, NOT generic interstitial open space. Today skeleton_gen.rs::subdivide_block_footprints computes roofed_coverage_pct from BulkClass but treats 100% of the remainder as generic interstitial (yards/parks/lots); no operations-surface tag exists anywhere. Distinct derivation axis from T-988''s density/setback-driven interstitial TYPE: this is the economic signal (dominant_bulk_class on context). Split out of T-959 during /whats-next refinement 2026-07-08 so it has a visible owner.', 'review', 'medium', NULL, 'server', 'D-233', '2026-07-08 15:53:13.711', '2026-07-11 08:34:23.130', NULL, '9e81bcabefcaeefeeff5ab0da3dde4f6', 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 ('06FMZZ0184R5B8YMFJW5NWPNXW', 'task', '06FB0TNSRZXCHGS16BFHSSGSV4', 'Interstitial fill — tile character between building footprints (setback-driven open space vs. built ops-surface) at chunk derive', 'Deferred slice of T-959 (Layer 5 fill), split out during /whats-next review 2026-07-08. T-988 landed BuildingExteriorTag.setback_tier + BlockSkeleton.interstitial_character (OpenSpace|OperationsSurface, D-233 bulk-driven), and FillChunk now reads materials onto Wall/Roof shell voxels. What remains: actually FILL the between-footprint tiles at chunk-derive time — resolve each non-footprint ground tile to its character (setback-driven interstitial type: void/court/garden/plaza/dock_slip/market_pad/open_lawn per D-235; or the block''s OperationsSurface tag for bulk industry per D-233/T-1097).\n\nWHY DEFERRED (Dudley''s rationale, PR review): FillChunk''s work item today carries only Vec (per-building) with zero block-level metadata; setback_tier is per-building on exterior, but ''the gap between buildings'' is block-shaped. And ''what is an interstitial tile inside a 64m chunk derive'' is a real geometry question (the BSP leaves that lost the coverage roll in subdivide_block_footprints? a separate ground-fill pass?) that needs a design pass, not a guess. Nothing consumes FillChunk in production until Phase 5, so this blocks nothing today.\n\nSCOPE: (1) thread block-level metadata (interstitial_character + setback/density) into the FillChunk work item; (2) decide + implement the ground-fill geometry (which chunk tiles are interstitial vs footprint-covered vs street); (3) resolve each to its D-235 interstitial type / D-233 ops-surface tag; (4) stays pure/cache-free (T-987). Write a short brief pinning the geometry model before implementing.', 'backlog', 'medium', NULL, 'server', 'D-235', '2026-07-11 07:02:23.297', '2026-07-11 12:54:35.373', NULL, 'e85052ff6edeaa5fa18b9811d9be4451', 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 ('06FB0TNSRZWSSHC2S5KPKAZ5QR', 'task', '06FB0TNSRZKXHAYMT7Q6WW3XDC', 'BuildingExteriorTag visual grammar + material vocabulary (template-filtered)', '(architecture_flavor x zone_type x era x density) -> BuildingExteriorTag{wall_material, roof_form, setback_tier, facade_rhythm, color_range}. Vocabulary: WallMaterial/RoofForm/FacadeRhythm/StreetSurface (extends D-228 FloorMaterial). 4-step derivation: flavor filter -> zone bias -> era restrict -> density setback -> interstitial type. Color flavor-bounded/era-adjusted/seed-selected. + +--- +Refinement (/whats-next 2026-07-08): AUTHORED-DEPTH v1 (user decision — "deliver what we want to deliver in the first run"; pull Miri + Araminta into the ticket for the content catalog). RESOLVED: +1. Derivation is 3-STEP, era-free (D-235 amendment / D-232 reframe): template visual_bundle filter -> zone_type bias -> density setback + interstitial type. Drop the stale "era restrict" step and "era-adjusted" color — era reads as wear via D-217 condition, never a material gate. +2. Phase timing (per the T-994 precedent, same rationale): BuildingExteriorTag is resolved at GenerateSkeleton dispatch/plan time — where context, catalog, and flavor_ref resolution are available — and stored FROZEN on BuildingPropertyTag; FillChunk only reads it (T-987 purity). Swerve(tag) refs resolve against the full catalog at the same point. +3. trait_catalog_reader must be extended to parse visual_bundle (+ the new fields below) — currently explicitly unparsed ("D-235 territory"). +4. Vocabulary becomes append-only integer-discriminant Rust enums (WallMaterial/RoofForm/FacadeRhythm/StreetSurface), matching the SeedDomain/DistrictType convention; unknown registry strings parse to the axis generic with a tracing warning (patch tolerance). Registry TOML remains the authoring source (V-TT-03/04 validated). +5. Zone bias is a REAL authored table: per-template zone_type -> token weight overrides (integer bps), authored by Miri (cultural meaning) + Araminta (visual coherence) into the catalog TOML alongside visual_bundle; importer-validated (new V-TT check: referenced tokens exist in the template''s own visual_bundle axis). Uniform fallback where unauthored. +6. color_range is a NUMERIC model now: per-color_register authored integer ranges (e.g. HSV/OKLCH components as integer bps bands, D-010 — no floats), one table keyed by the 28 color_register values, Araminta-authored; per-building seed pick within the template''s register band, stored as integers on BuildingExteriorTag. +7. StreetSurface is IN SCOPE here: derived per street/interstitial run with the same template filter (D-235 "same filter as buildings"), stored alongside the interstitial type. +8. setback_tier: fixed 5-tier vocabulary (zero_lot | tight | standard | generous | campus) derived from BlockSkeleton.density_pct bands (the shipped axis; D-220 DensityClass has no code representation) — thresholds documented as calibration placeholders. +Content deliverables (Miri + Araminta): zone-bias table + color_register numeric bands for all 28 templates/registers. Code deliverables: reader extension, enums, derivation fn at skeleton time, importer validation, tests.', 'done', 'medium', NULL, 'server', 'D-235', '2026-05-25 19:11:19', '2026-07-11 12:54:38.771', NULL, 'e78de3cf2889a25aa80aab7d8bb7241f', 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 ('06FM4VQCXZ9JEXPCM4ZQD5WXNW', 'task', '06FB0TNSRZKXHAYMT7Q6WW3XDC', 'Operations-surface fill — BulkClass-driven built-infrastructure tag over the non-roofed block remainder (D-233)', 'D-233: for bulk-industry blocks (BulkSolid/BulkLiquid), the non-roofed remainder is operations surface (haul roads, ore pads, conveyor runs, tank berms) — tagged built economic infrastructure, NOT generic interstitial open space. Today skeleton_gen.rs::subdivide_block_footprints computes roofed_coverage_pct from BulkClass but treats 100% of the remainder as generic interstitial (yards/parks/lots); no operations-surface tag exists anywhere. Distinct derivation axis from T-988''s density/setback-driven interstitial TYPE: this is the economic signal (dominant_bulk_class on context). Split out of T-959 during /whats-next refinement 2026-07-08 so it has a visible owner.', 'done', 'medium', NULL, 'server', 'D-233', '2026-07-08 15:53:13.711', '2026-07-11 12:54:38.778', NULL, 'de9023ba8bde9ca813b846492a52f54b', 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 ('06FB0TNSRZKXHAYMT7Q6WW3XDC', 'story', '06FB0TNSRZXCHGS16BFHSSGSV4', 'Layer 5 — Chunk→Tile fill (floors, walls, materials, interstitial)', 'THE primary gap (generator.rs is stubbed). Generate walkable tiles from the block/chunk skeleton: floors, walls, doors, placed objects, using tile-condition thresholds 0.63/0.43/0.23 (D-217). Output is the walkable world data. + +Refinement (round 2, 2026-05-25): Layer-5 fill is the D-230 on-demand derive phase (<5ms shell derivation Void/Wall/FloorSlab/Roof from the cached tags) plus the BuildingExteriorTag visual grammar and material vocabulary (D-235: WallMaterial/RoofForm/FacadeRhythm/StreetSurface, template-filtered (era = maintenance/wear, not a material gate)) plus interstitial and operations-surface fill driven by BulkClass coverage (D-233). Blocked by 957, 976, 977. + +Refinement (2026-05-26): READY behind 1006/957/976/977/1005. shell_derive = rectangle-containment + z-range over cached tags (~0.5ms/chunk). FillChunk pre-condition: only after SkeletonGenerated; re-enqueue High if block_tags absent. Wire chunk_streaming.rs to enqueue FillChunk on load-radius entry (no GenerationQueue interaction today). Interstitial token derived from setback_tier (D-235) x position; bulk operations-surface tagged built-infra, not open space. Child 988 = exterior grammar, now 3-step template-filtered (era is wear, not a material gate). Files: gen_queue.rs FillChunk arm, workers/stubs.rs, plugin.rs SkeletonGenerated handler. + +--- +Refinement (/whats-next 2026-07-08): SCOPE PINNED post-PR #173. T-987 (shell derivation) shipped; remaining T-959 scope = floors/walls/materials + interstitial fill. RESOLVED (user): "placed objects" DESCOPED — no D-record, vocabulary, or code path exists; exterior props arrive with the asset pipeline and interiors are Phase 6 (cascade). Title updated accordingly. Doors stay deferred to T-979/T-998 (BuildingPropertyTag.doors = empty, commented "#979"). Confirmed non-gaps (Si sweep): D-217 thresholds 0.63/0.43/0.23 unchanged, initial_condition frozen at plan time and consumed by T-999 (not here); Atlas tile-layer visualization is T-960''s scope — T-959''s deliverable is DATA only; chunk_streaming.rs FillChunk enqueue wiring is a deliberate Phase-5 deferral gated by T-962 (per T-987 close-out), not this ticket. D-233 operations-surface fill split to a new child task (BulkClass-driven, distinct from T-988''s density/setback-driven interstitial type).', 'done', 'high', NULL, 'server', 'D-217', '2026-05-22 17:42:34', '2026-07-11 12:54:38.779', NULL, '7a71646b2f3490f61fcd9a4ee7f8804a', 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 ('06FBPTXQGAX5GT4PTTBQYGJCV4', 'task', '06FB0TNSRZXCHGS16BFHSSGSV4', 'Triage the Phase-4 question set before T-959 starts: Q-102, Q-103, Q-105, Q-109', '(description follows in first append) + +--- +RECOVERED DESCRIPTION (lost to a same-second create+append LWW tie-break on changelog rebuild; recovered from .pql/changelog/ticket_history/2026-06.sql — pql bug filed upstream): "The remaining Phase-4 spine is T-959 (Layer 5 tile fill) -> T-962 (validation + Phase-5 gate). Four open architecture questions sit directly under that work with no owners: Q-103 (tile-mutator op schema — needed before T-959 Layer 5), Q-102 (cohesion-matrix seam-free variation — needed for tile fill; relates to T-1042), Q-105 (region seasonal/clock state), Q-109 (generation-source dispatch: planet/station/mod/save). Answer or ticket each before T-959 kicks off; Q-103 and Q-102 are the most load-bearing. Also now open from the audit: Q-110 (scale anchoring — blocks the spine ticket) and Q-111 (live-econ coupling — gates T-1007/T-982 sequencing)." + +Refinement (/whats-next 2026-07-08): triage dispositions RESOLVED (user): +- Q-102: RESOLVED-IN-PRACTICE — close with a resolution note citing D-246 voxel_mosaic (noise basis/keying/determinism), T-1080 (meso gradients), T-1077 (ladder), and D-228''s categorical FloorMaterial override stack (authored features composite without bleed). +- Q-103: DEFER with dated note — its own text scopes to Phase 5+ save system; T-987 shipped Layer-5 shell fill without mutators (empirical non-blocker). Revisit at Phase-5 save-system kickoff. +- Q-109: DEFER with dated note — planetary path is the only live source; D-229''s 2026-06-05 amendment carved the station interim. Revisit before stations/mods/save-only bodies. +- Q-105: CLAIM THE D-RECORD NOW (user decision) — design the region transient mechanics as part of this ticket: seasonal phase stepping, tidal term, weather term, snow/ice depth rise/fall, crop-cycle cadence, recompute-on-phase-change; grounded in D-243 §3/§4 region-clock structure (T-1078) and the three shipped punts (freeze/snow model, region climate stack, water-body gen). Claim via pql decisions claim D architecture; resolve Q-105 against it. +Deliverables: governance notes for all four Q-records + the new Q-105 D-record. This ticket gates T-959''s start.', 'done', 'medium', NULL, 'server', NULL, '2026-06-12 10:40:59', '2026-07-11 12:54:38.779', NULL, 'd23c1f352027727a0ba8f231fffcf96e', 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);