chore(meta): cascade refocus — supersede v0.2 cluster, re-home backlog tree, capture workshop WIP

Governance:
- D-166 amendment (2026-06-12): outside-in build order (geo → econ-on-world →
  building templates → door boundary contracts → NPC/interiors → gameplay);
  Phase 5 ramps in parallel once outsides are walkable (gate: T-962)
- D-114/D-115/D-117/D-118/D-120 marked superseded by D-166 (inbound anchors fixed)
- D-221 amended: milestones retired, cascade-hierarchy gating is canonical
- Q-077/Q-068/Q-036 resolved (answered by events); Q-110 (scale anchoring) and
  Q-111 (live-econ coupling) opened from cascade grounding

Ticket tree (147 stray backlog tickets dispositioned):
- New parents: T-1036 (post-cascade gameplay parking), T-1037 (maintenance initiative)
- Re-homed: 15 → Phase 4 (T-750), 30 → Phase 5 (T-749), 11 → Phase 6 (T-751),
  21 → gameplay parking, 28 → maintenance; children follow their epics
- Cancelled 12 administrative shells (mirror tickets, emptied pre-cascade umbrellas,
  v0.2 pivot shell T-603); T-9/T-28 closed done; T-745 in_progress
- New grounded tickets T-1038..T-1044: inter-settlement road/rail graph, L3→L4
  dispatch threading, river-channel-anchor bug, 64m landform-repeat bug,
  region seam blending, road-entry octants, drainage re-run fix

Docs:
- CLAUDE.md cascade paragraph updated to the amended rule
- 20 v0.1-era docs/design files marked superseded with pointers;
  content-structure-canonical retitled (v0.2 label dropped)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-06-12 12:26:32 +02:00
co-authored by Claude Fable 5
parent 5adf2b8bd7
commit ca255dc16c
35 changed files with 2100 additions and 62 deletions
+965
View File
@@ -262,3 +262,968 @@ 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 ('06FB0TNSRW8G7MTH1FRGR1FN1W', 'status', 'backlog', 'done', NULL, '2026-06-08 21:01:34', '2026-06-08 21:01:34', '2026-06-08 21:01:34', NULL, '25f77f3b46ef200f7bb46f373eb5b381', 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 ('06FB0TNSRWHN6KDZ5F97XDBD48', 'status', 'backlog', 'done', NULL, '2026-06-08 21:01:34', '2026-06-08 21:01:34', '2026-06-08 21:01:34', NULL, '29a486b50ed7bacb44f1325c4373b53c', 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 ('06FB0TNSRZ9FH06QVXD4T20BF8', 'status', 'backlog', 'done', NULL, '2026-06-09 06:18:57', '2026-06-09 06:18:57', '2026-06-09 06:18:57', NULL, 'b42a8ddec35e477153a5c6795e750309', 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 ('06FB0TNSRYXCMB1D08PW87FR9C', 'parent_id', NULL, 'T-749', NULL, '2026-06-12 10:23:02', '2026-06-12 10:23:02', '2026-06-12 10:23:02', NULL, 'c66d29eccfb301d3445068f937a18cd3', 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 ('06FB0TNSRYXCMB1D08PW87FR9C', 'description', NULL, 'Parked under Phase 5 epic per cascade refocus 2026-06-12 — art direction (Q-003, still open) is decided when in-world rendering with final-version assets begins.', NULL, '2026-06-12 10:23:02', '2026-06-12 10:23:02', '2026-06-12 10:23:02', NULL, 'acc5b2b585797cc26b0c657f5bc70f66', 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 ('06FB0TNSRYWZ8VC3HVQJ6HA59R', 'parent_id', NULL, 'T-1036', NULL, '2026-06-12 10:23:02', '2026-06-12 10:23:02', '2026-06-12 10:23:02', NULL, '13bb215610501643a44c03b05f87139a', 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 ('06FB0TNSRYWZ8VC3HVQJ6HA59R', 'description', NULL, 'Parked post-cascade per refocus 2026-06-12 — licensing/distribution (Q-008, still open) is a making-it-a-game/shipping concern with no generation dependency.', NULL, '2026-06-12 10:23:02', '2026-06-12 10:23:02', '2026-06-12 10:23:02', NULL, 'ac5e3e61c3e2fd426eac582e35e9dbc1', 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 ('06FB0TNSRY7PWMK1F1DAWC08T8', 'parent_id', NULL, 'T-1036', NULL, '2026-06-12 10:23:02', '2026-06-12 10:23:02', '2026-06-12 10:23:02', NULL, '44df46eed03f99971d46904b317b9290', 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 ('06FB0TNSRY7PWMK1F1DAWC08T8', 'description', NULL, 'Parked post-cascade per refocus 2026-06-12 — storyteller AI (Q-010, still open) is a gameplay system with no generation dependency; functional requirement preserved.', NULL, '2026-06-12 10:23:02', '2026-06-12 10:23:02', '2026-06-12 10:23:02', NULL, '6b090290ac932f4a707ffedd091699f2', 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 ('06FB0TNSRWABN2YJ0SNKRW9D7G', 'parent_id', 'T-29', 'T-751', NULL, '2026-06-12 10:23:02', '2026-06-12 10:23:02', '2026-06-12 10:23:02', NULL, 'ee2560b28a02038833e636f93ad34df4', 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 ('06FB0TNSRWABN2YJ0SNKRW9D7G', 'description', 'Four-tier NPC simulation: Active (full sim), Background (state machines), State-saved (frozen structs), Ungenerated. Timestamp-based LRU eviction, scope tags.', 'Four-tier NPC simulation: Active (full sim), Background (state machines), State-saved (frozen structs), Ungenerated. Timestamp-based LRU eviction, scope tags.
Re-parented under Phase 6 epic per cascade refocus 2026-06-12 background NPC simulation tiers follow world generation and door boundary contracts; former parent T-29 is cancelled. Functional requirement preserved.', NULL, '2026-06-12 10:23:02', '2026-06-12 10:23:02', '2026-06-12 10:23:02', NULL, 'f3e02a0c6c68ad33cd12b894d087e377', 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 ('06FB0TNSRWCSXFAG1E4TS7HAB4', 'parent_id', 'T-30', 'T-749', NULL, '2026-06-12 10:23:02', '2026-06-12 10:23:02', '2026-06-12 10:23:02', NULL, '2cd468c25ba21e6f4526b6567fdf2075', 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 ('06FB0TNSRWCSXFAG1E4TS7HAB4', 'description', 'LOS-based shadowcasting per z-level. Vision cone (forward/peripheral/behind). Walls block vision, fog returns on departure. Universal for all entities.', 'LOS-based shadowcasting per z-level. Vision cone (forward/peripheral/behind). Walls block vision, fog returns on departure. Universal for all entities.
Re-parented under Phase 5 epic per cascade refocus 2026-06-12 fog-of-perception vision is a player-surface system built on generated tiles; functional requirement preserved.', NULL, '2026-06-12 10:23:02', '2026-06-12 10:23:02', '2026-06-12 10:23:02', NULL, 'f27fb8bb3f82aa2c2e640ac1bcb2a0c2', 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 ('06FB0TNSRY3PA3E31NAVQHR5GC', 'parent_id', 'T-30', 'T-749', NULL, '2026-06-12 10:23:02', '2026-06-12 10:23:02', '2026-06-12 10:23:02', NULL, '5a6ad9dfd0221949c5a5275b6f7a882d', 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 ('06FB0TNSRY3PA3E31NAVQHR5GC', 'description', 'Locked to character, no panning. Optional rotation to facing direction (deferred to post-v0.1). Fixed-north for v0.1.', 'Locked to character, no panning. Optional rotation to facing direction (deferred to post-v0.1). Fixed-north for v0.1.
Re-parented under Phase 5 epic per cascade refocus 2026-06-12 locked camera is player-control work; functional requirement preserved.', NULL, '2026-06-12 10:23:02', '2026-06-12 10:23:02', '2026-06-12 10:23:02', NULL, '2935f673242e4ff88f0c7b14ce178227', 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 ('06FB0TNSRWBH6313PF00570RGR', 'parent_id', 'T-30', 'T-749', NULL, '2026-06-12 10:23:02', '2026-06-12 10:23:02', '2026-06-12 10:23:02', NULL, '77d0da1e080fc948b94272d2c25d9c14', 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 ('06FB0TNSRWBH6313PF00570RGR', 'description', 'Character voice narration for non-visual perception, atmosphere, diegetic hints. Contextual line selection based on situation, character personality, knowledge state.', 'Character voice narration for non-visual perception, atmosphere, diegetic hints. Contextual line selection based on situation, character personality, knowledge state.
Re-parented under Phase 5 epic per cascade refocus 2026-06-12 internal monologue is a player perception surface; line-content detail can deepen in Phase 6. Functional requirement preserved.', NULL, '2026-06-12 10:23:02', '2026-06-12 10:23:02', '2026-06-12 10:23:02', NULL, '5cb0f2cc30572fbd4e0c4e326a690fd6', 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 ('06FB0TNSRZP5KQ8RHFQQZK1ZJ0', 'parent_id', 'T-30', 'T-749', NULL, '2026-06-12 10:23:02', '2026-06-12 10:23:02', '2026-06-12 10:23:02', NULL, '5ecacf30ef2ddc7a4795664d972e88f3', 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 ('06FB0TNSRZP5KQ8RHFQQZK1ZJ0', 'description', 'Three-range sound: Close (stereo audio), Medium (fog-edge indicators + monologue), Long (insert notifications - stretch). Event classification, directional info.', 'Three-range sound: Close (stereo audio), Medium (fog-edge indicators + monologue), Long (insert notifications - stretch). Event classification, directional info.
Re-parented under Phase 5 epic per cascade refocus 2026-06-12 three-range sound propagation is a player perception surface; functional requirement preserved.', NULL, '2026-06-12 10:23:02', '2026-06-12 10:23:02', '2026-06-12 10:23:02', NULL, 'aac020d884d5d85b56cf89e2172b0c35', 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 ('06FB0TNSRW1VJS6GTSSYHK63F8', 'parent_id', 'T-30', 'T-749', NULL, '2026-06-12 10:23:02', '2026-06-12 10:23:02', '2026-06-12 10:23:02', NULL, 'd2081a15249a24965d1330a5c0386d3d', 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 ('06FB0TNSRW1VJS6GTSSYHK63F8', 'description', 'Tile-based rendering, sprite system, z-level visualization, fog overlay. 3D cutscenes deferred post-v0.1.', 'Tile-based rendering, sprite system, z-level visualization, fog overlay. 3D cutscenes deferred post-v0.1.
Re-parented under Phase 5 epic per cascade refocus 2026-06-12 in-world tile/sprite rendering on generated tiles (D-019 superseded by D-148); functional requirement preserved.', NULL, '2026-06-12 10:23:02', '2026-06-12 10:23:02', '2026-06-12 10:23:02', NULL, '454fbef5ee0d84b9ce909939985f1ef6', 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 ('06FB0TNSRY8XYH2CGTVR0TJ7W8', 'parent_id', 'T-30', 'T-749', NULL, '2026-06-12 10:23:02', '2026-06-12 10:23:02', '2026-06-12 10:23:02', NULL, 'f8d2d646f4307ea3376822d7f73e916d', 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 ('06FB0TNSRY8XYH2CGTVR0TJ7W8', 'description', 'Natural vision baseline for v0.1. Modular architecture for future modes (thermal, camera feeds, unisphere tracking, audio analysis). Observer query pattern.', 'Natural vision baseline for v0.1. Modular architecture for future modes (thermal, camera feeds, unisphere tracking, audio analysis). Observer query pattern.
Re-parented under Phase 5 epic per cascade refocus 2026-06-12 perception mode framework extends the player vision baseline; functional requirement preserved.', NULL, '2026-06-12 10:23:02', '2026-06-12 10:23:02', '2026-06-12 10:23:02', NULL, '1e2a6a34400d84b3c2b61e0bbcd4bacf', 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 ('06FB0TNSRYTW3T8YYBJ0VSSZM8', 'parent_id', 'T-31', 'T-749', NULL, '2026-06-12 10:23:02', '2026-06-12 10:23:02', '2026-06-12 10:23:02', NULL, '8ed79aabbe82e7c061b9fb52c70443ea', 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 ('06FB0TNSRYTW3T8YYBJ0VSSZM8', 'description', 'First-class information tagging. Every piece of game state tagged with observer access. Foundation for fog, perception modes, NPC knowledge.', 'First-class information tagging. Every piece of game state tagged with observer access. Foundation for fog, perception modes, NPC knowledge.
Re-parented under Phase 5 epic per cascade refocus 2026-06-12 observer-access information tagging is the foundation for fog/perception player surfaces; functional requirement preserved.', NULL, '2026-06-12 10:23:02', '2026-06-12 10:23:02', '2026-06-12 10:23:02', NULL, 'f56430bad89233185505cfd24fd56f44', 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 ('06FB0TNSRXX5X1PDENVXC4DRJ4', 'parent_id', 'T-31', 'T-750', NULL, '2026-06-12 10:23:02', '2026-06-12 10:23:02', '2026-06-12 10:23:02', NULL, '9e18abe02c8434f669e53702aa87a7a8', 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 ('06FB0TNSRXX5X1PDENVXC4DRJ4', 'description', 'Chunk generation and loading. Bounded maps with internal chunks for v0.1. Architecture supports future borderless generation.', 'Chunk generation and loading. Bounded maps with internal chunks for v0.1. Architecture supports future borderless generation.
Re-parented under Phase 4 epic per cascade refocus 2026-06-12 chunk generation/loading is tile/chunk world-generation work; functional requirement preserved.', NULL, '2026-06-12 10:23:02', '2026-06-12 10:23:02', '2026-06-12 10:23:02', NULL, 'c1e51f575d9b8f35a6020f0e46b3ab95', 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 ('06FB0TNSRXZK7C4X2DHQ6A0CKR', 'parent_id', 'T-31', 'T-749', NULL, '2026-06-12 10:23:02', '2026-06-12 10:23:02', '2026-06-12 10:23:02', NULL, '038fac2828b333f27c54b61abd8d870d', 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 ('06FB0TNSRXZK7C4X2DHQ6A0CKR', 'description', 'Neural insert UI. POI discovery system (background, NPC tips, research, discovery). Minimap with directional arrows for distant POIs.', 'Neural insert UI. POI discovery system (background, NPC tips, research, discovery). Minimap with directional arrows for distant POIs.
Re-parented under Phase 5 epic per cascade refocus 2026-06-12 minimap/POI discovery is a HUD navigation surface for in-world play; functional requirement preserved.', NULL, '2026-06-12 10:23:02', '2026-06-12 10:23:02', '2026-06-12 10:23:02', NULL, 'c28b1ea27a5afab3f9e6a5960270178a', 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 ('06FB0TNSRY5H0R4JCAJ6MY4X44', 'parent_id', 'T-31', 'T-750', NULL, '2026-06-12 10:23:02', '2026-06-12 10:23:02', '2026-06-12 10:23:02', NULL, '65285746bb61b511e1cb294b1d9dab6f', 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 ('06FB0TNSRY5H0R4JCAJ6MY4X44', 'description', 'Revise D-014 for vertical slice: station district layout, workplace/bar/smuggling ring locations, 15-40 tile functional clusters, 2-3 z-levels.', 'Revise D-014 for vertical slice: station district layout, workplace/bar/smuggling ring locations, 15-40 tile functional clusters, 2-3 z-levels.
Re-parented under Phase 4 epic per cascade refocus 2026-06-12 the v0.1 vertical-slice framing is superseded, but station district layout with functional clusters survives as econ-layer/building-placement generation work.', NULL, '2026-06-12 10:23:02', '2026-06-12 10:23:02', '2026-06-12 10:23:02', NULL, '387bd6989f40f1223efdff0357cd71ac', 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 ('06FB0TNSRW1K4QJHAVSJF2ECSC', 'parent_id', 'T-32', 'T-1036', NULL, '2026-06-12 10:23:02', '2026-06-12 10:23:02', '2026-06-12 10:23:02', NULL, '6e6f49edb507432db42747f91db95163', 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 ('06FB0TNSRW1K4QJHAVSJF2ECSC', 'description', 'Tier 1: Drama module pool system. Tier 2: Template instantiation engine. Tier 3: Procedural filler generation. Storyteller activation logic.', 'Tier 1: Drama module pool system. Tier 2: Template instantiation engine. Tier 3: Procedural filler generation. Storyteller activation logic.
Parked post-cascade per refocus 2026-06-12 drama modules, storyteller activation, and narrative content pipeline are game-making systems with no generation dependency; functional requirement preserved.', NULL, '2026-06-12 10:23:02', '2026-06-12 10:23:02', '2026-06-12 10:23:02', NULL, 'a277520590b43d0748efde7dbd10bed6', 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 ('06FB0TNSRW5FXRP4KGCC3CBMAW', 'parent_id', 'T-32', 'T-750', NULL, '2026-06-12 10:23:02', '2026-06-12 10:23:02', '2026-06-12 10:23:02', NULL, '44c5285a6937effad79acc92e73cafd5', 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 ('06FB0TNSRW5FXRP4KGCC3CBMAW', 'description', 'Functional cluster definition: 4-8 NPC roles, 15-40 tile spaces, sightline requirements. Single-ownership with reference links. Template → instance lifecycle.', 'Functional cluster definition: 4-8 NPC roles, 15-40 tile spaces, sightline requirements. Single-ownership with reference links. Template → instance lifecycle.
Re-parented under Phase 4 epic per cascade refocus 2026-06-12 the spatial functional-cluster template (15-40 tile spaces, sightlines, template-to-instance lifecycle) is the building-templates cascade step; NPC-role population detail follows in Phase 6.', NULL, '2026-06-12 10:23:02', '2026-06-12 10:23:02', '2026-06-12 10:23:02', NULL, 'cad7289c84b16db98381f770b7f36044', 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 ('06FB0TNSRXXVCGN5D35ZJ7M0MW', 'parent_id', 'T-32', 'T-751', NULL, '2026-06-12 10:23:02', '2026-06-12 10:23:02', '2026-06-12 10:23:02', NULL, '5ae330ee71539aed360590ab1f526104', 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 ('06FB0TNSRXXVCGN5D35ZJ7M0MW', 'description', 'Tagged line pools with systemic selection. Four relational layers: access tiers, relationship history, trust-gated gossip, unprompted disclosure. Trait modifier system.', 'Tagged line pools with systemic selection. Four relational layers: access tiers, relationship history, trust-gated gossip, unprompted disclosure. Trait modifier system.
Re-parented under Phase 6 epic per cascade refocus 2026-06-12 dialogue architecture and relational layers are NPC detail-coloring work; functional requirement preserved.', NULL, '2026-06-12 10:23:02', '2026-06-12 10:23:02', '2026-06-12 10:23:02', NULL, 'e336c2447fc8e985501e74fa880b5f26', 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 ('06FB0TNSRXYZC8QDKK423KFSKC', 'parent_id', 'T-32', 'T-751', NULL, '2026-06-12 10:23:02', '2026-06-12 10:23:02', '2026-06-12 10:23:02', NULL, 'd10283ce770006a7973c76a465deccb2', 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 ('06FB0TNSRXYZC8QDKK423KFSKC', 'description', '30/50/20 entanglement ratio (flat/mundane/intrigue). Variable per seed. Module attachment to known NPCs (60-70/30-40 ratio, also variable).', '30/50/20 entanglement ratio (flat/mundane/intrigue). Variable per seed. Module attachment to known NPCs (60-70/30-40 ratio, also variable).
Re-parented under Phase 6 epic per cascade refocus 2026-06-12 population entanglement ratios are background-NPC-layer work; functional requirement preserved.', NULL, '2026-06-12 10:23:02', '2026-06-12 10:23:02', '2026-06-12 10:23:02', NULL, '57ee2ecbff7e57e7c04c9db0bce007f9', 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 ('06FB0TNSRZ5AP28E96W00KB0R4', 'parent_id', 'T-34', 'T-1037', NULL, '2026-06-12 10:23:02', '2026-06-12 10:23:02', '2026-06-12 10:23:02', NULL, '18b7b8e77384722d0257113caad93b93', 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 ('06FB0TNSRZ5AP28E96W00KB0R4', 'description', 'Test harness for simulation server. External test modules, deterministic replay, ECS state inspection, behavior validation. Minimal production code pollution.', 'Test harness for simulation server. External test modules, deterministic replay, ECS state inspection, behavior validation. Minimal production code pollution.
Re-homed under the maintenance umbrella per cascade refocus 2026-06-12 server test infrastructure is ongoing infra hygiene (much already delivered via the Gauntlet/verification harness); remaining scope preserved.', NULL, '2026-06-12 10:23:02', '2026-06-12 10:23:02', '2026-06-12 10:23:02', NULL, 'fd801d30de40ef78e44be5f0c73d4ce7', 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 ('06FB0TNSRYDYTDC36V3EPDD7VR', 'parent_id', 'T-34', 'T-1037', NULL, '2026-06-12 10:23:02', '2026-06-12 10:23:02', '2026-06-12 10:23:02', NULL, 'e0f9603cf6a22863f14a7bc919bdd0f5', 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 ('06FB0TNSRYDYTDC36V3EPDD7VR', 'description', 'Test harness for rendering client. Scene testing, input simulation, rendering verification, fog/UI validation.', 'Test harness for rendering client. Scene testing, input simulation, rendering verification, fog/UI validation.
Re-homed under the maintenance umbrella per cascade refocus 2026-06-12 client test infrastructure is ongoing infra hygiene (TestHarness and live-tier testing already exist); remaining scope preserved.', NULL, '2026-06-12 10:23:02', '2026-06-12 10:23:02', '2026-06-12 10:23:02', NULL, '605b5c9a226bfe7a5212e97f89a12d39', 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 ('06FB0TNSRWYX9HMVEXES6GHXPW', 'parent_id', 'T-34', 'T-1037', NULL, '2026-06-12 10:23:02', '2026-06-12 10:23:02', '2026-06-12 10:23:02', NULL, 'afb0b4e42def97e7e0edf0fa3296b84b', 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 ('06FB0TNSRWYX9HMVEXES6GHXPW', 'description', 'End-to-end tests across IPC boundary. Protocol validation, sync verification, full playthrough automation.', 'End-to-end tests across IPC boundary. Protocol validation, sync verification, full playthrough automation.
Re-homed under the maintenance umbrella per cascade refocus 2026-06-12 cross-IPC integration testing is ongoing infra hygiene (live Gauntlet pipeline already covers much of it); remaining scope preserved.', NULL, '2026-06-12 10:23:02', '2026-06-12 10:23:02', '2026-06-12 10:23:02', NULL, '2d8a7c2104a904afd47fa622eff56210', 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 ('06FB0TNSRWRV5KJ6DVD742S678', 'parent_id', 'T-35', 'T-1037', NULL, '2026-06-12 10:23:02', '2026-06-12 10:23:02', '2026-06-12 10:23:02', NULL, '621d8c0d8d7af92a5207783903574304', 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 ('06FB0TNSRWRV5KJ6DVD742S678', 'description', 'Run simulation headless via terminal. Log output for verification. No GUI dependency.', 'Run simulation headless via terminal. Log output for verification. No GUI dependency.
Re-homed under the maintenance umbrella per cascade refocus 2026-06-12 headless CLI harness is test tooling hygiene under done epic T-35; verify remaining gap vs the existing --test-mode/Gauntlet headless path.', NULL, '2026-06-12 10:23:02', '2026-06-12 10:23:02', '2026-06-12 10:23:02', NULL, '66839fb3d4e996acc7300d364dbc7450', 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 ('06FB0TNSRX13JY1N9BF76CK8WW', 'parent_id', 'T-37', 'T-1036', NULL, '2026-06-12 10:23:02', '2026-06-12 10:23:02', '2026-06-12 10:23:02', NULL, 'e1fb5d9e989ca5c166e30091ef8478af', 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 ('06FB0TNSRX13JY1N9BF76CK8WW', 'description', 'TCP-based bridge for future multiplayer. Same interface as LocalBridge, deferred implementation.', 'TCP-based bridge for future multiplayer. Same interface as LocalBridge, deferred implementation.
Parked post-cascade per refocus 2026-06-12 the TCP NetworkBridge for future multiplayer has no generation dependency and stays deferred; functional requirement preserved (same interface as LocalBridge).', NULL, '2026-06-12 10:23:02', '2026-06-12 10:23:02', '2026-06-12 10:23:02', NULL, '0bc66738b138867012998db30c3e47ac', 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 ('06FB0TNSRW99M5Z3KD8HM0VDT8', 'parent_id', 'T-41', 'T-751', NULL, '2026-06-12 10:23:02', '2026-06-12 10:23:02', '2026-06-12 10:23:02', NULL, '30160a2e71af7581aaf623cd54b2b458', 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 ('06FB0TNSRW99M5Z3KD8HM0VDT8', 'description', 'MoodState component. Mood affected by events, relationships, job satisfaction, contentment. Mood influences behavior.', 'MoodState component. Mood affected by events, relationships, job satisfaction, contentment. Mood influences behavior.
Re-parented under Phase 6 epic per cascade refocus 2026-06-12 NPC mood simulation is background-NPC-layer work; rescued from cancelled parent epic T-41. Functional requirement preserved.', NULL, '2026-06-12 10:23:02', '2026-06-12 10:23:02', '2026-06-12 10:23:02', NULL, '25c2dd3a6ecd1a0035b13b28e11c94e4', 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 ('06FB0TNSRY0PTZ1MKJEGCR2NYC', 'parent_id', 'T-41', 'T-751', NULL, '2026-06-12 10:23:02', '2026-06-12 10:23:02', '2026-06-12 10:23:02', NULL, '3e543cedc7a16ab45bb69e4644ea89ac', 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 ('06FB0TNSRY0PTZ1MKJEGCR2NYC', 'description', 'Work activity states. Job satisfaction tracking. Performance affects mood and relationships.', 'Work activity states. Job satisfaction tracking. Performance affects mood and relationships.
Re-parented under Phase 6 epic per cascade refocus 2026-06-12 NPC job-performance simulation is background-NPC-layer work; rescued from cancelled parent epic T-41. Functional requirement preserved.', NULL, '2026-06-12 10:23:02', '2026-06-12 10:23:02', '2026-06-12 10:23:02', NULL, '49e534942de5b9ab67ec151f2a56f4ec', 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 ('06FB0TNSRYHPH9Q44CERYSRYJC', 'parent_id', 'T-45', 'T-1036', NULL, '2026-06-12 10:23:02', '2026-06-12 10:23:02', '2026-06-12 10:23:02', NULL, '2a1abdcd1f7973353395bbdd9248088e', 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 ('06FB0TNSRYHPH9Q44CERYSRYJC', 'description', 'Monologue can be wrong. Character misinterpretations. Knowledge-gated accuracy.', 'Monologue can be wrong. Character misinterpretations. Knowledge-gated accuracy.
Parked as post-cascade gameplay per cascade refocus 2026-06-12; functional requirement (knowledge-gated monologue accuracy) preserved, not cancelled.', NULL, '2026-06-12 10:23:02', '2026-06-12 10:23:02', '2026-06-12 10:23:02', NULL, '47e981f0914997d744de13d003d99aa9', 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 ('06FB0TNSRWEGYAEQXDVSMF4THG', 'parent_id', 'T-47', 'T-750', NULL, '2026-06-12 10:23:02', '2026-06-12 10:23:02', '2026-06-12 10:23:02', NULL, '31b05f3c99d9e8229d2a4f53af094db1', 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 ('06FB0TNSRWEGYAEQXDVSMF4THG', 'description', 'Colored boxes, simple sprites, labels. Functional but not polished. Per D-014 guidance.', 'Colored boxes, simple sprites, labels. Functional but not polished. Per D-014 guidance.
Re-parented under Phase 4 epic (T-750) per cascade refocus 2026-06-12; scope updated from v0.1 placeholder art to the final-version asset pipeline per D-166 (no placeholders, no test map) functional requirement (asset production pipeline) preserved.', NULL, '2026-06-12 10:23:02', '2026-06-12 10:23:02', '2026-06-12 10:23:02', NULL, 'dda68f7fbce543e1d4483060a27976f0', 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 ('06FB0TNSRW4WB0PWAXS6D67J8R', 'parent_id', 'T-48', 'T-1036', NULL, '2026-06-12 10:23:02', '2026-06-12 10:23:02', '2026-06-12 10:23:02', NULL, 'e3293802acbea1820e680bf45d78a406', 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 ('06FB0TNSRW4WB0PWAXS6D67J8R', 'description', 'Thermal, camera feeds, unisphere tracking, audio analysis. Interface only, no implementation. Post-v0.1 features.', 'Thermal, camera feeds, unisphere tracking, audio analysis. Interface only, no implementation. Post-v0.1 features.
Parked as post-cascade gameplay per cascade refocus 2026-06-12; thermal/camera-feed/unisphere/audio modes are D-017 character-build features, preserved not cancelled.', NULL, '2026-06-12 10:23:02', '2026-06-12 10:23:02', '2026-06-12 10:23:02', NULL, '806acd3364eb75d013ba7ddfb8267847', 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 ('06FB0TNSRYR09VY1F6C42PACGW', 'parent_id', 'T-51', 'T-1036', NULL, '2026-06-12 10:23:02', '2026-06-12 10:23:02', '2026-06-12 10:23:02', NULL, '2f676494bd75c3df30624fd9b199843e', 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 ('06FB0TNSRYR09VY1F6C42PACGW', 'description', 'Different characters see different POIs. Profession-based, faction-based, relationship-based visibility.', 'Different characters see different POIs. Profession-based, faction-based, relationship-based visibility.
Parked as post-cascade gameplay per cascade refocus 2026-06-12; profession/faction/relationship-gated POI visibility preserved, not cancelled.', NULL, '2026-06-12 10:23:02', '2026-06-12 10:23:02', '2026-06-12 10:23:02', NULL, 'b03d0c586f36e9e08e47b1993ec5b31e', 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 ('06FB0TNSRWMGK6BB68HARCD500', 'parent_id', 'T-51', 'T-1036', NULL, '2026-06-12 10:23:02', '2026-06-12 10:23:02', '2026-06-12 10:23:02', NULL, 'f23ee9f738dd50fa449770ae480b45ef', 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 ('06FB0TNSRWMGK6BB68HARCD500', 'description', 'False POIs (traps), outdated locations, spoofed information. Trust/deception layer.', 'False POIs (traps), outdated locations, spoofed information. Trust/deception layer.
Parked as post-cascade gameplay per cascade refocus 2026-06-12; false-POI/spoofing trust-deception layer preserved, not cancelled.', NULL, '2026-06-12 10:23:02', '2026-06-12 10:23:02', '2026-06-12 10:23:02', NULL, '909879c66db952197d55236eff8dd0df', 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 ('06FB0TNSRY9C4JS3NDEMS5QBXC', 'parent_id', 'T-53', 'T-751', NULL, '2026-06-12 10:23:02', '2026-06-12 10:23:02', '2026-06-12 10:23:02', NULL, '60fa9d796b09d58fbac71ffcd7d88a2b', 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 ('06FB0TNSRY9C4JS3NDEMS5QBXC', 'description', 'Generate filler locations from templates. Ambient NPCs, basic interactions, systemic hooks for template colonization.', 'Generate filler locations from templates. Ambient NPCs, basic interactions, systemic hooks for template colonization.
Parked under Phase 6 epic (T-751) per cascade refocus 2026-06-12; ambient-NPC population of template locations comes after the world is walkable (location geometry itself is covered by Phase 4 template/district work).', NULL, '2026-06-12 10:23:02', '2026-06-12 10:23:02', '2026-06-12 10:23:02', NULL, 'f58b20e341707b1283d3f6b9a8d226f2', 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 ('06FB0TNSRY8BRY0E3PH6JA2HAM', 'parent_id', 'T-54', 'T-751', NULL, '2026-06-12 10:23:02', '2026-06-12 10:23:02', '2026-06-12 10:23:02', NULL, '7b074250dad2aa442614175faa2d117d', 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 ('06FB0TNSRY8BRY0E3PH6JA2HAM', 'description', 'Create reference links between templates. Shared NPCs, relationship propagation, contamination paths.', 'Create reference links between templates. Shared NPCs, relationship propagation, contamination paths.
Parked under Phase 6 epic (T-751) per cascade refocus 2026-06-12; shared-NPC/relationship links between templates belong to the NPC detail layer.', NULL, '2026-06-12 10:23:02', '2026-06-12 10:23:02', '2026-06-12 10:23:02', NULL, 'fbeca836ab5e1c51d3a282447232e272', 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 ('06FB0TNSRYX9R1F6SDN27PDND8', 'parent_id', 'T-56', 'T-1036', NULL, '2026-06-12 10:23:02', '2026-06-12 10:23:02', '2026-06-12 10:23:02', NULL, '03298b7a30bb6c9a94c770cab784fcc7', 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 ('06FB0TNSRYX9R1F6SDN27PDND8', 'description', '60-70/30-40 known vs stranger ratio for module attachment. Variable per seed. Anti-metagaming.', '60-70/30-40 known vs stranger ratio for module attachment. Variable per seed. Anti-metagaming.
Parked as post-cascade gameplay per cascade refocus 2026-06-12; drama-module attachment ratios (anti-metagaming) preserved, not cancelled.', NULL, '2026-06-12 10:23:02', '2026-06-12 10:23:02', '2026-06-12 10:23:02', NULL, '5e39ddd2b0467615325fb3c7371cc08c', 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 ('06FB0TNSRXJ0QD32XB44NESXDW', 'parent_id', 'T-64', 'T-1037', NULL, '2026-06-12 10:23:02', '2026-06-12 10:23:02', '2026-06-12 10:23:02', NULL, '8b2952df7ada5bf39c66a636ba787031', 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 ('06FB0TNSRXJ0QD32XB44NESXDW', 'description', 'Document agreed patterns. Test organization conventions, naming, structure. Developer guide.', 'Document agreed patterns. Test organization conventions, naming, structure. Developer guide.
Re-homed under maintenance per cascade refocus 2026-06-12; testing-pattern developer guide is documentation/infra hygiene (partially covered by CLAUDE.md testing preferences reconcile when picked up).', NULL, '2026-06-12 10:23:02', '2026-06-12 10:23:02', '2026-06-12 10:23:02', NULL, '94f2b2a4732566466def47edb2647eb9', 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 ('06FB0TNSRZHTCRQY5G1J8SEGXM', 'parent_id', 'T-64', 'T-1037', NULL, '2026-06-12 10:23:02', '2026-06-12 10:23:02', '2026-06-12 10:23:02', NULL, '9e29ce1e89e067aa9bddfa30efaae6fc', 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 ('06FB0TNSRZHTCRQY5G1J8SEGXM', 'description', 'Define required tooling: test runners, assertion libraries, mocking frameworks. Installation/setup docs.', 'Define required tooling: test runners, assertion libraries, mocking frameworks. Installation/setup docs.
Re-homed under maintenance per cascade refocus 2026-06-12; test-tooling requirements spec is infra hygiene (much is de facto settled: gdUnit4, cargo test, Gauntlet).', NULL, '2026-06-12 10:23:02', '2026-06-12 10:23:02', '2026-06-12 10:23:02', NULL, 'b6c8555f61782d99733cd83451e419fe', 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 ('06FB0TNSRY9FP8GJSR96661J9M', 'parent_id', 'T-64', 'T-1037', NULL, '2026-06-12 10:23:02', '2026-06-12 10:23:02', '2026-06-12 10:23:02', NULL, 'b37aaac89436932ba7d9e2c41074018c', 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 ('06FB0TNSRY9FP8GJSR96661J9M', 'description', 'Define rules: what test hooks are acceptable in production code, what must stay external. Pollution boundaries.', 'Define rules: what test hooks are acceptable in production code, what must stay external. Pollution boundaries.
Re-homed under maintenance per cascade refocus 2026-06-12; production-code test-hook policy is engineering-hygiene documentation.', NULL, '2026-06-12 10:23:02', '2026-06-12 10:23:02', '2026-06-12 10:23:02', NULL, '131a8ef9207d04512a3c52e8a794b3f5', 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 ('06FB0TNSRY8KWVN9TCM2G5XXG8', 'parent_id', 'T-29', 'T-749', NULL, '2026-06-12 10:23:03', '2026-06-12 10:23:03', '2026-06-12 10:23:03', NULL, '04566b4f704ba31f6d53f47634145572', 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 ('06FB0TNSRY8KWVN9TCM2G5XXG8', 'description', 'Tile collision, pathfinding, NPC movement, and game clock systems. Hard blockers identified in v0.1 gap analysis workshop. Without these, NPCs cannot physically navigate the station.', 'Tile collision, pathfinding, NPC movement, and game clock systems. Hard blockers identified in v0.1 gap analysis workshop. Without these, NPCs cannot physically navigate the station.
Parked under Phase 5 epic (T-749) per cascade refocus 2026-06-12; previous parent initiative T-29 is cancelled tile collision/pathfinding/clock is the player-walking foundation (NPC movement portion follows in Phase 6).', NULL, '2026-06-12 10:23:03', '2026-06-12 10:23:03', '2026-06-12 10:23:03', NULL, '1329583e026c26024db16b70da7878f3', 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 ('06FB0TNSRZ202MPMFH0EDH2BT4', 'parent_id', 'T-30', 'T-1036', NULL, '2026-06-12 10:23:03', '2026-06-12 10:23:03', '2026-06-12 10:23:03', NULL, 'f2ab81ce77da54b5a03baeb1980b2fe0', 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 ('06FB0TNSRZ202MPMFH0EDH2BT4', 'description', 'Unified observation pipeline and player interaction systems. The experience layer that connects perception, knowledge, and monologue into the core gameplay loop. Identified as the missing spine in gap analysis workshop.', 'Unified observation pipeline and player interaction systems. The experience layer that connects perception, knowledge, and monologue into the core gameplay loop. Identified as the missing spine in gap analysis workshop.
Parked as post-cascade gameplay per cascade refocus 2026-06-12; the observation/interaction spine of the core gameplay loop is preserved, not cancelled.', NULL, '2026-06-12 10:23:03', '2026-06-12 10:23:03', '2026-06-12 10:23:03', NULL, '26149fcd78db4ea4888549edb6a66308', 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 ('06FB0TNSRZP48TDBTW18P88WNW', 'parent_id', 'T-28', 'T-749', NULL, '2026-06-12 10:23:03', '2026-06-12 10:23:03', '2026-06-12 10:23:03', NULL, '84c1c55f5f0852f5a34fe82517fc1035', 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 ('06FB0TNSRZP48TDBTW18P88WNW', 'description', 'Save/load, session management, and game state serialization systems. Required for playable v0.1 sessions.', 'Save/load, session management, and game state serialization systems. Required for playable v0.1 sessions.
Parked under Phase 5 epic (T-749) per cascade refocus 2026-06-12; save/load and session management are tied to playable sessions (savegame lineage is documented as Phase 5+).', NULL, '2026-06-12 10:23:03', '2026-06-12 10:23:03', '2026-06-12 10:23:03', NULL, 'e6ea3e6e6ce541d5a4140209eac0f075', 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 ('06FB0TNSRY5PJH0XRB4Z92JBER', 'parent_id', 'T-64', 'T-1037', NULL, '2026-06-12 10:23:03', '2026-06-12 10:23:03', '2026-06-12 10:23:03', NULL, '6730ebc8eb09cfdd5f8a991172928bd2', 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 ('06FB0TNSRY5PJH0XRB4Z92JBER', 'description', 'Normalize cargo-nextest and gdUnit4 output into consistent JSON schema (suite, total, passed, failed, failures array). Low priority — gdUnit4 already outputs JSON natively. Source: Hoshe R1 T-3.', 'Normalize cargo-nextest and gdUnit4 output into consistent JSON schema (suite, total, passed, failed, failures array). Low priority — gdUnit4 already outputs JSON natively. Source: Hoshe R1 T-3.
Re-homed under maintenance per cascade refocus 2026-06-12; test tooling, not phase work.', NULL, '2026-06-12 10:23:03', '2026-06-12 10:23:03', '2026-06-12 10:23:03', NULL, '2be2c01d8c848d46c0446450f6ea239c', 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 ('06FB0TNSRZHW11BZWVZKB5YTH8', 'parent_id', 'T-38', 'T-1037', NULL, '2026-06-12 10:23:03', '2026-06-12 10:23:03', '2026-06-12 10:23:03', NULL, '5df10e30ed54a9696cbd306d1a3dc0ab', 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 ('06FB0TNSRZHW11BZWVZKB5YTH8', 'description', 'Crash reporting infrastructure for both codebases:\n- Rust panic handler writes crash.log with backtrace\n- Godot push_error captures client crashes\n- Include version, platform, last 100 log lines\n- Needed before external playtesting\n\nEffort: M\nCodebase: server + client\nSource: Architecture Review Audit 2026-02-11\nSprint: 2+ (before vertical slice playtest)', 'Crash reporting infrastructure for both codebases:\n- Rust panic handler writes crash.log with backtrace\n- Godot push_error captures client crashes\n- Include version, platform, last 100 log lines\n- Needed before external playtesting\n\nEffort: M\nCodebase: server + client\nSource: Architecture Review Audit 2026-02-11\nSprint: 2+ (before vertical slice playtest)
Re-homed under maintenance per cascade refocus 2026-06-12; infra requirement preserved unchanged.', NULL, '2026-06-12 10:23:03', '2026-06-12 10:23:03', '2026-06-12 10:23:03', NULL, 'c669a731814c9b6e8394d9eaf02d4a58', 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 ('06FB0TNSRXVMATNG8QEJVVVCH0', 'parent_id', NULL, 'T-751', NULL, '2026-06-12 10:23:03', '2026-06-12 10:23:03', '2026-06-12 10:23:03', NULL, 'ecfdbd4d588cdfee9a7b70e0f047e6d5', 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 ('06FB0TNSRXVMATNG8QEJVVVCH0', 'description', 'Design workshop for KnowledgeGraph component to replace Vec<String> placeholder.
Scope:
- Graph structure (nodes, edges, timestamps, certainty)
- Information boundaries (what NPCs know vs do not know)
- Propagation rules (gossip, observation, inference)
- Query interface for dialogue/behavior systems
- Memory limits and forgetting mechanics
Pillar-1 mechanic. CRITICAL priority.
Sprint 2 blocker.
Participants: Tyre (lead), Morve, Dudley, SI
Source: Architecture Review Audit 2026-02-11', 'Design workshop for KnowledgeGraph component to replace Vec<String> placeholder.
Scope:
- Graph structure (nodes, edges, timestamps, certainty)
- Information boundaries (what NPCs know vs do not know)
- Propagation rules (gossip, observation, inference)
- Query interface for dialogue/behavior systems
- Memory limits and forgetting mechanics
Pillar-1 mechanic. CRITICAL priority.
Sprint 2 blocker.
Participants: Tyre (lead), Morve, Dudley, SI
Source: Architecture Review Audit 2026-02-11
Parked under Phase 6 epic per cascade refocus 2026-06-12; NPC knowledge systems follow the background NPC layer.', NULL, '2026-06-12 10:23:03', '2026-06-12 10:23:03', '2026-06-12 10:23:03', NULL, '981d6dac4b0819d2ea15bd4855b6cb47', 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 ('06FB0TNSRZ8NCH53C9VAC2N3V8', 'parent_id', NULL, 'T-749', NULL, '2026-06-12 10:23:03', '2026-06-12 10:23:03', '2026-06-12 10:23:03', NULL, '9b85e38694be8befd2fb44e352545a91', 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 ('06FB0TNSRZ8NCH53C9VAC2N3V8', 'description', 'Design workshop for perception query algorithm that generates ObserverSnapshot.
Pipeline stages:
1. Spatial query (entities in range)
2. Line-of-sight filtering
3. Sound propagation
4. Knowledge graph integration
5. Snapshot assembly
CRITICAL priority. Sprint 2 blocker.
Depends on Workshop 1 (Knowledge Graph).
Participants: Tyre (lead), Morve, Dudley, SI
Source: Architecture Review Audit 2026-02-11', 'Design workshop for perception query algorithm that generates ObserverSnapshot.
Pipeline stages:
1. Spatial query (entities in range)
2. Line-of-sight filtering
3. Sound propagation
4. Knowledge graph integration
5. Snapshot assembly
CRITICAL priority. Sprint 2 blocker.
Depends on Workshop 1 (Knowledge Graph).
Participants: Tyre (lead), Morve, Dudley, SI
Source: Architecture Review Audit 2026-02-11
Parked under Phase 5 epic per cascade refocus 2026-06-12; player perception pipeline activates with player viewport work.', NULL, '2026-06-12 10:23:03', '2026-06-12 10:23:03', '2026-06-12 10:23:03', NULL, 'fe5b3b9cb6f02eaace8c86972ecf6edd', 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 ('06FB0TNSRZVC39DY5152CXZMB0', 'parent_id', NULL, 'T-749', NULL, '2026-06-12 10:23:03', '2026-06-12 10:23:03', '2026-06-12 10:23:03', NULL, 'f88fd63f3423d51912ff406c166221eb', 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 ('06FB0TNSRZVC39DY5152CXZMB0', 'description', 'Design workshop for save/load system architecture.
Key decisions:
- Custom SaveState struct vs bevy_reflect
- Version number scheme and migration strategy
- Relationship to tier system (serialize by tier?)
- Incremental saves vs full snapshots
- Quick save vs named saves
MEDIUM priority. Must be resolved before vertical slice.
Participants: Dudley (lead), Tyre, Morve, SI
Source: Architecture Review Audit 2026-02-11', 'Design workshop for save/load system architecture.
Key decisions:
- Custom SaveState struct vs bevy_reflect
- Version number scheme and migration strategy
- Relationship to tier system (serialize by tier?)
- Incremental saves vs full snapshots
- Quick save vs named saves
MEDIUM priority. Must be resolved before vertical slice.
Participants: Dudley (lead), Tyre, Morve, SI
Source: Architecture Review Audit 2026-02-11
Parked under Phase 5 epic per cascade refocus 2026-06-12; savegame lineage already planned as Phase 5+ in asset-pipeline.md.', NULL, '2026-06-12 10:23:03', '2026-06-12 10:23:03', '2026-06-12 10:23:03', NULL, 'f27e459d6f62b844f3c561b8347a09e0', 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 ('06FB0TNSRWSBWTKM42BVVMPXJG', 'parent_id', NULL, 'T-750', NULL, '2026-06-12 10:23:03', '2026-06-12 10:23:03', '2026-06-12 10:23:03', NULL, 'e3c272771a0b35bd23ea5df4ebcca496', 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 ('06FB0TNSRWSBWTKM42BVVMPXJG', 'description', 'Design workshop for map authoring toolchain and format.
Key decisions:
- Tool selection: Tiled vs Godot TileMap vs YAML
- Map format (JSON, TMX, custom?)
- Collision layer specification
- Entity spawn points
- Loader implementation (server + client)
- Hot reload support for iteration
MEDIUM priority. Sprint 2-3 target.
Participants: Morve (lead), Tyre, Dudley, SI
Source: Architecture Review Audit 2026-02-11', 'Design workshop for map authoring toolchain and format.
Key decisions:
- Tool selection: Tiled vs Godot TileMap vs YAML
- Map format (JSON, TMX, custom?)
- Collision layer specification
- Entity spawn points
- Loader implementation (server + client)
- Hot reload support for iteration
MEDIUM priority. Sprint 2-3 target.
Participants: Morve (lead), Tyre, Dudley, SI
Source: Architecture Review Audit 2026-02-11
Re-parented under Phase 4 epic per cascade refocus 2026-06-12; authoring-tool framing superseded by D-166 (no hand-made maps) surviving scope is format/collision/loader for generator output.', NULL, '2026-06-12 10:23:03', '2026-06-12 10:23:03', '2026-06-12 10:23:03', NULL, '3b479b955cc103bd1679e0f1b7ac6a25', 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 ('06FB0TNSRWYBGV0A6RBVS1NSP0', 'parent_id', NULL, 'T-749', NULL, '2026-06-12 10:23:03', '2026-06-12 10:23:03', '2026-06-12 10:23:03', NULL, '38edf501382c16867bab9eb0db73f60c', 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 ('06FB0TNSRWYBGV0A6RBVS1NSP0', 'description', NULL, 'Parked under Phase 5 epic per cascade refocus 2026-06-12; player control workshop runs when player work begins.', NULL, '2026-06-12 10:23:03', '2026-06-12 10:23:03', '2026-06-12 10:23:03', NULL, '485da6b215d9f0942e2e5736cc227d55', 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 ('06FB0TNSRXTV61ZRF9RZ6V1NXR', 'parent_id', NULL, 'T-1036', NULL, '2026-06-12 10:23:03', '2026-06-12 10:23:03', '2026-06-12 10:23:03', NULL, '70fb40497c855e1d23254b1d64a62b27', 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 ('06FB0TNSRXTV61ZRF9RZ6V1NXR', 'description', 'Broad design discussion to map out ALL the data feed systems the insert will eventually surface, identify common patterns, and design foundational plumbing that serves them all. This is bigger than the onboarding dossier — it is the insert as an information platform.
Participants: Tyre (architecture), Dudley (server), Stig (UI), Gestalt (systems design), Miri (worldbuilding what feeds exist in-setting), Ozzie (player experience what feels good to check)
The insert (D-065) is the player''s primary information device. It needs to surface a wide variety of data feeds that exist naturally in the setting. Map these out FIRST, then identify patterns, then design plumbing.
## Known and candidate feed types
**Documents/dossiers** static or semi-static authored content. Assignment briefs, personal notes, found documents, intercepted communications. Markdown body, variable injection, triggered delivery.
**Messaging/comms** NPC-to-player and overheard messages. Meridian messages, dead drops, intercepted transmissions. Threaded? Timed delivery? Read/unread state?
**News/ticker feeds** station news, sector bulletins, propaganda. Already have TickerPool (#591) for the bar how does this generalize to the insert? Weather/atmospheric feeds for planets (adds environmental flavor).
**Time systems** local station time, central Settled Reach time, planetary day-night cycles (varying rotation periods). How does the insert display multiple time references? Which are always visible vs on-demand?
**Maps** district layouts, marked locations, fog-of-war on map data. Progressive reveal as player explores.
**Logs/journal** auto-generated from observations? Player-annotated? Investigation notes the detective accumulates vs cargo manifests the smuggler tracks?
**Faction/relationship status** trust levels, known affiliations, reputation. How much is visible to the player vs hidden (D-012 information boundary)?
**Inventory/cargo** physical items, data chips, contraband manifests.
## Questions to resolve
1. What feed types exist in the Settled Reach setting? (Miri: what does a station worker/visitor actually have on their insert?)
2. Which feeds are universal vs archetype-specific? (Detective gets case files; smuggler gets network dead drops. Both get news and time.)
3. What are the common patterns across feeds? (Delivery trigger, persistence, read state, update frequency, rendering format)
4. Server-side: single generic "insert_feeds" collection in ObserverSnapshot vs typed fields? Delta updates vs full state?
5. Client-side: plugin/renderer architecture how does the insert UI dispatch feed types to renderers without hardcoding each one?
6. Persistence: session-persistent vs save-persistent vs ephemeral. Which feeds accumulate, which rotate, which expire?
7. Information boundary (D-012): feeds are perception-filtered. The insert only shows what the PC has access to. How does this interact with the observer snapshot?
8. Priority/notification: which feeds notify the player (new message!), which are passive (time ticks), which are urgent (warning)?
## Output
D-record (or major amendment to D-065) documenting:
- Catalog of insert feed types with properties
- Common envelope/interface pattern
- Serverclient data flow architecture
- Rendering dispatch pattern
- Persistence and lifecycle model
This is a design discussion, not implementation. Produce decisions and patterns that #600 and future insert work implement against.
## Refs
D-065 (insert UI), D-012 (information boundary), D-010 (determinism), Q-055', 'Broad design discussion to map out ALL the data feed systems the insert will eventually surface, identify common patterns, and design foundational plumbing that serves them all. This is bigger than the onboarding dossier it is the insert as an information platform.
Participants: Tyre (architecture), Dudley (server), Stig (UI), Gestalt (systems design), Miri (worldbuilding what feeds exist in-setting), Ozzie (player experience what feels good to check)
The insert (D-065) is the player''s primary information device. It needs to surface a wide variety of data feeds that exist naturally in the setting. Map these out FIRST, then identify patterns, then design plumbing.
## Known and candidate feed types
**Documents/dossiers** static or semi-static authored content. Assignment briefs, personal notes, found documents, intercepted communications. Markdown body, variable injection, triggered delivery.
**Messaging/comms** NPC-to-player and overheard messages. Meridian messages, dead drops, intercepted transmissions. Threaded? Timed delivery? Read/unread state?
**News/ticker feeds** station news, sector bulletins, propaganda. Already have TickerPool (#591) for the bar how does this generalize to the insert? Weather/atmospheric feeds for planets (adds environmental flavor).
**Time systems** local station time, central Settled Reach time, planetary day-night cycles (varying rotation periods). How does the insert display multiple time references? Which are always visible vs on-demand?
**Maps** district layouts, marked locations, fog-of-war on map data. Progressive reveal as player explores.
**Logs/journal** auto-generated from observations? Player-annotated? Investigation notes the detective accumulates vs cargo manifests the smuggler tracks?
**Faction/relationship status** trust levels, known affiliations, reputation. How much is visible to the player vs hidden (D-012 information boundary)?
**Inventory/cargo** physical items, data chips, contraband manifests.
## Questions to resolve
1. What feed types exist in the Settled Reach setting? (Miri: what does a station worker/visitor actually have on their insert?)
2. Which feeds are universal vs archetype-specific? (Detective gets case files; smuggler gets network dead drops. Both get news and time.)
3. What are the common patterns across feeds? (Delivery trigger, persistence, read state, update frequency, rendering format)
4. Server-side: single generic "insert_feeds" collection in ObserverSnapshot vs typed fields? Delta updates vs full state?
5. Client-side: plugin/renderer architecture how does the insert UI dispatch feed types to renderers without hardcoding each one?
6. Persistence: session-persistent vs save-persistent vs ephemeral. Which feeds accumulate, which rotate, which expire?
7. Information boundary (D-012): feeds are perception-filtered. The insert only shows what the PC has access to. How does this interact with the observer snapshot?
8. Priority/notification: which feeds notify the player (new message!), which are passive (time ticks), which are urgent (warning)?
## Output
D-record (or major amendment to D-065) documenting:
- Catalog of insert feed types with properties
- Common envelope/interface pattern
- Serverclient data flow architecture
- Rendering dispatch pattern
- Persistence and lifecycle model
This is a design discussion, not implementation. Produce decisions and patterns that #600 and future insert work implement against.
## Refs
D-065 (insert UI), D-012 (information boundary), D-010 (determinism), Q-055
Parked in gameplay backlog per cascade refocus 2026-06-12; feed plumbing design resumes when gameplay systems exist to feed it.', NULL, '2026-06-12 10:23:03', '2026-06-12 10:23:03', '2026-06-12 10:23:03', NULL, 'd48324c21b3a465ea1c27e834c9f6eb5', 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 ('06FB0TNSRWJ60W2RFN2FQ2P3EW', 'parent_id', 'T-603', 'T-1036', NULL, '2026-06-12 10:23:03', '2026-06-12 10:23:03', '2026-06-12 10:23:03', NULL, '90dca0ddf08f303e5a9ddb030158e02d', 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 ('06FB0TNSRWJ60W2RFN2FQ2P3EW', 'description', 'Sprint 25 spike: generator must produce usable output before anything else matters. Prove auto-generated locations at scale with legible characters. Template assembly (not procedural geography) for v0.2. See workshop decisions #1, #7, #22, #23. Estimated 7 sprints to proof-of-life playtest (generated location + legible characters + tycoon bookmark from creation to Day 3) — Tyre estimate.', 'Sprint 25 spike: generator must produce usable output before anything else matters. Prove auto-generated locations at scale with legible characters. Template assembly (not procedural geography) for v0.2. See workshop decisions #1, #7, #22, #23. Estimated 7 sprints to proof-of-life playtest (generated location + legible characters + tycoon bookmark from creation to Day 3) — Tyre estimate.
Parked in gameplay backlog per cascade refocus 2026-06-12; template-assembly generation superseded by the T-750 cascade proof-of-life playtest concept preserved.', NULL, '2026-06-12 10:23:03', '2026-06-12 10:23:03', '2026-06-12 10:23:03', NULL, '8637267369c90396682245eaf70e3583', 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 ('06FB0TNSRXD5W32VCV5YZY3NX0', 'parent_id', 'T-603', 'T-1036', NULL, '2026-06-12 10:23:03', '2026-06-12 10:23:03', '2026-06-12 10:23:03', NULL, '9f743ca7242a1d787c40ec9a11c21c83', 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 ('06FB0TNSRXD5W32VCV5YZY3NX0', 'description', 'Tycoon is the v0.2 bookmark: small business owner, existing in the Krenn System. Zero investigation content. Tycoon = aspiration not starting state. Workshop decisions #4, #19, #20. Broad economic verb vocabulary serving all careers. Auto-generated apartment reflecting wealth + cultural context. CK3-style bookmark selection flow.', 'Tycoon is the v0.2 bookmark: small business owner, existing in the Krenn System. Zero investigation content. Tycoon = aspiration not starting state. Workshop decisions #4, #19, #20. Broad economic verb vocabulary serving all careers. Auto-generated apartment reflecting wealth + cultural context. CK3-style bookmark selection flow.
Parked in gameplay backlog per cascade refocus 2026-06-12; bookmark concept preserved for post-cascade game-making.', NULL, '2026-06-12 10:23:03', '2026-06-12 10:23:03', '2026-06-12 10:23:03', NULL, 'f48ed040780f6cda4ee5a5d83d4be639', 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 ('06FB0TNSRXE0VWDHVQTXPVPEW0', 'parent_id', 'T-603', 'T-1036', NULL, '2026-06-12 10:23:03', '2026-06-12 10:23:03', '2026-06-12 10:23:03', NULL, 'bcc78c57bc13fc1152326eb864bc10c7', 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 ('06FB0TNSRXE0VWDHVQTXPVPEW0', 'description', 'CK3-style character creation: skills + bookmark selection. Full cosmetic customisation (hair, clothing, colours — workshop decision #11). Culture implicit in starting location (decision #16). No family/culture/religion sliders in creation — those are deferred. Decision #2.', 'CK3-style character creation: skills + bookmark selection. Full cosmetic customisation (hair, clothing, colours — workshop decision #11). Culture implicit in starting location (decision #16). No family/culture/religion sliders in creation — those are deferred. Decision #2.
Parked in gameplay backlog per cascade refocus 2026-06-12; bookmark-selection flow preserved cosmetic customisation tracked separately under Phase 5 (T-619).', NULL, '2026-06-12 10:23:03', '2026-06-12 10:23:03', '2026-06-12 10:23:03', NULL, '952fc393969df30789555e0e1c86cd3a', 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 ('06FB0TNSRZ65H50N3XJKJ3F5XM', 'parent_id', 'T-603', 'T-1036', NULL, '2026-06-12 10:23:03', '2026-06-12 10:23:03', '2026-06-12 10:23:03', NULL, '911d94152fd3c73275d19045c6ea646e', 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 ('06FB0TNSRZ65H50N3XJKJ3F5XM', 'description', 'The world is quietly responsive, not indifferent. Gradient of caring by social proximity — world doesn''t care globally but notices locally. Dual-scale consequence model: Rimworld sharp events (crises, reversals) + DF slow accumulation (reputation, debt, relationship erosion). Setting delivery via both visual and insert layers in parallel. Workshop decisions #10, #12, #13, #21.', 'The world is quietly responsive, not indifferent. Gradient of caring by social proximity — world doesn''t care globally but notices locally. Dual-scale consequence model: Rimworld sharp events (crises, reversals) + DF slow accumulation (reputation, debt, relationship erosion). Setting delivery via both visual and insert layers in parallel. Workshop decisions #10, #12, #13, #21.
Parked in gameplay backlog per cascade refocus 2026-06-12; world-feel decisions preserved for post-cascade game-making.', NULL, '2026-06-12 10:23:03', '2026-06-12 10:23:03', '2026-06-12 10:23:03', NULL, 'f73bbff50e3086e97148bbec5e270859', 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 ('06FB0TNSRZHHSBPQS9VB8S7D5M', 'parent_id', 'T-606', 'T-749', NULL, '2026-06-12 10:23:03', '2026-06-12 10:23:03', '2026-06-12 10:23:03', NULL, 'c19773aee4f35af6d739ddc9a3957112', 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 ('06FB0TNSRZHHSBPQS9VB8S7D5M', 'description', 'Cosmetic customisation: hair, clothing, colours. Decision #11. Separate from skills/bookmark — aesthetic only. Question open: do creation choices trace into the generated apartment? (Q-WTF-040).', 'Cosmetic customisation: hair, clothing, colours. Decision #11. Separate from skills/bookmark — aesthetic only. Question open: do creation choices trace into the generated apartment? (Q-WTF-040).
Parked under Phase 5 epic per cascade refocus 2026-06-12; character-visuals customisation resumes with player rendering (overlaps T-694).', NULL, '2026-06-12 10:23:03', '2026-06-12 10:23:03', '2026-06-12 10:23:03', NULL, '93028af6bfd2b06dd2b1e7f143b6306e', 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 ('06FB0TNSRZBZHXAK3DYTK1C19R', 'parent_id', 'T-607', 'T-751', NULL, '2026-06-12 10:23:03', '2026-06-12 10:23:03', '2026-06-12 10:23:03', NULL, '3de6985bd2cc36e8137e38ce8f3520df', 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 ('06FB0TNSRZBZHXAK3DYTK1C19R', 'description', 'NPC-to-NPC and NPC-to-player relationships form through: Sims-style direct interaction + Rimworld-style shared adversity. Decision #17. Relationships must be readable from the outside. Codify for systems. Decision #18: prove relationships readable before layering narrative depth.', 'NPC-to-NPC and NPC-to-player relationships form through: Sims-style direct interaction + Rimworld-style shared adversity. Decision #17. Relationships must be readable from the outside. Codify for systems. Decision #18: prove relationships readable before layering narrative depth.
Parked under Phase 6 epic per cascade refocus 2026-06-12 (previous parent T-607 cancelled); relationship-formation requirement preserved for the NPC layer.', NULL, '2026-06-12 10:23:03', '2026-06-12 10:23:03', '2026-06-12 10:23:03', NULL, 'db160085efbdb1baa50e081cee38348c', 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 ('06FB0TNSRXK4NDX3Y242QK7BC8', 'parent_id', 'T-608', 'T-751', NULL, '2026-06-12 10:23:03', '2026-06-12 10:23:03', '2026-06-12 10:23:03', NULL, 'b8f507b9d8578630f6dce06ed19dde0b', 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 ('06FB0TNSRXK4NDX3Y242QK7BC8', 'description', 'The world notices locally but doesn''t care globally. Gradient of caring based on social proximity. Decision #10. Primary social contacts develop responsiveness over time. Indifferent world is wrong — quietly responsive world is right. Implementation: proximity-weighted NPC attention and reaction systems.', 'The world notices locally but doesn''t care globally. Gradient of caring based on social proximity. Decision #10. Primary social contacts develop responsiveness over time. Indifferent world is wrong — quietly responsive world is right. Implementation: proximity-weighted NPC attention and reaction systems.
Parked under Phase 6 epic per cascade refocus 2026-06-12; quietly-responsive-world requirement preserved for the NPC layer.', NULL, '2026-06-12 10:23:03', '2026-06-12 10:23:03', '2026-06-12 10:23:03', NULL, '0222df0f946a02c1b17fc43a5d501275', 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 ('06FB0TNSRXJDMPQNP05JFD2P6G', 'parent_id', 'T-638', 'T-1037', NULL, '2026-06-12 10:23:03', '2026-06-12 10:23:03', '2026-06-12 10:23:03', NULL, '80a9d802d78bd214fc6aefac1dee8455', 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 ('06FB0TNSRXJDMPQNP05JFD2P6G', 'description', 'sr-voice has cargo features for rocm/vulkan/cuda/metal but builds CPU-only (~13 t/s). Enable after code stable. GPU would reach 50+ t/s. LIBCLANG_PATH already in Makefile.', 'sr-voice has cargo features for rocm/vulkan/cuda/metal but builds CPU-only (~13 t/s). Enable after code stable. GPU would reach 50+ t/s. LIBCLANG_PATH already in Makefile.
Re-homed under maintenance per cascade refocus 2026-06-12; GPU build-feature enablement is infra hygiene on the existing voice pipeline.', NULL, '2026-06-12 10:23:03', '2026-06-12 10:23:03', '2026-06-12 10:23:03', NULL, '9ce4fe243def647e8b9e361acbc388ad', 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 ('06FB0TNSRW36DF5F95406ETRGR', 'parent_id', NULL, 'T-1037', NULL, '2026-06-12 10:23:03', '2026-06-12 10:23:03', '2026-06-12 10:23:03', NULL, '519f204a1543a7dc24a0f2aa3cd18f3d', 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 ('06FB0TNSRW36DF5F95406ETRGR', 'description', 'Trigger ticket: when any server module beyond voice/hardware.rs needs OS-dependent info (CPU, memory, battery, GPU), extract shared platform queries into server/src/platform.rs. Currently all OS detection lives in server/src/voice/hardware.rs (sysinfo crate, on_battery(), VRAM probes, available_parallelism). Single consumer, no duplication — no action needed until a second consumer appears. Trigger conditions: (1) a second system needs CPU/memory info independently of voice pipeline, (2) battery detection needed outside voice scaling (e.g. tick rate throttling), (3) server exposes system info over IPC (multiplayer diagnostics). Extraction is ~30 minutes: pull on_battery(), probe_current_free(), sysinfo calls into platform.rs, leave voice-specific scaling logic in hardware.rs.', 'Trigger ticket: when any server module beyond voice/hardware.rs needs OS-dependent info (CPU, memory, battery, GPU), extract shared platform queries into server/src/platform.rs. Currently all OS detection lives in server/src/voice/hardware.rs (sysinfo crate, on_battery(), VRAM probes, available_parallelism). Single consumer, no duplication — no action needed until a second consumer appears. Trigger conditions: (1) a second system needs CPU/memory info independently of voice pipeline, (2) battery detection needed outside voice scaling (e.g. tick rate throttling), (3) server exposes system info over IPC (multiplayer diagnostics). Extraction is ~30 minutes: pull on_battery(), probe_current_free(), sysinfo calls into platform.rs, leave voice-specific scaling logic in hardware.rs.
Re-homed under maintenance per cascade refocus 2026-06-12; trigger conditions unchanged.', NULL, '2026-06-12 10:23:03', '2026-06-12 10:23:03', '2026-06-12 10:23:03', NULL, 'fa543df4e53e1f4640de0f2d8fd0e564', 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 ('06FB0TNSRY4CMF4W57DCQASQNW', 'parent_id', NULL, 'T-1037', NULL, '2026-06-12 10:23:03', '2026-06-12 10:23:03', '2026-06-12 10:23:03', NULL, '6fc316e4ed8ad0c2575314a478c9aa5b', 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 ('06FB0TNSRY4CMF4W57DCQASQNW', 'description', 'When team agents discover new work during a sprint (like #661 zone-type templates in Sprint 26), they should message the lead immediately for retroactive ticket creation rather than just doing the work uncaptured. Document this in the sprint-start skill agent spawn prompt and/or team-patterns.md.', 'When team agents discover new work during a sprint (like #661 zone-type templates in Sprint 26), they should message the lead immediately for retroactive ticket creation rather than just doing the work uncaptured. Document this in the sprint-start skill agent spawn prompt and/or team-patterns.md.
Re-homed under maintenance per cascade refocus 2026-06-12; recast sprint protocol for kanban/batch mode functional requirement preserved.', NULL, '2026-06-12 10:23:03', '2026-06-12 10:23:03', '2026-06-12 10:23:03', NULL, '51ed1f7c869ab7763db1515b15da102b', 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 ('06FB0TNSRX1PW1RXYRBNRHVNYW', 'parent_id', 'T-51', 'T-1036', NULL, '2026-06-12 10:23:03', '2026-06-12 10:23:03', '2026-06-12 10:23:03', NULL, 'e699bae070711879861664d7803fe893', 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 ('06FB0TNSRX1PW1RXYRBNRHVNYW', 'description', NULL, 'Parked in gameplay backlog per cascade refocus 2026-06-12; star-map travel planner preserved for when in-game travel exists.', NULL, '2026-06-12 10:23:03', '2026-06-12 10:23:03', '2026-06-12 10:23:03', NULL, '6144e08786ba401cc57e91c7fcbe0bad', 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 ('06FB0TNSRZDYCH1YRQNVN0B2FC', 'parent_id', 'T-605', 'T-751', NULL, '2026-06-12 10:23:03', '2026-06-12 10:23:03', '2026-06-12 10:23:03', NULL, 'cce8dae61f1613031dd3507849ed9cca', 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 ('06FB0TNSRZDYCH1YRQNVN0B2FC', 'description', 'Server implementation: apartment generator takes economic position (from #615 tycoon starting state) + cultural context (from #679 location-to-culture resolution) + aesthetic taste trait. Produces apartment tile layout, furniture placement, and item set. Decision D-136 (First Settled Reach moment: apartment + insert activation). Decision D-137 (generator: structural and cosmetic variety). Blocked by: #615 (tycoon starting state), #679 (culture resolution).', 'Server implementation: apartment generator takes economic position (from #615 tycoon starting state) + cultural context (from #679 location-to-culture resolution) + aesthetic taste trait. Produces apartment tile layout, furniture placement, and item set. Decision D-136 (First Settled Reach moment: apartment + insert activation). Decision D-137 (generator: structural and cosmetic variety). Blocked by: #615 (tycoon starting state), #679 (culture resolution).
Parked under Phase 6 epic per cascade refocus 2026-06-12; interior/furniture generation is room-level detail pairs with T-682 (parked gameplay).', NULL, '2026-06-12 10:23:03', '2026-06-12 10:23:03', '2026-06-12 10:23:03', NULL, '1040933faf528ea6f0940a629cf9d46d', 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 ('06FB0TNSRYXPA202KSKKJ15KZ8', 'parent_id', 'T-683', 'T-749', NULL, '2026-06-12 10:23:03', '2026-06-12 10:23:03', '2026-06-12 10:23:03', NULL, '07ade8f8cc2e4bbdd6035e304986e5c0', 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 ('06FB0TNSRYXPA202KSKKJ15KZ8', 'description', 'Full character creation UI using the game UI kit and widget system — not a debug/test wrapper. This is the production character creation screen that players use at game start.
Built on the 3D CharacterVisual compositor (#693). Uses the same UI kit, widgets, and interaction patterns as the rest of the game UI.
Features:
- Body type selector (11 types)
- Head template browser (curated library)
- Hair, facial hair, eyebrow pickers with preview
- Skin tone selector (9-tone palette)
- Clothing and accessory slots
- Color customization per recolorable region
- Live 3D preview with camera orbit (frontal default per D-158, full rotation per D-155)
- Keyboard navigation (tab/arrow/enter/esc)
- Randomize button
- Standalone scene entry point (can be launched independently for artist review)
- Feeds CharacterVisualDescriptor into new game flow on confirm
Decisions: D-134 (full customization), D-146 (tile-scale heavy zoom preview), D-155 (editor rotation), D-158 (frontal camera default)
Blocked by: #693 (compositor)', 'Full character creation UI using the game UI kit and widget system not a debug/test wrapper. This is the production character creation screen that players use at game start.
Built on the 3D CharacterVisual compositor (#693). Uses the same UI kit, widgets, and interaction patterns as the rest of the game UI.
Features:
- Body type selector (11 types)
- Head template browser (curated library)
- Hair, facial hair, eyebrow pickers with preview
- Skin tone selector (9-tone palette)
- Clothing and accessory slots
- Color customization per recolorable region
- Live 3D preview with camera orbit (frontal default per D-158, full rotation per D-155)
- Keyboard navigation (tab/arrow/enter/esc)
- Randomize button
- Standalone scene entry point (can be launched independently for artist review)
- Feeds CharacterVisualDescriptor into new game flow on confirm
Decisions: D-134 (full customization), D-146 (tile-scale heavy zoom preview), D-155 (editor rotation), D-158 (frontal camera default)
Blocked by: #693 (compositor)
Parked under Phase 5 epic per cascade refocus 2026-06-12; creation screen ships with player control and character rendering.', NULL, '2026-06-12 10:23:03', '2026-06-12 10:23:03', '2026-06-12 10:23:03', NULL, '1c1476bef617dcc63942f9c183484988', 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 ('06FB0TNSRWQEZ7D8AX2PRS2FWM', 'parent_id', 'T-683', 'T-749', NULL, '2026-06-12 10:23:03', '2026-06-12 10:23:03', '2026-06-12 10:23:03', NULL, 'fe0064b13a00e26e54153d393975f8e5', 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 ('06FB0TNSRWQEZ7D8AX2PRS2FWM', 'description', 'Research and prototype LOD strategy for 400+ simultaneous characters on screen (crowd scenes, protests, battles).\n\nCurrent budget: 80 NPCs at full detail. This ticket defines the path to 400+.\n\nKey constraints from workshop:\n- LOD degradation is performance-driven, NOT distance/count threshold\n- Degradation is proactive (triggers on PROJECTED viewport character count, not measured frame drop — reactive causes hitching)\n- Progressive from player outward: furthest degrade first (full mesh -> simplified mesh -> billboard)\n- When paused: restore full detail on all characters\n- At billboard tier: body size tier and dominant clothing color must remain visually distinct\n- Outline baked into impostor sprite at billboard tier\n\nDeliverable: technical spec + prototype result. Does not produce shippable code.\n\nNot in Sprint 28 — backlog for when crowd-scale systems begin.', 'Research and prototype LOD strategy for 400+ simultaneous characters on screen (crowd scenes, protests, battles).\n\nCurrent budget: 80 NPCs at full detail. This ticket defines the path to 400+.\n\nKey constraints from workshop:\n- LOD degradation is performance-driven, NOT distance/count threshold\n- Degradation is proactive (triggers on PROJECTED viewport character count, not measured frame drop — reactive causes hitching)\n- Progressive from player outward: furthest degrade first (full mesh -> simplified mesh -> billboard)\n- When paused: restore full detail on all characters\n- At billboard tier: body size tier and dominant clothing color must remain visually distinct\n- Outline baked into impostor sprite at billboard tier\n\nDeliverable: technical spec + prototype result. Does not produce shippable code.\n\nNot in Sprint 28 — backlog for when crowd-scale systems begin.
Parked under Phase 5 epic per cascade refocus 2026-06-12; crowd-rendering research resumes with in-world rendering work.', NULL, '2026-06-12 10:23:03', '2026-06-12 10:23:03', '2026-06-12 10:23:03', NULL, '4a9d9c7110d535cea09345cae53cb0c4', 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 ('06FB0TNSRY6TPACQSYVFGDEMPR', 'parent_id', 'T-683', 'T-749', NULL, '2026-06-12 10:23:03', '2026-06-12 10:23:03', '2026-06-12 10:23:03', NULL, '401470082085a9062a094af1dc8234bb', 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 ('06FB0TNSRY6TPACQSYVFGDEMPR', 'description', 'Visual overlay system for scars on character bodies. Scars are per-segment (leveraging the 18-segment body architecture for placement). Each scar is a visual modification to a specific body segment — either a decal/texture overlay or a small mesh overlay attached to the segment. Requirements: scars placed per body segment, multiple scars per character, persist across clothing changes (visible on exposed segments), hidden under clothing via coverage system, recolorable via toon shader for skin tone matching. Depends on compositor (#704) and body segments (#707) — both done. Architecture uses per-segment addressability from D-160.', 'Visual overlay system for scars on character bodies. Scars are per-segment (leveraging the 18-segment body architecture for placement). Each scar is a visual modification to a specific body segment — either a decal/texture overlay or a small mesh overlay attached to the segment. Requirements: scars placed per body segment, multiple scars per character, persist across clothing changes (visible on exposed segments), hidden under clothing via coverage system, recolorable via toon shader for skin tone matching. Depends on compositor (#704) and body segments (#707) — both done. Architecture uses per-segment addressability from D-160.
Parked under Phase 5 epic per cascade refocus 2026-06-12; character-visuals leftover preserved.', NULL, '2026-06-12 10:23:03', '2026-06-12 10:23:03', '2026-06-12 10:23:03', NULL, 'd7bdc6daa348e5174a109160ea402783', 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 ('06FB0TNSRWS9B34T2HPJCYMGK0', 'parent_id', 'T-683', 'T-749', NULL, '2026-06-12 10:23:03', '2026-06-12 10:23:03', '2026-06-12 10:23:03', NULL, '887730352ad113e6d8deea7f67380c31', 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 ('06FB0TNSRWS9B34T2HPJCYMGK0', 'description', 'Visual overlay system for tattoos on character bodies. Tattoos are per-segment texture overlays with their own recolor masks for ink color variation. Requirements: tattoos placed per body segment, multiple tattoos per character, persist across clothing changes (visible on exposed segments), hidden under clothing via coverage system, recolorable via multi-region mask for multi-color tattoos. May share implementation approach with scar system (#715). Architecture uses per-segment addressability from D-160.', 'Visual overlay system for tattoos on character bodies. Tattoos are per-segment texture overlays with their own recolor masks for ink color variation. Requirements: tattoos placed per body segment, multiple tattoos per character, persist across clothing changes (visible on exposed segments), hidden under clothing via coverage system, recolorable via multi-region mask for multi-color tattoos. May share implementation approach with scar system (#715). Architecture uses per-segment addressability from D-160.
Parked under Phase 5 epic per cascade refocus 2026-06-12; character-visuals leftover preserved.', NULL, '2026-06-12 10:23:03', '2026-06-12 10:23:03', '2026-06-12 10:23:03', NULL, 'ceaf1f9cd8543b84b113a5fa0eec9a63', 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 ('06FB0TNSRWEDR71D90K594P7DG', 'parent_id', 'T-683', 'T-749', NULL, '2026-06-12 10:23:03', '2026-06-12 10:23:03', '2026-06-12 10:23:03', NULL, '25e00ee612f2ecedd692833527b98408', 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 ('06FB0TNSRWEDR71D90K594P7DG', 'description', 'Visual overlay system for injuries on character bodies. Injuries are per-segment visual states showing damage (bruises, cuts, burns) and healing progression. Requirements: injuries placed per body segment, severity/type affects visual appearance, healing progression over time changes the overlay, hidden under clothing via coverage system, interacts with amputation system (injury on a removed limb is moot). Depends on compositor (#704) and body segments (#707) — both done. Architecture uses per-segment addressability from D-160 and limb removal capability.', 'Visual overlay system for injuries on character bodies. Injuries are per-segment visual states showing damage (bruises, cuts, burns) and healing progression. Requirements: injuries placed per body segment, severity/type affects visual appearance, healing progression over time changes the overlay, hidden under clothing via coverage system, interacts with amputation system (injury on a removed limb is moot). Depends on compositor (#704) and body segments (#707) — both done. Architecture uses per-segment addressability from D-160 and limb removal capability.
Parked under Phase 5 epic per cascade refocus 2026-06-12; character-visuals leftover preserved.', NULL, '2026-06-12 10:23:03', '2026-06-12 10:23:03', '2026-06-12 10:23:03', NULL, '8df024d88478e4c5ccb02746b2533f20', 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 ('06FB0TNSRY5J5AWB356FT9WK0M', 'parent_id', NULL, 'T-749', NULL, '2026-06-12 10:23:03', '2026-06-12 10:23:03', '2026-06-12 10:23:03', NULL, 'bb92391660c2f89cd828880d919b9995', 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 ('06FB0TNSRY5J5AWB356FT9WK0M', 'description', '_get_accessory_ids_for_slot(slot) accepts a slot parameter but returns all accessories unfiltered. Every accessory slot shows the full catalogue. Should filter by slot-appropriate prefix (hat_*, goggles_*, etc.) matching the clothing tab''s approach. Currently invisible with placeholder assets but will be wrong when real accessories are added.', '_get_accessory_ids_for_slot(slot) accepts a slot parameter but returns all accessories unfiltered. Every accessory slot shows the full catalogue. Should filter by slot-appropriate prefix (hat_*, goggles_*, etc.) matching the clothing tab''s approach. Currently invisible with placeholder assets but will be wrong when real accessories are added.
Parked under Phase 5 epic per cascade refocus 2026-06-12; latent creation-UI bug fixed alongside character-visuals leftovers.', NULL, '2026-06-12 10:23:03', '2026-06-12 10:23:03', '2026-06-12 10:23:03', NULL, '12b79e07db27041708b58a1bdf1a9878', 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 ('06FB0TNSRYS8J5T5CV3EKNPJMR', 'parent_id', NULL, 'T-749', NULL, '2026-06-12 10:23:03', '2026-06-12 10:23:03', '2026-06-12 10:23:03', NULL, '78490f2d459ad3a5fa23d35a3f58377f', 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 ('06FB0TNSRYS8J5T5CV3EKNPJMR', 'description', 'Evaluate GodotFontAutoSizeLabels (https://github.com/LuisEscorza/GodotFontAutoSizeLabels) for handling text that must fit a fixed container. We will hit this with: NPC name labels, item names in grids, clothing/hair button labels, dialogue boxes, any server-generated text rendered in fixed UI elements. Adopt the pattern early (either this plugin or our own implementation) before overflow bugs accumulate.', 'Evaluate GodotFontAutoSizeLabels (https://github.com/LuisEscorza/GodotFontAutoSizeLabels) for handling text that must fit a fixed container. We will hit this with: NPC name labels, item names in grids, clothing/hair button labels, dialogue boxes, any server-generated text rendered in fixed UI elements. Adopt the pattern early (either this plugin or our own implementation) before overflow bugs accumulate.
Parked under Phase 5 epic per cascade refocus 2026-06-12; adopt the pattern when gameplay UI surfaces are built.', NULL, '2026-06-12 10:23:03', '2026-06-12 10:23:03', '2026-06-12 10:23:03', NULL, 'afff3234f7568416f12bf3798f3430a2', 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 ('06FB0TNSRXJ3WZ2AQMWBNB4D2W', 'parent_id', NULL, 'T-749', NULL, '2026-06-12 10:23:03', '2026-06-12 10:23:03', '2026-06-12 10:23:03', NULL, '9572840bbcad80ee20aebb037c808e9f', 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 ('06FB0TNSRXJ3WZ2AQMWBNB4D2W', 'description', 'Godot Icons Fonts (https://github.com/rakugoteam/Godot-Icons-Fonts) — searchable icon font library (FontAwesome, Material Icons, etc.) directly in the Godot editor. MIT. Saves time hunting for individual icon assets during UI development. Install from asset library. Use for: HUD icons, status indicators, navigation symbols, button icons, inventory categories.', 'Godot Icons Fonts (https://github.com/rakugoteam/Godot-Icons-Fonts) — searchable icon font library (FontAwesome, Material Icons, etc.) directly in the Godot editor. MIT. Saves time hunting for individual icon assets during UI development. Install from asset library. Use for: HUD icons, status indicators, navigation symbols, button icons, inventory categories.
Parked under Phase 5 epic per cascade refocus 2026-06-12; install when HUD/gameplay UI development resumes.', NULL, '2026-06-12 10:23:03', '2026-06-12 10:23:03', '2026-06-12 10:23:03', NULL, '4e602b09bdc4bb576bd084869518b5d1', 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 ('06FB0TNSRYKBBN824V9KB9NEN0', 'parent_id', NULL, 'T-749', NULL, '2026-06-12 10:23:03', '2026-06-12 10:23:03', '2026-06-12 10:23:03', NULL, '2c819d8daa0ddb72dce62e422c6822b3', 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 ('06FB0TNSRYKBBN824V9KB9NEN0', 'description', 'Extend the character creator screenshot test config JSON with a resolution field. The system sets viewport size before capturing, enabling automated visual regression across common resolutions (1080p, 1440p, 4K, ultrawide, Steam Deck 800p). Batch script iterates the manifest body types × resolutions for full coverage. No plugin needed — just OS.window_size or viewport size override. Inspired by Project Resolution plugin (https://github.com/Danim3D/Godot-4-Plugin-Project-Resolution) but built into our existing test infrastructure.', 'Extend the character creator screenshot test config JSON with a resolution field. The system sets viewport size before capturing, enabling automated visual regression across common resolutions (1080p, 1440p, 4K, ultrawide, Steam Deck 800p). Batch script iterates the manifest body types × resolutions for full coverage. No plugin needed — just OS.window_size or viewport size override. Inspired by Project Resolution plugin (https://github.com/Danim3D/Godot-4-Plugin-Project-Resolution) but built into our existing test infrastructure.
Parked under Phase 5 epic per cascade refocus 2026-06-12; functional requirement (multi-resolution visual regression) preserved resumes with character rendering work.', NULL, '2026-06-12 10:23:03', '2026-06-12 10:23:03', '2026-06-12 10:23:03', NULL, '97136ab4f9f1f22de5a449b159c72d6d', 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 ('06FB0TNSRZGD6VYZM7BT6PC5WM', 'parent_id', NULL, 'T-1036', NULL, '2026-06-12 10:23:03', '2026-06-12 10:23:03', '2026-06-12 10:23:03', NULL, 'b4849d91d8c79dde043dc0ac2801816e', 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 ('06FB0TNSRZGD6VYZM7BT6PC5WM', 'description', 'Evaluate Godot4xInstallWizard (https://github.com/untamedlabs/Godot4xInstallWizard) for first-launch experience: EULA acceptance, initial settings (resolution, audio, controls), install path selection. Needed when packaging for Steam or standalone distribution. Low priority until release preparation begins.', 'Evaluate Godot4xInstallWizard (https://github.com/untamedlabs/Godot4xInstallWizard) for first-launch experience: EULA acceptance, initial settings (resolution, audio, controls), install path selection. Needed when packaging for Steam or standalone distribution. Low priority until release preparation begins.
Parked under post-cascade gameplay/release backlog per cascade refocus 2026-06-12; functional requirement preserved for release preparation.', NULL, '2026-06-12 10:23:03', '2026-06-12 10:23:03', '2026-06-12 10:23:03', NULL, '8c4150b661ea0fe4b936c92c219cc120', 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 ('06FB0TNSRXBTTPTBFJN0DGX2YC', 'parent_id', NULL, 'T-1036', NULL, '2026-06-12 10:23:03', '2026-06-12 10:23:03', '2026-06-12 10:23:03', NULL, '967331e552a622c24fb59a4ba78ed20b', 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 ('06FB0TNSRXBTTPTBFJN0DGX2YC', 'description', 'Add a licenses/credits screen accessible from the main menu settings. Must display all third-party licenses: Quaternius (CC0), Godot engine, any adopted plugins (MIT), font licenses, audio assets. Pattern reference: godot-licensing (https://github.com/nathanfranke/godot-licensing) — auto-collects license info. We don''t need the plugin but need the pattern: scan for LICENSE files, Godot''s built-in Engine.get_license_info(), and our own attribution list. Legal requirement for distribution.', 'Add a licenses/credits screen accessible from the main menu settings. Must display all third-party licenses: Quaternius (CC0), Godot engine, any adopted plugins (MIT), font licenses, audio assets. Pattern reference: godot-licensing (https://github.com/nathanfranke/godot-licensing) — auto-collects license info. We don''t need the plugin but need the pattern: scan for LICENSE files, Godot''s built-in Engine.get_license_info(), and our own attribution list. Legal requirement for distribution.
Parked under post-cascade gameplay/release backlog per cascade refocus 2026-06-12; legal attribution requirement preserved for release preparation.', NULL, '2026-06-12 10:23:03', '2026-06-12 10:23:03', '2026-06-12 10:23:03', NULL, 'b02383d6350c79eba1708421aece23a2', 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 ('06FB0TNSRY35YGQ1PGBXE4B7KM', 'parent_id', NULL, 'T-1036', NULL, '2026-06-12 10:23:04', '2026-06-12 10:23:04', '2026-06-12 10:23:04', NULL, '7aef2c8adf2d8b129ccde6c3b0196ed8', 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 ('06FB0TNSRY35YGQ1PGBXE4B7KM', 'description', 'Up up down down left right left right B A. Because reasons. https://github.com/aravikusu/konamicode — reference implementation. Trigger: unlock debug panel in release builds, or something fun.', 'Up up down down left right left right B A. Because reasons. https://github.com/aravikusu/konamicode — reference implementation. Trigger: unlock debug panel in release builds, or something fun.
Parked under post-cascade gameplay backlog per cascade refocus 2026-06-12; preserved, not cancelled.', NULL, '2026-06-12 10:23:04', '2026-06-12 10:23:04', '2026-06-12 10:23:04', NULL, '837ba526ee51d3d1b1dbe0e57fc2ba1f', 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 ('06FB0TNSRWJAKQQ33BNCFZGV3W', 'parent_id', NULL, 'T-749', NULL, '2026-06-12 10:23:04', '2026-06-12 10:23:04', '2026-06-12 10:23:04', NULL, 'dd42991736e4acd4b4367d22128f5a23', 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 ('06FB0TNSRWJAKQQ33BNCFZGV3W', 'description', 'The minimap needs to render from server-sent exploration and visibility data. No existing Godot minimap plugin fits because our information boundary is server-authoritative. Architecture: server sends explored tile states (unexplored/explored/visible) as part of ObserverSnapshot. Client renders a top-down 2D minimap from this data — fog for unexplored, dim for explored-not-visible, lit for currently visible. Player position centered. Needs a dedicated data stream or section in the snapshot for minimap tile states. Reference: the existing 2D fog_state.gd has the rendering patterns (texture from tile data), but the 3D minimap may use a separate overhead Camera3D in a SubViewport instead.', 'The minimap needs to render from server-sent exploration and visibility data. No existing Godot minimap plugin fits because our information boundary is server-authoritative. Architecture: server sends explored tile states (unexplored/explored/visible) as part of ObserverSnapshot. Client renders a top-down 2D minimap from this data — fog for unexplored, dim for explored-not-visible, lit for currently visible. Player position centered. Needs a dedicated data stream or section in the snapshot for minimap tile states. Reference: the existing 2D fog_state.gd has the rendering patterns (texture from tile data), but the 3D minimap may use a separate overhead Camera3D in a SubViewport instead.
Parked under Phase 5 epic per cascade refocus 2026-06-12; server-authoritative minimap requirement preserved resumes with player rendering.', NULL, '2026-06-12 10:23:04', '2026-06-12 10:23:04', '2026-06-12 10:23:04', NULL, 'fcb9b5c82f6c26c92293090c073d1211', 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 ('06FB0TNSRXGNK7WHD9DEGPY4BC', 'parent_id', NULL, 'T-749', NULL, '2026-06-12 10:23:04', '2026-06-12 10:23:04', '2026-06-12 10:23:04', NULL, '5095862ce620dace4020ed10e41601f7', 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 ('06FB0TNSRXGNK7WHD9DEGPY4BC', 'description', 'Implement nested/recursive tooltips for the information-dense UI. Reference: Nested-Tooltips (https://github.com/duzychri/Nested-Tooltips). Pattern: hover over text → tooltip appears → hover over a keyword in the tooltip → nested tooltip explains that keyword. Use cases: NPC names (→ disposition, role), items (→ stats → stat modifier explanations), zone names (→ zone type, danger level), factions (→ relationship, territory). This is core to the asymmetric information design — tooltips reveal what your character KNOWS, with depth proportional to familiarity. Study the plugin for the recursive hover detection pattern, implement with our diegetic UI aesthetic.', 'Implement nested/recursive tooltips for the information-dense UI. Reference: Nested-Tooltips (https://github.com/duzychri/Nested-Tooltips). Pattern: hover over text → tooltip appears → hover over a keyword in the tooltip → nested tooltip explains that keyword. Use cases: NPC names (→ disposition, role), items (→ stats → stat modifier explanations), zone names (→ zone type, danger level), factions (→ relationship, territory). This is core to the asymmetric information design — tooltips reveal what your character KNOWS, with depth proportional to familiarity. Study the plugin for the recursive hover detection pattern, implement with our diegetic UI aesthetic.
Parked under Phase 5 epic per cascade refocus 2026-06-12; asymmetric-information tooltip requirement preserved resumes with gameplay UI work.', NULL, '2026-06-12 10:23:04', '2026-06-12 10:23:04', '2026-06-12 10:23:04', NULL, 'e08809c3d8eb525b1be278e52a4ece9f', 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 ('06FB0TNSRXY24QTYKWPERE52X4', 'parent_id', NULL, 'T-749', NULL, '2026-06-12 10:23:04', '2026-06-12 10:23:04', '2026-06-12 10:23:04', NULL, '163a0b0d605303c2e225bb693312721d', 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 ('06FB0TNSRXY24QTYKWPERE52X4', 'description', 'Unified design and implementation pass for player-facing settings and input: (a) Key binding remapper with save/load. (b) Save browser with thumbnails and metadata. (c) Context-sensitive cursors (examine, talk, use, attack, walk). (d) Controller/gamepad support with radial menus. Design all four together in Frame0 for visual consistency, then implement as a cohesive system. These share UI patterns (settings panels, modal dialogs, input feedback) and should not be built independently.', 'Unified design and implementation pass for player-facing settings and input: (a) Key binding remapper with save/load. (b) Save browser with thumbnails and metadata. (c) Context-sensitive cursors (examine, talk, use, attack, walk). (d) Controller/gamepad support with radial menus. Design all four together in Frame0 for visual consistency, then implement as a cohesive system. These share UI patterns (settings panels, modal dialogs, input feedback) and should not be built independently.
Parked under Phase 5 epic per cascade refocus 2026-06-12; unified settings/input design requirement preserved resumes with player control work.', NULL, '2026-06-12 10:23:04', '2026-06-12 10:23:04', '2026-06-12 10:23:04', NULL, '1bc7c74d446e342f697d8d9ad596184a', 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 ('06FB0TNSRZ3GAN6QKTNJWVKPDG', 'parent_id', NULL, 'T-750', NULL, '2026-06-12 10:23:04', '2026-06-12 10:23:04', '2026-06-12 10:23:04', NULL, '80629a9d29a18f8d9244bcdb6d3e97c3', 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 ('06FB0TNSRZ3GAN6QKTNJWVKPDG', 'description', 'Godot Poly Haven Downloader (https://github.com/P3ntest/godot-polyhaven-downloader) — browse and download CC0 models, textures, and HDRIs from Poly Haven directly in the Godot editor. Removes friction from asset sourcing. Install when environment art work begins.', 'Godot Poly Haven Downloader (https://github.com/P3ntest/godot-polyhaven-downloader) — browse and download CC0 models, textures, and HDRIs from Poly Haven directly in the Godot editor. Removes friction from asset sourcing. Install when environment art work begins.
Re-parented under Phase 4 epic per cascade refocus 2026-06-12 asset-pipeline tooling feeding the Phase-4 asset catalog.', NULL, '2026-06-12 10:23:04', '2026-06-12 10:23:04', '2026-06-12 10:23:04', NULL, '6fa7e591ddac231484991527587cb530', 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 ('06FB0TNSRY9W1MWNKMS803195C', 'parent_id', NULL, 'T-749', NULL, '2026-06-12 10:23:04', '2026-06-12 10:23:04', '2026-06-12 10:23:04', NULL, '9eb7d8e83c7a6301fad8e938acd6fd09', 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 ('06FB0TNSRY9W1MWNKMS803195C', 'description', 'Soft glow border on hovered/selected objects and characters. Reference: GlowBorderEffect (https://github.com/Magodra/GlowBorderEffect). Distinct from our inverted hull outline (permanent character silhouette) — this is a context-sensitive highlight: hover over an NPC to see a soft glow indicating they''re interactable, selected items glow in inventory, quest-relevant objects pulse. Could be a simple shader (stencil + blur) or adopt the plugin. Evaluate when interaction system is built.', 'Soft glow border on hovered/selected objects and characters. Reference: GlowBorderEffect (https://github.com/Magodra/GlowBorderEffect). Distinct from our inverted hull outline (permanent character silhouette) — this is a context-sensitive highlight: hover over an NPC to see a soft glow indicating they''re interactable, selected items glow in inventory, quest-relevant objects pulse. Could be a simple shader (stencil + blur) or adopt the plugin. Evaluate when interaction system is built.
Parked under Phase 5 epic per cascade refocus 2026-06-12; interactable-highlight requirement preserved evaluate when the interaction system is built.', NULL, '2026-06-12 10:23:04', '2026-06-12 10:23:04', '2026-06-12 10:23:04', NULL, 'cefee7bdb82d9c9b16a18e6af89a7917', 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 ('06FB0TNSRWKAS60B0F9E8QHZ10', 'parent_id', NULL, 'T-749', NULL, '2026-06-12 10:23:04', '2026-06-12 10:23:04', '2026-06-12 10:23:04', NULL, '0183d0232cdf4d6306f3fe7df430082c', 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 ('06FB0TNSRWKAS60B0F9E8QHZ10', 'description', 'Replace standalone stance indicator with an icon bar docked to the HUD status panel. Shows active states as small icons: stance (walk/sprint/crouch/careful), perception mode, future buffs/debuffs, implant status. Each icon color-coded per existing stance colors. Tooltip on hover shows label. Bar sits above or beside the HUD status ImplantPanel. Requires: icon set design (Araminta), bar layout component (ImplantIconBar), stance indicator refactored from panel to icon.', 'Replace standalone stance indicator with an icon bar docked to the HUD status panel. Shows active states as small icons: stance (walk/sprint/crouch/careful), perception mode, future buffs/debuffs, implant status. Each icon color-coded per existing stance colors. Tooltip on hover shows label. Bar sits above or beside the HUD status ImplantPanel. Requires: icon set design (Araminta), bar layout component (ImplantIconBar), stance indicator refactored from panel to icon.
Parked under Phase 5 epic per cascade refocus 2026-06-12; HUD status-icon requirement preserved resumes with gameplay UI work.', NULL, '2026-06-12 10:23:04', '2026-06-12 10:23:04', '2026-06-12 10:23:04', NULL, 'a6c4857ba57ea9ffa1c933f2c133f194', 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 ('06FB0TNSRXZSXNPA5Q55JN5K54', 'parent_id', NULL, 'T-749', NULL, '2026-06-12 10:23:04', '2026-06-12 10:23:04', '2026-06-12 10:23:04', NULL, 'afb45c0e5591638c3f6c3c66a5d4629e', 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 ('06FB0TNSRXZSXNPA5Q55JN5K54', 'description', 'Two deliverables: (1) A keybind reference document listing all current key bindings (InputMap actions + hardcoded _unhandled_key_input keys like M/J/N/[/]). (2) A keybind mapper in the settings dialog that lets the player rebind keys at runtime. Triggered by Sprint 34 E-key conflict where economics panel was bound to a key already used by InputMap interact action.', 'Two deliverables: (1) A keybind reference document listing all current key bindings (InputMap actions + hardcoded _unhandled_key_input keys like M/J/N/[/]). (2) A keybind mapper in the settings dialog that lets the player rebind keys at runtime. Triggered by Sprint 34 E-key conflict where economics panel was bound to a key already used by InputMap interact action.
Parked under Phase 5 epic per cascade refocus 2026-06-12; keybind documentation and remapping requirement preserved pairs with T-735.', NULL, '2026-06-12 10:23:04', '2026-06-12 10:23:04', '2026-06-12 10:23:04', NULL, '7551e65c0732fbcbc9f32f9ec75a1388', 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 ('06FB0TNSRXMTJBWMXJBANMD6C4', 'parent_id', NULL, 'T-750', NULL, '2026-06-12 10:23:04', '2026-06-12 10:23:04', '2026-06-12 10:23:04', NULL, 'c3d4e91ec552298c6a3621aaa714b902', 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 ('06FB0TNSRXMTJBWMXJBANMD6C4', 'description', 'Review follow-up from PR #128 (Hoshe #17). Add unit-test coverage for compute_gdp, infer_tier_from_population, build_adjacency, parse_wiki_index in tooling/generate-star-map-data.py. Explicit boundary-condition test worth adding: compute_gdp at exactly 1T Tr (the BTr → TTr format switch). Non-blocker on the atlas landing PR but the generator is now on the pre-pr-client path, so it earns the regression coverage.', 'Review follow-up from PR #128 (Hoshe #17). Add unit-test coverage for compute_gdp, infer_tier_from_population, build_adjacency, parse_wiki_index in tooling/generate-star-map-data.py. Explicit boundary-condition test worth adding: compute_gdp at exactly 1T Tr (the BTr → TTr format switch). Non-blocker on the atlas landing PR but the generator is now on the pre-pr-client path, so it earns the regression coverage.
Re-parented under Phase 4 epic per cascade refocus 2026-06-12 generation-tooling test coverage (atlas star-map generator).', NULL, '2026-06-12 10:23:04', '2026-06-12 10:23:04', '2026-06-12 10:23:04', NULL, '28b48f03517057f089201fa0be6bcea9', 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 ('06FB0TNSRZN95D8BBZ28Q92BQW', 'parent_id', NULL, 'T-750', NULL, '2026-06-12 10:23:04', '2026-06-12 10:23:04', '2026-06-12 10:23:04', NULL, '870cb7c53dd735d617b18188f75c68cc', 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 ('06FB0TNSRZN95D8BBZ28Q92BQW', 'description', 'Review follow-up from PR #128 (blocker #3 fix). AtlasMarkerOverlay currently derives production_zones / shadow_economy / corp_presence from cities[].primary_function and cities[].commission_presence because D-191 §8''s schema (cities, roads, railroads, pois, rivers, oceans, mountain_ranges) has no dedicated arrays for production zones, shadow bands, or per-corp dots. Options: (a) amend D-191 §8 to list these explicitly and update the server generator, or (b) keep deriving from cities forever. Work with server team to pick and land the schema change so the MVP overlays read first-class data.', 'Review follow-up from PR #128 (blocker #3 fix). AtlasMarkerOverlay currently derives production_zones / shadow_economy / corp_presence from cities[].primary_function and cities[].commission_presence because D-191 §8''s schema (cities, roads, railroads, pois, rivers, oceans, mountain_ranges) has no dedicated arrays for production zones, shadow bands, or per-corp dots. Options: (a) amend D-191 §8 to list these explicitly and update the server generator, or (b) keep deriving from cities forever. Work with server team to pick and land the schema change so the MVP overlays read first-class data.
Re-parented under Phase 4 epic per cascade refocus 2026-06-12 atlas markers schema is generation-output data.', NULL, '2026-06-12 10:23:04', '2026-06-12 10:23:04', '2026-06-12 10:23:04', NULL, '4e23b109798083d8dc6c365ca5602d6f', 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 ('06FB0TNSRX6RK3GGV1A1TWQSMC', 'parent_id', NULL, 'T-1037', NULL, '2026-06-12 10:23:04', '2026-06-12 10:23:04', '2026-06-12 10:23:04', NULL, '096122a11ab0c0064a8926a1d1a115b8', 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 ('06FB0TNSRX6RK3GGV1A1TWQSMC', 'description', 'The game will ship on multiple GPU vendors. The current sr-voice Cargo.toml has optional feature flags for metal / vulkan / cuda / rocm but default = [] — which means `cargo build --release` produces a CPU-only binary. Release binaries need to cover at minimum:
- NVIDIA: --features cuda (Windows, Linux gaming rigs)
- AMD: --features rocm (Linux) or vulkan (Windows, macOS, broader)
- Apple Silicon: --features metal (macOS)
- Fallback: CPU-only, always available
Options to cover this from the build pipeline:
A) Multiple release artifacts sr-voice-cuda, sr-voice-rocm, sr-voice-vulkan, sr-voice-cpu selected at game startup based on detected hardware. Biggest artifact count but best performance.
B) Single Vulkan release + CPU fallback Vulkan compute works on NVIDIA, AMD, and Intel integrated GPUs with shipping drivers. One binary, acceptable perf on all GPUs, CPU-only binary for everyone else.
C) Dynamic feature detection at runtime one binary with all backends compiled in, selects at load time. Largest binary, simplest distribution.
Also needs: release build pipeline (CI / cross-compilation) for each target platform, dev package installation instructions for each backend (e.g. ROCm rocm-hip-devel on Fedora is required for --features rocm to build), runtime hardware detection in the game launcher to pick the right binary.
Filed during the #833 naming pipeline work the ROCm rebuild on the dev machine surfaced that the current Makefile target `build-sr-voice` produces CPU-only binaries regardless of the hardware present, which is fine for the dev''s #833 batch but absolutely wrong for shipped release binaries. Parent work: D-138 (Gemma 2 voice pipeline).', 'The game will ship on multiple GPU vendors. The current sr-voice Cargo.toml has optional feature flags for metal / vulkan / cuda / rocm but default = [] which means `cargo build --release` produces a CPU-only binary. Release binaries need to cover at minimum:
- NVIDIA: --features cuda (Windows, Linux gaming rigs)
- AMD: --features rocm (Linux) or vulkan (Windows, macOS, broader)
- Apple Silicon: --features metal (macOS)
- Fallback: CPU-only, always available
Options to cover this from the build pipeline:
A) Multiple release artifacts sr-voice-cuda, sr-voice-rocm, sr-voice-vulkan, sr-voice-cpu selected at game startup based on detected hardware. Biggest artifact count but best performance.
B) Single Vulkan release + CPU fallback Vulkan compute works on NVIDIA, AMD, and Intel integrated GPUs with shipping drivers. One binary, acceptable perf on all GPUs, CPU-only binary for everyone else.
C) Dynamic feature detection at runtime one binary with all backends compiled in, selects at load time. Largest binary, simplest distribution.
Also needs: release build pipeline (CI / cross-compilation) for each target platform, dev package installation instructions for each backend (e.g. ROCm rocm-hip-devel on Fedora is required for --features rocm to build), runtime hardware detection in the game launcher to pick the right binary.
Filed during the #833 naming pipeline work the ROCm rebuild on the dev machine surfaced that the current Makefile target `build-sr-voice` produces CPU-only binaries regardless of the hardware present, which is fine for the dev''s #833 batch but absolutely wrong for shipped release binaries. Parent work: D-138 (Gemma 2 voice pipeline).
Re-homed under maintenance per cascade refocus 2026-06-12 build-pipeline infrastructure; multi-GPU release-binary requirement preserved.', NULL, '2026-06-12 10:23:04', '2026-06-12 10:23:04', '2026-06-12 10:23:04', NULL, 'e8fcd5f91d82fc989100d1ddfcf649fb', 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 ('06FB0TNSRWBJ1XC9V5ZQHSXAXG', 'parent_id', NULL, 'T-1037', NULL, '2026-06-12 10:23:04', '2026-06-12 10:23:04', '2026-06-12 10:23:04', NULL, '848225cc420632c4c8c749e61bbbeed0', 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 ('06FB0TNSRWBJ1XC9V5ZQHSXAXG', 'description', 'test_monologue_display_visible_hidden in test_client_p2.gd accessed mono.is_visible (a custom bool property). MonologueDisplay was refactored to use _visible: Array[Dictionary] instead. Test skipped (skip_test_) pending rewrite. New test should check _visible.size() > 0 after show_monologue, and == 0 when idle.', 'test_monologue_display_visible_hidden in test_client_p2.gd accessed mono.is_visible (a custom bool property). MonologueDisplay was refactored to use _visible: Array[Dictionary] instead. Test skipped (skip_test_) pending rewrite. New test should check _visible.size() > 0 after show_monologue, and == 0 when idle.
Re-homed under maintenance (test debt) per cascade refocus 2026-06-12.', NULL, '2026-06-12 10:23:04', '2026-06-12 10:23:04', '2026-06-12 10:23:04', NULL, '4b580afc32e9395363db47830ae00254', 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 ('06FB0TNSRZGSKN39GSW39JNZDG', 'parent_id', NULL, 'T-1037', NULL, '2026-06-12 10:23:04', '2026-06-12 10:23:04', '2026-06-12 10:23:04', NULL, '7c80c11a690779fc355d0f064d7732e1', 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 ('06FB0TNSRZGSKN39GSW39JNZDG', 'description', 'test_journal_sprint18.gd was deleted in Sprint 37 (#870 parse-error cleanup). It contained unique tests for: GameState.player_knowledge snapshot parsing/persistence, journal_panel.tscn scene lifecycle, entry rendering from player_knowledge entities, UIStrings confidence/source keys (D-042), _state_color() for Contradicted/Stale/Active states. No other journal-specific test file exists. Spec: D-041, D-042, #264.', 'test_journal_sprint18.gd was deleted in Sprint 37 (#870 parse-error cleanup). It contained unique tests for: GameState.player_knowledge snapshot parsing/persistence, journal_panel.tscn scene lifecycle, entry rendering from player_knowledge entities, UIStrings confidence/source keys (D-042), _state_color() for Contradicted/Stale/Active states. No other journal-specific test file exists. Spec: D-041, D-042, #264.
Re-homed under maintenance (test-revival debt from #870 deletions) per cascade refocus 2026-06-12.', NULL, '2026-06-12 10:23:04', '2026-06-12 10:23:04', '2026-06-12 10:23:04', NULL, 'd6bbde49b03c7193e985e2c8edae61b9', 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 ('06FB0TNSRYDPBFJVAQAN7T56VR', 'parent_id', NULL, 'T-1037', NULL, '2026-06-12 10:23:04', '2026-06-12 10:23:04', '2026-06-12 10:23:04', NULL, '695ab58b6bd8ee97c8b1b440b83f57ed', 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 ('06FB0TNSRYDPBFJVAQAN7T56VR', 'description', 'test_minimap_sprint18.gd was deleted in Sprint 37 (#870 parse-error cleanup). It contained unique tests for: minimap.tscn scene, POI rendering from GameState.discovered_pois, circular insert overlay visibility, insert_active toggle behavior. No other minimap test file exists. Spec: D-013, D-015, D-049, #151.', 'test_minimap_sprint18.gd was deleted in Sprint 37 (#870 parse-error cleanup). It contained unique tests for: minimap.tscn scene, POI rendering from GameState.discovered_pois, circular insert overlay visibility, insert_active toggle behavior. No other minimap test file exists. Spec: D-013, D-015, D-049, #151.
Re-homed under maintenance (test-revival debt from #870 deletions) per cascade refocus 2026-06-12.', NULL, '2026-06-12 10:23:04', '2026-06-12 10:23:04', '2026-06-12 10:23:04', NULL, '9eb2d0145e5d69b8a9a1da782a2cae33', 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 ('06FB0TNSRWYRBKFQ1W3S8DS21W', 'parent_id', NULL, 'T-1037', NULL, '2026-06-12 10:23:04', '2026-06-12 10:23:04', '2026-06-12 10:23:04', NULL, 'f003a38d3c5d7b33651ed2756257272c', 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 ('06FB0TNSRWYRBKFQ1W3S8DS21W', 'description', 'test_sprite_integration.gd was deleted in Sprint 37 (#870 parse-error cleanup). It was the sole asserter of D-044 sprite dimensions: EntityRenderer.ENTITY_WIDTH == 24 and ENTITY_HEIGHT == 32 (client/scripts/rendering/entity_renderer.gd:19-20). These values are load-bearing for tile-anchored y-sort (ENTITY_OFFSET_Y = TILE_SIZE - ENTITY_HEIGHT, line 22, D-019 tilt). Revive a focused test that asserts both constants and the derived offset — rewrite against current EntityRenderer API. Surfaced in PR #135 review (Tyre T2). Spec: D-044, D-019, D-049.', 'test_sprite_integration.gd was deleted in Sprint 37 (#870 parse-error cleanup). It was the sole asserter of D-044 sprite dimensions: EntityRenderer.ENTITY_WIDTH == 24 and ENTITY_HEIGHT == 32 (client/scripts/rendering/entity_renderer.gd:19-20). These values are load-bearing for tile-anchored y-sort (ENTITY_OFFSET_Y = TILE_SIZE - ENTITY_HEIGHT, line 22, D-019 tilt). Revive a focused test that asserts both constants and the derived offset — rewrite against current EntityRenderer API. Surfaced in PR #135 review (Tyre T2). Spec: D-044, D-019, D-049.
Re-homed under maintenance (test-revival debt from #870 deletions) per cascade refocus 2026-06-12.', NULL, '2026-06-12 10:23:04', '2026-06-12 10:23:04', '2026-06-12 10:23:04', NULL, 'd1200b1c150086e91d428b6806d6dca1', 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 ('06FB0TNSRY05Z5JJRN1ND5ZFGC', 'parent_id', NULL, 'T-1036', NULL, '2026-06-12 10:23:04', '2026-06-12 10:23:04', '2026-06-12 10:23:04', NULL, '678db598ab95971347f5773c9311e199', 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 ('06FB0TNSRY05Z5JJRN1ND5ZFGC', 'description', 'main_menu.gd:72-74 _process loop polls SimBridge.poll_snapshot while _waiting_for_catalog is true. If the server never delivers bookmark_catalog (crash, new-server bug, decode dropout), the loading screen hangs forever. #872 patched the specific TCP-batch race where catalog was overwritten in receive_bytes, but the systemic class — ''catalog never arrives'' — remains.
Add a ~10s timer on _waiting_for_catalog = true. On expiry: show ''Server did not respond. Try again.'', re-enable the menu buttons, allow the user to retry or quit. Surfaced in PR #135 review (Tyre T4).
Spec: #872 (TCP-batch race fix), #258 (main menu flow).', 'main_menu.gd:72-74 _process loop polls SimBridge.poll_snapshot while _waiting_for_catalog is true. If the server never delivers bookmark_catalog (crash, new-server bug, decode dropout), the loading screen hangs forever. #872 patched the specific TCP-batch race where catalog was overwritten in receive_bytes, but the systemic class ''catalog never arrives'' remains.
Add a ~10s timer on _waiting_for_catalog = true. On expiry: show ''Server did not respond. Try again.'', re-enable the menu buttons, allow the user to retry or quit. Surfaced in PR #135 review (Tyre T4).
Spec: #872 (TCP-batch race fix), #258 (main menu flow).
Parked under post-cascade gameplay backlog per cascade refocus 2026-06-12; loading-timeout robustness requirement preserved with the bookmark flow.', NULL, '2026-06-12 10:23:04', '2026-06-12 10:23:04', '2026-06-12 10:23:04', NULL, '9553a5986eeb683e626a7c3b7b35ecc2', 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 ('06FB0TNSRXT5QXNT1QST51NKZR', 'parent_id', NULL, 'T-1037', NULL, '2026-06-12 10:23:05', '2026-06-12 10:23:05', '2026-06-12 10:23:05', NULL, 'c192f10a169108d2e1e5248a1f77b93d', 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 ('06FB0TNSRXT5QXNT1QST51NKZR', 'description', 'Scene-level UI flow tests landed as a 4th tier beyond the 3 in CLAUDE.md (live Gauntlet / MessagePack replay / TestHarness mock). test_merge_path_flows_sprint37.gd is the first concrete example. Two rough edges surfaced in PR #135 review (Tyre T5, T6):
1. **Doc the tier model.** Update CLAUDE.md test tiers section to name this tier explicitly ''scene-flow tests: load .tscn headless, simulate input via signal emit, assert terminal state''. Include when to reach for it vs MessagePack replay vs mock.
2. **Test-only reset helpers.** before_test() in test_merge_path_flows_sprint37.gd reaches into SimBridge._last_snapshot, SimBridge._outbound_buffer, MetaStack._stack. Same reach-in pattern appeared in test_anti_tedium.gd before_test (PR #135 commit bc310a3c added MetaStack._stack.clear). Expose:
- SimBridge.reset_for_test() clears _last_snapshot, _outbound_buffer, disconnects; test-only, guarded by test_mode.
- MetaStack.reset_for_test() clears _stack.
Replace per-test reach-ins with these helpers.
3. **Minimal public API for scene state.** Current flow tests couple to private fields (_waiting_for_catalog, _selected_bookmark_id, _loading_screen, _new_game_btn). UI refactor renames will break all 4 tests simultaneously. Consider: is_waiting_for_catalog(), has_selected_bookmark(), pressed_new_game() signal a minimal public surface that test-and-refactor can share.
Not blocking PR #135 but the coupling will bite the next UI refactor.
Spec: #873 (merge-path tests), D-020 (IPC architecture test harness layer).', 'Scene-level UI flow tests landed as a 4th tier beyond the 3 in CLAUDE.md (live Gauntlet / MessagePack replay / TestHarness mock). test_merge_path_flows_sprint37.gd is the first concrete example. Two rough edges surfaced in PR #135 review (Tyre T5, T6):
1. **Doc the tier model.** Update CLAUDE.md test tiers section to name this tier explicitly ''scene-flow tests: load .tscn headless, simulate input via signal emit, assert terminal state''. Include when to reach for it vs MessagePack replay vs mock.
2. **Test-only reset helpers.** before_test() in test_merge_path_flows_sprint37.gd reaches into SimBridge._last_snapshot, SimBridge._outbound_buffer, MetaStack._stack. Same reach-in pattern appeared in test_anti_tedium.gd before_test (PR #135 commit bc310a3c added MetaStack._stack.clear). Expose:
- SimBridge.reset_for_test() clears _last_snapshot, _outbound_buffer, disconnects; test-only, guarded by test_mode.
- MetaStack.reset_for_test() clears _stack.
Replace per-test reach-ins with these helpers.
3. **Minimal public API for scene state.** Current flow tests couple to private fields (_waiting_for_catalog, _selected_bookmark_id, _loading_screen, _new_game_btn). UI refactor renames will break all 4 tests simultaneously. Consider: is_waiting_for_catalog(), has_selected_bookmark(), pressed_new_game() signal a minimal public surface that test-and-refactor can share.
Not blocking PR #135 but the coupling will bite the next UI refactor.
Spec: #873 (merge-path tests), D-020 (IPC architecture test harness layer).
Re-homed under maintenance (test-infra hygiene) per cascade refocus 2026-06-12.', NULL, '2026-06-12 10:23:05', '2026-06-12 10:23:05', '2026-06-12 10:23:05', NULL, 'c544ab9011f1b0f8758d7d6b12d63c50', 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 ('06FB0TNSRW77B3T7GXT6ZASX88', 'parent_id', NULL, 'T-1037', NULL, '2026-06-12 10:23:05', '2026-06-12 10:23:05', '2026-06-12 10:23:05', NULL, '3b397761ee33b5d5cffb245e59c836cc', 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 ('06FB0TNSRW77B3T7GXT6ZASX88', 'description', '**Follow-up to PR #137 / Hoshe review H8.**
PR #137 includes 21 file edits under `wiki/` authored by the server team (6 new corp wiki pages + 15 tag updates, shipped under #860 "Close D-175 Phase 2 coverage gate"). `CLAUDE.md` team-boundaries policy says: *"Stay within your team''s scope. Server team modifies `server/`. Copy team modifies `wiki/`."* The wiki writes were accepted for this sprint as a pragmatic fix (and copy-team follow-up review filed as #884), but Hoshe correctly flagged the precedent concern:
> "If cross-scope writes are structurally necessary for coverage gates, process should note this explicitly rather than route as a copy-team follow-up after merge."
The server team''s Phase 2 economy coverage gate requires that every referenced commodity / system / corporation has a corresponding wiki page otherwise the gate fails. That coupling is real and will recur. Routing it as an after-the-fact copy-team review works once; it''s not a stable process.
**Scope:**
1. Amend `CLAUDE.md` team-boundaries section to note an explicit carveout: when a server-side coverage gate requires wiki writes to close (economy coverage, asset coverage, future gates), the server team may write under `wiki/` provided:
- The writes are mechanical / gate-driven (page creation to satisfy a lookup, tag updates to satisfy a filter), not voice/lore authoring.
- A copy-team follow-up ticket is filed in the same PR body for voice/consistency review.
- The PR body explicitly lists the wiki files touched and the coverage gate that required them.
2. Decide whether the same carveout applies in reverse (copy team writing to `server/` for a gate closure probably N/A, but worth calling out to avoid asymmetry surprises later).
3. Alternative framing to consider: instead of the carveout, extract the coverage-gate-driven file generation into a tooling script under `tooling/` that creates *stub* pages for copy to flesh out. The server team commits the stubs; copy replaces with real content. Evaluate vs. direct-write carveout; the carveout is less infrastructure but the stub pipeline is cleaner process-wise.
4. Update `.claude/rules/project-structure.md` if needed to match the CLAUDE.md change.
**Cross-reference:** PR #137, #860 (D-175 Phase 2 coverage gate), #884 (copy-team voice/lore review of the wiki writes), `CLAUDE.md` "Agent Instructions → Team boundaries" section.
**Rationale:** The boundary exists to keep voice/lore authoring in copy-team hands and prevent drift. Coverage gates create legitimate cross-scope writes that aren''t authoring. The boundary should accommodate this or provide an alternative that keeps the boundary clean.', '**Follow-up to PR #137 / Hoshe review H8.**
PR #137 includes 21 file edits under `wiki/` authored by the server team (6 new corp wiki pages + 15 tag updates, shipped under #860 "Close D-175 Phase 2 coverage gate"). `CLAUDE.md` team-boundaries policy says: *"Stay within your team''s scope. Server team modifies `server/`. Copy team modifies `wiki/`."* The wiki writes were accepted for this sprint as a pragmatic fix (and copy-team follow-up review filed as #884), but Hoshe correctly flagged the precedent concern:
> "If cross-scope writes are structurally necessary for coverage gates, process should note this explicitly rather than route as a copy-team follow-up after merge."
The server team''s Phase 2 economy coverage gate requires that every referenced commodity / system / corporation has a corresponding wiki page otherwise the gate fails. That coupling is real and will recur. Routing it as an after-the-fact copy-team review works once; it''s not a stable process.
**Scope:**
1. Amend `CLAUDE.md` team-boundaries section to note an explicit carveout: when a server-side coverage gate requires wiki writes to close (economy coverage, asset coverage, future gates), the server team may write under `wiki/` provided:
- The writes are mechanical / gate-driven (page creation to satisfy a lookup, tag updates to satisfy a filter), not voice/lore authoring.
- A copy-team follow-up ticket is filed in the same PR body for voice/consistency review.
- The PR body explicitly lists the wiki files touched and the coverage gate that required them.
2. Decide whether the same carveout applies in reverse (copy team writing to `server/` for a gate closure probably N/A, but worth calling out to avoid asymmetry surprises later).
3. Alternative framing to consider: instead of the carveout, extract the coverage-gate-driven file generation into a tooling script under `tooling/` that creates *stub* pages for copy to flesh out. The server team commits the stubs; copy replaces with real content. Evaluate vs. direct-write carveout; the carveout is less infrastructure but the stub pipeline is cleaner process-wise.
4. Update `.claude/rules/project-structure.md` if needed to match the CLAUDE.md change.
**Cross-reference:** PR #137, #860 (D-175 Phase 2 coverage gate), #884 (copy-team voice/lore review of the wiki writes), `CLAUDE.md` "Agent Instructions → Team boundaries" section.
**Rationale:** The boundary exists to keep voice/lore authoring in copy-team hands and prevent drift. Coverage gates create legitimate cross-scope writes that aren''t authoring. The boundary should accommodate this or provide an alternative that keeps the boundary clean.
Re-homed under maintenance (process/docs hygiene) per cascade refocus 2026-06-12.', NULL, '2026-06-12 10:23:05', '2026-06-12 10:23:05', '2026-06-12 10:23:05', NULL, 'ebf00eaf6189ca661affae193c839fa5', 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 ('06FB0TNSRZBH1C2R0DXM00C66R', 'parent_id', NULL, 'T-1036', NULL, '2026-06-12 10:23:05', '2026-06-12 10:23:05', '2026-06-12 10:23:05', NULL, '321711ee03afb2d18687795f2eebb450', 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 ('06FB0TNSRZBH1C2R0DXM00C66R', 'description', 'v01_integration_playthrough.rs was deleted in #878 as archetype-dependent. Its only non-archetype coverage — D-027 criterion 4 (RoutineDeviation tell after triangle activation) — was already #[ignore]-blocked on #589 (escalate_tells_on_activation). Layer 1 tell priority is covered by tell_escalation.rs. This ticket tracks the missing Layer 2 ECS-world test: activation event → RoutineDeviation insertion, and (optionally) a Layer 3 subprocess proof once #589 lands. Non-blocking for sprint 37 merge.', 'v01_integration_playthrough.rs was deleted in #878 as archetype-dependent. Its only non-archetype coverage — D-027 criterion 4 (RoutineDeviation tell after triangle activation) — was already #[ignore]-blocked on #589 (escalate_tells_on_activation). Layer 1 tell priority is covered by tell_escalation.rs. This ticket tracks the missing Layer 2 ECS-world test: activation event → RoutineDeviation insertion, and (optionally) a Layer 3 subprocess proof once #589 lands. Non-blocking for sprint 37 merge.
Parked under post-cascade gameplay backlog per cascade refocus 2026-06-12; D-027 criterion-4 coverage requirement preserved picks up when tell escalation (#589) lands.', NULL, '2026-06-12 10:23:05', '2026-06-12 10:23:05', '2026-06-12 10:23:05', NULL, '9c1136adea956745fd8c509a5220d750', 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 ('06FB0TNSRXN360AQN3973AHS8M', 'parent_id', 'T-871', 'T-1037', NULL, '2026-06-12 10:23:05', '2026-06-12 10:23:05', '2026-06-12 10:23:05', NULL, '76cc8040f9009694f3861eac03e5cfa0', 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 ('06FB0TNSRXN360AQN3973AHS8M', 'description', '5 failing test cases in test_dialogue_sprint20.gd. The suite tests D-020 signal decoupling for dialogue_box. Likely failure: test_show_dialogue_does_not_call_audio_manager_directly compares AudioManager.get_active_dip() before/after show_dialogue — if AudioManager.get_active_dip() behavior changed or is not returning clean state, this would fail. Investigate by running the suite in isolation and reading specific assertion failures from the log. Sprint 38 triage #871.', '5 failing test cases in test_dialogue_sprint20.gd. The suite tests D-020 signal decoupling for dialogue_box. Likely failure: test_show_dialogue_does_not_call_audio_manager_directly compares AudioManager.get_active_dip() before/after show_dialogue — if AudioManager.get_active_dip() behavior changed or is not returning clean state, this would fail. Investigate by running the suite in isolation and reading specific assertion failures from the log. Sprint 38 triage #871.
Re-homed under maintenance from done umbrella T-871 per cascade refocus 2026-06-12.', NULL, '2026-06-12 10:23:05', '2026-06-12 10:23:05', '2026-06-12 10:23:05', NULL, 'aafb0b06053995e8abd23fa978f55329', 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 ('06FB0TNSRXMVYQJV2QDHH8H7P8', 'parent_id', 'T-871', 'T-1037', NULL, '2026-06-12 10:23:05', '2026-06-12 10:23:05', '2026-06-12 10:23:05', NULL, 'aee51fd80113c848573fffd319abd334', 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 ('06FB0TNSRXMVYQJV2QDHH8H7P8', 'description', '3 failing test cases in test_input_roundtrip.gd. All tests check _connect_to_server() which skips if server binary not found — but 3 still fail, suggesting either: (1) server binary is present but something in LocalBridge.send_message, poll, or Protocol.encode_player_inputs changed, or (2) test environment returns false from _connect_to_server but then asserts fail. Investigate by running with --filter test_input_roundtrip and checking the log for exact assertion sites. Sprint 38 triage #871.', '3 failing test cases in test_input_roundtrip.gd. All tests check _connect_to_server() which skips if server binary not found — but 3 still fail, suggesting either: (1) server binary is present but something in LocalBridge.send_message, poll, or Protocol.encode_player_inputs changed, or (2) test environment returns false from _connect_to_server but then asserts fail. Investigate by running with --filter test_input_roundtrip and checking the log for exact assertion sites. Sprint 38 triage #871.
Re-homed under maintenance from done umbrella T-871 per cascade refocus 2026-06-12.', NULL, '2026-06-12 10:23:05', '2026-06-12 10:23:05', '2026-06-12 10:23:05', NULL, '2e20c8d57ebb36df3ec4c62a4019a0ae', 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 ('06FB0TNSRY3TXD5HDKHFVGDG18', 'parent_id', 'T-871', 'T-1037', NULL, '2026-06-12 10:23:05', '2026-06-12 10:23:05', '2026-06-12 10:23:05', NULL, '08bf56ba5ea0b7470ad4470a3384d233', 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 ('06FB0TNSRY3TXD5HDKHFVGDG18', 'description', '1 failing test case in test_implant_app_lifecycle.gd. Suite tests ImplantApp._internal_app_changed, nav stack, preserves_state, and HudGroups state. after_test resets HudGroups._active_app, _active_mode, _groups — if these private fields were renamed or removed, after_test would fail and bleed state. Or a specific on_open/on_close hook fires differently. Run --filter test_implant_app_lifecycle and check specific assertion. Sprint 38 triage #871.', '1 failing test case in test_implant_app_lifecycle.gd. Suite tests ImplantApp._internal_app_changed, nav stack, preserves_state, and HudGroups state. after_test resets HudGroups._active_app, _active_mode, _groups — if these private fields were renamed or removed, after_test would fail and bleed state. Or a specific on_open/on_close hook fires differently. Run --filter test_implant_app_lifecycle and check specific assertion. Sprint 38 triage #871.
Re-homed under maintenance from done umbrella T-871 per cascade refocus 2026-06-12.', NULL, '2026-06-12 10:23:05', '2026-06-12 10:23:05', '2026-06-12 10:23:05', NULL, '66a1757301b4be02a42e6fe14cb907e4', 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 ('06FB0TNSRWK87PCWGZ6GWT2TBM', 'parent_id', 'T-871', 'T-1037', NULL, '2026-06-12 10:23:05', '2026-06-12 10:23:05', '2026-06-12 10:23:05', NULL, '5cfe2051910895671feb740728b898b5', 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 ('06FB0TNSRWK87PCWGZ6GWT2TBM', 'description', '1 failing test case in test_game_state_sprint20.gd. before_each resets SnapshotHandler._prev_player_position. If this static var was renamed or moved, the before_each hook would error. Alternatively a stationary_ticks path changed in SnapshotHandler. Verify SnapshotHandler still has static var _prev_player_position at that exact name. Sprint 38 triage #871.', '1 failing test case in test_game_state_sprint20.gd. before_each resets SnapshotHandler._prev_player_position. If this static var was renamed or moved, the before_each hook would error. Alternatively a stationary_ticks path changed in SnapshotHandler. Verify SnapshotHandler still has static var _prev_player_position at that exact name. Sprint 38 triage #871.
Re-homed under maintenance from done umbrella T-871 per cascade refocus 2026-06-12.', NULL, '2026-06-12 10:23:05', '2026-06-12 10:23:05', '2026-06-12 10:23:05', NULL, '15fd6bc1637771fb36b0361658f5b12f', 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 ('06FB0TNSRYF23MZ86S1XF1542G', 'parent_id', 'T-871', 'T-1037', NULL, '2026-06-12 10:23:05', '2026-06-12 10:23:05', '2026-06-12 10:23:05', NULL, 'cb8e3e0aec2ef61c07113c41b9a93267', 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 ('06FB0TNSRYF23MZ86S1XF1542G', 'description', '1 failing test case in test_fog_shader.gd. The most likely failure is test_fog_state_forward_vs_peripheral: it asserts Forward > Peripheral visibility values, but Sprint 22 (#569) removed peripheral sector. Now all visible tiles write VIS_FORWARD regardless. The test checks the texture is non-null (not the actual byte values), so it should pass... unless the failure is in test_fog_state_exploration_persists which has a weak assertion. Run --filter test_fog_shader to identify the specific failure. Sprint 38 triage #871.', '1 failing test case in test_fog_shader.gd. The most likely failure is test_fog_state_forward_vs_peripheral: it asserts Forward > Peripheral visibility values, but Sprint 22 (#569) removed peripheral sector. Now all visible tiles write VIS_FORWARD regardless. The test checks the texture is non-null (not the actual byte values), so it should pass... unless the failure is in test_fog_state_exploration_persists which has a weak assertion. Run --filter test_fog_shader to identify the specific failure. Sprint 38 triage #871.
Re-homed under maintenance from done umbrella T-871 per cascade refocus 2026-06-12.', NULL, '2026-06-12 10:23:05', '2026-06-12 10:23:05', '2026-06-12 10:23:05', NULL, '627f13f72010cc6e168d832ba4dadce6', 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 ('06FB0TNSRZYDBRV5T9QVQAXGV0', 'parent_id', 'T-871', 'T-1037', NULL, '2026-06-12 10:23:05', '2026-06-12 10:23:05', '2026-06-12 10:23:05', NULL, 'c36b0ad6e8a54ef5d7e8702c615ac409', 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 ('06FB0TNSRZYDBRV5T9QVQAXGV0', 'description', '1 failing test case in test_e2e_connection.gd. test_send_input_receive_snapshot skips if server binary not found. If it fails, either: (1) server binary exists but connection fails (port collision, timing), or (2) LocalBridge.reset() method was removed (the test calls _bridge.reset() but this may not exist on LocalBridge). Verify LocalBridge has a reset() method. Sprint 38 triage #871.', '1 failing test case in test_e2e_connection.gd. test_send_input_receive_snapshot skips if server binary not found. If it fails, either: (1) server binary exists but connection fails (port collision, timing), or (2) LocalBridge.reset() method was removed (the test calls _bridge.reset() but this may not exist on LocalBridge). Verify LocalBridge has a reset() method. Sprint 38 triage #871.
Re-homed under maintenance from done umbrella T-871 per cascade refocus 2026-06-12.', NULL, '2026-06-12 10:23:05', '2026-06-12 10:23:05', '2026-06-12 10:23:05', NULL, '8e04e917f9de6e7ab8b8c70b39826d9d', 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 ('06FB0TNSRY9FV0S9RE42WY7SHW', 'parent_id', 'T-871', 'T-1037', NULL, '2026-06-12 10:23:05', '2026-06-12 10:23:05', '2026-06-12 10:23:05', NULL, '7bf5cad7bc9fa5ef93d805e0e3538245', 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 ('06FB0TNSRY9FV0S9RE42WY7SHW', 'description', '1 failing test case in test_audio_sprint13.gd. before_test calls AudioManager.clear_dip(), stop_all_loops(), set_volume() for all buses. If any of these methods were renamed or a bus constant changed, setup would fail and cascade. Or a specific dip timing assertion is stale. Run --filter test_audio_sprint13 and read the specific failure. Sprint 38 triage #871.', '1 failing test case in test_audio_sprint13.gd. before_test calls AudioManager.clear_dip(), stop_all_loops(), set_volume() for all buses. If any of these methods were renamed or a bus constant changed, setup would fail and cascade. Or a specific dip timing assertion is stale. Run --filter test_audio_sprint13 and read the specific failure. Sprint 38 triage #871.
Re-homed under maintenance from done umbrella T-871 per cascade refocus 2026-06-12.', NULL, '2026-06-12 10:23:05', '2026-06-12 10:23:05', '2026-06-12 10:23:05', NULL, 'bf9041705c59d84b0ccee690f5eb57a5', 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 ('06FB0TNSRXCE9D9JYBZWVXMG68', 'parent_id', 'T-871', 'T-1037', NULL, '2026-06-12 10:23:05', '2026-06-12 10:23:05', '2026-06-12 10:23:05', NULL, '41d583727a964c812e3675fe61e9d007', 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 ('06FB0TNSRXCE9D9JYBZWVXMG68', 'description', '1 failing test case in test_ai_dialogue_sprint26.gd. The HardwareDetector tests skip if autoload not found. The GameState field tests (ai_enhanced_dialogue_enabled) look correct. The failing test is likely in the settings_dialog section: SETTINGS_DIALOG_SCENE preloaded at class level — if settings_dialog.tscn doesn''t exist or a method was renamed, class-level preload would fail. Check res://ui/settings_dialog.tscn exists and the relevant methods. Sprint 38 triage #871.', '1 failing test case in test_ai_dialogue_sprint26.gd. The HardwareDetector tests skip if autoload not found. The GameState field tests (ai_enhanced_dialogue_enabled) look correct. The failing test is likely in the settings_dialog section: SETTINGS_DIALOG_SCENE preloaded at class level — if settings_dialog.tscn doesn''t exist or a method was renamed, class-level preload would fail. Check res://ui/settings_dialog.tscn exists and the relevant methods. Sprint 38 triage #871.
Re-homed under maintenance from done umbrella T-871 per cascade refocus 2026-06-12.', NULL, '2026-06-12 10:23:05', '2026-06-12 10:23:05', '2026-06-12 10:23:05', NULL, '80a3b0d7891f6d8a3dbd5d4210a1d283', 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 ('06FB0TNSRZ9Q7NHVDRT6ARMCWW', 'parent_id', NULL, 'T-750', NULL, '2026-06-12 10:23:05', '2026-06-12 10:23:05', '2026-06-12 10:23:05', NULL, 'e603be2f928c6ef8b4506dbfc02bab4f', 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 ('06FB0TNSRZ9Q7NHVDRT6ARMCWW', 'description', 'D-210 defines SubBiomeVariant for fine-grained biome classification within SettingType::Wilderness districts. Currently deferred — SettingType::Wilderness carries a plain String biome field. Implement SubBiomeVariant enum and wire it into the atlas skeleton generator when the biome taxonomy is finalized.', 'D-210 defines SubBiomeVariant for fine-grained biome classification within SettingType::Wilderness districts. Currently deferred — SettingType::Wilderness carries a plain String biome field. Implement SubBiomeVariant enum and wire it into the atlas skeleton generator when the biome taxonomy is finalized.
Re-parented under Phase 4 epic per cascade refocus 2026-06-12 biome taxonomy for the atlas/cascade generator.', NULL, '2026-06-12 10:23:05', '2026-06-12 10:23:05', '2026-06-12 10:23:05', NULL, '7f7f52c2e35c84f0a91c571949aeebbe', 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 ('06FB0TNSRW2ZSPJ3D9NEZ6JBW8', 'parent_id', NULL, 'T-750', NULL, '2026-06-12 10:23:05', '2026-06-12 10:23:05', '2026-06-12 10:23:05', NULL, 'e17ee629f3929232714360b1306e9838', 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 ('06FB0TNSRW2ZSPJ3D9NEZ6JBW8', 'description', 'The client currently reads markers.json and star_map_data.json directly from the filesystem. This bypasses the server layer entirely — the client should request all game data through IPC calls to the Rust backend.
Implementation can be simple: the server exposes a query/proxy endpoint that reads the JSON file or runs a DB query and returns the result. The client asks, the server responds. No complex protocol needed just the boundary enforcement that the client never reads files or DB directly.
Affects: atlas app (reach, system, planet, regional screens), economics monitor. The server-side handler can start as a thin proxy (read file, return contents) and evolve into perception-filtered queries (D-012) later.', 'The client currently reads markers.json and star_map_data.json directly from the filesystem. This bypasses the server layer entirely the client should request all game data through IPC calls to the Rust backend.
Implementation can be simple: the server exposes a query/proxy endpoint that reads the JSON file or runs a DB query and returns the result. The client asks, the server responds. No complex protocol needed just the boundary enforcement that the client never reads files or DB directly.
Affects: atlas app (reach, system, planet, regional screens), economics monitor. The server-side handler can start as a thin proxy (read file, return contents) and evolve into perception-filtered queries (D-012) later.
Re-parented under Phase 4 epic per cascade refocus 2026-06-12 atlas data delivery underpins viewing cascade layers through the implant Atlas.', NULL, '2026-06-12 10:23:05', '2026-06-12 10:23:05', '2026-06-12 10:23:05', NULL, '2324d6b1a0cd6020db5c9dbe0a6836de', 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 ('06FB0TNSRYEM4VSX74MS4NKQ1C', 'parent_id', NULL, 'T-1037', NULL, '2026-06-12 10:23:05', '2026-06-12 10:23:05', '2026-06-12 10:23:05', NULL, '6301e9591f04a9575589320fcb874641', 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 ('06FB0TNSRYEM4VSX74MS4NKQ1C', 'description', 'Surfaced 2026-05-24 running the full client suite (tests/run-godot, no server) during #960. NOT caused by #960 — verified: test_input_roundtrip fails identically at the pre-change baseline, and the rest are unrelated subsystems. Two categories to triage:
CATEGORY 1 server-dependent (expected-fail under bare run-godot): test_e2e_connection (test_send_input_receive_snapshot), test_input_roundtrip (movement/interact/move_then_interact). They error with ''Nil snapshot'' / ''.tick on Nil'' because no sim server is spawned. They need the run-ipc-* harness or SR_LIVE=1. FIX OPTIONS: gate/skip these under bare run-godot (mark as requiring a server) OR have run-godot spawn the server for the e2e tier, so tests/run-godot
{"suite":"godot","total":2522,"passed":2482,"failed":40,"duration_ms":96836,"log":"/tmp/sr-run-godot.1737738.log"} is green without false negatives.
CATEGORY 2 genuine logic failures in subsystems unrelated to current work: test_audio_sprint13 (test_d067_chime_duration_spec_is_300_to_400ms, line 547 ''Expecting true but is false''), test_fog_sprint22 (exploration_data_preserved_across_resize), test_fog_shader (visibility_texture_update_performance), test_dialogue_sprint18/20 (signal/audio-dip), test_monologue_display (queue_never_exceeds_max_depth), test_implant_app_lifecycle (on_insert_deactivated_closes_insert_app), test_ai_dialogue_sprint26 (settings_dialog warning label). Triage each: fix or remove/xfail with a reason.
Goal: a green (or explicitly-gated) bare `make test-client` so client regressions are detectable. Until then, run targeted suites (run-godot --filter <stem>).', 'Surfaced 2026-05-24 running the full client suite (tests/run-godot, no server) during #960. NOT caused by #960 — verified: test_input_roundtrip fails identically at the pre-change baseline, and the rest are unrelated subsystems. Two categories to triage:
CATEGORY 1 server-dependent (expected-fail under bare run-godot): test_e2e_connection (test_send_input_receive_snapshot), test_input_roundtrip (movement/interact/move_then_interact). They error with ''Nil snapshot'' / ''.tick on Nil'' because no sim server is spawned. They need the run-ipc-* harness or SR_LIVE=1. FIX OPTIONS: gate/skip these under bare run-godot (mark as requiring a server) OR have run-godot spawn the server for the e2e tier, so tests/run-godot
{"suite":"godot","total":2522,"passed":2482,"failed":40,"duration_ms":96836,"log":"/tmp/sr-run-godot.1737738.log"} is green without false negatives.
CATEGORY 2 genuine logic failures in subsystems unrelated to current work: test_audio_sprint13 (test_d067_chime_duration_spec_is_300_to_400ms, line 547 ''Expecting true but is false''), test_fog_sprint22 (exploration_data_preserved_across_resize), test_fog_shader (visibility_texture_update_performance), test_dialogue_sprint18/20 (signal/audio-dip), test_monologue_display (queue_never_exceeds_max_depth), test_implant_app_lifecycle (on_insert_deactivated_closes_insert_app), test_ai_dialogue_sprint26 (settings_dialog warning label). Triage each: fix or remove/xfail with a reason.
Goal: a green (or explicitly-gated) bare `make test-client` so client regressions are detectable. Until then, run targeted suites (run-godot --filter <stem>).
Re-homed under maintenance (test-failure debt / suite hygiene) per cascade refocus 2026-06-12.', NULL, '2026-06-12 10:23:05', '2026-06-12 10:23:05', '2026-06-12 10:23:05', NULL, '7ebbdb82222a772add175874f3eb782b', 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 ('06FB0TNSRYYR0QJC12EMA0SV1W', 'parent_id', NULL, 'T-750', NULL, '2026-06-12 10:23:06', '2026-06-12 10:23:06', '2026-06-12 10:23:06', NULL, '4d013ceac8fcc77c37b37d9cda73c5a0', 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 ('06FB0TNSRYYR0QJC12EMA0SV1W', 'description', 'The #1016 cultural pass found two systems founded by East-African-INTERIOR peoples that the canonical 47-value heritage taxonomy has no token for, so they currently borrow ''swahili'' (a coastal value) as the nearest fit (documented inline in wiki/economics/system_specialization.toml):
- GJ 667B Kampala Gate Baganda/Ugandan (Great Lakes interior)
- GJ 1292 Moyale Kenyan/Ethiopian (Borana/Oromo, Horn)
(Mwangaza GJ 693 is genuinely coastal Swahili correct, leave it.)
SCOPE: add an appropriate heritage value (or values) to the canonical taxonomy at the nationality/people granularity the taxonomy uses candidates: a Great Lakes / interior East African token and/or a Horn-of-Africa token. Update:
1. docs/workshops/system-economic-specialization/heritage-taxonomy-draft.md (canon list + count)
2. _CULTURAL_HERITAGE in tooling/economy-db/import_economics.py
3. repin GJ 667B and GJ 1292 in system_specialization.toml to the new value(s)
4. regen-db + verify (V-SES-04) + commit
Surfaced by the PR #147 (#1016) review (Paula HIGH / Miri). Low priority current ''swahili'' approximation is documented, not silently wrong.', 'The #1016 cultural pass found two systems founded by East-African-INTERIOR peoples that the canonical 47-value heritage taxonomy has no token for, so they currently borrow ''swahili'' (a coastal value) as the nearest fit (documented inline in wiki/economics/system_specialization.toml):
- GJ 667B Kampala Gate Baganda/Ugandan (Great Lakes interior)
- GJ 1292 Moyale Kenyan/Ethiopian (Borana/Oromo, Horn)
(Mwangaza GJ 693 is genuinely coastal Swahili correct, leave it.)
SCOPE: add an appropriate heritage value (or values) to the canonical taxonomy at the nationality/people granularity the taxonomy uses candidates: a Great Lakes / interior East African token and/or a Horn-of-Africa token. Update:
1. docs/workshops/system-economic-specialization/heritage-taxonomy-draft.md (canon list + count)
2. _CULTURAL_HERITAGE in tooling/economy-db/import_economics.py
3. repin GJ 667B and GJ 1292 in system_specialization.toml to the new value(s)
4. regen-db + verify (V-SES-04) + commit
Surfaced by the PR #147 (#1016) review (Paula HIGH / Miri). Low priority current ''swahili'' approximation is documented, not silently wrong.
Re-parented under Phase 4 epic per cascade refocus 2026-06-12 cultural_specialization taxonomy is a generation-input data fix (D-237).', NULL, '2026-06-12 10:23:06', '2026-06-12 10:23:06', '2026-06-12 10:23:06', NULL, '7274ff0c46dfc1bad959705e00184c50', 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 ('06FB0TNSRZ9NXNX40J476N2EQM', 'parent_id', NULL, 'T-750', NULL, '2026-06-12 10:23:06', '2026-06-12 10:23:06', '2026-06-12 10:23:06', NULL, 'd981f504bac8fee54000cb4982738843', 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 ('06FB0TNSRZ9NXNX40J476N2EQM', 'description', 'Deferred from the #955 pair session. The Phase-4 cascade (Layers 0-5) is fully deterministic (D-010 + SeedChain) — its output (settlement placements, and eventually the full BodyWorldState) is a pure function of (heightmap, authored context, world seed), so it can be cached rather than re-derived on every cold load.
CONSTRAINT: systems.db is read-only from the server''s perspective (schema header) the runtime server CANNOT write it. So a persistent cache is one of:
(A) Build-time whole-cascade bake into systems.db (a tool runs the Rust cascade, bakes BodyWorldState/placements; runtime reads). Matches the D-223/#951 ''cascade fills the geometry tables'' intent; staleness handled by the existing meta-stamp. Cost: committed binary artifact + re-bake on input change.
(B) Runtime local cache in a gitignored .cache/ keyed by (world_seed, schema_version, body_id), written on first derive, read after. No commit/merge issues; per-machine first-derive cost.
DESIGN DECISION NEEDED: A vs B (or both A for shipped worlds, B for dev iteration).
WHY DEFERRED (not now): (1) every cascade layer is a PURE function, so a cache wraps it later at ZERO retrofit determinism makes deferral free. (2) Layer-2 inputs are still churning (#1014/#982 dominant-commodity, #977 trait_selection, #956 political archetype all change placement inputs) a bake now would be stale/constantly re-baked. (3) Bake the WHOLE cascade once it is end-to-end (post Layer 5, #959), not one layer. (4) No measured perf need yet (Layer 3 = Hungarian on a small grid).
TRIGGER: pick this up when the cascade is end-to-end (after #959) OR the Layer-2 context freezes whichever first. The in-memory hot cache (BodyWorldState / D-203, #968) already covers ''no IO while on a system''; this ticket is only about cross-session/cold-load persistence.
Seam: run_layer3 (and each run_layerN) is pure wrap at the run_cascade call site (a // cache seam comment marks it).', 'Deferred from the #955 pair session. The Phase-4 cascade (Layers 0-5) is fully deterministic (D-010 + SeedChain) its output (settlement placements, and eventually the full BodyWorldState) is a pure function of (heightmap, authored context, world seed), so it can be cached rather than re-derived on every cold load.
CONSTRAINT: systems.db is read-only from the server''s perspective (schema header) the runtime server CANNOT write it. So a persistent cache is one of:
(A) Build-time whole-cascade bake into systems.db (a tool runs the Rust cascade, bakes BodyWorldState/placements; runtime reads). Matches the D-223/#951 ''cascade fills the geometry tables'' intent; staleness handled by the existing meta-stamp. Cost: committed binary artifact + re-bake on input change.
(B) Runtime local cache in a gitignored .cache/ keyed by (world_seed, schema_version, body_id), written on first derive, read after. No commit/merge issues; per-machine first-derive cost.
DESIGN DECISION NEEDED: A vs B (or both A for shipped worlds, B for dev iteration).
WHY DEFERRED (not now): (1) every cascade layer is a PURE function, so a cache wraps it later at ZERO retrofit determinism makes deferral free. (2) Layer-2 inputs are still churning (#1014/#982 dominant-commodity, #977 trait_selection, #956 political archetype all change placement inputs) a bake now would be stale/constantly re-baked. (3) Bake the WHOLE cascade once it is end-to-end (post Layer 5, #959), not one layer. (4) No measured perf need yet (Layer 3 = Hungarian on a small grid).
TRIGGER: pick this up when the cascade is end-to-end (after #959) OR the Layer-2 context freezes whichever first. The in-memory hot cache (BodyWorldState / D-203, #968) already covers ''no IO while on a system''; this ticket is only about cross-session/cold-load persistence.
Seam: run_layer3 (and each run_layerN) is pure wrap at the run_cascade call site (a // cache seam comment marks it).
Re-parented under Phase 4 epic per cascade refocus 2026-06-12 cascade-output persistence; trigger remains end-to-end cascade (post #959) or Layer-2 context freeze.', NULL, '2026-06-12 10:23:06', '2026-06-12 10:23:06', '2026-06-12 10:23:06', NULL, '84458945bafef24a3a3715256be47ce8', 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 ('06FB0TNSRW7FZPYXXCGWBBRBEC', 'status', 'backlog', 'cancelled', NULL, '2026-06-12 10:23:06', '2026-06-12 10:23:06', '2026-06-12 10:23:06', NULL, 'c42cd711f2cf3b47cba6f27cc0d48b1f', 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 ('06FB0TNSRW7FZPYXXCGWBBRBEC', 'description', 'Generator-first life sim pivot following the Where''s the Fun? workshop (2026-03-05). 24 decisions locked: all NPCs generated, tycoon bookmark, culture-implicit-in-location, broad life verbs, dual-scale consequence model. Detective/smuggler framing retired. Critical path: Sprint 25 generator spike. See docs/workshops/wheres-the-fun/workshop-outcomes.md.', 'Generator-first life sim pivot following the Where''s the Fun? workshop (2026-03-05). 24 decisions locked: all NPCs generated, tycoon bookmark, culture-implicit-in-location, broad life verbs, dual-scale consequence model. Detective/smuggler framing retired. Critical path: Sprint 25 generator spike. See docs/workshops/wheres-the-fun/workshop-outcomes.md.
Cancelled 2026-06-12: the v0.2 Life-Sim Pivot initiative shell the v0.2 target is dropped (D-166, amendment 2026-06-12; D-114/D-115/D-117/D-118/D-120 superseded). Its children with surviving functional content (T-604 proof-of-life playtest concept, T-605 tycoon bookmark, T-606 creation flow, T-608 world feel) are preserved under the post-cascade gameplay parking epic T-1036.', NULL, '2026-06-12 10:23:06', '2026-06-12 10:23:06', '2026-06-12 10:23:06', NULL, 'c459af61444e3a82aa25521149f5d2af', 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 ('06FB0TNSRXXP903QTD8Q2YWRJ8', 'status', 'backlog', 'cancelled', NULL, '2026-06-12 10:23:06', '2026-06-12 10:23:06', '2026-06-12 10:23:06', NULL, '34f76c86eb0db970728d8d3adb0118d4', 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 ('06FB0TNSRXXP903QTD8Q2YWRJ8', 'description', NULL, 'Cancelled 2026-06-12: administrative mirror of Q-004 (resolved); no surviving open requirement.', NULL, '2026-06-12 10:23:06', '2026-06-12 10:23:06', '2026-06-12 10:23:06', NULL, 'f408f179e7ba0878439945b01b31e6e2', 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 ('06FB0TNSRZYTPACQCYNGVK5XSC', 'status', 'backlog', 'cancelled', NULL, '2026-06-12 10:23:06', '2026-06-12 10:23:06', '2026-06-12 10:23:06', NULL, '01ad9701d1a3401458f9ec6c9ace18c3', 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 ('06FB0TNSRZYTPACQCYNGVK5XSC', 'description', NULL, 'Cancelled 2026-06-12: administrative mirror of Q-005 (resolved); no surviving open requirement.', NULL, '2026-06-12 10:23:06', '2026-06-12 10:23:06', '2026-06-12 10:23:06', NULL, '6673e5f40b6cc09073de805af7eda714', 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 ('06FB0TNSRW3ASVAZZNYN9M59AW', 'status', 'backlog', 'cancelled', NULL, '2026-06-12 10:23:06', '2026-06-12 10:23:06', '2026-06-12 10:23:06', NULL, 'd2f3ab638c8fc4b8aa5ad4084950e98c', 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 ('06FB0TNSRW3ASVAZZNYN9M59AW', 'description', NULL, 'Cancelled 2026-06-12: administrative mirror of Q-007 (resolved); no surviving open requirement.', NULL, '2026-06-12 10:23:06', '2026-06-12 10:23:06', '2026-06-12 10:23:06', NULL, '39050e099a4d3e7242802e867acd5fd9', 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 ('06FB0TNSRWJYV3ZVY7D7G3P4FW', 'status', 'backlog', 'cancelled', NULL, '2026-06-12 10:23:06', '2026-06-12 10:23:06', '2026-06-12 10:23:06', NULL, '0ce5155d6ddd034453ad17a5f5aa7327', 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 ('06FB0TNSRWJYV3ZVY7D7G3P4FW', 'description', NULL, 'Cancelled 2026-06-12: administrative mirror of Q-011 (resolved); no surviving open requirement.', NULL, '2026-06-12 10:23:06', '2026-06-12 10:23:06', '2026-06-12 10:23:06', NULL, '19482df4281101fcc70c9ed330278298', 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 ('06FB0TNSRWXPRPS7G2MA786GR0', 'status', 'backlog', 'cancelled', NULL, '2026-06-12 10:23:06', '2026-06-12 10:23:06', '2026-06-12 10:23:06', NULL, '93473dea304f5054de1283d6673864d8', 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 ('06FB0TNSRWXPRPS7G2MA786GR0', 'description', 'Implement D-010 (information boundaries), D-012 (chunk-based maps), D-013 (diegetic insert/POI navigation), D-014 revised (station district map). World structure and player navigation.', 'Implement D-010 (information boundaries), D-012 (chunk-based maps), D-013 (diegetic insert/POI navigation), D-014 revised (station district map). World structure and player navigation.
Cancelled 2026-06-12: pre-cascade umbrella emptied by the cascade refocus children re-homed (T-50/T-52 to Phase 4, T-49/T-51 to Phase 5).', NULL, '2026-06-12 10:23:06', '2026-06-12 10:23:06', '2026-06-12 10:23:06', NULL, '4a7ba17c2754f3cc875433f9a57a41d9', 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 ('06FB0TNSRY3XYFKDGVPQR87JHM', 'status', 'backlog', 'cancelled', NULL, '2026-06-12 10:23:06', '2026-06-12 10:23:06', '2026-06-12 10:23:06', NULL, '66c8f0798b9f83c1ff3bd94064addc30', 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 ('06FB0TNSRY3XYFKDGVPQR87JHM', 'description', 'Implement D-023 (three-tier content model), D-025 (social site templates), D-028 (dialogue system), D-029 (population entanglement). Template system and dialogue.', 'Implement D-023 (three-tier content model), D-025 (social site templates), D-028 (dialogue system), D-029 (population entanglement). Template system and dialogue.
Cancelled 2026-06-12: pre-cascade umbrella emptied by the cascade refocus children re-homed (T-54 to Phase 4, T-55/T-56 to Phase 6, T-53 to gameplay parking T-1036).', NULL, '2026-06-12 10:23:06', '2026-06-12 10:23:06', '2026-06-12 10:23:06', NULL, 'ff38957b48287803e268bc019bba7bed', 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 ('06FB0TNSRZK0EWD2NW4D2MGGV0', 'description', 'Build comprehensive testing framework for both Rust/bevy_ecs simulation and Godot 4 client. External test harness, minimal production code pollution. NEEDS REFINEMENT.', 'Build comprehensive testing framework for both Rust/bevy_ecs simulation and Godot 4 client. External test harness, minimal production code pollution. NEEDS REFINEMENT.
Cancelled 2026-06-12: pre-cascade umbrella test-infra children re-homed under maintenance initiative T-1037; discussion child T-64 cancelled (testing approach long established).', NULL, '2026-06-12 10:23:06', '2026-06-12 10:23:06', '2026-06-12 10:23:06', NULL, '75630490b06810bdd8b4f04b2bbf6dd7', 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 ('06FB0TNSRXG2Z9ZAR42SQ9GNP4', 'description', 'Discussion: Jeroen + Tyre + Gestalt + Hoshe + Troblum. Determine optimal testing approach for Claude Code execution. Define patterns, constraints, tooling needs.', 'Discussion: Jeroen + Tyre + Gestalt + Hoshe + Troblum. Determine optimal testing approach for Claude Code execution. Define patterns, constraints, tooling needs.
Cancelled 2026-06-12: discussion premise fulfilled testing approach established and documented (three-tier strategy, Gauntlet-first, D-239 harness); doc deliverables live on in T-215/T-216/T-217 under T-1037.', NULL, '2026-06-12 10:23:06', '2026-06-12 10:23:06', '2026-06-12 10:23:06', NULL, 'e524883fd40476112076fdadb5902f62', 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 ('06FB0TNSRZS8C6ZGVR5M7D3974', 'status', 'backlog', 'cancelled', NULL, '2026-06-12 10:23:06', '2026-06-12 10:23:06', '2026-06-12 10:23:06', NULL, '19dc0f2545cbbcfe2f743126f7571559', 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 ('06FB0TNSRZS8C6ZGVR5M7D3974', 'description', 'NEEDS REFINEMENT. Jeroen + Tyre + Gestalt + Hoshe + Troblum. Determine optimal testing approach for Claude Code. External vs integrated, patterns, constraints.', 'NEEDS REFINEMENT. Jeroen + Tyre + Gestalt + Hoshe + Troblum. Determine optimal testing approach for Claude Code. External vs integrated, patterns, constraints.
Cancelled 2026-06-12: refinement-discussion artifact; testing approach since decided and documented; surviving doc work in T-215/T-216/T-217.', NULL, '2026-06-12 10:23:06', '2026-06-12 10:23:06', '2026-06-12 10:23:06', NULL, 'd27eab43f00603a7f65b01c084c7db95', 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 ('06FB0TNSRXMPF6176KB9CSBH2C', 'status', 'backlog', 'cancelled', NULL, '2026-06-12 10:23:06', '2026-06-12 10:23:06', '2026-06-12 10:23:06', NULL, '12f099f80d87c071e93398e6b6284f2b', 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 ('06FB0TNSRXMPF6176KB9CSBH2C', 'description', 'SPLIT — see #681 (server: apartment generator logic) and #682 (client: visual rendering + first-moment sequence). Original: Player starting apartment is auto-generated to reflect economic position and cultural context. Decision D-136 (First Settled Reach moment: apartment + insert activation). Decision D-126 (Groundhog Day alarm clock homage).', 'SPLIT — see #681 (server: apartment generator logic) and #682 (client: visual rendering + first-moment sequence). Original: Player starting apartment is auto-generated to reflect economic position and cultural context. Decision D-136 (First Settled Reach moment: apartment + insert activation). Decision D-126 (Groundhog Day alarm clock homage).
Cancelled 2026-06-12: administrative split shell full scope carried by T-681 (Phase 6) and T-682 (gameplay parking); no functional requirement lost.', NULL, '2026-06-12 10:23:06', '2026-06-12 10:23:06', '2026-06-12 10:23:06', NULL, '2be15e824659a581dfab93503dc99bd3', 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 ('06FB0TNSRXAPVCJAZ0ZKGESCP4', 'status', 'backlog', 'cancelled', NULL, '2026-06-12 10:23:06', '2026-06-12 10:23:06', '2026-06-12 10:23:06', NULL, '1d27f2e8f93e311a87894db039c8d150', 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 ('06FB0TNSRXAPVCJAZ0ZKGESCP4', 'description', 'Implement D-011 (fog of perception), D-015 (locked camera), D-016 (internal monologue), D-017 (perception modes), D-018 (3-range sound), D-019 (top-down rendering). Client-side observation systems.', 'Implement D-011 (fog of perception), D-015 (locked camera), D-016 (internal monologue), D-017 (perception modes), D-018 (3-range sound), D-019 (top-down rendering). Client-side observation systems.
Cancelled 2026-06-12: pre-cascade umbrella emptied by the cascade refocus perception/rendering epics re-homed under Phase 5 (T-43T-48), T-234 observation/interaction loop preserved in gameplay parking T-1036.', NULL, '2026-06-12 10:23:06', '2026-06-12 10:23:06', '2026-06-12 10:23:06', NULL, '007b823051c1a78ed6710e3649762d97', 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 ('06FB0TNSRXXEKGTNRJ7Z6FTDRM', 'status', 'backlog', 'done', NULL, '2026-06-12 10:23:06', '2026-06-12 10:23:06', '2026-06-12 10:23:06', NULL, '88a4bc9c1ce0bb27b5867f88ff853a75', 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 ('06FB0TNSRXXEKGTNRJ7Z6FTDRM', 'description', 'Implement D-020: Godot 4 client + Rust/bevy_ecs simulation via subprocess/IPC. MessagePack protocol, ObserverSnapshot pattern, deterministic simulation.', 'Implement D-020: Godot 4 client + Rust/bevy_ecs simulation via subprocess/IPC. MessagePack protocol, ObserverSnapshot pattern, deterministic simulation.
Closed 2026-06-12: engine architecture delivered (T-35T-38 done); the one open child (T-235 game state management) re-homed under Phase 5 epic T-749. Umbrella complete.', NULL, '2026-06-12 10:23:06', '2026-06-12 10:23:06', '2026-06-12 10:23:06', NULL, '71c233cadbd6067f78a3bace931f0115', 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 ('06FB0TNSRY5G9GMPV8B0RDD1JR', 'status', 'review', 'done', NULL, '2026-06-12 10:23:07', '2026-06-12 10:23:07', '2026-06-12 10:23:07', NULL, '7b323ca0b9157d277d62c56eef9c5343', 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 ('06FB0TNSRY5G9GMPV8B0RDD1JR', 'description', NULL, 'Closed 2026-06-12: decision-mirror initiative for D-011 (fog of perception non-negotiable). D-011 is confirmed and the fog/perception system is implemented (shadowcasting, vision cone, observer snapshots); the mirror served its purpose. Cleared from the perpetual review queue.', NULL, '2026-06-12 10:23:07', '2026-06-12 10:23:07', '2026-06-12 10:23:07', NULL, 'f10612048b81230c3c2ffc608a2125bb', 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 ('06FB0TNSRZE4CSS8YR0FCEXMK8', 'status', 'backlog', 'in_progress', NULL, '2026-06-12 10:23:07', '2026-06-12 10:23:07', '2026-06-12 10:23:07', NULL, 'd05aa5ec6f4e62c2ef5fa3977aeb08b7', 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 ('06FB0TNSRXG2Z9ZAR42SQ9GNP4', 'status', 'backlog', 'cancelled', NULL, '2026-06-12 10:23:17', '2026-06-12 10:23:17', '2026-06-12 10:23:17', NULL, 'e73c0c57f7d26aeb9510fd5425225466', 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 ('06FB0TNSRXG2Z9ZAR42SQ9GNP4', 'description', 'Discussion: Jeroen + Tyre + Gestalt + Hoshe + Troblum. Determine optimal testing approach for Claude Code execution. Define patterns, constraints, tooling needs.
Cancelled 2026-06-12: discussion premise fulfilled testing approach established and documented (three-tier strategy, Gauntlet-first, D-239 harness); doc deliverables live on in T-215/T-216/T-217 under T-1037.', 'Discussion: Jeroen + Tyre + Gestalt + Hoshe + Troblum. Determine optimal testing approach for Claude Code execution. Define patterns, constraints, tooling needs.
Cancelled 2026-06-12: discussion premise fulfilled testing approach established and documented (three-tier strategy, Gauntlet-first, D-239 harness); doc deliverables live on in T-215/T-216/T-217 under T-1037.
Cancelled 2026-06-12: discussion premise fulfilled testing approach established and documented (three-tier strategy, Gauntlet-first, D-239 harness); doc deliverables live on in T-215/T-216/T-217 under T-1037.', NULL, '2026-06-12 10:23:17', '2026-06-12 10:23:17', '2026-06-12 10:23:17', NULL, '31230f0cde3827b2d0e7351e3368060f', 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 ('06FB0TNSRZK0EWD2NW4D2MGGV0', 'status', 'backlog', 'cancelled', NULL, '2026-06-12 10:23:17', '2026-06-12 10:23:17', '2026-06-12 10:23:17', NULL, '9c8710a3ac1639a09e73e84fcb4e20e6', 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 ('06FB0TNSRZK0EWD2NW4D2MGGV0', 'description', 'Build comprehensive testing framework for both Rust/bevy_ecs simulation and Godot 4 client. External test harness, minimal production code pollution. NEEDS REFINEMENT.
Cancelled 2026-06-12: pre-cascade umbrella test-infra children re-homed under maintenance initiative T-1037; discussion child T-64 cancelled (testing approach long established).', 'Build comprehensive testing framework for both Rust/bevy_ecs simulation and Godot 4 client. External test harness, minimal production code pollution. NEEDS REFINEMENT.
Cancelled 2026-06-12: pre-cascade umbrella test-infra children re-homed under maintenance initiative T-1037; discussion child T-64 cancelled (testing approach long established).
Cancelled 2026-06-12: pre-cascade umbrella test-infra children re-homed under maintenance initiative T-1037; discussion child T-64 cancelled (testing approach long established).', NULL, '2026-06-12 10:23:17', '2026-06-12 10:23:17', '2026-06-12 10:23:17', NULL, '949dfa994e19abe55b5c87c45acea3a7', 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 ('06FB0TNSRX3R6G3Y7QR4FAJPNM', 'description', 'Consolidate all wiki content (pages + heightmaps + markers + architecture-flavor) into one first-class, baked Atlas/gamedata content set with a unified bake pipeline -- instead of per-feature file conventions. Resolves where authored per-body content lives (the D-232 flavor source). BLOCKED on Q-107 (open question -- the target tree structure must be decided first). The generator-facing trait_templates + atlas_body_trait_bias tables (D-232) is invariant to this, so it does NOT block the fill seam; sequence this AFTER the fill-seam work. Jeroen: ''the wiki needs to become part of the atlas content set ... not yet another hack.''', 'Consolidate all wiki content (pages + heightmaps + markers + architecture-flavor) into one first-class, baked Atlas/gamedata content set with a unified bake pipeline -- instead of per-feature file conventions. Resolves where authored per-body content lives (the D-232 flavor source). BLOCKED on Q-107 (open question -- the target tree structure must be decided first). The generator-facing trait_templates + atlas_body_trait_bias tables (D-232) is invariant to this, so it does NOT block the fill seam; sequence this AFTER the fill-seam work. Jeroen: ''the wiki needs to become part of the atlas content set ... not yet another hack.''
Hygiene note 2026-06-12: title says ''blocked'' but no blocker edge exists, so this surfaced in the --unblocked feed. Labelled needs-decision; genuinely gated on Q-107 (wiki→Atlas content consolidation) — resolve Q-107 before picking this up.', NULL, '2026-06-12 10:23:21', '2026-06-12 10:23:21', '2026-06-12 10:23:21', NULL, 'ad4d2baf54fc5b4b633a7783ea966162', 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 ('06FB0TNSRZ8Z6NN74YKCCRCPMR', 'description', 'Validation pass: generated content reads correctly (settlements legible, walkable, named). Establishes the dependency gate that locks Phase 5 (player control, epic #749) behind Phase 4 completion per the cascade rule (D-166 amended 2026-05-22).', 'Validation pass: generated content reads correctly (settlements legible, walkable, named). Establishes the dependency gate that locks Phase 5 (player control, epic #749) behind Phase 4 completion per the cascade rule (D-166 amended 2026-05-22).
Gate trigger updated per D-166 amendment (2026-06-12): Phase 5 ramps in parallel once OUTSIDE generation produces deterministic, walkable exteriors the gate this ticket holds is ''outsides generate deterministically and are walkable'' (validation pass: settlements legible, walkable, named), not ''all Phase-4 polish complete''. Door-boundary contracts and remaining Phase-4 detail may continue alongside early Phase-5 work.', NULL, '2026-06-12 10:23:21', '2026-06-12 10:23:21', '2026-06-12 10:23:21', NULL, '95c4da6eebe02dc3d59875a7ff11646e', 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 ('06FBPQ02F02JDDBSFMGPX0XASR', 'description', 'Workshopped-but-unticketed cascade work captured 2026-06-12 (cascade-refocus grounding pass). Full grounded scope follows.', 'Workshopped-but-unticketed cascade work captured 2026-06-12 (cascade-refocus grounding pass). Full grounded scope follows.
Generate the inter-settlement road/rail graph at Layer 2 the workshopped-but-never-ticketed link between settlement placement (T-955/T-956, done) and everything that consumes transport topology. No road code exists today (zero RoadGraph/road_segment hits in server/src; TerritorialStatus shipped without its road-coverage inputs).
Scope (algorithm fully decided, docs/workshops/planet-down-cascade/tyre-round1.md:274-299):
1. MST force-connect all CityPlacements (Euclidean), then secondary direct links for city pairs within 30-60% of body scale whose MST path exceeds 1.5x Euclidean.
2. Route each edge with A* over the L1 terrain-cost field (terrain_modification_cost, D-210, server/src/atlas/subbiome.rs; cost spec: water impassable, roughness>0.7 = 10.0, river corridor = 0.5, flat = 1.0 rivers as preferred valley routes). Budget ~30ms/body (round-1-notes.md:348).
3. Assign MaintenanceAuthority per edge from endpoint relationships (5-value enum Administrative/Corporate/Communal/Trade/Abandoned generation-cascade/workshop-outcomes.md:177, resolution :257; player-readable in road condition per ozzie-round1.md:86-92).
4. Place waypoint sub-settlement nodes at midpoints of edges > ~12 regional cells (tyre-round1.md:267-272).
5. Named-route identity assignment: post-generation join of generated edges to systems.db named highway routes via optional named_route_id FK (paula-round1.md:107,:140; round-1-notes.md:322 L2-Q3 resolution under Amendment 3).
6. RailHeadFacing second pass: settlements at high-connectivity road/rail junctions get FoundingOrientation::RailHeadFacing, overriding AdminFacing-from-Synthetic (paula-round3.md:218-236) wire into attractor_matching.rs.
Storage: RoadGraph{nodes,edges} on BodyWorldState (round-1-notes.md:257-267), session-cached, never serialized runtime Rust, not systems.db (the atlas_road_nodes/atlas_road_edges schema shape carries forward per tyre-round1.md:42 but lives in session memory).
Downstream consumers (do NOT scope in, but design the output for them): road_entry_directions per city (see road-entry-octants ticket; generation-cascade/round-3-notes.md:104), TerritorialStatus quantitative road-coverage thresholds (round-1-notes.md:329-338), per-economic_role hinterland fill (round-1-notes.md:324-327, BRIEF.md:279), prosperity/atlas overlays.
Cascade-first fit: this is direction step (2) the econ layer drawn onto the world between settlements. Parent: T-750. Suggested deps: blocks the road-entry-octants ticket; references D-205 (provinces), D-210, D-211, D-212, D-213.', NULL, '2026-06-12 10:23:49', '2026-06-12 10:23:49', '2026-06-12 10:23:49', NULL, '09343e853335f1641f609ea74f4dca2e', 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 ('06FBPQ02KN9147H4Z12KJW7H1M', 'description', 'Workshopped-but-unticketed cascade work captured 2026-06-12 (cascade-refocus grounding pass). Full grounded scope follows.', 'Workshopped-but-unticketed cascade work captured 2026-06-12 (cascade-refocus grounding pass). Full grounded scope follows.
Thread the remaining Layer-3 character fields through the L3->L4 GenerateSkeleton dispatch. T-1022 wired the dispatch, but build_skeleton_work_item (server/src/atlas/plugin.rs:179-212) overrides only founding_orientation (:192-193); political_archetype stays the Commission stub (city_context_reader.rs:471-474) and morphology_zone stays AlluvialPlain (:487-488) even though:
- CityPlacement already carries the real political_archetype (D-214, derived from TerritorialStatus + economic_role at attractor_matching.rs:595-602) and arrangement_pattern (D-215, city_character at :282-293) fields :49-64;
- the covering region''s real morphology_zone (D-239 §6 frozen vocab, T-1027, region_profile.rs:180/:499) is available from snapshot.layer_region, populated in the same cascade run (cascade.rs:238-240) map placement.position to its covering region cell.
Consequences of the stubs: skeleton_gen''s morphology gating (D-234a Topology selection) always takes the AlluvialPlain Prim-MST mesh path fjord/delta cities get plains street networks; block_irregularity/layout-mode always sees Commission (skeleton_gen.rs:68-77). D-234''s implementation note explicitly lists this threading as the pending dependency of the (done, tested, dormant) morphology-gated street rules.
Also decide arrangement_pattern''s path: CityGenerationContext has NO arrangement_pattern field (generator.rs:1078 has political_archetype only; ArrangementPattern :442 is defined but unconsumed at L4). Either (a) add the field and have skeleton_gen consume the D-215 explicit pattern, or (b) record that L4 derives layout from archetype alone and the placement''s pattern is Atlas/UI-only. Option (a) matches the workshop intent (ozzie-round1.md:112-118 backs explicit arrangement).
Miri''s queryability requirement (tile-derivation-contract/tyre-round1.md:308-311) morphology_zone readable at Atlas-generation time is satisfied by reading from BodyWorldState regions, no recompute.
Acceptance: dispatch a body with a FjordWall-region coastal placement in a CorpTerritory province -> the generated quarter uses Ribbon topology and CompanyTown-class layout, not mesh+Commission. Parent: T-750. Refs: D-214, D-215, D-228, D-234, D-239 §6; T-1022 (predecessor), T-983, T-1014 (adjacent, different fields).', NULL, '2026-06-12 10:23:49', '2026-06-12 10:23:49', '2026-06-12 10:23:49', NULL, 'aafa7653b1d4048eda755d45d341d04c', 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 ('06FBPQ02QTVSZ1PXTGNCN6Y8KM', 'description', 'Workshopped-but-unticketed cascade work captured 2026-06-12 (cascade-refocus grounding pass). Full grounded scope follows.', 'Workshopped-but-unticketed cascade work captured 2026-06-12 (cascade-refocus grounding pass). Full grounded scope follows.
BUG: channel centrelines are anchored to the world-origin axis. compute_channel_state (AlluvialPlain, server/src/atlas/voxel.rs:1648-1707) and compute_meander_channel_state (MeanderReach, :1556-1595) compute perp_distance = (cross - meander_displacement).abs() (:1694, :1583) where cross is the raw world-space voxel coordinate (derive_voxel_column takes tile_x/tile_y in world metres, :328-338; cross = vx or vy at :1653-1661). The channel centreline is therefore the world x=0/y=0 axis plus-or-minus meander amplitude: only chunks within ~(channel_width/2 + amplitude + jitter) metres of the world origin axis ever contain channel water, regardless of ChunkContext.has_active_channel / channel_width_m (chunk_context.rs:103-110). in_levee_band (:1602-1633) inherits the same defect, so levees are origin-locked too. Every has_active_channel chunk elsewhere on the body silently renders dry floodplain.
Intended model (workshopped): channel positions derive from region/chunk-scale data, not world axes D-239 §10 (one basin-direction + global meander-curve params; wavelength > 64 m seeds Region-or-higher) and tile-derivation-contract/gestalt-round1.md:152-162 (channel branch positions from a multi-seed Voronoi partition of the chunk area with D8 flow direction as attractor; meander_intensity controls deviation from the straight downslope path).
Fix, two stages:
1. Minimal correctness: derive a deterministic cross-offset channel anchor at region scale (alongside meander_phase in derive_chunk_context, chunk_context.rs:124-141 same Region-or-higher seed path) and measure perp_distance from that anchor, so an active channel actually crosses the chunks the region says it crosses, continuously across chunk boundaries.
2. Full model: gestalt''s multi-seed Voronoi + D8-attractor branch placement when BraidedDelta sub-classification (D-239 implementation note: deferred to ChunkContext) lands.
Add a T-1031-harness believability check: a has_active_channel chunk at an arbitrary large world offset (e.g. chunk_pos (1000, -750)) contains in-channel voxels; channel position is continuous across adjacent chunk pairs. Sibling bug: landform-64m-repeat (same family, opposite direction channels appear nowhere, landforms appear everywhere). Parent: T-750. Refs: D-239 §10, D-208 (D8), D-010; T-1029 (origin), T-1031 (harness).', NULL, '2026-06-12 10:23:49', '2026-06-12 10:23:49', '2026-06-12 10:23:49', NULL, '0f5069538ff0d3c38627e2d343d5d55d', 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 ('06FBPQ02VWJGXWDYT2SMXM9DTC', 'description', 'Workshopped-but-unticketed cascade work captured 2026-06-12 (cascade-refocus grounding pass). Full grounded scope follows.', 'Workshopped-but-unticketed cascade work captured 2026-06-12 (cascade-refocus grounding pass). Full grounded scope follows.
BUG: four morphology generators fold world coordinates into the 64 m chunk frame, so region-scale landforms repeat every chunk violating D-239 §10 (''features with wavelength > 64 m seed from Region-or-higher, not the chunk seed''; deliberately strengthened from Block-or-higher in the adversarial verification pass, tile-derivation-contract/workshop-outcomes.md:83).
Sites (server/src/atlas/voxel.rs):
- generate_fjord_wall :594-597 cross.rem_euclid(64)-32: a complete fjord (floor|moraine|wall cross-section) centred in EVERY chunk of a FjordWall region; a real fjord valley is one feature spanning the region.
- generate_cliff_coast :721 seaward_coord.rem_euclid(64): the cliff face sits at intra-chunk offset 48-55 in every chunk, sawtoothing the coastline at 64 m pitch.
- generate_braided_delta :825 cross.rem_euclid(64): the same three braid threads restart per chunk instead of anastomosing across the fan.
- generate_incised_gorge :1054-1057 same fold: a gorge per chunk.
Fix: compute each landform''s axis/centreline in REGION-anchored coordinates derive the feature anchor (centreline position, coast-face line) once per region from the region-scale seed path that meander_phase/basin_direction already use correctly (chunk_context.rs:124-141), then measure each voxel''s distance to that anchor in continuous world coordinates (no rem_euclid against the chunk size). This matches the workshop''s seam-freedom principle: the algorithm must see positions with no knowledge of the chunk grid (tyre-round1.md:174-176). Preserve D-239 §9 chokepoint widths (fjord floor 4-8 m, gorge floor 2-8 m currently honoured at :607-609, :1059-1062).
Harness gap to close (T-1031 follow-up): current tests check per-chunk boundary smoothness, not feature uniqueness add a multi-chunk assertion that a FjordWall/IncisedGorge region contains ONE valley spanning its chunks, and a CliffCoast region one continuous (warp-displaced) coast line. Sibling bug: river-channel-anchor (channels are origin-anchored and appear nowhere; landforms are chunk-folded and appear everywhere fix both against the same region-anchor mechanism). Depends on scale-anchoring Q for the region''s physical extent, but the region-index anchor works regardless. Parent: T-750. Refs: D-239 §5/§8/§9/§10, D-010; T-1029, T-1031.', NULL, '2026-06-12 10:23:50', '2026-06-12 10:23:50', '2026-06-12 10:23:50', NULL, 'f6f01880acec881ea8241f76fc42d4dc', 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 ('06FBPQ0308CFF9WKNGBBYQ763W', 'description', 'Workshopped-but-unticketed cascade work captured 2026-06-12 (cascade-refocus grounding pass). Full grounded scope follows.', 'Workshopped-but-unticketed cascade work captured 2026-06-12 (cascade-refocus grounding pass). Full grounded scope follows.
Implement cross-region parameter blending at the chunk/voxel scale, replacing the walking-skeleton single-profile restriction (server/src/atlas/chunk_context.rs:119-123: ''in the future a blend of adjacent profiles will handle cross-region chunk seams''). Today every voxel generator reads the one covering RegionProfile''s values directly (region.elev_q at voxel.rs:614, :731, :1067-1068; channel/meander params likewise), so continuous parameters step discontinuously at every region-grid border elevation cliffs at the region pitch, visible as a grid at Atlas/voxel scale.
Design is decided stay inside the D-239 §7 seam policy:
- NEVER blend morphology family selection. Family seams are prevented at source (gate ordering + build-time compatibility matrix) or kept sharp (cliff-fjord, lithology faults are real geology). Tyre''s cross-family elevation-blend was explicitly resolved against (D-239 dissent line).
- DO blend continuous positional parameters: elevation, channel width, meander wavelength/phase, freeze/moisture scalars. Mechanism from tile-derivation-contract/tyre-round1.md: ChunkContext gains secondary: Option<RegionProfile> + blend_weight: u8 (255 = fully primary; :123-125), blend zone one chunk (64 m) each side of the region border (:101-102); derive_voxel resolves parameters from both profiles and integer-blends BEFORE material selection (:217-220), reusing the same warp offset so the blend seam cannot align with the chunk edge; elevation sampled bilinearly from the region grid to chunk resolution (:130, the elevation_grid sketch).
- D-010 discipline: integer blend arithmetic; the f64 path only for position math per D-239 §4.
Note: region size in metres is currently ambiguous (see the scale-anchoring Q-record) the blend can be implemented against the region grid index regardless, but the Q should be resolved before tuning blend-zone width in metres.
Acceptance: T-1031 harness cross-region chunk pairs show no elevation step exceeding the lithology-permitted slope (D-239 §8) at region borders; family seams remain sharp; determinism golden-seed unchanged for chunks far from borders. Parent: T-750. Refs: D-239 §4/§7/§8, D-010; Q-102; T-1026/T-1028/T-1029 (predecessors).', NULL, '2026-06-12 10:23:50', '2026-06-12 10:23:50', '2026-06-12 10:23:50', NULL, 'd540b7402a8a66bf2704f1ab953c5383', 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 ('06FBPQ034DKN4ENSGX5HTYTBJG', 'description', 'Workshopped-but-unticketed cascade work captured 2026-06-12 (cascade-refocus grounding pass). Full grounded scope follows.', 'Workshopped-but-unticketed cascade work captured 2026-06-12 (cascade-refocus grounding pass). Full grounded scope follows.
Derive road_entry_directions at Layer 3 and thread them through the GenerateSkeleton dispatch. CityGenerationContext.road_entry_directions (server/src/simulation/generator.rs:1083-1084, compass octants 0=N..7=NW) is stubbed empty (city_context_reader.rs:478-479) and never overridden by the T-1022 dispatch, so derive_access_points (skeleton_gen.rs:1008-1036) never emits QuarterEdge access nodes every quarter falls back to reservation gates or a single central BlockJunction (:1029-1034), and the D-234 arterial graph has no outward connection to the world.
Workshop contract: the field is a per-city output of the inter-settlement road graph (generation-cascade/round-3-notes.md:104 ''Layer C: Road graph (road_entry_directions per city)''; burnelli-sheldon-round4.md:308). Full-fidelity derivation therefore lands with the inter-settlement-transport ticket: octant = bearing of each connecting road edge where it crosses the city footprint radius (D-204 footprint), de-duplicated per octant, retaining per-entry quality for the consumer rule below.
Interim derivation (no road graph required, deterministic, replace-don''t-rework): derive octants at L3 from (a) bearings to the settlement''s MST-neighbor placements (positions already in BodyWorldState.placements) and (b) the founding-orientation water bearing (TerrainAnalysis::water_bearing, 8-octant integer D-234 implementation note) for port/river settlements. Thread through build_skeleton_work_item (plugin.rs:179-212) next to the founding_orientation override.
Consumer rule to honour (already decided): the AdminFacing arrangement pattern picks its prestige edge as the edge facing the highest-quality road entry (paula-round2.md:428-433, paula-round3.md:320-322) so the octant list should be ordered or annotated by quality once the graph exists. Player-experience intent: the approach should present the city''s FoundingOrientation face (ozzie-round1.md:96-100).
Acceptance: a dispatched settlement with >=1 neighbor produces >=1 AccessKind::QuarterEdge node on the correct octant; the BlockJunction fallback fires only for genuinely isolated settlements. Parent: T-750. Blocked-by (soft): inter-settlement-transport ticket for full fidelity. Refs: D-234, D-213, D-204; T-990 (consumer, done), T-1022 (dispatch, done).', NULL, '2026-06-12 10:23:50', '2026-06-12 10:23:50', '2026-06-12 10:23:50', NULL, '83c55790389ce5fe221953ac5046af3f', 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 ('06FBPQ0381QWDAQABZAY7MRD8M', 'description', 'Workshopped-but-unticketed cascade work captured 2026-06-12 (cascade-refocus grounding pass). Full grounded scope follows.', 'Workshopped-but-unticketed cascade work captured 2026-06-12 (cascade-refocus grounding pass). Full grounded scope follows.
Drop the redundant per-body drainage + terrain re-run in the RegionProfile cascade layer by caching TerrainAnalysis on Layer1Output. cascade.rs:213-241: run_layer1 already computes drainage and (transitively) the terrain masks, but Layer1Output (layer1.rs:28-41) stores only river_network/basins/attractors so the RegionProfile arm re-runs drainage::analyze (:228-233) AND TerrainAnalysis::analyze (:234) on every AnalyzeBody. The in-code PERF/TODO (:219-221) cites T-1028, which is closed; T-1032 then wired the real body_params read, making this a live production cost on every analyzed body (:221-224). Drainage alone is ~50ms of the ~82ms Layer-1 subtotal (planet-down-cascade/round-1-notes.md:300-306), so the re-run roughly doubles the dominant per-body cost.
Scope (the TODO already prescribes it):
1. Carry TerrainAnalysis (features.rs:66+) on Layer1Output or a parallel field on the cascade snapshot, populated once in run_layer1.
2. Reuse it at cascade.rs:228-234 for region_profile::derive_all_regions.
3. Memory check: TerrainAnalysis holds several full-working-grid Vecs and Layer1Output rides the BodyWorldState LRU (D-203) either store the slim subset region derivation actually reads, or drop the analysis from the cached state after the region layer runs.
4. Validate combined cost against the D-239 §10 ~45 ms/body budget in the T-1031 verification harness (the TODO''s own acceptance criterion).
Pure refactor: derivation inputs unchanged, so T-952 golden-seed outputs must be byte-identical assert it. Also update the stale TODO text (it references a closed ticket). Parent: T-750. Refs: D-239 §10, D-203; T-1028/T-1031/T-1032 (context), T-952 (determinism gate).', NULL, '2026-06-12 10:23:50', '2026-06-12 10:23:50', '2026-06-12 10:23:50', NULL, 'b61e0502d60fee942b85061e5b511087', 2) ON CONFLICT(hash) DO NOTHING;
+9
View File
@@ -43,3 +43,12 @@ 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 ('06FB0TNSRW8G7MTH1FRGR1FN1W', 'T-974', '2026-05-25 10:51:49', '2026-06-08 21:01:34', NULL, '0fe94f1fc381b14886642c03819559ef', 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 ('06FB0TNSRWHN6KDZ5F97XDBD48', 'T-1034', '2026-06-08 17:00:07', '2026-06-08 21:01:34', NULL, '5e4adc849af1d11f0d529e4d35f89f93', 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 ('06FB0TNSRZ9FH06QVXD4T20BF8', 'T-1035', '2026-06-08 21:24:06', '2026-06-09 06:18:57', NULL, '41bce26391dae7d8c43fa108d3410a71', 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 ('06FBPPMMF7HS6FWRYAKMECTXX0', 'T-1036', '2026-06-12 10:22:16', '2026-06-12 10:22:16', NULL, 'e7d719dddb633da9ed45e2c95a7a7c22', 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 ('06FBPPMZNNEV052DBYYY3A897C', 'T-1037', '2026-06-12 10:22:19', '2026-06-12 10:22:19', NULL, 'b4dd5ff121bc2d8c6a0eb1321e731bb2', 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 ('06FBPQ02F02JDDBSFMGPX0XASR', 'T-1038', '2026-06-12 10:23:49', '2026-06-12 10:23:49', NULL, 'ae525176eebd585621a03f402b0b4e2c', 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 ('06FBPQ02KN9147H4Z12KJW7H1M', 'T-1039', '2026-06-12 10:23:49', '2026-06-12 10:23:49', NULL, 'f85ce209083bbd17dbb52210387ada38', 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 ('06FBPQ02QTVSZ1PXTGNCN6Y8KM', 'T-1040', '2026-06-12 10:23:49', '2026-06-12 10:23:49', NULL, '8b82cc663278b1afe2481faf0a7d4df0', 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 ('06FBPQ02VWJGXWDYT2SMXM9DTC', 'T-1041', '2026-06-12 10:23:49', '2026-06-12 10:23:49', NULL, '20289cc1d8082a6e1d72dbcf07bb8534', 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 ('06FBPQ0308CFF9WKNGBBYQ763W', 'T-1042', '2026-06-12 10:23:50', '2026-06-12 10:23:50', NULL, 'fd4f910a04f93cb960046faeded4d0f5', 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 ('06FBPQ034DKN4ENSGX5HTYTBJG', 'T-1043', '2026-06-12 10:23:50', '2026-06-12 10:23:50', NULL, '86eea4e94a5cb3f6947fcbdb0a0cfaed', 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 ('06FBPQ0381QWDAQABZAY7MRD8M', 'T-1044', '2026-06-12 10:23:50', '2026-06-12 10:23:50', NULL, '32d7b3362db0a95735536be0ad4036a2', 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);
+1
View File
@@ -88,3 +88,4 @@ INSERT INTO ticket_labels (ticket_record_id, label, created_at, updated_at, dele
INSERT INTO ticket_labels (ticket_record_id, label, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRXQH2YH9MPZV004C18', 'phase:4', '2026-06-06 00:00:00', '2026-06-06 19:40:20', '2026-06-06 19:40:20', 'f851d9705c0a2c2d34d813cabe2be82b', 2) ON CONFLICT(ticket_record_id, label) DO UPDATE SET updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > ticket_labels.updated_at OR (excluded.updated_at = ticket_labels.updated_at AND excluded.hash > ticket_labels.hash);
INSERT INTO ticket_labels (ticket_record_id, label, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRWJYWJKF9KNTBW69VC', 'phase:4', '2026-06-06 00:00:00', '2026-06-06 19:40:20', '2026-06-06 19:40:20', 'fe70ef92aebc1538a7a25be743264718', 2) ON CONFLICT(ticket_record_id, label) DO UPDATE SET updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > ticket_labels.updated_at OR (excluded.updated_at = ticket_labels.updated_at AND excluded.hash > ticket_labels.hash);
INSERT INTO ticket_labels (ticket_record_id, label, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRXMXGWS6NJ1FBJQ1GM', 'phase:4', '2026-06-06 00:00:00', '2026-06-06 19:40:20', '2026-06-06 19:40:20', 'ff96af73a95cb3ef5c7e54eb1a9af4f7', 2) ON CONFLICT(ticket_record_id, label) DO UPDATE SET updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > ticket_labels.updated_at OR (excluded.updated_at = ticket_labels.updated_at AND excluded.hash > ticket_labels.hash);
INSERT INTO ticket_labels (ticket_record_id, label, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRX3R6G3Y7QR4FAJPNM', 'needs-decision', '2026-06-12 10:23:21', '2026-06-12 10:23:21', NULL, 'a6311544e9503dd33805793528fc5baf', 2) ON CONFLICT(ticket_record_id, label) DO UPDATE SET updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > ticket_labels.updated_at OR (excluded.updated_at = ticket_labels.updated_at AND excluded.hash > ticket_labels.hash);
+974
View File
@@ -355,3 +355,977 @@ test, the +356C climate bug) — keep reviewing + verifying agent output, don''t
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 ('06FB0TNSRW8G7MTH1FRGR1FN1W', 'epic', '06FB0TNSRZXCHGS16BFHSSGSV4', 'Atlas-to-tile derivation model', 'Foundational world-derivation model from the atlas-derivation workshop. D-227 (deterministic-rebuild world model: pure function of seed+atlas, derived on demand + cached, only tile mutators persisted, fully volumetric voxel/subvoxel, vertical extent physical not floor-count, variable-height floors) + D-228 (composite tile schema: orthogonal axes TerrainMaterial/FloorMaterial/Vegetation/Water/elevation, derived shape/tactical-form, region-level morphology zones, cohesion matrix, dynamic clock-bound region seasonal state). Most implementation lands as the cascade reaches the tile layers (Phase 4+). Open design tracked in Q-100 (biome authority), Q-101 (refinement contract + body-class river density + ocean mask), Q-102 (cohesion-matrix algorithm), Q-103 (mutator op schema), Q-104 (floor-to-voxel-z mapping), Q-105 (region seasonal/clock state: water/snow/weather/crops).', 'done', 'high', NULL, 'server', 'D-228', '2026-05-25 10:51:49', '2026-06-08 21:01:34', NULL, '3ee28eefc0cb8acf63bdd59bd24a5eb5', 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 ('06FB0TNSRWHN6KDZ5F97XDBD48', 'bug', '06FB0TNSRW8G7MTH1FRGR1FN1W', 'derive_moisture_q hydrosphere vocab mismatch — liquid_water etc. fall to default', 'derive_moisture_q (region_profile.rs) matches hydrosphere on ''ocean''/''rivers''/''ice''/''subsurface''/''none'', but the actual bodies.hydrosphere vocab in systems.db is: liquid_water (175 bodies), ice (962), rivers (31), moderate (21), ocean (only 19), minimal (10), trace (8), subsurface_liquid (7), rivers-lakes (4), extensive (4), subsurface_ice (3), ocean-coastal (1), plus NULL (1649). So ''liquid_water'' and most surface-water worlds fall to the ''_ => 30'' default instead of high moisture — propagating wrong precipitation_class / glaciation_grade / vegetation_class for ~175+ water worlds. Same root cause as D-240 (code keying on a vocab the data doesn''t use). Fix: align derive_moisture_q (and audit any other hydrosphere consumer) to the real vocab — surface liquid (liquid_water/ocean/ocean-coastal/extensive) -> high; rivers/rivers-lakes/moderate -> mid; ice/subsurface* -> low; minimal/trace/none/NULL -> arid. T-1033''s maritime_factor table already maps the real vocab and can be the reference. Found during T-1033 verification (2026-06-08).', 'done', 'high', NULL, 'server', 'D-240', '2026-06-08 17:00:07', '2026-06-08 21:01:34', NULL, '9b9e1f52e3e4ef7ad71febff14cd0e2c', 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 ('06FB0TNSRZ9FH06QVXD4T20BF8', 'bug', NULL, 'voice::lookup tests share an on-disk cache dir — flaky under parallelism', 'voice::lookup::cache_miss_returns_base_text intermittently fails the full-suite push gate under cargo''s default parallel execution (passes in isolation). Root cause is test-isolation, not production nondeterminism: the test helper test_cache() builds every store with the SAME base_dir (temp_dir/sr-voice-lookup-test) and world_seed (99), so all four module tests share the on-disk zone path .../99/100.msgpack. VoiceCacheStore persists to disk on Drop (save_all) and reads it back on first zone access (load_zone). cache_hit_returns_voiced_text stores ''Voiced line.'' under the IDENTICAL (zone_id=100, CacheKey) that cache_miss_returns_base_text looks up; model/injector versions match so the invalidation guard doesn''t help. When the hit test''s Drop/save interleaves with the miss test (after its remove_dir_all, before its lookup), the miss test loads the leaked entry and returns ''Voiced line.'' instead of ''Base line.'' -> assertion fails. Fix: isolate each test''s cache directory (per-test label + process id) so neither parallel tests nor concurrent cargo test runs collide. Found during T-1031/T-1034 verification (2026-06-08).', 'done', 'medium', NULL, 'server', NULL, '2026-06-08 21:24:06', '2026-06-09 06:18:57', NULL, 'edfdf21f37c9610d280b0ff16e49f7f2', 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 ('06FBPPMMF7HS6FWRYAKMECTXX0', 'epic', '06FB0TNSRZE4CSS8YR0FCEXMK8', 'Post-cascade gameplay & scenario parking lot', 'Parking lot for game-making work that resumes only after the cascade delivers a traversable world (D-166 amendment 2026-06-12: ''Before this is a game I want it to be a Reach a character can travel through''). Holds scenario/bookmark/storyteller/gameplay-system tickets — including the surviving functional ideas from the dropped v0.2 target (tycoon bookmark, verbs, world feel; D-114/D-115/D-117/D-118/D-120 superseded by D-166). Tickets here are deliberately preserved, not cancelled: functional requirements survive scope pivots. Not a phase — sits beside the six phase epics under T-745 and is excluded from phase kanban queries.', 'backlog', 'low', NULL, NULL, NULL, '2026-06-12 10:22:16', '2026-06-12 10:22:16', NULL, '7d9a8938d359f9aaacec225f934e08f1', 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 ('06FBPPMZNNEV052DBYYY3A897C', 'initiative', NULL, 'Maintenance & test debt (phase-independent)', 'Standing home for test-failure debt, test-infrastructure work, build/process hygiene, and other phase-independent maintenance (created 2026-06-12 during the cascade-refocus cleanup; absorbs the open children of done umbrella T-871, the former T-34 test-infrastructure tree, and stray hygiene tasks). Deliberately parentless: maintenance is not a cascade phase. Per the broken-tests rule, failing-test children here need a fix or a dated disposition — parking is tracking, not forgetting.', 'backlog', 'medium', NULL, NULL, NULL, '2026-06-12 10:22:19', '2026-06-12 10:22:19', NULL, '01f97e13a5afcaf96fcd48d06d33c09d', 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 ('06FB0TNSRYXCMB1D08PW87FR9C', 'story', '06FB0TNSRXX29H5X0EB0F0GBW4', 'Art direction', NULL, 'backlog', 'medium', NULL, NULL, 'Q-003', '2026-02-09 15:21:44', '2026-06-12 10:23:02', NULL, 'feebc02db2e7effe635f48f8b211bf09', 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 ('06FB0TNSRYXCMB1D08PW87FR9C', 'story', '06FB0TNSRXX29H5X0EB0F0GBW4', 'Art direction', 'Parked under Phase 5 epic per cascade refocus 2026-06-12 — art direction (Q-003, still open) is decided when in-world rendering with final-version assets begins.', 'backlog', 'medium', NULL, NULL, 'Q-003', '2026-02-09 15:21:44', '2026-06-12 10:23:02', NULL, 'fdbc63dd9b6518a2796c6f7738ba56fd', 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 ('06FB0TNSRYWZ8VC3HVQJ6HA59R', 'story', '06FBPPMMF7HS6FWRYAKMECTXX0', 'Licensing/distribution', NULL, 'backlog', 'medium', NULL, NULL, 'Q-008', '2026-02-09 15:21:44', '2026-06-12 10:23:02', NULL, 'a228f257b4f9eac1c1d2356c47cfadaa', 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 ('06FB0TNSRYWZ8VC3HVQJ6HA59R', 'story', '06FBPPMMF7HS6FWRYAKMECTXX0', 'Licensing/distribution', 'Parked post-cascade per refocus 2026-06-12 — licensing/distribution (Q-008, still open) is a making-it-a-game/shipping concern with no generation dependency.', 'backlog', 'medium', NULL, NULL, 'Q-008', '2026-02-09 15:21:44', '2026-06-12 10:23:02', NULL, 'c01966c995b3da12b11764132eb84b42', 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 ('06FB0TNSRY7PWMK1F1DAWC08T8', 'story', '06FBPPMMF7HS6FWRYAKMECTXX0', 'Storyteller AI design', NULL, 'backlog', 'medium', NULL, NULL, 'Q-010', '2026-02-09 15:21:44', '2026-06-12 10:23:02', NULL, '1d86a79a61e8d3d21e36136a3682b8ca', 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 ('06FB0TNSRY7PWMK1F1DAWC08T8', 'story', '06FBPPMMF7HS6FWRYAKMECTXX0', 'Storyteller AI design', 'Parked post-cascade per refocus 2026-06-12 — storyteller AI (Q-010, still open) is a gameplay system with no generation dependency; functional requirement preserved.', 'backlog', 'medium', NULL, NULL, 'Q-010', '2026-02-09 15:21:44', '2026-06-12 10:23:02', NULL, 'd9ea9b1f8fa208612bf39d2f48ab71c8', 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 ('06FB0TNSRWABN2YJ0SNKRW9D7G', 'epic', '06FB0TNSRZGGNZMAP8GDMXSCMW', 'Simulation Tier System', 'Four-tier NPC simulation: Active (full sim), Background (state machines), State-saved (frozen structs), Ungenerated. Timestamp-based LRU eviction, scope tags.', 'backlog', 'critical', NULL, NULL, 'D-026', '2026-02-10 23:15:58', '2026-06-12 10:23:02', NULL, '7721b55841fe4a39d7504a8ee954b3be', 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 ('06FB0TNSRWABN2YJ0SNKRW9D7G', 'epic', '06FB0TNSRZGGNZMAP8GDMXSCMW', 'Simulation Tier System', 'Four-tier NPC simulation: Active (full sim), Background (state machines), State-saved (frozen structs), Ungenerated. Timestamp-based LRU eviction, scope tags.
Re-parented under Phase 6 epic per cascade refocus 2026-06-12 background NPC simulation tiers follow world generation and door boundary contracts; former parent T-29 is cancelled. Functional requirement preserved.', 'backlog', 'critical', NULL, NULL, 'D-026', '2026-02-10 23:15:58', '2026-06-12 10:23:02', NULL, 'fdc0c5552ef65c813d90b71e2257ce35', 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 ('06FB0TNSRWCSXFAG1E4TS7HAB4', 'epic', '06FB0TNSRXX29H5X0EB0F0GBW4', 'Fog of Perception - Vision System', 'LOS-based shadowcasting per z-level. Vision cone (forward/peripheral/behind). Walls block vision, fog returns on departure. Universal for all entities.', 'backlog', 'critical', NULL, NULL, 'D-011', '2026-02-10 23:16:24', '2026-06-12 10:23:02', NULL, '418e201b566c298be5b1dc9f6d42ccd3', 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 ('06FB0TNSRWCSXFAG1E4TS7HAB4', 'epic', '06FB0TNSRXX29H5X0EB0F0GBW4', 'Fog of Perception - Vision System', 'LOS-based shadowcasting per z-level. Vision cone (forward/peripheral/behind). Walls block vision, fog returns on departure. Universal for all entities.
Re-parented under Phase 5 epic per cascade refocus 2026-06-12 fog-of-perception vision is a player-surface system built on generated tiles; functional requirement preserved.', 'backlog', 'critical', NULL, NULL, 'D-011', '2026-02-10 23:16:24', '2026-06-12 10:23:02', NULL, '948a7539aa2cb43aea76a350323d9150', 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 ('06FB0TNSRY3PA3E31NAVQHR5GC', 'epic', '06FB0TNSRXX29H5X0EB0F0GBW4', 'Camera System', 'Locked to character, no panning. Optional rotation to facing direction (deferred to post-v0.1). Fixed-north for v0.1.', 'backlog', 'critical', NULL, NULL, 'D-015', '2026-02-10 23:16:24', '2026-06-12 10:23:02', NULL, '8c5fb1850e23d3661badb36c2e867abc', 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 ('06FB0TNSRY3PA3E31NAVQHR5GC', 'epic', '06FB0TNSRXX29H5X0EB0F0GBW4', 'Camera System', 'Locked to character, no panning. Optional rotation to facing direction (deferred to post-v0.1). Fixed-north for v0.1.
Re-parented under Phase 5 epic per cascade refocus 2026-06-12 locked camera is player-control work; functional requirement preserved.', 'backlog', 'critical', NULL, NULL, 'D-015', '2026-02-10 23:16:24', '2026-06-12 10:23:02', NULL, 'cd374ab66d33b4281051389fed254d64', 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 ('06FB0TNSRWBH6313PF00570RGR', 'epic', '06FB0TNSRXX29H5X0EB0F0GBW4', 'Internal Monologue System', 'Character voice narration for non-visual perception, atmosphere, diegetic hints. Contextual line selection based on situation, character personality, knowledge state.', 'backlog', 'high', NULL, NULL, 'D-016', '2026-02-10 23:16:24', '2026-06-12 10:23:02', NULL, '296e9334c952731fe3627f0c1f58583e', 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 ('06FB0TNSRWBH6313PF00570RGR', 'epic', '06FB0TNSRXX29H5X0EB0F0GBW4', 'Internal Monologue System', 'Character voice narration for non-visual perception, atmosphere, diegetic hints. Contextual line selection based on situation, character personality, knowledge state.
Re-parented under Phase 5 epic per cascade refocus 2026-06-12 internal monologue is a player perception surface; line-content detail can deepen in Phase 6. Functional requirement preserved.', 'backlog', 'high', NULL, NULL, 'D-016', '2026-02-10 23:16:24', '2026-06-12 10:23:02', NULL, 'c1f745b624eea830933397d905d5062a', 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 ('06FB0TNSRZP5KQ8RHFQQZK1ZJ0', 'epic', '06FB0TNSRXX29H5X0EB0F0GBW4', 'Sound Propagation Model', 'Three-range sound: Close (stereo audio), Medium (fog-edge indicators + monologue), Long (insert notifications - stretch). Event classification, directional info.', 'backlog', 'high', NULL, NULL, 'D-018', '2026-02-10 23:16:24', '2026-06-12 10:23:02', NULL, 'fd9cab58eca1544e079a621d05687d28', 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 ('06FB0TNSRZP5KQ8RHFQQZK1ZJ0', 'epic', '06FB0TNSRXX29H5X0EB0F0GBW4', 'Sound Propagation Model', 'Three-range sound: Close (stereo audio), Medium (fog-edge indicators + monologue), Long (insert notifications - stretch). Event classification, directional info.
Re-parented under Phase 5 epic per cascade refocus 2026-06-12 three-range sound propagation is a player perception surface; functional requirement preserved.', 'backlog', 'high', NULL, NULL, 'D-018', '2026-02-10 23:16:24', '2026-06-12 10:23:02', NULL, 'f6535180332df2caba5223f657bc8743', 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 ('06FB0TNSRW1VJS6GTSSYHK63F8', 'epic', '06FB0TNSRXX29H5X0EB0F0GBW4', 'Top-down Renderer', 'Tile-based rendering, sprite system, z-level visualization, fog overlay. 3D cutscenes deferred post-v0.1.', 'backlog', 'critical', NULL, NULL, 'D-019', '2026-02-10 23:16:24', '2026-06-12 10:23:02', NULL, '43d6b62fb3f70b687a9426379c460dec', 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 ('06FB0TNSRW1VJS6GTSSYHK63F8', 'epic', '06FB0TNSRXX29H5X0EB0F0GBW4', 'Top-down Renderer', 'Tile-based rendering, sprite system, z-level visualization, fog overlay. 3D cutscenes deferred post-v0.1.
Re-parented under Phase 5 epic per cascade refocus 2026-06-12 in-world tile/sprite rendering on generated tiles (D-019 superseded by D-148); functional requirement preserved.', 'backlog', 'critical', NULL, NULL, 'D-019', '2026-02-10 23:16:24', '2026-06-12 10:23:02', NULL, 'b2d399cf427665ffc8b0b3f330306dec', 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 ('06FB0TNSRY8XYH2CGTVR0TJ7W8', 'epic', '06FB0TNSRXX29H5X0EB0F0GBW4', 'Perception Mode Framework', 'Natural vision baseline for v0.1. Modular architecture for future modes (thermal, camera feeds, unisphere tracking, audio analysis). Observer query pattern.', 'backlog', 'medium', NULL, NULL, 'D-017', '2026-02-10 23:16:24', '2026-06-12 10:23:02', NULL, '1ed0c69966f724d8c4660bb7cf24b9a6', 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 ('06FB0TNSRY8XYH2CGTVR0TJ7W8', 'epic', '06FB0TNSRXX29H5X0EB0F0GBW4', 'Perception Mode Framework', 'Natural vision baseline for v0.1. Modular architecture for future modes (thermal, camera feeds, unisphere tracking, audio analysis). Observer query pattern.
Re-parented under Phase 5 epic per cascade refocus 2026-06-12 perception mode framework extends the player vision baseline; functional requirement preserved.', 'backlog', 'medium', NULL, NULL, 'D-017', '2026-02-10 23:16:24', '2026-06-12 10:23:02', NULL, '00139894e437d285a7ceed4480545f56', 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 ('06FB0TNSRYTW3T8YYBJ0VSSZM8', 'epic', '06FB0TNSRXX29H5X0EB0F0GBW4', 'Information Boundary System', 'First-class information tagging. Every piece of game state tagged with observer access. Foundation for fog, perception modes, NPC knowledge.', 'backlog', 'critical', NULL, NULL, 'D-010', '2026-02-10 23:16:38', '2026-06-12 10:23:02', NULL, '62e43e4e91964a85e046320911ea5dc3', 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 ('06FB0TNSRYTW3T8YYBJ0VSSZM8', 'epic', '06FB0TNSRXX29H5X0EB0F0GBW4', 'Information Boundary System', 'First-class information tagging. Every piece of game state tagged with observer access. Foundation for fog, perception modes, NPC knowledge.
Re-parented under Phase 5 epic per cascade refocus 2026-06-12 observer-access information tagging is the foundation for fog/perception player surfaces; functional requirement preserved.', 'backlog', 'critical', NULL, NULL, 'D-010', '2026-02-10 23:16:38', '2026-06-12 10:23:02', NULL, '0d391cbe9651a3bc75c75137de845597', 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 ('06FB0TNSRXX5X1PDENVXC4DRJ4', 'epic', '06FB0TNSRZXCHGS16BFHSSGSV4', 'Chunk-based Map System', 'Chunk generation and loading. Bounded maps with internal chunks for v0.1. Architecture supports future borderless generation.', 'backlog', 'high', NULL, NULL, 'D-012', '2026-02-10 23:16:38', '2026-06-12 10:23:02', NULL, 'ce059616258642310cecff6f8c5b625a', 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 ('06FB0TNSRXX5X1PDENVXC4DRJ4', 'epic', '06FB0TNSRZXCHGS16BFHSSGSV4', 'Chunk-based Map System', 'Chunk generation and loading. Bounded maps with internal chunks for v0.1. Architecture supports future borderless generation.
Re-parented under Phase 4 epic per cascade refocus 2026-06-12 chunk generation/loading is tile/chunk world-generation work; functional requirement preserved.', 'backlog', 'high', NULL, NULL, 'D-012', '2026-02-10 23:16:38', '2026-06-12 10:23:02', NULL, 'a9173a092dbf6fb17794659f7cdf2ce9', 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 ('06FB0TNSRXZK7C4X2DHQ6A0CKR', 'epic', '06FB0TNSRXX29H5X0EB0F0GBW4', 'Diegetic Insert/Minimap', 'Neural insert UI. POI discovery system (background, NPC tips, research, discovery). Minimap with directional arrows for distant POIs.', 'backlog', 'high', NULL, NULL, 'D-013', '2026-02-10 23:16:38', '2026-06-12 10:23:02', NULL, 'ff9c54ef6d3119a5c00a43718ca88737', 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 ('06FB0TNSRXZK7C4X2DHQ6A0CKR', 'epic', '06FB0TNSRXX29H5X0EB0F0GBW4', 'Diegetic Insert/Minimap', 'Neural insert UI. POI discovery system (background, NPC tips, research, discovery). Minimap with directional arrows for distant POIs.
Re-parented under Phase 5 epic per cascade refocus 2026-06-12 minimap/POI discovery is a HUD navigation surface for in-world play; functional requirement preserved.', 'backlog', 'high', NULL, NULL, 'D-013', '2026-02-10 23:16:38', '2026-06-12 10:23:02', NULL, 'd3d9d1682a09c509a70f316799bc8e06', 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 ('06FB0TNSRY5H0R4JCAJ6MY4X44', 'epic', '06FB0TNSRZXCHGS16BFHSSGSV4', 'Station District Map - v0.1 Revision', 'Revise D-014 for vertical slice: station district layout, workplace/bar/smuggling ring locations, 15-40 tile functional clusters, 2-3 z-levels.', 'backlog', 'high', NULL, NULL, 'D-014, D-027', '2026-02-10 23:16:38', '2026-06-12 10:23:02', NULL, '002412bb8ab724eaf4ae4ed60c863576', 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 ('06FB0TNSRY5H0R4JCAJ6MY4X44', 'epic', '06FB0TNSRZXCHGS16BFHSSGSV4', 'Station District Map - v0.1 Revision', 'Revise D-014 for vertical slice: station district layout, workplace/bar/smuggling ring locations, 15-40 tile functional clusters, 2-3 z-levels.
Re-parented under Phase 4 epic per cascade refocus 2026-06-12 the v0.1 vertical-slice framing is superseded, but station district layout with functional clusters survives as econ-layer/building-placement generation work.', 'backlog', 'high', NULL, NULL, 'D-014, D-027', '2026-02-10 23:16:38', '2026-06-12 10:23:02', NULL, '6bb3ffd815431c28f75ab8386cc26db9', 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 ('06FB0TNSRW1K4QJHAVSJF2ECSC', 'epic', '06FBPPMMF7HS6FWRYAKMECTXX0', 'Three-Tier Content Pipeline', 'Tier 1: Drama module pool system. Tier 2: Template instantiation engine. Tier 3: Procedural filler generation. Storyteller activation logic.', 'backlog', 'high', NULL, NULL, 'D-023', '2026-02-10 23:16:54', '2026-06-12 10:23:02', NULL, '4ebacb1a412cc0f5afd3a9a220275cff', 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 ('06FB0TNSRW1K4QJHAVSJF2ECSC', 'epic', '06FBPPMMF7HS6FWRYAKMECTXX0', 'Three-Tier Content Pipeline', 'Tier 1: Drama module pool system. Tier 2: Template instantiation engine. Tier 3: Procedural filler generation. Storyteller activation logic.
Parked post-cascade per refocus 2026-06-12 drama modules, storyteller activation, and narrative content pipeline are game-making systems with no generation dependency; functional requirement preserved.', 'backlog', 'high', NULL, NULL, 'D-023', '2026-02-10 23:16:54', '2026-06-12 10:23:02', NULL, '048fc5463c27d51fa7a3a75c94cabe05', 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 ('06FB0TNSRW5FXRP4KGCC3CBMAW', 'epic', '06FB0TNSRZXCHGS16BFHSSGSV4', 'Social Site Template System', 'Functional cluster definition: 4-8 NPC roles, 15-40 tile spaces, sightline requirements. Single-ownership with reference links. Template → instance lifecycle.', 'backlog', 'high', NULL, NULL, 'D-025', '2026-02-10 23:16:54', '2026-06-12 10:23:02', NULL, '3bff76dc2dbcf574aedbe699233cdb38', 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 ('06FB0TNSRW5FXRP4KGCC3CBMAW', 'epic', '06FB0TNSRZXCHGS16BFHSSGSV4', 'Social Site Template System', 'Functional cluster definition: 4-8 NPC roles, 15-40 tile spaces, sightline requirements. Single-ownership with reference links. Template → instance lifecycle.
Re-parented under Phase 4 epic per cascade refocus 2026-06-12 the spatial functional-cluster template (15-40 tile spaces, sightlines, template-to-instance lifecycle) is the building-templates cascade step; NPC-role population detail follows in Phase 6.', 'backlog', 'high', NULL, NULL, 'D-025', '2026-02-10 23:16:54', '2026-06-12 10:23:02', NULL, '92d805f095da86db0877be554f74f8e3', 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 ('06FB0TNSRXXVCGN5D35ZJ7M0MW', 'epic', '06FB0TNSRZGGNZMAP8GDMXSCMW', 'Dialogue System Architecture', 'Tagged line pools with systemic selection. Four relational layers: access tiers, relationship history, trust-gated gossip, unprompted disclosure. Trait modifier system.', 'backlog', 'high', NULL, NULL, 'D-028', '2026-02-10 23:16:54', '2026-06-12 10:23:02', NULL, '1c766a202d0efda4006ca96ef5fbb7c4', 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 ('06FB0TNSRXXVCGN5D35ZJ7M0MW', 'epic', '06FB0TNSRZGGNZMAP8GDMXSCMW', 'Dialogue System Architecture', 'Tagged line pools with systemic selection. Four relational layers: access tiers, relationship history, trust-gated gossip, unprompted disclosure. Trait modifier system.
Re-parented under Phase 6 epic per cascade refocus 2026-06-12 dialogue architecture and relational layers are NPC detail-coloring work; functional requirement preserved.', 'backlog', 'high', NULL, NULL, 'D-028', '2026-02-10 23:16:54', '2026-06-12 10:23:02', NULL, '55e50c06c24a105e4f983df2a467974e', 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 ('06FB0TNSRXYZC8QDKK423KFSKC', 'epic', '06FB0TNSRZGGNZMAP8GDMXSCMW', 'Population Management', '30/50/20 entanglement ratio (flat/mundane/intrigue). Variable per seed. Module attachment to known NPCs (60-70/30-40 ratio, also variable).', 'backlog', 'medium', NULL, NULL, 'D-029', '2026-02-10 23:16:54', '2026-06-12 10:23:02', NULL, 'ad5d5cec3164efa8ed7e4cbf2577a574', 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 ('06FB0TNSRXYZC8QDKK423KFSKC', 'epic', '06FB0TNSRZGGNZMAP8GDMXSCMW', 'Population Management', '30/50/20 entanglement ratio (flat/mundane/intrigue). Variable per seed. Module attachment to known NPCs (60-70/30-40 ratio, also variable).
Re-parented under Phase 6 epic per cascade refocus 2026-06-12 population entanglement ratios are background-NPC-layer work; functional requirement preserved.', 'backlog', 'medium', NULL, NULL, 'D-029', '2026-02-10 23:16:54', '2026-06-12 10:23:02', NULL, 'd8067a374a5a7cdcdac989c5ee413577', 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 ('06FB0TNSRZ5AP28E96W00KB0R4', 'epic', '06FBPPMZNNEV052DBYYY3A897C', 'Rust/bevy_ecs Test Infrastructure', 'Test harness for simulation server. External test modules, deterministic replay, ECS state inspection, behavior validation. Minimal production code pollution.', 'backlog', 'high', NULL, NULL, NULL, '2026-02-10 23:17:38', '2026-06-12 10:23:02', NULL, 'f35b5e6fc0a225aafdea63a0b9507e70', 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 ('06FB0TNSRZ5AP28E96W00KB0R4', 'epic', '06FBPPMZNNEV052DBYYY3A897C', 'Rust/bevy_ecs Test Infrastructure', 'Test harness for simulation server. External test modules, deterministic replay, ECS state inspection, behavior validation. Minimal production code pollution.
Re-homed under the maintenance umbrella per cascade refocus 2026-06-12 server test infrastructure is ongoing infra hygiene (much already delivered via the Gauntlet/verification harness); remaining scope preserved.', 'backlog', 'high', NULL, NULL, NULL, '2026-02-10 23:17:38', '2026-06-12 10:23:02', NULL, '9f77e277d1467a352082bb0594e73233', 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 ('06FB0TNSRYDYTDC36V3EPDD7VR', 'epic', '06FBPPMZNNEV052DBYYY3A897C', 'Godot Client Test Infrastructure', 'Test harness for rendering client. Scene testing, input simulation, rendering verification, fog/UI validation.', 'backlog', 'high', NULL, NULL, NULL, '2026-02-10 23:17:38', '2026-06-12 10:23:02', NULL, '2ca6965b9f752c1b212d0d0a2667ba15', 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 ('06FB0TNSRYDYTDC36V3EPDD7VR', 'epic', '06FBPPMZNNEV052DBYYY3A897C', 'Godot Client Test Infrastructure', 'Test harness for rendering client. Scene testing, input simulation, rendering verification, fog/UI validation.
Re-homed under the maintenance umbrella per cascade refocus 2026-06-12 client test infrastructure is ongoing infra hygiene (TestHarness and live-tier testing already exist); remaining scope preserved.', 'backlog', 'high', NULL, NULL, NULL, '2026-02-10 23:17:38', '2026-06-12 10:23:02', NULL, '270d69970b9b853bcb0954e8be3d50f5', 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 ('06FB0TNSRWYX9HMVEXES6GHXPW', 'epic', '06FBPPMZNNEV052DBYYY3A897C', 'Integration Test Framework', 'End-to-end tests across IPC boundary. Protocol validation, sync verification, full playthrough automation.', 'backlog', 'medium', NULL, NULL, NULL, '2026-02-10 23:17:38', '2026-06-12 10:23:02', NULL, '80285c89dd7722c73cde7a3360f2a137', 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 ('06FB0TNSRWYX9HMVEXES6GHXPW', 'epic', '06FBPPMZNNEV052DBYYY3A897C', 'Integration Test Framework', 'End-to-end tests across IPC boundary. Protocol validation, sync verification, full playthrough automation.
Re-homed under the maintenance umbrella per cascade refocus 2026-06-12 cross-IPC integration testing is ongoing infra hygiene (live Gauntlet pipeline already covers much of it); remaining scope preserved.', 'backlog', 'medium', NULL, NULL, NULL, '2026-02-10 23:17:38', '2026-06-12 10:23:02', NULL, 'cc7067391bc544ed46b17b432699e980', 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 ('06FB0TNSRWRV5KJ6DVD742S678', 'story', '06FBPPMZNNEV052DBYYY3A897C', 'Standalone CLI test harness', 'Run simulation headless via terminal. Log output for verification. No GUI dependency.', 'backlog', 'high', NULL, NULL, NULL, '2026-02-10 23:17:59', '2026-06-12 10:23:02', NULL, 'f353d713819ff7e22f95584bedaf25e0', 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 ('06FB0TNSRWRV5KJ6DVD742S678', 'story', '06FBPPMZNNEV052DBYYY3A897C', 'Standalone CLI test harness', 'Run simulation headless via terminal. Log output for verification. No GUI dependency.
Re-homed under the maintenance umbrella per cascade refocus 2026-06-12 headless CLI harness is test tooling hygiene under done epic T-35; verify remaining gap vs the existing --test-mode/Gauntlet headless path.', 'backlog', 'high', NULL, NULL, NULL, '2026-02-10 23:17:59', '2026-06-12 10:23:02', NULL, '25d05d75c596cc3aa92391d93bcc9ccb', 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 ('06FB0TNSRX13JY1N9BF76CK8WW', 'story', '06FBPPMMF7HS6FWRYAKMECTXX0', 'NetworkBridge stub', 'TCP-based bridge for future multiplayer. Same interface as LocalBridge, deferred implementation.', 'backlog', 'low', NULL, NULL, NULL, '2026-02-10 23:18:24', '2026-06-12 10:23:02', NULL, '2a50025cfd384bb89d2128f754308654', 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 ('06FB0TNSRX13JY1N9BF76CK8WW', 'story', '06FBPPMMF7HS6FWRYAKMECTXX0', 'NetworkBridge stub', 'TCP-based bridge for future multiplayer. Same interface as LocalBridge, deferred implementation.
Parked post-cascade per refocus 2026-06-12 the TCP NetworkBridge for future multiplayer has no generation dependency and stays deferred; functional requirement preserved (same interface as LocalBridge).', 'backlog', 'low', NULL, NULL, NULL, '2026-02-10 23:18:24', '2026-06-12 10:23:02', NULL, '3b4aecc006ff0f423a503cbbbacd8d0e', 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 ('06FB0TNSRW99M5Z3KD8HM0VDT8', 'story', '06FB0TNSRZGGNZMAP8GDMXSCMW', 'Mood system', 'MoodState component. Mood affected by events, relationships, job satisfaction, contentment. Mood influences behavior.', 'backlog', 'medium', NULL, NULL, NULL, '2026-02-10 23:19:21', '2026-06-12 10:23:02', NULL, '6a55fc693a32e335312e3c6a71482e6b', 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 ('06FB0TNSRW99M5Z3KD8HM0VDT8', 'story', '06FB0TNSRZGGNZMAP8GDMXSCMW', 'Mood system', 'MoodState component. Mood affected by events, relationships, job satisfaction, contentment. Mood influences behavior.
Re-parented under Phase 6 epic per cascade refocus 2026-06-12 NPC mood simulation is background-NPC-layer work; rescued from cancelled parent epic T-41. Functional requirement preserved.', 'backlog', 'medium', NULL, NULL, NULL, '2026-02-10 23:19:21', '2026-06-12 10:23:02', NULL, '783e82c9d93ad5a7cdee581651902ab6', 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 ('06FB0TNSRY0PTZ1MKJEGCR2NYC', 'story', '06FB0TNSRZGGNZMAP8GDMXSCMW', 'Job performance simulation', 'Work activity states. Job satisfaction tracking. Performance affects mood and relationships.', 'backlog', 'low', NULL, NULL, NULL, '2026-02-10 23:19:21', '2026-06-12 10:23:02', NULL, '0217076ad4addac86308cc1f680ed3eb', 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 ('06FB0TNSRY0PTZ1MKJEGCR2NYC', 'story', '06FB0TNSRZGGNZMAP8GDMXSCMW', 'Job performance simulation', 'Work activity states. Job satisfaction tracking. Performance affects mood and relationships.
Re-parented under Phase 6 epic per cascade refocus 2026-06-12 NPC job-performance simulation is background-NPC-layer work; rescued from cancelled parent epic T-41. Functional requirement preserved.', 'backlog', 'low', NULL, NULL, NULL, '2026-02-10 23:19:21', '2026-06-12 10:23:02', NULL, 'b16bda5453b92497d390622f15526d29', 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 ('06FB0TNSRYHPH9Q44CERYSRYJC', 'story', '06FBPPMMF7HS6FWRYAKMECTXX0', 'Unreliable narrator mechanics', 'Monologue can be wrong. Character misinterpretations. Knowledge-gated accuracy.', 'backlog', 'low', NULL, NULL, NULL, '2026-02-10 23:20:40', '2026-06-12 10:23:02', NULL, 'f13672adbdb2b1164bdd7598d6b25aff', 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 ('06FB0TNSRYHPH9Q44CERYSRYJC', 'story', '06FBPPMMF7HS6FWRYAKMECTXX0', 'Unreliable narrator mechanics', 'Monologue can be wrong. Character misinterpretations. Knowledge-gated accuracy.
Parked as post-cascade gameplay per cascade refocus 2026-06-12; functional requirement (knowledge-gated monologue accuracy) preserved, not cancelled.', 'backlog', 'low', NULL, NULL, NULL, '2026-02-10 23:20:40', '2026-06-12 10:23:02', NULL, '770b2bee51d65f264ed58fa9ce72bc54', 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 ('06FB0TNSRWEGYAEQXDVSMF4THG', 'story', '06FB0TNSRZXCHGS16BFHSSGSV4', 'Placeholder art pipeline', 'Colored boxes, simple sprites, labels. Functional but not polished. Per D-014 guidance.', 'backlog', 'high', NULL, NULL, NULL, '2026-02-10 23:21:12', '2026-06-12 10:23:02', NULL, '685ae03697216b9f5f4e791d5cfee252', 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 ('06FB0TNSRWEGYAEQXDVSMF4THG', 'story', '06FB0TNSRZXCHGS16BFHSSGSV4', 'Placeholder art pipeline', 'Colored boxes, simple sprites, labels. Functional but not polished. Per D-014 guidance.
Re-parented under Phase 4 epic (T-750) per cascade refocus 2026-06-12; scope updated from v0.1 placeholder art to the final-version asset pipeline per D-166 (no placeholders, no test map) functional requirement (asset production pipeline) preserved.', 'backlog', 'high', NULL, NULL, NULL, '2026-02-10 23:21:12', '2026-06-12 10:23:02', NULL, '6718c338eb00f8fa703c1f6c12c47061', 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 ('06FB0TNSRW4WB0PWAXS6D67J8R', 'story', '06FBPPMMF7HS6FWRYAKMECTXX0', 'Additional mode stubs', 'Thermal, camera feeds, unisphere tracking, audio analysis. Interface only, no implementation. Post-v0.1 features.', 'backlog', 'low', NULL, NULL, NULL, '2026-02-10 23:21:23', '2026-06-12 10:23:02', NULL, 'df1325f7c62d8454b433391b168f8bad', 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 ('06FB0TNSRW4WB0PWAXS6D67J8R', 'story', '06FBPPMMF7HS6FWRYAKMECTXX0', 'Additional mode stubs', 'Thermal, camera feeds, unisphere tracking, audio analysis. Interface only, no implementation. Post-v0.1 features.
Parked as post-cascade gameplay per cascade refocus 2026-06-12; thermal/camera-feed/unisphere/audio modes are D-017 character-build features, preserved not cancelled.', 'backlog', 'low', NULL, NULL, NULL, '2026-02-10 23:21:23', '2026-06-12 10:23:02', NULL, '4d38b67572b5c02ac8d4d5b49b010f3c', 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 ('06FB0TNSRYR09VY1F6C42PACGW', 'story', '06FBPPMMF7HS6FWRYAKMECTXX0', 'Character-specific POI filtering', 'Different characters see different POIs. Profession-based, faction-based, relationship-based visibility.', 'backlog', 'medium', NULL, NULL, NULL, '2026-02-10 23:22:17', '2026-06-12 10:23:02', NULL, 'bc869a5613c10871e32804f3e898867d', 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 ('06FB0TNSRYR09VY1F6C42PACGW', 'story', '06FBPPMMF7HS6FWRYAKMECTXX0', 'Character-specific POI filtering', 'Different characters see different POIs. Profession-based, faction-based, relationship-based visibility.
Parked as post-cascade gameplay per cascade refocus 2026-06-12; profession/faction/relationship-gated POI visibility preserved, not cancelled.', 'backlog', 'medium', NULL, NULL, NULL, '2026-02-10 23:22:17', '2026-06-12 10:23:02', NULL, '78d416703703c36d4191f263e2f5f1d8', 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 ('06FB0TNSRWMGK6BB68HARCD500', 'story', '06FBPPMMF7HS6FWRYAKMECTXX0', 'POI manipulation mechanics', 'False POIs (traps), outdated locations, spoofed information. Trust/deception layer.', 'backlog', 'low', NULL, NULL, NULL, '2026-02-10 23:22:17', '2026-06-12 10:23:02', NULL, '8a9a1060501c70e4f732153a9477fe62', 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 ('06FB0TNSRWMGK6BB68HARCD500', 'story', '06FBPPMMF7HS6FWRYAKMECTXX0', 'POI manipulation mechanics', 'False POIs (traps), outdated locations, spoofed information. Trust/deception layer.
Parked as post-cascade gameplay per cascade refocus 2026-06-12; false-POI/spoofing trust-deception layer preserved, not cancelled.', 'backlog', 'low', NULL, NULL, NULL, '2026-02-10 23:22:17', '2026-06-12 10:23:02', NULL, '899f36728e92fe8c7aeff2f2a02a8627', 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 ('06FB0TNSRY9C4JS3NDEMS5QBXC', 'story', '06FB0TNSRZGGNZMAP8GDMXSCMW', 'Tier 3 procedural generator', 'Generate filler locations from templates. Ambient NPCs, basic interactions, systemic hooks for template colonization.', 'backlog', 'medium', NULL, NULL, NULL, '2026-02-10 23:23:54', '2026-06-12 10:23:02', NULL, '28010b342b384cba5a77cf4be1ec1b9c', 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 ('06FB0TNSRY9C4JS3NDEMS5QBXC', 'story', '06FB0TNSRZGGNZMAP8GDMXSCMW', 'Tier 3 procedural generator', 'Generate filler locations from templates. Ambient NPCs, basic interactions, systemic hooks for template colonization.
Parked under Phase 6 epic (T-751) per cascade refocus 2026-06-12; ambient-NPC population of template locations comes after the world is walkable (location geometry itself is covered by Phase 4 template/district work).', 'backlog', 'medium', NULL, NULL, NULL, '2026-02-10 23:23:54', '2026-06-12 10:23:02', NULL, '570a8daef7cdab27896f6f946c5b5e1f', 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 ('06FB0TNSRY8BRY0E3PH6JA2HAM', 'story', '06FB0TNSRZGGNZMAP8GDMXSCMW', 'Cross-template reference system', 'Create reference links between templates. Shared NPCs, relationship propagation, contamination paths.', 'backlog', 'medium', NULL, NULL, NULL, '2026-02-10 23:24:06', '2026-06-12 10:23:02', NULL, '52b53333bc3611e139647d59d36c4294', 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 ('06FB0TNSRY8BRY0E3PH6JA2HAM', 'story', '06FB0TNSRZGGNZMAP8GDMXSCMW', 'Cross-template reference system', 'Create reference links between templates. Shared NPCs, relationship propagation, contamination paths.
Parked under Phase 6 epic (T-751) per cascade refocus 2026-06-12; shared-NPC/relationship links between templates belong to the NPC detail layer.', 'backlog', 'medium', NULL, NULL, NULL, '2026-02-10 23:24:06', '2026-06-12 10:23:02', NULL, '67678194e45fc82bf34e96a61c834883', 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 ('06FB0TNSRYX9R1F6SDN27PDND8', 'story', '06FBPPMMF7HS6FWRYAKMECTXX0', 'Module attachment logic', '60-70/30-40 known vs stranger ratio for module attachment. Variable per seed. Anti-metagaming.', 'backlog', 'low', NULL, NULL, NULL, '2026-02-10 23:24:37', '2026-06-12 10:23:02', NULL, '9e840a81b854503f2576474ebd8d7d6c', 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 ('06FB0TNSRYX9R1F6SDN27PDND8', 'story', '06FBPPMMF7HS6FWRYAKMECTXX0', 'Module attachment logic', '60-70/30-40 known vs stranger ratio for module attachment. Variable per seed. Anti-metagaming.
Parked as post-cascade gameplay per cascade refocus 2026-06-12; drama-module attachment ratios (anti-metagaming) preserved, not cancelled.', 'backlog', 'low', NULL, NULL, NULL, '2026-02-10 23:24:37', '2026-06-12 10:23:02', NULL, 'eff4a3b8d1df1f4b223faf50dbab8c46', 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 ('06FB0TNSRXJ0QD32XB44NESXDW', 'story', '06FBPPMZNNEV052DBYYY3A897C', 'Testing pattern documentation', 'Document agreed patterns. Test organization conventions, naming, structure. Developer guide.', 'backlog', 'high', NULL, NULL, NULL, '2026-02-10 23:27:10', '2026-06-12 10:23:02', NULL, '2866969117769a402ea35cb9167c8df7', 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 ('06FB0TNSRXJ0QD32XB44NESXDW', 'story', '06FBPPMZNNEV052DBYYY3A897C', 'Testing pattern documentation', 'Document agreed patterns. Test organization conventions, naming, structure. Developer guide.
Re-homed under maintenance per cascade refocus 2026-06-12; testing-pattern developer guide is documentation/infra hygiene (partially covered by CLAUDE.md testing preferences reconcile when picked up).', 'backlog', 'high', NULL, NULL, NULL, '2026-02-10 23:27:10', '2026-06-12 10:23:02', NULL, 'a1707e0fc860a696e4185c3407cc4b0e', 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 ('06FB0TNSRZHTCRQY5G1J8SEGXM', 'story', '06FBPPMZNNEV052DBYYY3A897C', 'Tooling requirements spec', 'Define required tooling: test runners, assertion libraries, mocking frameworks. Installation/setup docs.', 'backlog', 'high', NULL, NULL, NULL, '2026-02-10 23:27:10', '2026-06-12 10:23:02', NULL, '2b4756d4fc1d09884cbde5ca27074650', 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 ('06FB0TNSRZHTCRQY5G1J8SEGXM', 'story', '06FBPPMZNNEV052DBYYY3A897C', 'Tooling requirements spec', 'Define required tooling: test runners, assertion libraries, mocking frameworks. Installation/setup docs.
Re-homed under maintenance per cascade refocus 2026-06-12; test-tooling requirements spec is infra hygiene (much is de facto settled: gdUnit4, cargo test, Gauntlet).', 'backlog', 'high', NULL, NULL, NULL, '2026-02-10 23:27:10', '2026-06-12 10:23:02', NULL, '85430c9483f3f62444bf0dfd8db39cd1', 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 ('06FB0TNSRY9FP8GJSR96661J9M', 'story', '06FBPPMZNNEV052DBYYY3A897C', 'Production code constraints', 'Define rules: what test hooks are acceptable in production code, what must stay external. Pollution boundaries.', 'backlog', 'high', NULL, NULL, NULL, '2026-02-10 23:27:10', '2026-06-12 10:23:02', NULL, '959a0000a9e6b4f20ce8eaa5fc4d76cc', 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 ('06FB0TNSRY9FP8GJSR96661J9M', 'story', '06FBPPMZNNEV052DBYYY3A897C', 'Production code constraints', 'Define rules: what test hooks are acceptable in production code, what must stay external. Pollution boundaries.
Re-homed under maintenance per cascade refocus 2026-06-12; production-code test-hook policy is engineering-hygiene documentation.', 'backlog', 'high', NULL, NULL, NULL, '2026-02-10 23:27:10', '2026-06-12 10:23:02', NULL, 'd71e4a0bb47bc8f488d408b8ba19afa2', 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 ('06FB0TNSRY8KWVN9TCM2G5XXG8', 'epic', '06FB0TNSRXX29H5X0EB0F0GBW4', 'Movement & Collision', 'Tile collision, pathfinding, NPC movement, and game clock systems. Hard blockers identified in v0.1 gap analysis workshop. Without these, NPCs cannot physically navigate the station.', 'backlog', 'critical', NULL, NULL, NULL, '2026-02-11 00:00:57', '2026-06-12 10:23:03', NULL, 'b1dadd77544073516a99f3db850d6735', 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 ('06FB0TNSRY8KWVN9TCM2G5XXG8', 'epic', '06FB0TNSRXX29H5X0EB0F0GBW4', 'Movement & Collision', 'Tile collision, pathfinding, NPC movement, and game clock systems. Hard blockers identified in v0.1 gap analysis workshop. Without these, NPCs cannot physically navigate the station.
Parked under Phase 5 epic (T-749) per cascade refocus 2026-06-12; previous parent initiative T-29 is cancelled tile collision/pathfinding/clock is the player-walking foundation (NPC movement portion follows in Phase 6).', 'backlog', 'critical', NULL, NULL, NULL, '2026-02-11 00:00:57', '2026-06-12 10:23:03', NULL, '150ea94645f47777383e0eccef421055', 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 ('06FB0TNSRZ202MPMFH0EDH2BT4', 'epic', '06FBPPMMF7HS6FWRYAKMECTXX0', 'Observation & Interaction', 'Unified observation pipeline and player interaction systems. The experience layer that connects perception, knowledge, and monologue into the core gameplay loop. Identified as the missing spine in gap analysis workshop.', 'backlog', 'critical', NULL, NULL, NULL, '2026-02-11 00:01:05', '2026-06-12 10:23:03', NULL, '3421d4a2b8fb1e403763a83876246fc3', 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 ('06FB0TNSRZ202MPMFH0EDH2BT4', 'epic', '06FBPPMMF7HS6FWRYAKMECTXX0', 'Observation & Interaction', 'Unified observation pipeline and player interaction systems. The experience layer that connects perception, knowledge, and monologue into the core gameplay loop. Identified as the missing spine in gap analysis workshop.
Parked as post-cascade gameplay per cascade refocus 2026-06-12; the observation/interaction spine of the core gameplay loop is preserved, not cancelled.', 'backlog', 'critical', NULL, NULL, NULL, '2026-02-11 00:01:05', '2026-06-12 10:23:03', NULL, 'fdb933b02ac2af9d0585e9ff2f0af3a5', 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 ('06FB0TNSRZP48TDBTW18P88WNW', 'epic', '06FB0TNSRXX29H5X0EB0F0GBW4', 'Game State Management', 'Save/load, session management, and game state serialization systems. Required for playable v0.1 sessions.', 'backlog', 'high', NULL, NULL, NULL, '2026-02-11 00:01:13', '2026-06-12 10:23:03', NULL, '9b5824a7c03adcb2281dfa143444a4cb', 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 ('06FB0TNSRZP48TDBTW18P88WNW', 'epic', '06FB0TNSRXX29H5X0EB0F0GBW4', 'Game State Management', 'Save/load, session management, and game state serialization systems. Required for playable v0.1 sessions.
Parked under Phase 5 epic (T-749) per cascade refocus 2026-06-12; save/load and session management are tied to playable sessions (savegame lineage is documented as Phase 5+).', 'backlog', 'high', NULL, NULL, NULL, '2026-02-11 00:01:13', '2026-06-12 10:23:03', NULL, '125b493b4c861ba2a04ae2a9185ed944', 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 ('06FB0TNSRY5PJH0XRB4Z92JBER', 'story', '06FBPPMZNNEV052DBYYY3A897C', 'Test output formatter CLI', 'Normalize cargo-nextest and gdUnit4 output into consistent JSON schema (suite, total, passed, failed, failures array). Low priority — gdUnit4 already outputs JSON natively. Source: Hoshe R1 T-3.', 'backlog', 'low', NULL, NULL, NULL, '2026-02-11 00:05:00', '2026-06-12 10:23:03', NULL, 'e1672de4783731547b2847688810f175', 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 ('06FB0TNSRY5PJH0XRB4Z92JBER', 'story', '06FBPPMZNNEV052DBYYY3A897C', 'Test output formatter CLI', 'Normalize cargo-nextest and gdUnit4 output into consistent JSON schema (suite, total, passed, failed, failures array). Low priority — gdUnit4 already outputs JSON natively. Source: Hoshe R1 T-3.
Re-homed under maintenance per cascade refocus 2026-06-12; test tooling, not phase work.', 'backlog', 'low', NULL, NULL, NULL, '2026-02-11 00:05:00', '2026-06-12 10:23:03', NULL, '67ea9105ad606a6e386d2f7fcdb155b1', 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 ('06FB0TNSRZHW11BZWVZKB5YTH8', 'story', '06FBPPMZNNEV052DBYYY3A897C', 'Crash reporting infrastructure', 'Crash reporting infrastructure for both codebases:\n- Rust panic handler writes crash.log with backtrace\n- Godot push_error captures client crashes\n- Include version, platform, last 100 log lines\n- Needed before external playtesting\n\nEffort: M\nCodebase: server + client\nSource: Architecture Review Audit 2026-02-11\nSprint: 2+ (before vertical slice playtest)', 'backlog', 'medium', NULL, NULL, NULL, '2026-02-11 20:27:45', '2026-06-12 10:23:03', NULL, '3bb30edc990fb63ea6b0ba530e1fe0a4', 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 ('06FB0TNSRZHW11BZWVZKB5YTH8', 'story', '06FBPPMZNNEV052DBYYY3A897C', 'Crash reporting infrastructure', 'Crash reporting infrastructure for both codebases:\n- Rust panic handler writes crash.log with backtrace\n- Godot push_error captures client crashes\n- Include version, platform, last 100 log lines\n- Needed before external playtesting\n\nEffort: M\nCodebase: server + client\nSource: Architecture Review Audit 2026-02-11\nSprint: 2+ (before vertical slice playtest)
Re-homed under maintenance per cascade refocus 2026-06-12; infra requirement preserved unchanged.', 'backlog', 'medium', NULL, NULL, NULL, '2026-02-11 20:27:45', '2026-06-12 10:23:03', NULL, '3046ccac1355ecf98b7ff730d8abd03d', 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 ('06FB0TNSRXVMATNG8QEJVVVCH0', 'epic', '06FB0TNSRZGGNZMAP8GDMXSCMW', 'Workshop: Knowledge Graph & Information Boundaries', 'Design workshop for KnowledgeGraph component to replace Vec<String> placeholder.
Scope:
- Graph structure (nodes, edges, timestamps, certainty)
- Information boundaries (what NPCs know vs do not know)
- Propagation rules (gossip, observation, inference)
- Query interface for dialogue/behavior systems
- Memory limits and forgetting mechanics
Pillar-1 mechanic. CRITICAL priority.
Sprint 2 blocker.
Participants: Tyre (lead), Morve, Dudley, SI
Source: Architecture Review Audit 2026-02-11', 'backlog', 'critical', NULL, NULL, NULL, '2026-02-11 20:27:52', '2026-06-12 10:23:03', NULL, 'f506ed016009ecb27393e8ce71c41b04', 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 ('06FB0TNSRXVMATNG8QEJVVVCH0', 'epic', '06FB0TNSRZGGNZMAP8GDMXSCMW', 'Workshop: Knowledge Graph & Information Boundaries', 'Design workshop for KnowledgeGraph component to replace Vec<String> placeholder.
Scope:
- Graph structure (nodes, edges, timestamps, certainty)
- Information boundaries (what NPCs know vs do not know)
- Propagation rules (gossip, observation, inference)
- Query interface for dialogue/behavior systems
- Memory limits and forgetting mechanics
Pillar-1 mechanic. CRITICAL priority.
Sprint 2 blocker.
Participants: Tyre (lead), Morve, Dudley, SI
Source: Architecture Review Audit 2026-02-11
Parked under Phase 6 epic per cascade refocus 2026-06-12; NPC knowledge systems follow the background NPC layer.', 'backlog', 'critical', NULL, NULL, NULL, '2026-02-11 20:27:52', '2026-06-12 10:23:03', NULL, '41396f69c018ecf29aff0e17689172bc', 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 ('06FB0TNSRZ8NCH53C9VAC2N3V8', 'epic', '06FB0TNSRXX29H5X0EB0F0GBW4', 'Workshop: Observer Snapshot Generation Pipeline', 'Design workshop for perception query algorithm that generates ObserverSnapshot.
Pipeline stages:
1. Spatial query (entities in range)
2. Line-of-sight filtering
3. Sound propagation
4. Knowledge graph integration
5. Snapshot assembly
CRITICAL priority. Sprint 2 blocker.
Depends on Workshop 1 (Knowledge Graph).
Participants: Tyre (lead), Morve, Dudley, SI
Source: Architecture Review Audit 2026-02-11', 'backlog', 'critical', NULL, NULL, NULL, '2026-02-11 20:28:05', '2026-06-12 10:23:03', NULL, 'a7c69a12c7a6c9e2143a80641947e548', 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 ('06FB0TNSRZ8NCH53C9VAC2N3V8', 'epic', '06FB0TNSRXX29H5X0EB0F0GBW4', 'Workshop: Observer Snapshot Generation Pipeline', 'Design workshop for perception query algorithm that generates ObserverSnapshot.
Pipeline stages:
1. Spatial query (entities in range)
2. Line-of-sight filtering
3. Sound propagation
4. Knowledge graph integration
5. Snapshot assembly
CRITICAL priority. Sprint 2 blocker.
Depends on Workshop 1 (Knowledge Graph).
Participants: Tyre (lead), Morve, Dudley, SI
Source: Architecture Review Audit 2026-02-11
Parked under Phase 5 epic per cascade refocus 2026-06-12; player perception pipeline activates with player viewport work.', 'backlog', 'critical', NULL, NULL, NULL, '2026-02-11 20:28:05', '2026-06-12 10:23:03', NULL, '7e004de68834eca5c9a9038ef1bbe277', 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 ('06FB0TNSRZVC39DY5152CXZMB0', 'epic', '06FB0TNSRXX29H5X0EB0F0GBW4', 'Workshop: Save/Load Architecture', 'Design workshop for save/load system architecture.
Key decisions:
- Custom SaveState struct vs bevy_reflect
- Version number scheme and migration strategy
- Relationship to tier system (serialize by tier?)
- Incremental saves vs full snapshots
- Quick save vs named saves
MEDIUM priority. Must be resolved before vertical slice.
Participants: Dudley (lead), Tyre, Morve, SI
Source: Architecture Review Audit 2026-02-11', 'backlog', 'medium', NULL, NULL, NULL, '2026-02-11 20:28:16', '2026-06-12 10:23:03', NULL, 'a88b7b40aa2b05fd5baeb91363890c87', 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 ('06FB0TNSRZVC39DY5152CXZMB0', 'epic', '06FB0TNSRXX29H5X0EB0F0GBW4', 'Workshop: Save/Load Architecture', 'Design workshop for save/load system architecture.
Key decisions:
- Custom SaveState struct vs bevy_reflect
- Version number scheme and migration strategy
- Relationship to tier system (serialize by tier?)
- Incremental saves vs full snapshots
- Quick save vs named saves
MEDIUM priority. Must be resolved before vertical slice.
Participants: Dudley (lead), Tyre, Morve, SI
Source: Architecture Review Audit 2026-02-11
Parked under Phase 5 epic per cascade refocus 2026-06-12; savegame lineage already planned as Phase 5+ in asset-pipeline.md.', 'backlog', 'medium', NULL, NULL, NULL, '2026-02-11 20:28:16', '2026-06-12 10:23:03', NULL, '54cec88f34afca4fb300884337cab649', 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 ('06FB0TNSRWSBWTKM42BVVMPXJG', 'epic', '06FB0TNSRZXCHGS16BFHSSGSV4', 'Workshop: Map Authoring Pipeline', 'Design workshop for map authoring toolchain and format.
Key decisions:
- Tool selection: Tiled vs Godot TileMap vs YAML
- Map format (JSON, TMX, custom?)
- Collision layer specification
- Entity spawn points
- Loader implementation (server + client)
- Hot reload support for iteration
MEDIUM priority. Sprint 2-3 target.
Participants: Morve (lead), Tyre, Dudley, SI
Source: Architecture Review Audit 2026-02-11', 'backlog', 'medium', NULL, NULL, NULL, '2026-02-11 20:28:22', '2026-06-12 10:23:03', NULL, 'f62afde5bfff20014eae53dffaec16ed', 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 ('06FB0TNSRWSBWTKM42BVVMPXJG', 'epic', '06FB0TNSRZXCHGS16BFHSSGSV4', 'Workshop: Map Authoring Pipeline', 'Design workshop for map authoring toolchain and format.
Key decisions:
- Tool selection: Tiled vs Godot TileMap vs YAML
- Map format (JSON, TMX, custom?)
- Collision layer specification
- Entity spawn points
- Loader implementation (server + client)
- Hot reload support for iteration
MEDIUM priority. Sprint 2-3 target.
Participants: Morve (lead), Tyre, Dudley, SI
Source: Architecture Review Audit 2026-02-11
Re-parented under Phase 4 epic per cascade refocus 2026-06-12; authoring-tool framing superseded by D-166 (no hand-made maps) surviving scope is format/collision/loader for generator output.', 'backlog', 'medium', NULL, NULL, NULL, '2026-02-11 20:28:22', '2026-06-12 10:23:03', NULL, '49700ba92cebf77fd899a98be505eb73', 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 ('06FB0TNSRWYBGV0A6RBVS1NSP0', 'epic', '06FB0TNSRXX29H5X0EB0F0GBW4', 'Workshop: Control & Interaction Scheme', NULL, 'backlog', 'critical', NULL, NULL, 'D-053', '2026-02-13 21:05:22', '2026-06-12 10:23:03', NULL, '6cee19a63a5ba848bce561b550e60274', 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 ('06FB0TNSRWYBGV0A6RBVS1NSP0', 'epic', '06FB0TNSRXX29H5X0EB0F0GBW4', 'Workshop: Control & Interaction Scheme', 'Parked under Phase 5 epic per cascade refocus 2026-06-12; player control workshop runs when player work begins.', 'backlog', 'critical', NULL, NULL, 'D-053', '2026-02-13 21:05:22', '2026-06-12 10:23:03', NULL, '001e82e401ddfc49aa6d8731f8748d8a', 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 ('06FB0TNSRXTV61ZRF9RZ6V1NXR', 'story', '06FBPPMMF7HS6FWRYAKMECTXX0', 'Design discussion: insert data feeds — documenting feature systems and plumbing patterns', 'Broad design discussion to map out ALL the data feed systems the insert will eventually surface, identify common patterns, and design foundational plumbing that serves them all. This is bigger than the onboarding dossier — it is the insert as an information platform.
Participants: Tyre (architecture), Dudley (server), Stig (UI), Gestalt (systems design), Miri (worldbuilding what feeds exist in-setting), Ozzie (player experience what feels good to check)
The insert (D-065) is the player''s primary information device. It needs to surface a wide variety of data feeds that exist naturally in the setting. Map these out FIRST, then identify patterns, then design plumbing.
## Known and candidate feed types
**Documents/dossiers** static or semi-static authored content. Assignment briefs, personal notes, found documents, intercepted communications. Markdown body, variable injection, triggered delivery.
**Messaging/comms** NPC-to-player and overheard messages. Meridian messages, dead drops, intercepted transmissions. Threaded? Timed delivery? Read/unread state?
**News/ticker feeds** station news, sector bulletins, propaganda. Already have TickerPool (#591) for the bar how does this generalize to the insert? Weather/atmospheric feeds for planets (adds environmental flavor).
**Time systems** local station time, central Settled Reach time, planetary day-night cycles (varying rotation periods). How does the insert display multiple time references? Which are always visible vs on-demand?
**Maps** district layouts, marked locations, fog-of-war on map data. Progressive reveal as player explores.
**Logs/journal** auto-generated from observations? Player-annotated? Investigation notes the detective accumulates vs cargo manifests the smuggler tracks?
**Faction/relationship status** trust levels, known affiliations, reputation. How much is visible to the player vs hidden (D-012 information boundary)?
**Inventory/cargo** physical items, data chips, contraband manifests.
## Questions to resolve
1. What feed types exist in the Settled Reach setting? (Miri: what does a station worker/visitor actually have on their insert?)
2. Which feeds are universal vs archetype-specific? (Detective gets case files; smuggler gets network dead drops. Both get news and time.)
3. What are the common patterns across feeds? (Delivery trigger, persistence, read state, update frequency, rendering format)
4. Server-side: single generic "insert_feeds" collection in ObserverSnapshot vs typed fields? Delta updates vs full state?
5. Client-side: plugin/renderer architecture how does the insert UI dispatch feed types to renderers without hardcoding each one?
6. Persistence: session-persistent vs save-persistent vs ephemeral. Which feeds accumulate, which rotate, which expire?
7. Information boundary (D-012): feeds are perception-filtered. The insert only shows what the PC has access to. How does this interact with the observer snapshot?
8. Priority/notification: which feeds notify the player (new message!), which are passive (time ticks), which are urgent (warning)?
## Output
D-record (or major amendment to D-065) documenting:
- Catalog of insert feed types with properties
- Common envelope/interface pattern
- Serverclient data flow architecture
- Rendering dispatch pattern
- Persistence and lifecycle model
This is a design discussion, not implementation. Produce decisions and patterns that #600 and future insert work implement against.
## Refs
D-065 (insert UI), D-012 (information boundary), D-010 (determinism), Q-055', 'backlog', 'high', NULL, NULL, 'D-065,Q-055', '2026-03-05 10:28:30', '2026-06-12 10:23:03', NULL, 'cf5fb202dd6dff99f0d8d9e5170fc22e', 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 ('06FB0TNSRXTV61ZRF9RZ6V1NXR', 'story', '06FBPPMMF7HS6FWRYAKMECTXX0', 'Design discussion: insert data feeds — documenting feature systems and plumbing patterns', 'Broad design discussion to map out ALL the data feed systems the insert will eventually surface, identify common patterns, and design foundational plumbing that serves them all. This is bigger than the onboarding dossier — it is the insert as an information platform.
Participants: Tyre (architecture), Dudley (server), Stig (UI), Gestalt (systems design), Miri (worldbuilding what feeds exist in-setting), Ozzie (player experience what feels good to check)
The insert (D-065) is the player''s primary information device. It needs to surface a wide variety of data feeds that exist naturally in the setting. Map these out FIRST, then identify patterns, then design plumbing.
## Known and candidate feed types
**Documents/dossiers** static or semi-static authored content. Assignment briefs, personal notes, found documents, intercepted communications. Markdown body, variable injection, triggered delivery.
**Messaging/comms** NPC-to-player and overheard messages. Meridian messages, dead drops, intercepted transmissions. Threaded? Timed delivery? Read/unread state?
**News/ticker feeds** station news, sector bulletins, propaganda. Already have TickerPool (#591) for the bar how does this generalize to the insert? Weather/atmospheric feeds for planets (adds environmental flavor).
**Time systems** local station time, central Settled Reach time, planetary day-night cycles (varying rotation periods). How does the insert display multiple time references? Which are always visible vs on-demand?
**Maps** district layouts, marked locations, fog-of-war on map data. Progressive reveal as player explores.
**Logs/journal** auto-generated from observations? Player-annotated? Investigation notes the detective accumulates vs cargo manifests the smuggler tracks?
**Faction/relationship status** trust levels, known affiliations, reputation. How much is visible to the player vs hidden (D-012 information boundary)?
**Inventory/cargo** physical items, data chips, contraband manifests.
## Questions to resolve
1. What feed types exist in the Settled Reach setting? (Miri: what does a station worker/visitor actually have on their insert?)
2. Which feeds are universal vs archetype-specific? (Detective gets case files; smuggler gets network dead drops. Both get news and time.)
3. What are the common patterns across feeds? (Delivery trigger, persistence, read state, update frequency, rendering format)
4. Server-side: single generic "insert_feeds" collection in ObserverSnapshot vs typed fields? Delta updates vs full state?
5. Client-side: plugin/renderer architecture how does the insert UI dispatch feed types to renderers without hardcoding each one?
6. Persistence: session-persistent vs save-persistent vs ephemeral. Which feeds accumulate, which rotate, which expire?
7. Information boundary (D-012): feeds are perception-filtered. The insert only shows what the PC has access to. How does this interact with the observer snapshot?
8. Priority/notification: which feeds notify the player (new message!), which are passive (time ticks), which are urgent (warning)?
## Output
D-record (or major amendment to D-065) documenting:
- Catalog of insert feed types with properties
- Common envelope/interface pattern
- Serverclient data flow architecture
- Rendering dispatch pattern
- Persistence and lifecycle model
This is a design discussion, not implementation. Produce decisions and patterns that #600 and future insert work implement against.
## Refs
D-065 (insert UI), D-012 (information boundary), D-010 (determinism), Q-055
Parked in gameplay backlog per cascade refocus 2026-06-12; feed plumbing design resumes when gameplay systems exist to feed it.', 'backlog', 'high', NULL, NULL, 'D-065,Q-055', '2026-03-05 10:28:30', '2026-06-12 10:23:03', NULL, '19bcd44c46ca50f81b75d8e9e08e1353', 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 ('06FB0TNSRWJ60W2RFN2FQ2P3EW', 'epic', '06FBPPMMF7HS6FWRYAKMECTXX0', 'Generator Proof-of-Life', 'Sprint 25 spike: generator must produce usable output before anything else matters. Prove auto-generated locations at scale with legible characters. Template assembly (not procedural geography) for v0.2. See workshop decisions #1, #7, #22, #23. Estimated 7 sprints to proof-of-life playtest (generated location + legible characters + tycoon bookmark from creation to Day 3) — Tyre estimate.', 'backlog', 'critical', NULL, NULL, NULL, '2026-03-05 23:11:39', '2026-06-12 10:23:03', NULL, '5c2c3dc4e338bee268b571675061df7b', 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 ('06FB0TNSRWJ60W2RFN2FQ2P3EW', 'epic', '06FBPPMMF7HS6FWRYAKMECTXX0', 'Generator Proof-of-Life', 'Sprint 25 spike: generator must produce usable output before anything else matters. Prove auto-generated locations at scale with legible characters. Template assembly (not procedural geography) for v0.2. See workshop decisions #1, #7, #22, #23. Estimated 7 sprints to proof-of-life playtest (generated location + legible characters + tycoon bookmark from creation to Day 3) — Tyre estimate.
Parked in gameplay backlog per cascade refocus 2026-06-12; template-assembly generation superseded by the T-750 cascade proof-of-life playtest concept preserved.', 'backlog', 'critical', NULL, NULL, NULL, '2026-03-05 23:11:39', '2026-06-12 10:23:03', NULL, 'eb2c4463ff919778f8bdc5a76a8c2546', 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 ('06FB0TNSRXD5W32VCV5YZY3NX0', 'epic', '06FBPPMMF7HS6FWRYAKMECTXX0', 'Tycoon Bookmark', 'Tycoon is the v0.2 bookmark: small business owner, existing in the Krenn System. Zero investigation content. Tycoon = aspiration not starting state. Workshop decisions #4, #19, #20. Broad economic verb vocabulary serving all careers. Auto-generated apartment reflecting wealth + cultural context. CK3-style bookmark selection flow.', 'backlog', 'high', NULL, NULL, NULL, '2026-03-05 23:11:42', '2026-06-12 10:23:03', NULL, '1830a6e517710899abeb534c6445db64', 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 ('06FB0TNSRXD5W32VCV5YZY3NX0', 'epic', '06FBPPMMF7HS6FWRYAKMECTXX0', 'Tycoon Bookmark', 'Tycoon is the v0.2 bookmark: small business owner, existing in the Krenn System. Zero investigation content. Tycoon = aspiration not starting state. Workshop decisions #4, #19, #20. Broad economic verb vocabulary serving all careers. Auto-generated apartment reflecting wealth + cultural context. CK3-style bookmark selection flow.
Parked in gameplay backlog per cascade refocus 2026-06-12; bookmark concept preserved for post-cascade game-making.', 'backlog', 'high', NULL, NULL, NULL, '2026-03-05 23:11:42', '2026-06-12 10:23:03', NULL, '004369aee4878e3aa3d419f3f1bcd73e', 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 ('06FB0TNSRXE0VWDHVQTXPVPEW0', 'epic', '06FBPPMMF7HS6FWRYAKMECTXX0', 'Character Creation', 'CK3-style character creation: skills + bookmark selection. Full cosmetic customisation (hair, clothing, colours — workshop decision #11). Culture implicit in starting location (decision #16). No family/culture/religion sliders in creation — those are deferred. Decision #2.', 'backlog', 'high', NULL, NULL, NULL, '2026-03-05 23:11:48', '2026-06-12 10:23:03', NULL, 'a4c743376eeb5a1ba1cbed47deac12c1', 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 ('06FB0TNSRXE0VWDHVQTXPVPEW0', 'epic', '06FBPPMMF7HS6FWRYAKMECTXX0', 'Character Creation', 'CK3-style character creation: skills + bookmark selection. Full cosmetic customisation (hair, clothing, colours — workshop decision #11). Culture implicit in starting location (decision #16). No family/culture/religion sliders in creation — those are deferred. Decision #2.
Parked in gameplay backlog per cascade refocus 2026-06-12; bookmark-selection flow preserved cosmetic customisation tracked separately under Phase 5 (T-619).', 'backlog', 'high', NULL, NULL, NULL, '2026-03-05 23:11:48', '2026-06-12 10:23:03', NULL, '57f07a5f9d963bde7eccd2fddbef96dc', 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 ('06FB0TNSRZ65H50N3XJKJ3F5XM', 'epic', '06FBPPMMF7HS6FWRYAKMECTXX0', 'World Feel', 'The world is quietly responsive, not indifferent. Gradient of caring by social proximity — world doesn''t care globally but notices locally. Dual-scale consequence model: Rimworld sharp events (crises, reversals) + DF slow accumulation (reputation, debt, relationship erosion). Setting delivery via both visual and insert layers in parallel. Workshop decisions #10, #12, #13, #21.', 'backlog', 'high', NULL, NULL, NULL, '2026-03-05 23:11:59', '2026-06-12 10:23:03', NULL, '8d6818d100f2017e9bf2cb033291fa53', 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 ('06FB0TNSRZ65H50N3XJKJ3F5XM', 'epic', '06FBPPMMF7HS6FWRYAKMECTXX0', 'World Feel', 'The world is quietly responsive, not indifferent. Gradient of caring by social proximity — world doesn''t care globally but notices locally. Dual-scale consequence model: Rimworld sharp events (crises, reversals) + DF slow accumulation (reputation, debt, relationship erosion). Setting delivery via both visual and insert layers in parallel. Workshop decisions #10, #12, #13, #21.
Parked in gameplay backlog per cascade refocus 2026-06-12; world-feel decisions preserved for post-cascade game-making.', 'backlog', 'high', NULL, NULL, NULL, '2026-03-05 23:11:59', '2026-06-12 10:23:03', NULL, '7271e54ba535dfdedd73d4f22a058a5a', 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 ('06FB0TNSRZHHSBPQS9VB8S7D5M', 'story', '06FB0TNSRXX29H5X0EB0F0GBW4', 'Full character customisation', 'Cosmetic customisation: hair, clothing, colours. Decision #11. Separate from skills/bookmark — aesthetic only. Question open: do creation choices trace into the generated apartment? (Q-WTF-040).', 'backlog', 'high', NULL, 'client', NULL, '2026-03-05 23:12:52', '2026-06-12 10:23:03', NULL, 'fe1f1ccdd1755cde45c229df7fc25a77', 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 ('06FB0TNSRZHHSBPQS9VB8S7D5M', 'story', '06FB0TNSRXX29H5X0EB0F0GBW4', 'Full character customisation', 'Cosmetic customisation: hair, clothing, colours. Decision #11. Separate from skills/bookmark — aesthetic only. Question open: do creation choices trace into the generated apartment? (Q-WTF-040).
Parked under Phase 5 epic per cascade refocus 2026-06-12; character-visuals customisation resumes with player rendering (overlaps T-694).', 'backlog', 'high', NULL, 'client', NULL, '2026-03-05 23:12:52', '2026-06-12 10:23:03', NULL, '5781aff24e5ef5f6789a1d7ae171bc40', 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 ('06FB0TNSRZBZHXAK3DYTK1C19R', 'story', '06FB0TNSRZGGNZMAP8GDMXSCMW', 'Relationship formation system', 'NPC-to-NPC and NPC-to-player relationships form through: Sims-style direct interaction + Rimworld-style shared adversity. Decision #17. Relationships must be readable from the outside. Codify for systems. Decision #18: prove relationships readable before layering narrative depth.', 'backlog', 'high', NULL, 'server', NULL, '2026-03-05 23:13:08', '2026-06-12 10:23:03', NULL, '675b52e99220f082d111cec3d9ddbf5f', 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 ('06FB0TNSRZBZHXAK3DYTK1C19R', 'story', '06FB0TNSRZGGNZMAP8GDMXSCMW', 'Relationship formation system', 'NPC-to-NPC and NPC-to-player relationships form through: Sims-style direct interaction + Rimworld-style shared adversity. Decision #17. Relationships must be readable from the outside. Codify for systems. Decision #18: prove relationships readable before layering narrative depth.
Parked under Phase 6 epic per cascade refocus 2026-06-12 (previous parent T-607 cancelled); relationship-formation requirement preserved for the NPC layer.', 'backlog', 'high', NULL, 'server', NULL, '2026-03-05 23:13:08', '2026-06-12 10:23:03', NULL, '5b91cc368402eedd0da8f5e0e245474b', 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 ('06FB0TNSRXK4NDX3Y242QK7BC8', 'story', '06FB0TNSRZGGNZMAP8GDMXSCMW', 'Quietly responsive world', 'The world notices locally but doesn''t care globally. Gradient of caring based on social proximity. Decision #10. Primary social contacts develop responsiveness over time. Indifferent world is wrong — quietly responsive world is right. Implementation: proximity-weighted NPC attention and reaction systems.', 'backlog', 'high', NULL, 'server', NULL, '2026-03-05 23:13:22', '2026-06-12 10:23:03', NULL, 'be5e2012a0ee6dd1a07398ec2d1b261d', 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 ('06FB0TNSRXK4NDX3Y242QK7BC8', 'story', '06FB0TNSRZGGNZMAP8GDMXSCMW', 'Quietly responsive world', 'The world notices locally but doesn''t care globally. Gradient of caring based on social proximity. Decision #10. Primary social contacts develop responsiveness over time. Indifferent world is wrong — quietly responsive world is right. Implementation: proximity-weighted NPC attention and reaction systems.
Parked under Phase 6 epic per cascade refocus 2026-06-12; quietly-responsive-world requirement preserved for the NPC layer.', 'backlog', 'high', NULL, 'server', NULL, '2026-03-05 23:13:22', '2026-06-12 10:23:03', NULL, 'fd6c2a9e3e2b1ca57462596be2ff799a', 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 ('06FB0TNSRXJDMPQNP05JFD2P6G', 'story', '06FBPPMZNNEV052DBYYY3A897C', 'Voice pipeline: GPU acceleration (ROCm/Vulkan)', 'sr-voice has cargo features for rocm/vulkan/cuda/metal but builds CPU-only (~13 t/s). Enable after code stable. GPU would reach 50+ t/s. LIBCLANG_PATH already in Makefile.', 'backlog', 'low', NULL, 'server', NULL, '2026-03-07 18:19:29', '2026-06-12 10:23:03', NULL, '1904c59cef77c9a6db8bb047f9a8ada7', 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 ('06FB0TNSRXJDMPQNP05JFD2P6G', 'story', '06FBPPMZNNEV052DBYYY3A897C', 'Voice pipeline: GPU acceleration (ROCm/Vulkan)', 'sr-voice has cargo features for rocm/vulkan/cuda/metal but builds CPU-only (~13 t/s). Enable after code stable. GPU would reach 50+ t/s. LIBCLANG_PATH already in Makefile.
Re-homed under maintenance per cascade refocus 2026-06-12; GPU build-feature enablement is infra hygiene on the existing voice pipeline.', 'backlog', 'low', NULL, 'server', NULL, '2026-03-07 18:19:29', '2026-06-12 10:23:03', NULL, '169b8c3c22eeba4ed8e0dbf1042364bc', 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 ('06FB0TNSRW36DF5F95406ETRGR', 'story', '06FBPPMZNNEV052DBYYY3A897C', 'Server: extract platform abstraction module when second consumer appears', 'Trigger ticket: when any server module beyond voice/hardware.rs needs OS-dependent info (CPU, memory, battery, GPU), extract shared platform queries into server/src/platform.rs. Currently all OS detection lives in server/src/voice/hardware.rs (sysinfo crate, on_battery(), VRAM probes, available_parallelism). Single consumer, no duplication — no action needed until a second consumer appears. Trigger conditions: (1) a second system needs CPU/memory info independently of voice pipeline, (2) battery detection needed outside voice scaling (e.g. tick rate throttling), (3) server exposes system info over IPC (multiplayer diagnostics). Extraction is ~30 minutes: pull on_battery(), probe_current_free(), sysinfo calls into platform.rs, leave voice-specific scaling logic in hardware.rs.', 'backlog', 'low', NULL, 'server', NULL, '2026-03-13 09:49:07', '2026-06-12 10:23:03', NULL, 'd2f3dc06ebad5f9c538aa09653b33812', 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 ('06FB0TNSRW36DF5F95406ETRGR', 'story', '06FBPPMZNNEV052DBYYY3A897C', 'Server: extract platform abstraction module when second consumer appears', 'Trigger ticket: when any server module beyond voice/hardware.rs needs OS-dependent info (CPU, memory, battery, GPU), extract shared platform queries into server/src/platform.rs. Currently all OS detection lives in server/src/voice/hardware.rs (sysinfo crate, on_battery(), VRAM probes, available_parallelism). Single consumer, no duplication — no action needed until a second consumer appears. Trigger conditions: (1) a second system needs CPU/memory info independently of voice pipeline, (2) battery detection needed outside voice scaling (e.g. tick rate throttling), (3) server exposes system info over IPC (multiplayer diagnostics). Extraction is ~30 minutes: pull on_battery(), probe_current_free(), sysinfo calls into platform.rs, leave voice-specific scaling logic in hardware.rs.
Re-homed under maintenance per cascade refocus 2026-06-12; trigger conditions unchanged.', 'backlog', 'low', NULL, 'server', NULL, '2026-03-13 09:49:07', '2026-06-12 10:23:03', NULL, '7aa6eca7e7350f0992f285fa7325786a', 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 ('06FB0TNSRY4CMF4W57DCQASQNW', 'task', '06FBPPMZNNEV052DBYYY3A897C', 'Mid-sprint ticket creation protocol for team agents', 'When team agents discover new work during a sprint (like #661 zone-type templates in Sprint 26), they should message the lead immediately for retroactive ticket creation rather than just doing the work uncaptured. Document this in the sprint-start skill agent spawn prompt and/or team-patterns.md.', 'backlog', 'low', NULL, 'meta', NULL, '2026-03-13 11:37:34', '2026-06-12 10:23:03', NULL, 'a40b8568dfffec237478189f140ba8a9', 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 ('06FB0TNSRY4CMF4W57DCQASQNW', 'task', '06FBPPMZNNEV052DBYYY3A897C', 'Mid-sprint ticket creation protocol for team agents', 'When team agents discover new work during a sprint (like #661 zone-type templates in Sprint 26), they should message the lead immediately for retroactive ticket creation rather than just doing the work uncaptured. Document this in the sprint-start skill agent spawn prompt and/or team-patterns.md.
Re-homed under maintenance per cascade refocus 2026-06-12; recast sprint protocol for kanban/batch mode functional requirement preserved.', 'backlog', 'low', NULL, 'meta', NULL, '2026-03-13 11:37:34', '2026-06-12 10:23:03', NULL, '9f08d77f1d757206ac431d91820a63b8', 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 ('06FB0TNSRX1PW1RXYRBNRHVNYW', 'story', '06FBPPMMF7HS6FWRYAKMECTXX0', 'Gate network travel planner — interactive route-finding overlay on the star map insert, showing hop paths between systems with transit time estimates and corridor information', NULL, 'backlog', 'medium', NULL, 'client', NULL, '2026-03-15 10:20:07', '2026-06-12 10:23:03', NULL, 'd5ed14ff7a71cd5357bd3cf8b127d639', 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 ('06FB0TNSRX1PW1RXYRBNRHVNYW', 'story', '06FBPPMMF7HS6FWRYAKMECTXX0', 'Gate network travel planner — interactive route-finding overlay on the star map insert, showing hop paths between systems with transit time estimates and corridor information', 'Parked in gameplay backlog per cascade refocus 2026-06-12; star-map travel planner preserved for when in-game travel exists.', 'backlog', 'medium', NULL, 'client', NULL, '2026-03-15 10:20:07', '2026-06-12 10:23:03', NULL, '29e604f79ca25dbe8ce14536932429c1', 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 ('06FB0TNSRZDYCH1YRQNVN0B2FC', 'story', '06FB0TNSRZGGNZMAP8GDMXSCMW', 'Apartment generator logic (server)', 'Server implementation: apartment generator takes economic position (from #615 tycoon starting state) + cultural context (from #679 location-to-culture resolution) + aesthetic taste trait. Produces apartment tile layout, furniture placement, and item set. Decision D-136 (First Settled Reach moment: apartment + insert activation). Decision D-137 (generator: structural and cosmetic variety). Blocked by: #615 (tycoon starting state), #679 (culture resolution).', 'backlog', 'high', NULL, 'server', NULL, '2026-03-17 07:06:30', '2026-06-12 10:23:03', NULL, '7c945106cab77d0f2acf1814f95c4bca', 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 ('06FB0TNSRZDYCH1YRQNVN0B2FC', 'story', '06FB0TNSRZGGNZMAP8GDMXSCMW', 'Apartment generator logic (server)', 'Server implementation: apartment generator takes economic position (from #615 tycoon starting state) + cultural context (from #679 location-to-culture resolution) + aesthetic taste trait. Produces apartment tile layout, furniture placement, and item set. Decision D-136 (First Settled Reach moment: apartment + insert activation). Decision D-137 (generator: structural and cosmetic variety). Blocked by: #615 (tycoon starting state), #679 (culture resolution).
Parked under Phase 6 epic per cascade refocus 2026-06-12; interior/furniture generation is room-level detail pairs with T-682 (parked gameplay).', 'backlog', 'high', NULL, 'server', NULL, '2026-03-17 07:06:30', '2026-06-12 10:23:03', NULL, '47edbff461c36e23bbfdaf07a48c8cad', 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 ('06FB0TNSRYXPA202KSKKJ15KZ8', 'story', '06FB0TNSRXX29H5X0EB0F0GBW4', 'Character creation screen', 'Full character creation UI using the game UI kit and widget system — not a debug/test wrapper. This is the production character creation screen that players use at game start.
Built on the 3D CharacterVisual compositor (#693). Uses the same UI kit, widgets, and interaction patterns as the rest of the game UI.
Features:
- Body type selector (11 types)
- Head template browser (curated library)
- Hair, facial hair, eyebrow pickers with preview
- Skin tone selector (9-tone palette)
- Clothing and accessory slots
- Color customization per recolorable region
- Live 3D preview with camera orbit (frontal default per D-158, full rotation per D-155)
- Keyboard navigation (tab/arrow/enter/esc)
- Randomize button
- Standalone scene entry point (can be launched independently for artist review)
- Feeds CharacterVisualDescriptor into new game flow on confirm
Decisions: D-134 (full customization), D-146 (tile-scale heavy zoom preview), D-155 (editor rotation), D-158 (frontal camera default)
Blocked by: #693 (compositor)', 'backlog', 'high', NULL, 'client', NULL, '2026-03-17 08:21:47', '2026-06-12 10:23:03', NULL, 'ed3c0ae9f3ab466ad63d40c3192d644e', 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 ('06FB0TNSRYXPA202KSKKJ15KZ8', 'story', '06FB0TNSRXX29H5X0EB0F0GBW4', 'Character creation screen', 'Full character creation UI using the game UI kit and widget system — not a debug/test wrapper. This is the production character creation screen that players use at game start.
Built on the 3D CharacterVisual compositor (#693). Uses the same UI kit, widgets, and interaction patterns as the rest of the game UI.
Features:
- Body type selector (11 types)
- Head template browser (curated library)
- Hair, facial hair, eyebrow pickers with preview
- Skin tone selector (9-tone palette)
- Clothing and accessory slots
- Color customization per recolorable region
- Live 3D preview with camera orbit (frontal default per D-158, full rotation per D-155)
- Keyboard navigation (tab/arrow/enter/esc)
- Randomize button
- Standalone scene entry point (can be launched independently for artist review)
- Feeds CharacterVisualDescriptor into new game flow on confirm
Decisions: D-134 (full customization), D-146 (tile-scale heavy zoom preview), D-155 (editor rotation), D-158 (frontal camera default)
Blocked by: #693 (compositor)
Parked under Phase 5 epic per cascade refocus 2026-06-12; creation screen ships with player control and character rendering.', 'backlog', 'high', NULL, 'client', NULL, '2026-03-17 08:21:47', '2026-06-12 10:23:03', NULL, '687fce3729c26231a6d9635dfcbfc6ca', 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 ('06FB0TNSRWQEZ7D8AX2PRS2FWM', 'task', '06FB0TNSRXX29H5X0EB0F0GBW4', 'LOD crowd rendering research — performance-driven strategy for 400+ characters', 'Research and prototype LOD strategy for 400+ simultaneous characters on screen (crowd scenes, protests, battles).\n\nCurrent budget: 80 NPCs at full detail. This ticket defines the path to 400+.\n\nKey constraints from workshop:\n- LOD degradation is performance-driven, NOT distance/count threshold\n- Degradation is proactive (triggers on PROJECTED viewport character count, not measured frame drop — reactive causes hitching)\n- Progressive from player outward: furthest degrade first (full mesh -> simplified mesh -> billboard)\n- When paused: restore full detail on all characters\n- At billboard tier: body size tier and dominant clothing color must remain visually distinct\n- Outline baked into impostor sprite at billboard tier\n\nDeliverable: technical spec + prototype result. Does not produce shippable code.\n\nNot in Sprint 28 — backlog for when crowd-scale systems begin.', 'backlog', 'medium', NULL, 'client', NULL, '2026-03-17 17:48:12', '2026-06-12 10:23:03', NULL, 'c569b5b1c7c5896c9d0678c8efa405d3', 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 ('06FB0TNSRWQEZ7D8AX2PRS2FWM', 'task', '06FB0TNSRXX29H5X0EB0F0GBW4', 'LOD crowd rendering research — performance-driven strategy for 400+ characters', 'Research and prototype LOD strategy for 400+ simultaneous characters on screen (crowd scenes, protests, battles).\n\nCurrent budget: 80 NPCs at full detail. This ticket defines the path to 400+.\n\nKey constraints from workshop:\n- LOD degradation is performance-driven, NOT distance/count threshold\n- Degradation is proactive (triggers on PROJECTED viewport character count, not measured frame drop — reactive causes hitching)\n- Progressive from player outward: furthest degrade first (full mesh -> simplified mesh -> billboard)\n- When paused: restore full detail on all characters\n- At billboard tier: body size tier and dominant clothing color must remain visually distinct\n- Outline baked into impostor sprite at billboard tier\n\nDeliverable: technical spec + prototype result. Does not produce shippable code.\n\nNot in Sprint 28 — backlog for when crowd-scale systems begin.
Parked under Phase 5 epic per cascade refocus 2026-06-12; crowd-rendering research resumes with in-world rendering work.', 'backlog', 'medium', NULL, 'client', NULL, '2026-03-17 17:48:12', '2026-06-12 10:23:03', NULL, '68e3c19b17316e74a3a77812bd20f63e', 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 ('06FB0TNSRY6TPACQSYVFGDEMPR', 'story', '06FB0TNSRXX29H5X0EB0F0GBW4', 'Scar overlay system — per-segment scar meshes or textures', 'Visual overlay system for scars on character bodies. Scars are per-segment (leveraging the 18-segment body architecture for placement). Each scar is a visual modification to a specific body segment — either a decal/texture overlay or a small mesh overlay attached to the segment. Requirements: scars placed per body segment, multiple scars per character, persist across clothing changes (visible on exposed segments), hidden under clothing via coverage system, recolorable via toon shader for skin tone matching. Depends on compositor (#704) and body segments (#707) — both done. Architecture uses per-segment addressability from D-160.', 'backlog', 'medium', NULL, 'visual', NULL, '2026-03-22 14:30:36', '2026-06-12 10:23:03', NULL, '9adb71b9124bbc8c9db1ebe65acfbe61', 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 ('06FB0TNSRY6TPACQSYVFGDEMPR', 'story', '06FB0TNSRXX29H5X0EB0F0GBW4', 'Scar overlay system — per-segment scar meshes or textures', 'Visual overlay system for scars on character bodies. Scars are per-segment (leveraging the 18-segment body architecture for placement). Each scar is a visual modification to a specific body segment — either a decal/texture overlay or a small mesh overlay attached to the segment. Requirements: scars placed per body segment, multiple scars per character, persist across clothing changes (visible on exposed segments), hidden under clothing via coverage system, recolorable via toon shader for skin tone matching. Depends on compositor (#704) and body segments (#707) — both done. Architecture uses per-segment addressability from D-160.
Parked under Phase 5 epic per cascade refocus 2026-06-12; character-visuals leftover preserved.', 'backlog', 'medium', NULL, 'visual', NULL, '2026-03-22 14:30:36', '2026-06-12 10:23:03', NULL, '4645267811b9c4979915f196f771d988', 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 ('06FB0TNSRWS9B34T2HPJCYMGK0', 'story', '06FB0TNSRXX29H5X0EB0F0GBW4', 'Tattoo overlay system — per-segment tattoo textures', 'Visual overlay system for tattoos on character bodies. Tattoos are per-segment texture overlays with their own recolor masks for ink color variation. Requirements: tattoos placed per body segment, multiple tattoos per character, persist across clothing changes (visible on exposed segments), hidden under clothing via coverage system, recolorable via multi-region mask for multi-color tattoos. May share implementation approach with scar system (#715). Architecture uses per-segment addressability from D-160.', 'backlog', 'medium', NULL, 'visual', NULL, '2026-03-22 14:30:42', '2026-06-12 10:23:03', NULL, 'ae7e0e08a8627d75a9949bb4ce978001', 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 ('06FB0TNSRWS9B34T2HPJCYMGK0', 'story', '06FB0TNSRXX29H5X0EB0F0GBW4', 'Tattoo overlay system — per-segment tattoo textures', 'Visual overlay system for tattoos on character bodies. Tattoos are per-segment texture overlays with their own recolor masks for ink color variation. Requirements: tattoos placed per body segment, multiple tattoos per character, persist across clothing changes (visible on exposed segments), hidden under clothing via coverage system, recolorable via multi-region mask for multi-color tattoos. May share implementation approach with scar system (#715). Architecture uses per-segment addressability from D-160.
Parked under Phase 5 epic per cascade refocus 2026-06-12; character-visuals leftover preserved.', 'backlog', 'medium', NULL, 'visual', NULL, '2026-03-22 14:30:42', '2026-06-12 10:23:03', NULL, '16d146e23b58cc8467f6e0ca59151343', 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 ('06FB0TNSRWEDR71D90K594P7DG', 'story', '06FB0TNSRXX29H5X0EB0F0GBW4', 'Visible injury overlay system — per-segment injury visualization', 'Visual overlay system for injuries on character bodies. Injuries are per-segment visual states showing damage (bruises, cuts, burns) and healing progression. Requirements: injuries placed per body segment, severity/type affects visual appearance, healing progression over time changes the overlay, hidden under clothing via coverage system, interacts with amputation system (injury on a removed limb is moot). Depends on compositor (#704) and body segments (#707) — both done. Architecture uses per-segment addressability from D-160 and limb removal capability.', 'backlog', 'medium', NULL, 'visual', NULL, '2026-03-22 14:30:49', '2026-06-12 10:23:03', NULL, 'acf72109f46ac3786b587751e34a7133', 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 ('06FB0TNSRWEDR71D90K594P7DG', 'story', '06FB0TNSRXX29H5X0EB0F0GBW4', 'Visible injury overlay system — per-segment injury visualization', 'Visual overlay system for injuries on character bodies. Injuries are per-segment visual states showing damage (bruises, cuts, burns) and healing progression. Requirements: injuries placed per body segment, severity/type affects visual appearance, healing progression over time changes the overlay, hidden under clothing via coverage system, interacts with amputation system (injury on a removed limb is moot). Depends on compositor (#704) and body segments (#707) — both done. Architecture uses per-segment addressability from D-160 and limb removal capability.
Parked under Phase 5 epic per cascade refocus 2026-06-12; character-visuals leftover preserved.', 'backlog', 'medium', NULL, 'visual', NULL, '2026-03-22 14:30:49', '2026-06-12 10:23:03', NULL, '66e1c70cdf25354a92e8952bf92c32c2', 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 ('06FB0TNSRY5J5AWB356FT9WK0M', 'story', '06FB0TNSRXX29H5X0EB0F0GBW4', 'Accessory slot filtering — _get_accessory_ids_for_slot() ignores slot param', '_get_accessory_ids_for_slot(slot) accepts a slot parameter but returns all accessories unfiltered. Every accessory slot shows the full catalogue. Should filter by slot-appropriate prefix (hat_*, goggles_*, etc.) matching the clothing tab''s approach. Currently invisible with placeholder assets but will be wrong when real accessories are added.', 'backlog', 'low', 'client', NULL, NULL, '2026-03-22 16:33:07', '2026-06-12 10:23:03', NULL, 'e248cf9c02444e3ce27dcb5666040d3e', 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 ('06FB0TNSRY5J5AWB356FT9WK0M', 'story', '06FB0TNSRXX29H5X0EB0F0GBW4', 'Accessory slot filtering — _get_accessory_ids_for_slot() ignores slot param', '_get_accessory_ids_for_slot(slot) accepts a slot parameter but returns all accessories unfiltered. Every accessory slot shows the full catalogue. Should filter by slot-appropriate prefix (hat_*, goggles_*, etc.) matching the clothing tab''s approach. Currently invisible with placeholder assets but will be wrong when real accessories are added.
Parked under Phase 5 epic per cascade refocus 2026-06-12; latent creation-UI bug fixed alongside character-visuals leftovers.', 'backlog', 'low', 'client', NULL, NULL, '2026-03-22 16:33:07', '2026-06-12 10:23:03', NULL, 'b8b7a3fb5061192a31f267b490569b39', 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 ('06FB0TNSRYS8J5T5CV3EKNPJMR', 'task', '06FB0TNSRXX29H5X0EB0F0GBW4', 'Adopt auto-sizing label pattern for dynamic text', 'Evaluate GodotFontAutoSizeLabels (https://github.com/LuisEscorza/GodotFontAutoSizeLabels) for handling text that must fit a fixed container. We will hit this with: NPC name labels, item names in grids, clothing/hair button labels, dialogue boxes, any server-generated text rendered in fixed UI elements. Adopt the pattern early (either this plugin or our own implementation) before overflow bugs accumulate.', 'backlog', 'low', NULL, 'client', NULL, '2026-03-23 17:42:32', '2026-06-12 10:23:03', NULL, '951b59ccff83e6b34252e3a5b4d750b5', 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 ('06FB0TNSRYS8J5T5CV3EKNPJMR', 'task', '06FB0TNSRXX29H5X0EB0F0GBW4', 'Adopt auto-sizing label pattern for dynamic text', 'Evaluate GodotFontAutoSizeLabels (https://github.com/LuisEscorza/GodotFontAutoSizeLabels) for handling text that must fit a fixed container. We will hit this with: NPC name labels, item names in grids, clothing/hair button labels, dialogue boxes, any server-generated text rendered in fixed UI elements. Adopt the pattern early (either this plugin or our own implementation) before overflow bugs accumulate.
Parked under Phase 5 epic per cascade refocus 2026-06-12; adopt the pattern when gameplay UI surfaces are built.', 'backlog', 'low', NULL, 'client', NULL, '2026-03-23 17:42:32', '2026-06-12 10:23:03', NULL, 'a0fb59fc7e5fb140cc7377d2b3d0f8cd', 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 ('06FB0TNSRXJ3WZ2AQMWBNB4D2W', 'task', '06FB0TNSRXX29H5X0EB0F0GBW4', 'Install Godot Icons Fonts addon for UI development', 'Godot Icons Fonts (https://github.com/rakugoteam/Godot-Icons-Fonts) — searchable icon font library (FontAwesome, Material Icons, etc.) directly in the Godot editor. MIT. Saves time hunting for individual icon assets during UI development. Install from asset library. Use for: HUD icons, status indicators, navigation symbols, button icons, inventory categories.', 'backlog', 'low', NULL, 'client', NULL, '2026-03-23 18:19:22', '2026-06-12 10:23:03', NULL, '52acb96e3d678b612814b021d7f2a1a8', 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 ('06FB0TNSRXJ3WZ2AQMWBNB4D2W', 'task', '06FB0TNSRXX29H5X0EB0F0GBW4', 'Install Godot Icons Fonts addon for UI development', 'Godot Icons Fonts (https://github.com/rakugoteam/Godot-Icons-Fonts) — searchable icon font library (FontAwesome, Material Icons, etc.) directly in the Godot editor. MIT. Saves time hunting for individual icon assets during UI development. Install from asset library. Use for: HUD icons, status indicators, navigation symbols, button icons, inventory categories.
Parked under Phase 5 epic per cascade refocus 2026-06-12; install when HUD/gameplay UI development resumes.', 'backlog', 'low', NULL, 'client', NULL, '2026-03-23 18:19:22', '2026-06-12 10:23:03', NULL, '3b8b8c17b1d6894cfc7f2551109d4682', 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 ('06FB0TNSRYKBBN824V9KB9NEN0', 'task', '06FB0TNSRXX29H5X0EB0F0GBW4', 'Add resolution parameter to screenshot test config', 'Extend the character creator screenshot test config JSON with a resolution field. The system sets viewport size before capturing, enabling automated visual regression across common resolutions (1080p, 1440p, 4K, ultrawide, Steam Deck 800p). Batch script iterates the manifest body types × resolutions for full coverage. No plugin needed — just OS.window_size or viewport size override. Inspired by Project Resolution plugin (https://github.com/Danim3D/Godot-4-Plugin-Project-Resolution) but built into our existing test infrastructure.', 'backlog', 'medium', NULL, 'client', NULL, '2026-03-23 18:27:51', '2026-06-12 10:23:03', NULL, 'aecb1b1d6a5491ce4705a0ec2454d853', 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 ('06FB0TNSRYKBBN824V9KB9NEN0', 'task', '06FB0TNSRXX29H5X0EB0F0GBW4', 'Add resolution parameter to screenshot test config', 'Extend the character creator screenshot test config JSON with a resolution field. The system sets viewport size before capturing, enabling automated visual regression across common resolutions (1080p, 1440p, 4K, ultrawide, Steam Deck 800p). Batch script iterates the manifest body types × resolutions for full coverage. No plugin needed — just OS.window_size or viewport size override. Inspired by Project Resolution plugin (https://github.com/Danim3D/Godot-4-Plugin-Project-Resolution) but built into our existing test infrastructure.
Parked under Phase 5 epic per cascade refocus 2026-06-12; functional requirement (multi-resolution visual regression) preserved resumes with character rendering work.', 'backlog', 'medium', NULL, 'client', NULL, '2026-03-23 18:27:51', '2026-06-12 10:23:03', NULL, 'e8f991a475031b43cd083b4a1b1c995a', 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 ('06FB0TNSRZGD6VYZM7BT6PC5WM', 'task', '06FBPPMMF7HS6FWRYAKMECTXX0', 'First-launch install wizard for distribution', 'Evaluate Godot4xInstallWizard (https://github.com/untamedlabs/Godot4xInstallWizard) for first-launch experience: EULA acceptance, initial settings (resolution, audio, controls), install path selection. Needed when packaging for Steam or standalone distribution. Low priority until release preparation begins.', 'backlog', 'low', NULL, 'client', NULL, '2026-03-23 18:31:35', '2026-06-12 10:23:03', NULL, '04bc75bb1b687c91751a9d7292536a12', 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 ('06FB0TNSRZGD6VYZM7BT6PC5WM', 'task', '06FBPPMMF7HS6FWRYAKMECTXX0', 'First-launch install wizard for distribution', 'Evaluate Godot4xInstallWizard (https://github.com/untamedlabs/Godot4xInstallWizard) for first-launch experience: EULA acceptance, initial settings (resolution, audio, controls), install path selection. Needed when packaging for Steam or standalone distribution. Low priority until release preparation begins.
Parked under post-cascade gameplay/release backlog per cascade refocus 2026-06-12; functional requirement preserved for release preparation.', 'backlog', 'low', NULL, 'client', NULL, '2026-03-23 18:31:35', '2026-06-12 10:23:03', NULL, 'fbaf3da1d89d8b99e87bcf7f3a44fc55', 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 ('06FB0TNSRXBTTPTBFJN0DGX2YC', 'task', '06FBPPMMF7HS6FWRYAKMECTXX0', 'License and attribution screen in settings menu', 'Add a licenses/credits screen accessible from the main menu settings. Must display all third-party licenses: Quaternius (CC0), Godot engine, any adopted plugins (MIT), font licenses, audio assets. Pattern reference: godot-licensing (https://github.com/nathanfranke/godot-licensing) — auto-collects license info. We don''t need the plugin but need the pattern: scan for LICENSE files, Godot''s built-in Engine.get_license_info(), and our own attribution list. Legal requirement for distribution.', 'backlog', 'medium', NULL, 'client', NULL, '2026-03-23 18:33:04', '2026-06-12 10:23:03', NULL, '2bd2d6790d3004cb8f03393af5ddaf99', 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 ('06FB0TNSRXBTTPTBFJN0DGX2YC', 'task', '06FBPPMMF7HS6FWRYAKMECTXX0', 'License and attribution screen in settings menu', 'Add a licenses/credits screen accessible from the main menu settings. Must display all third-party licenses: Quaternius (CC0), Godot engine, any adopted plugins (MIT), font licenses, audio assets. Pattern reference: godot-licensing (https://github.com/nathanfranke/godot-licensing) — auto-collects license info. We don''t need the plugin but need the pattern: scan for LICENSE files, Godot''s built-in Engine.get_license_info(), and our own attribution list. Legal requirement for distribution.
Parked under post-cascade gameplay/release backlog per cascade refocus 2026-06-12; legal attribution requirement preserved for release preparation.', 'backlog', 'medium', NULL, 'client', NULL, '2026-03-23 18:33:04', '2026-06-12 10:23:03', NULL, '3206a8cd8f6a79b0ce11f22da0e96e4d', 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 ('06FB0TNSRY35YGQ1PGBXE4B7KM', 'task', '06FBPPMMF7HS6FWRYAKMECTXX0', 'Konami code easter egg', 'Up up down down left right left right B A. Because reasons. https://github.com/aravikusu/konamicode — reference implementation. Trigger: unlock debug panel in release builds, or something fun.', 'backlog', 'low', NULL, 'client', NULL, '2026-03-23 18:38:37', '2026-06-12 10:23:04', NULL, 'f0543594e7aa617efff4d564ca41e7cc', 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 ('06FB0TNSRY35YGQ1PGBXE4B7KM', 'task', '06FBPPMMF7HS6FWRYAKMECTXX0', 'Konami code easter egg', 'Up up down down left right left right B A. Because reasons. https://github.com/aravikusu/konamicode — reference implementation. Trigger: unlock debug panel in release builds, or something fun.
Parked under post-cascade gameplay backlog per cascade refocus 2026-06-12; preserved, not cancelled.', 'backlog', 'low', NULL, 'client', NULL, '2026-03-23 18:38:37', '2026-06-12 10:23:04', NULL, 'fd91252b7ed5cbd0204a4d9b1cfa0a1e', 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 ('06FB0TNSRWJAKQQ33BNCFZGV3W', 'task', '06FB0TNSRXX29H5X0EB0F0GBW4', 'Minimap rendering from server exploration data', 'The minimap needs to render from server-sent exploration and visibility data. No existing Godot minimap plugin fits because our information boundary is server-authoritative. Architecture: server sends explored tile states (unexplored/explored/visible) as part of ObserverSnapshot. Client renders a top-down 2D minimap from this data — fog for unexplored, dim for explored-not-visible, lit for currently visible. Player position centered. Needs a dedicated data stream or section in the snapshot for minimap tile states. Reference: the existing 2D fog_state.gd has the rendering patterns (texture from tile data), but the 3D minimap may use a separate overhead Camera3D in a SubViewport instead.', 'backlog', 'medium', NULL, 'client', NULL, '2026-03-23 18:48:16', '2026-06-12 10:23:04', NULL, '03a0cee44b63f54f36f1298d30b696d2', 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 ('06FB0TNSRWJAKQQ33BNCFZGV3W', 'task', '06FB0TNSRXX29H5X0EB0F0GBW4', 'Minimap rendering from server exploration data', 'The minimap needs to render from server-sent exploration and visibility data. No existing Godot minimap plugin fits because our information boundary is server-authoritative. Architecture: server sends explored tile states (unexplored/explored/visible) as part of ObserverSnapshot. Client renders a top-down 2D minimap from this data — fog for unexplored, dim for explored-not-visible, lit for currently visible. Player position centered. Needs a dedicated data stream or section in the snapshot for minimap tile states. Reference: the existing 2D fog_state.gd has the rendering patterns (texture from tile data), but the 3D minimap may use a separate overhead Camera3D in a SubViewport instead.
Parked under Phase 5 epic per cascade refocus 2026-06-12; server-authoritative minimap requirement preserved resumes with player rendering.', 'backlog', 'medium', NULL, 'client', NULL, '2026-03-23 18:48:16', '2026-06-12 10:23:04', NULL, 'f4e0d43c19fa89cdf89e91357498bfe5', 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 ('06FB0TNSRXGNK7WHD9DEGPY4BC', 'task', '06FB0TNSRXX29H5X0EB0F0GBW4', 'Nested tooltip system for information layering', 'Implement nested/recursive tooltips for the information-dense UI. Reference: Nested-Tooltips (https://github.com/duzychri/Nested-Tooltips). Pattern: hover over text → tooltip appears → hover over a keyword in the tooltip → nested tooltip explains that keyword. Use cases: NPC names (→ disposition, role), items (→ stats → stat modifier explanations), zone names (→ zone type, danger level), factions (→ relationship, territory). This is core to the asymmetric information design — tooltips reveal what your character KNOWS, with depth proportional to familiarity. Study the plugin for the recursive hover detection pattern, implement with our diegetic UI aesthetic.', 'backlog', 'medium', NULL, 'client', NULL, '2026-03-23 18:49:04', '2026-06-12 10:23:04', NULL, 'd003693816cfa6ceb1c8f4f3332da2dc', 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 ('06FB0TNSRXGNK7WHD9DEGPY4BC', 'task', '06FB0TNSRXX29H5X0EB0F0GBW4', 'Nested tooltip system for information layering', 'Implement nested/recursive tooltips for the information-dense UI. Reference: Nested-Tooltips (https://github.com/duzychri/Nested-Tooltips). Pattern: hover over text → tooltip appears → hover over a keyword in the tooltip → nested tooltip explains that keyword. Use cases: NPC names (→ disposition, role), items (→ stats → stat modifier explanations), zone names (→ zone type, danger level), factions (→ relationship, territory). This is core to the asymmetric information design — tooltips reveal what your character KNOWS, with depth proportional to familiarity. Study the plugin for the recursive hover detection pattern, implement with our diegetic UI aesthetic.
Parked under Phase 5 epic per cascade refocus 2026-06-12; asymmetric-information tooltip requirement preserved resumes with gameplay UI work.', 'backlog', 'medium', NULL, 'client', NULL, '2026-03-23 18:49:04', '2026-06-12 10:23:04', NULL, 'c93be2af1a2358d4f53a341e64726ada', 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 ('06FB0TNSRXY24QTYKWPERE52X4', 'epic', '06FB0TNSRXX29H5X0EB0F0GBW4', 'Settings and input system — keybinds, save browser, cursors, controller', 'Unified design and implementation pass for player-facing settings and input: (a) Key binding remapper with save/load. (b) Save browser with thumbnails and metadata. (c) Context-sensitive cursors (examine, talk, use, attack, walk). (d) Controller/gamepad support with radial menus. Design all four together in Frame0 for visual consistency, then implement as a cohesive system. These share UI patterns (settings panels, modal dialogs, input feedback) and should not be built independently.', 'backlog', 'medium', NULL, 'client', NULL, '2026-03-23 18:53:39', '2026-06-12 10:23:04', NULL, '2d10d4586473fd67b035a7cb57d2ec47', 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 ('06FB0TNSRXY24QTYKWPERE52X4', 'epic', '06FB0TNSRXX29H5X0EB0F0GBW4', 'Settings and input system — keybinds, save browser, cursors, controller', 'Unified design and implementation pass for player-facing settings and input: (a) Key binding remapper with save/load. (b) Save browser with thumbnails and metadata. (c) Context-sensitive cursors (examine, talk, use, attack, walk). (d) Controller/gamepad support with radial menus. Design all four together in Frame0 for visual consistency, then implement as a cohesive system. These share UI patterns (settings panels, modal dialogs, input feedback) and should not be built independently.
Parked under Phase 5 epic per cascade refocus 2026-06-12; unified settings/input design requirement preserved resumes with player control work.', 'backlog', 'medium', NULL, 'client', NULL, '2026-03-23 18:53:39', '2026-06-12 10:23:04', NULL, 'c441081d01ef7302c48f6dc9a4c53e10', 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 ('06FB0TNSRZ3GAN6QKTNJWVKPDG', 'task', '06FB0TNSRZXCHGS16BFHSSGSV4', 'Install Poly Haven downloader addon', 'Godot Poly Haven Downloader (https://github.com/P3ntest/godot-polyhaven-downloader) — browse and download CC0 models, textures, and HDRIs from Poly Haven directly in the Godot editor. Removes friction from asset sourcing. Install when environment art work begins.', 'backlog', 'low', NULL, 'client', NULL, '2026-03-23 19:08:40', '2026-06-12 10:23:04', NULL, '9fef3041737e4c15b600a0df2f7864a8', 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 ('06FB0TNSRZ3GAN6QKTNJWVKPDG', 'task', '06FB0TNSRZXCHGS16BFHSSGSV4', 'Install Poly Haven downloader addon', 'Godot Poly Haven Downloader (https://github.com/P3ntest/godot-polyhaven-downloader) — browse and download CC0 models, textures, and HDRIs from Poly Haven directly in the Godot editor. Removes friction from asset sourcing. Install when environment art work begins.
Re-parented under Phase 4 epic per cascade refocus 2026-06-12 asset-pipeline tooling feeding the Phase-4 asset catalog.', 'backlog', 'low', NULL, 'client', NULL, '2026-03-23 19:08:40', '2026-06-12 10:23:04', NULL, '0f2d6e36be6c2e3968f73d9ae2fb74c2', 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 ('06FB0TNSRY9W1MWNKMS803195C', 'task', '06FB0TNSRXX29H5X0EB0F0GBW4', 'Selection glow effect for interactable objects', 'Soft glow border on hovered/selected objects and characters. Reference: GlowBorderEffect (https://github.com/Magodra/GlowBorderEffect). Distinct from our inverted hull outline (permanent character silhouette) — this is a context-sensitive highlight: hover over an NPC to see a soft glow indicating they''re interactable, selected items glow in inventory, quest-relevant objects pulse. Could be a simple shader (stencil + blur) or adopt the plugin. Evaluate when interaction system is built.', 'backlog', 'low', NULL, 'client', NULL, '2026-03-23 19:28:45', '2026-06-12 10:23:04', NULL, 'db589d42de20c93bfcbc22167c0b2a84', 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 ('06FB0TNSRY9W1MWNKMS803195C', 'task', '06FB0TNSRXX29H5X0EB0F0GBW4', 'Selection glow effect for interactable objects', 'Soft glow border on hovered/selected objects and characters. Reference: GlowBorderEffect (https://github.com/Magodra/GlowBorderEffect). Distinct from our inverted hull outline (permanent character silhouette) — this is a context-sensitive highlight: hover over an NPC to see a soft glow indicating they''re interactable, selected items glow in inventory, quest-relevant objects pulse. Could be a simple shader (stencil + blur) or adopt the plugin. Evaluate when interaction system is built.
Parked under Phase 5 epic per cascade refocus 2026-06-12; interactable-highlight requirement preserved evaluate when the interaction system is built.', 'backlog', 'low', NULL, 'client', NULL, '2026-03-23 19:28:45', '2026-06-12 10:23:04', NULL, 'bbfcec7a05f37c80dd18da9bb9678323', 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 ('06FB0TNSRWKAS60B0F9E8QHZ10', 'task', '06FB0TNSRXX29H5X0EB0F0GBW4', 'feat(ui): status/buff icon bar docked to HUD panel', 'Replace standalone stance indicator with an icon bar docked to the HUD status panel. Shows active states as small icons: stance (walk/sprint/crouch/careful), perception mode, future buffs/debuffs, implant status. Each icon color-coded per existing stance colors. Tooltip on hover shows label. Bar sits above or beside the HUD status ImplantPanel. Requires: icon set design (Araminta), bar layout component (ImplantIconBar), stance indicator refactored from panel to icon.', 'backlog', 'medium', NULL, 'client', NULL, '2026-04-05 10:28:05', '2026-06-12 10:23:04', NULL, 'd6afefbdecde3653f5a359b8686cd2b2', 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 ('06FB0TNSRWKAS60B0F9E8QHZ10', 'task', '06FB0TNSRXX29H5X0EB0F0GBW4', 'feat(ui): status/buff icon bar docked to HUD panel', 'Replace standalone stance indicator with an icon bar docked to the HUD status panel. Shows active states as small icons: stance (walk/sprint/crouch/careful), perception mode, future buffs/debuffs, implant status. Each icon color-coded per existing stance colors. Tooltip on hover shows label. Bar sits above or beside the HUD status ImplantPanel. Requires: icon set design (Araminta), bar layout component (ImplantIconBar), stance indicator refactored from panel to icon.
Parked under Phase 5 epic per cascade refocus 2026-06-12; HUD status-icon requirement preserved resumes with gameplay UI work.', 'backlog', 'medium', NULL, 'client', NULL, '2026-04-05 10:28:05', '2026-06-12 10:23:04', NULL, '7ad8abce59fdb438744317556b2f1ada', 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 ('06FB0TNSRXZSXNPA5Q55JN5K54', 'task', '06FB0TNSRXX29H5X0EB0F0GBW4', 'Keybind document and settings keybind mapper', 'Two deliverables: (1) A keybind reference document listing all current key bindings (InputMap actions + hardcoded _unhandled_key_input keys like M/J/N/[/]). (2) A keybind mapper in the settings dialog that lets the player rebind keys at runtime. Triggered by Sprint 34 E-key conflict where economics panel was bound to a key already used by InputMap interact action.', 'backlog', 'medium', NULL, 'client', NULL, '2026-04-10 20:20:28', '2026-06-12 10:23:04', NULL, 'e64fbf417a5835eb33b3cc3226915fa6', 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 ('06FB0TNSRXZSXNPA5Q55JN5K54', 'task', '06FB0TNSRXX29H5X0EB0F0GBW4', 'Keybind document and settings keybind mapper', 'Two deliverables: (1) A keybind reference document listing all current key bindings (InputMap actions + hardcoded _unhandled_key_input keys like M/J/N/[/]). (2) A keybind mapper in the settings dialog that lets the player rebind keys at runtime. Triggered by Sprint 34 E-key conflict where economics panel was bound to a key already used by InputMap interact action.
Parked under Phase 5 epic per cascade refocus 2026-06-12; keybind documentation and remapping requirement preserved pairs with T-735.', 'backlog', 'medium', NULL, 'client', NULL, '2026-04-10 20:20:28', '2026-06-12 10:23:04', NULL, 'fd783602a1e24f812acedefa8700c5c1', 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 ('06FB0TNSRXMTJBWMXJBANMD6C4', 'task', '06FB0TNSRZXCHGS16BFHSSGSV4', 'Unit tests for generate-star-map-data.py helpers', 'Review follow-up from PR #128 (Hoshe #17). Add unit-test coverage for compute_gdp, infer_tier_from_population, build_adjacency, parse_wiki_index in tooling/generate-star-map-data.py. Explicit boundary-condition test worth adding: compute_gdp at exactly 1T Tr (the BTr → TTr format switch). Non-blocker on the atlas landing PR but the generator is now on the pre-pr-client path, so it earns the regression coverage.', 'backlog', 'low', NULL, 'client', NULL, '2026-04-15 07:06:33', '2026-06-12 10:23:04', NULL, '5b18f343adaed70a977c125c84a993c1', 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 ('06FB0TNSRXMTJBWMXJBANMD6C4', 'task', '06FB0TNSRZXCHGS16BFHSSGSV4', 'Unit tests for generate-star-map-data.py helpers', 'Review follow-up from PR #128 (Hoshe #17). Add unit-test coverage for compute_gdp, infer_tier_from_population, build_adjacency, parse_wiki_index in tooling/generate-star-map-data.py. Explicit boundary-condition test worth adding: compute_gdp at exactly 1T Tr (the BTr → TTr format switch). Non-blocker on the atlas landing PR but the generator is now on the pre-pr-client path, so it earns the regression coverage.
Re-parented under Phase 4 epic per cascade refocus 2026-06-12 generation-tooling test coverage (atlas star-map generator).', 'backlog', 'low', NULL, 'client', NULL, '2026-04-15 07:06:33', '2026-06-12 10:23:04', NULL, '4d9aeeb2e34f398dd75ff933247462d4', 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 ('06FB0TNSRZN95D8BBZ28Q92BQW', 'task', '06FB0TNSRZXCHGS16BFHSSGSV4', 'Amend D-191 §8 markers schema to formalize overlay arrays', 'Review follow-up from PR #128 (blocker #3 fix). AtlasMarkerOverlay currently derives production_zones / shadow_economy / corp_presence from cities[].primary_function and cities[].commission_presence because D-191 §8''s schema (cities, roads, railroads, pois, rivers, oceans, mountain_ranges) has no dedicated arrays for production zones, shadow bands, or per-corp dots. Options: (a) amend D-191 §8 to list these explicitly and update the server generator, or (b) keep deriving from cities forever. Work with server team to pick and land the schema change so the MVP overlays read first-class data.', 'backlog', 'low', NULL, 'client', NULL, '2026-04-15 07:06:42', '2026-06-12 10:23:04', NULL, '3a94a8f8f9e6e9d269467cad79f5666d', 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 ('06FB0TNSRZN95D8BBZ28Q92BQW', 'task', '06FB0TNSRZXCHGS16BFHSSGSV4', 'Amend D-191 §8 markers schema to formalize overlay arrays', 'Review follow-up from PR #128 (blocker #3 fix). AtlasMarkerOverlay currently derives production_zones / shadow_economy / corp_presence from cities[].primary_function and cities[].commission_presence because D-191 §8''s schema (cities, roads, railroads, pois, rivers, oceans, mountain_ranges) has no dedicated arrays for production zones, shadow bands, or per-corp dots. Options: (a) amend D-191 §8 to list these explicitly and update the server generator, or (b) keep deriving from cities forever. Work with server team to pick and land the schema change so the MVP overlays read first-class data.
Re-parented under Phase 4 epic per cascade refocus 2026-06-12 atlas markers schema is generation-output data.', 'backlog', 'low', NULL, 'client', NULL, '2026-04-15 07:06:42', '2026-06-12 10:23:04', NULL, 'ea39b95f484e0cd5115a261b64df9193', 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 ('06FB0TNSRX6RK3GGV1A1TWQSMC', 'task', '06FBPPMZNNEV052DBYYY3A897C', 'sr-voice release binary: multi-backend build (ROCm + CUDA + Vulkan + CPU)', 'The game will ship on multiple GPU vendors. The current sr-voice Cargo.toml has optional feature flags for metal / vulkan / cuda / rocm but default = [] — which means `cargo build --release` produces a CPU-only binary. Release binaries need to cover at minimum:
- NVIDIA: --features cuda (Windows, Linux gaming rigs)
- AMD: --features rocm (Linux) or vulkan (Windows, macOS, broader)
- Apple Silicon: --features metal (macOS)
- Fallback: CPU-only, always available
Options to cover this from the build pipeline:
A) Multiple release artifacts sr-voice-cuda, sr-voice-rocm, sr-voice-vulkan, sr-voice-cpu selected at game startup based on detected hardware. Biggest artifact count but best performance.
B) Single Vulkan release + CPU fallback Vulkan compute works on NVIDIA, AMD, and Intel integrated GPUs with shipping drivers. One binary, acceptable perf on all GPUs, CPU-only binary for everyone else.
C) Dynamic feature detection at runtime one binary with all backends compiled in, selects at load time. Largest binary, simplest distribution.
Also needs: release build pipeline (CI / cross-compilation) for each target platform, dev package installation instructions for each backend (e.g. ROCm rocm-hip-devel on Fedora is required for --features rocm to build), runtime hardware detection in the game launcher to pick the right binary.
Filed during the #833 naming pipeline work the ROCm rebuild on the dev machine surfaced that the current Makefile target `build-sr-voice` produces CPU-only binaries regardless of the hardware present, which is fine for the dev''s #833 batch but absolutely wrong for shipped release binaries. Parent work: D-138 (Gemma 2 voice pipeline).', 'backlog', 'medium', NULL, 'server', NULL, '2026-04-15 10:57:11', '2026-06-12 10:23:04', NULL, 'ffdbfda98db560272286a4557f559773', 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 ('06FB0TNSRX6RK3GGV1A1TWQSMC', 'task', '06FBPPMZNNEV052DBYYY3A897C', 'sr-voice release binary: multi-backend build (ROCm + CUDA + Vulkan + CPU)', 'The game will ship on multiple GPU vendors. The current sr-voice Cargo.toml has optional feature flags for metal / vulkan / cuda / rocm but default = [] — which means `cargo build --release` produces a CPU-only binary. Release binaries need to cover at minimum:
- NVIDIA: --features cuda (Windows, Linux gaming rigs)
- AMD: --features rocm (Linux) or vulkan (Windows, macOS, broader)
- Apple Silicon: --features metal (macOS)
- Fallback: CPU-only, always available
Options to cover this from the build pipeline:
A) Multiple release artifacts sr-voice-cuda, sr-voice-rocm, sr-voice-vulkan, sr-voice-cpu selected at game startup based on detected hardware. Biggest artifact count but best performance.
B) Single Vulkan release + CPU fallback Vulkan compute works on NVIDIA, AMD, and Intel integrated GPUs with shipping drivers. One binary, acceptable perf on all GPUs, CPU-only binary for everyone else.
C) Dynamic feature detection at runtime one binary with all backends compiled in, selects at load time. Largest binary, simplest distribution.
Also needs: release build pipeline (CI / cross-compilation) for each target platform, dev package installation instructions for each backend (e.g. ROCm rocm-hip-devel on Fedora is required for --features rocm to build), runtime hardware detection in the game launcher to pick the right binary.
Filed during the #833 naming pipeline work the ROCm rebuild on the dev machine surfaced that the current Makefile target `build-sr-voice` produces CPU-only binaries regardless of the hardware present, which is fine for the dev''s #833 batch but absolutely wrong for shipped release binaries. Parent work: D-138 (Gemma 2 voice pipeline).
Re-homed under maintenance per cascade refocus 2026-06-12 build-pipeline infrastructure; multi-GPU release-binary requirement preserved.', 'backlog', 'medium', NULL, 'server', NULL, '2026-04-15 10:57:11', '2026-06-12 10:23:04', NULL, '57831b4b04fe0e4ea0177b5cf5215aca', 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 ('06FB0TNSRWBJ1XC9V5ZQHSXAXG', 'bug', '06FBPPMZNNEV052DBYYY3A897C', 'Rewrite P2-U01 monologue_display_visible_hidden test against current _visible array API', 'test_monologue_display_visible_hidden in test_client_p2.gd accessed mono.is_visible (a custom bool property). MonologueDisplay was refactored to use _visible: Array[Dictionary] instead. Test skipped (skip_test_) pending rewrite. New test should check _visible.size() > 0 after show_monologue, and == 0 when idle.', 'backlog', 'low', NULL, 'client', NULL, '2026-04-20 11:17:20', '2026-06-12 10:23:04', NULL, '1ce2547723d3dd385d5843f331cfd5aa', 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 ('06FB0TNSRWBJ1XC9V5ZQHSXAXG', 'bug', '06FBPPMZNNEV052DBYYY3A897C', 'Rewrite P2-U01 monologue_display_visible_hidden test against current _visible array API', 'test_monologue_display_visible_hidden in test_client_p2.gd accessed mono.is_visible (a custom bool property). MonologueDisplay was refactored to use _visible: Array[Dictionary] instead. Test skipped (skip_test_) pending rewrite. New test should check _visible.size() > 0 after show_monologue, and == 0 when idle.
Re-homed under maintenance (test debt) per cascade refocus 2026-06-12.', 'backlog', 'low', NULL, 'client', NULL, '2026-04-20 11:17:20', '2026-06-12 10:23:04', NULL, '02af47396ed1d708fa5d50b13a0e6fb9', 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 ('06FB0TNSRZGSKN39GSW39JNZDG', 'task', '06FBPPMZNNEV052DBYYY3A897C', 'Revive journal panel tests (player_knowledge, UIStrings, state colors)', 'test_journal_sprint18.gd was deleted in Sprint 37 (#870 parse-error cleanup). It contained unique tests for: GameState.player_knowledge snapshot parsing/persistence, journal_panel.tscn scene lifecycle, entry rendering from player_knowledge entities, UIStrings confidence/source keys (D-042), _state_color() for Contradicted/Stale/Active states. No other journal-specific test file exists. Spec: D-041, D-042, #264.', 'backlog', 'low', NULL, 'client', NULL, '2026-04-21 15:01:17', '2026-06-12 10:23:04', NULL, 'acafbf18f2a8fd4ef0b5ea666b394e4d', 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 ('06FB0TNSRZGSKN39GSW39JNZDG', 'task', '06FBPPMZNNEV052DBYYY3A897C', 'Revive journal panel tests (player_knowledge, UIStrings, state colors)', 'test_journal_sprint18.gd was deleted in Sprint 37 (#870 parse-error cleanup). It contained unique tests for: GameState.player_knowledge snapshot parsing/persistence, journal_panel.tscn scene lifecycle, entry rendering from player_knowledge entities, UIStrings confidence/source keys (D-042), _state_color() for Contradicted/Stale/Active states. No other journal-specific test file exists. Spec: D-041, D-042, #264.
Re-homed under maintenance (test-revival debt from #870 deletions) per cascade refocus 2026-06-12.', 'backlog', 'low', NULL, 'client', NULL, '2026-04-21 15:01:17', '2026-06-12 10:23:04', NULL, 'e1cb97d054ae2bbec781509018e0e5b3', 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 ('06FB0TNSRYDPBFJVAQAN7T56VR', 'task', '06FBPPMZNNEV052DBYYY3A897C', 'Revive minimap rendering tests (discovered POIs, circular overlay, insert visibility)', 'test_minimap_sprint18.gd was deleted in Sprint 37 (#870 parse-error cleanup). It contained unique tests for: minimap.tscn scene, POI rendering from GameState.discovered_pois, circular insert overlay visibility, insert_active toggle behavior. No other minimap test file exists. Spec: D-013, D-015, D-049, #151.', 'backlog', 'low', NULL, 'client', NULL, '2026-04-21 15:01:23', '2026-06-12 10:23:04', NULL, '15593bb56dde167057a4695811dee09c', 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 ('06FB0TNSRYDPBFJVAQAN7T56VR', 'task', '06FBPPMZNNEV052DBYYY3A897C', 'Revive minimap rendering tests (discovered POIs, circular overlay, insert visibility)', 'test_minimap_sprint18.gd was deleted in Sprint 37 (#870 parse-error cleanup). It contained unique tests for: minimap.tscn scene, POI rendering from GameState.discovered_pois, circular insert overlay visibility, insert_active toggle behavior. No other minimap test file exists. Spec: D-013, D-015, D-049, #151.
Re-homed under maintenance (test-revival debt from #870 deletions) per cascade refocus 2026-06-12.', 'backlog', 'low', NULL, 'client', NULL, '2026-04-21 15:01:23', '2026-06-12 10:23:04', NULL, '7d0fe65f85fc02c4eac924fd91e2d0ad', 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 ('06FB0TNSRWYRBKFQ1W3S8DS21W', 'task', '06FBPPMZNNEV052DBYYY3A897C', 'Revive EntityRenderer sprite constants coverage (D-044 ENTITY_WIDTH/HEIGHT)', 'test_sprite_integration.gd was deleted in Sprint 37 (#870 parse-error cleanup). It was the sole asserter of D-044 sprite dimensions: EntityRenderer.ENTITY_WIDTH == 24 and ENTITY_HEIGHT == 32 (client/scripts/rendering/entity_renderer.gd:19-20). These values are load-bearing for tile-anchored y-sort (ENTITY_OFFSET_Y = TILE_SIZE - ENTITY_HEIGHT, line 22, D-019 tilt). Revive a focused test that asserts both constants and the derived offset — rewrite against current EntityRenderer API. Surfaced in PR #135 review (Tyre T2). Spec: D-044, D-019, D-049.', 'backlog', 'low', NULL, 'client', NULL, '2026-04-22 07:56:26', '2026-06-12 10:23:04', NULL, 'eac19435ce3c097daa1b470c1ce56edb', 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 ('06FB0TNSRWYRBKFQ1W3S8DS21W', 'task', '06FBPPMZNNEV052DBYYY3A897C', 'Revive EntityRenderer sprite constants coverage (D-044 ENTITY_WIDTH/HEIGHT)', 'test_sprite_integration.gd was deleted in Sprint 37 (#870 parse-error cleanup). It was the sole asserter of D-044 sprite dimensions: EntityRenderer.ENTITY_WIDTH == 24 and ENTITY_HEIGHT == 32 (client/scripts/rendering/entity_renderer.gd:19-20). These values are load-bearing for tile-anchored y-sort (ENTITY_OFFSET_Y = TILE_SIZE - ENTITY_HEIGHT, line 22, D-019 tilt). Revive a focused test that asserts both constants and the derived offset — rewrite against current EntityRenderer API. Surfaced in PR #135 review (Tyre T2). Spec: D-044, D-019, D-049.
Re-homed under maintenance (test-revival debt from #870 deletions) per cascade refocus 2026-06-12.', 'backlog', 'low', NULL, 'client', NULL, '2026-04-22 07:56:26', '2026-06-12 10:23:04', NULL, '00b2a12967d051a228c42a3acb114654', 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 ('06FB0TNSRY05Z5JJRN1ND5ZFGC', 'story', '06FBPPMMF7HS6FWRYAKMECTXX0', 'UI timeout fallback for bookmark catalog wait (main_menu)', 'main_menu.gd:72-74 _process loop polls SimBridge.poll_snapshot while _waiting_for_catalog is true. If the server never delivers bookmark_catalog (crash, new-server bug, decode dropout), the loading screen hangs forever. #872 patched the specific TCP-batch race where catalog was overwritten in receive_bytes, but the systemic class — ''catalog never arrives'' — remains.
Add a ~10s timer on _waiting_for_catalog = true. On expiry: show ''Server did not respond. Try again.'', re-enable the menu buttons, allow the user to retry or quit. Surfaced in PR #135 review (Tyre T4).
Spec: #872 (TCP-batch race fix), #258 (main menu flow).', 'backlog', 'low', NULL, 'client', NULL, '2026-04-22 07:56:41', '2026-06-12 10:23:04', NULL, '9514a83e929bc2a6cf73028fcc706250', 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 ('06FB0TNSRY05Z5JJRN1ND5ZFGC', 'story', '06FBPPMMF7HS6FWRYAKMECTXX0', 'UI timeout fallback for bookmark catalog wait (main_menu)', 'main_menu.gd:72-74 _process loop polls SimBridge.poll_snapshot while _waiting_for_catalog is true. If the server never delivers bookmark_catalog (crash, new-server bug, decode dropout), the loading screen hangs forever. #872 patched the specific TCP-batch race where catalog was overwritten in receive_bytes, but the systemic class — ''catalog never arrives'' — remains.
Add a ~10s timer on _waiting_for_catalog = true. On expiry: show ''Server did not respond. Try again.'', re-enable the menu buttons, allow the user to retry or quit. Surfaced in PR #135 review (Tyre T4).
Spec: #872 (TCP-batch race fix), #258 (main menu flow).
Parked under post-cascade gameplay backlog per cascade refocus 2026-06-12; loading-timeout robustness requirement preserved with the bookmark flow.', 'backlog', 'low', NULL, 'client', NULL, '2026-04-22 07:56:41', '2026-06-12 10:23:04', NULL, 'dcbf33e897de752ca35ad3bd4268f24c', 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 ('06FB0TNSRXT5QXNT1QST51NKZR', 'story', '06FBPPMZNNEV052DBYYY3A897C', 'Scene-flow test tier: doc + encapsulated reset helpers', 'Scene-level UI flow tests landed as a 4th tier beyond the 3 in CLAUDE.md (live Gauntlet / MessagePack replay / TestHarness mock). test_merge_path_flows_sprint37.gd is the first concrete example. Two rough edges surfaced in PR #135 review (Tyre T5, T6):
1. **Doc the tier model.** Update CLAUDE.md test tiers section to name this tier explicitly ''scene-flow tests: load .tscn headless, simulate input via signal emit, assert terminal state''. Include when to reach for it vs MessagePack replay vs mock.
2. **Test-only reset helpers.** before_test() in test_merge_path_flows_sprint37.gd reaches into SimBridge._last_snapshot, SimBridge._outbound_buffer, MetaStack._stack. Same reach-in pattern appeared in test_anti_tedium.gd before_test (PR #135 commit bc310a3c added MetaStack._stack.clear). Expose:
- SimBridge.reset_for_test() clears _last_snapshot, _outbound_buffer, disconnects; test-only, guarded by test_mode.
- MetaStack.reset_for_test() clears _stack.
Replace per-test reach-ins with these helpers.
3. **Minimal public API for scene state.** Current flow tests couple to private fields (_waiting_for_catalog, _selected_bookmark_id, _loading_screen, _new_game_btn). UI refactor renames will break all 4 tests simultaneously. Consider: is_waiting_for_catalog(), has_selected_bookmark(), pressed_new_game() signal a minimal public surface that test-and-refactor can share.
Not blocking PR #135 but the coupling will bite the next UI refactor.
Spec: #873 (merge-path tests), D-020 (IPC architecture test harness layer).', 'backlog', 'low', NULL, 'client', NULL, '2026-04-22 07:57:10', '2026-06-12 10:23:05', NULL, 'b110da7b2a0d1b36136af9cc78f128f0', 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 ('06FB0TNSRXT5QXNT1QST51NKZR', 'story', '06FBPPMZNNEV052DBYYY3A897C', 'Scene-flow test tier: doc + encapsulated reset helpers', 'Scene-level UI flow tests landed as a 4th tier beyond the 3 in CLAUDE.md (live Gauntlet / MessagePack replay / TestHarness mock). test_merge_path_flows_sprint37.gd is the first concrete example. Two rough edges surfaced in PR #135 review (Tyre T5, T6):
1. **Doc the tier model.** Update CLAUDE.md test tiers section to name this tier explicitly ''scene-flow tests: load .tscn headless, simulate input via signal emit, assert terminal state''. Include when to reach for it vs MessagePack replay vs mock.
2. **Test-only reset helpers.** before_test() in test_merge_path_flows_sprint37.gd reaches into SimBridge._last_snapshot, SimBridge._outbound_buffer, MetaStack._stack. Same reach-in pattern appeared in test_anti_tedium.gd before_test (PR #135 commit bc310a3c added MetaStack._stack.clear). Expose:
- SimBridge.reset_for_test() clears _last_snapshot, _outbound_buffer, disconnects; test-only, guarded by test_mode.
- MetaStack.reset_for_test() clears _stack.
Replace per-test reach-ins with these helpers.
3. **Minimal public API for scene state.** Current flow tests couple to private fields (_waiting_for_catalog, _selected_bookmark_id, _loading_screen, _new_game_btn). UI refactor renames will break all 4 tests simultaneously. Consider: is_waiting_for_catalog(), has_selected_bookmark(), pressed_new_game() signal a minimal public surface that test-and-refactor can share.
Not blocking PR #135 but the coupling will bite the next UI refactor.
Spec: #873 (merge-path tests), D-020 (IPC architecture test harness layer).
Re-homed under maintenance (test-infra hygiene) per cascade refocus 2026-06-12.', 'backlog', 'low', NULL, 'client', NULL, '2026-04-22 07:57:10', '2026-06-12 10:23:05', NULL, '910cc3678b98f58ce2fd10287c3bf8eb', 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 ('06FB0TNSRW77B3T7GXT6ZASX88', 'task', '06FBPPMZNNEV052DBYYY3A897C', 'CLAUDE.md carveout for server wiki writes driven by coverage gates', '**Follow-up to PR #137 / Hoshe review H8.**
PR #137 includes 21 file edits under `wiki/` authored by the server team (6 new corp wiki pages + 15 tag updates, shipped under #860 "Close D-175 Phase 2 coverage gate"). `CLAUDE.md` team-boundaries policy says: *"Stay within your team''s scope. Server team modifies `server/`. Copy team modifies `wiki/`."* The wiki writes were accepted for this sprint as a pragmatic fix (and copy-team follow-up review filed as #884), but Hoshe correctly flagged the precedent concern:
> "If cross-scope writes are structurally necessary for coverage gates, process should note this explicitly rather than route as a copy-team follow-up after merge."
The server team''s Phase 2 economy coverage gate requires that every referenced commodity / system / corporation has a corresponding wiki page otherwise the gate fails. That coupling is real and will recur. Routing it as an after-the-fact copy-team review works once; it''s not a stable process.
**Scope:**
1. Amend `CLAUDE.md` team-boundaries section to note an explicit carveout: when a server-side coverage gate requires wiki writes to close (economy coverage, asset coverage, future gates), the server team may write under `wiki/` provided:
- The writes are mechanical / gate-driven (page creation to satisfy a lookup, tag updates to satisfy a filter), not voice/lore authoring.
- A copy-team follow-up ticket is filed in the same PR body for voice/consistency review.
- The PR body explicitly lists the wiki files touched and the coverage gate that required them.
2. Decide whether the same carveout applies in reverse (copy team writing to `server/` for a gate closure probably N/A, but worth calling out to avoid asymmetry surprises later).
3. Alternative framing to consider: instead of the carveout, extract the coverage-gate-driven file generation into a tooling script under `tooling/` that creates *stub* pages for copy to flesh out. The server team commits the stubs; copy replaces with real content. Evaluate vs. direct-write carveout; the carveout is less infrastructure but the stub pipeline is cleaner process-wise.
4. Update `.claude/rules/project-structure.md` if needed to match the CLAUDE.md change.
**Cross-reference:** PR #137, #860 (D-175 Phase 2 coverage gate), #884 (copy-team voice/lore review of the wiki writes), `CLAUDE.md` "Agent Instructions → Team boundaries" section.
**Rationale:** The boundary exists to keep voice/lore authoring in copy-team hands and prevent drift. Coverage gates create legitimate cross-scope writes that aren''t authoring. The boundary should accommodate this or provide an alternative that keeps the boundary clean.', 'backlog', 'low', NULL, 'planning', NULL, '2026-04-22 08:00:12', '2026-06-12 10:23:05', NULL, 'e9d64f2cc8b6ebcb29abdf0b569e9979', 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 ('06FB0TNSRW77B3T7GXT6ZASX88', 'task', '06FBPPMZNNEV052DBYYY3A897C', 'CLAUDE.md carveout for server wiki writes driven by coverage gates', '**Follow-up to PR #137 / Hoshe review H8.**
PR #137 includes 21 file edits under `wiki/` authored by the server team (6 new corp wiki pages + 15 tag updates, shipped under #860 "Close D-175 Phase 2 coverage gate"). `CLAUDE.md` team-boundaries policy says: *"Stay within your team''s scope. Server team modifies `server/`. Copy team modifies `wiki/`."* The wiki writes were accepted for this sprint as a pragmatic fix (and copy-team follow-up review filed as #884), but Hoshe correctly flagged the precedent concern:
> "If cross-scope writes are structurally necessary for coverage gates, process should note this explicitly rather than route as a copy-team follow-up after merge."
The server team''s Phase 2 economy coverage gate requires that every referenced commodity / system / corporation has a corresponding wiki page otherwise the gate fails. That coupling is real and will recur. Routing it as an after-the-fact copy-team review works once; it''s not a stable process.
**Scope:**
1. Amend `CLAUDE.md` team-boundaries section to note an explicit carveout: when a server-side coverage gate requires wiki writes to close (economy coverage, asset coverage, future gates), the server team may write under `wiki/` provided:
- The writes are mechanical / gate-driven (page creation to satisfy a lookup, tag updates to satisfy a filter), not voice/lore authoring.
- A copy-team follow-up ticket is filed in the same PR body for voice/consistency review.
- The PR body explicitly lists the wiki files touched and the coverage gate that required them.
2. Decide whether the same carveout applies in reverse (copy team writing to `server/` for a gate closure probably N/A, but worth calling out to avoid asymmetry surprises later).
3. Alternative framing to consider: instead of the carveout, extract the coverage-gate-driven file generation into a tooling script under `tooling/` that creates *stub* pages for copy to flesh out. The server team commits the stubs; copy replaces with real content. Evaluate vs. direct-write carveout; the carveout is less infrastructure but the stub pipeline is cleaner process-wise.
4. Update `.claude/rules/project-structure.md` if needed to match the CLAUDE.md change.
**Cross-reference:** PR #137, #860 (D-175 Phase 2 coverage gate), #884 (copy-team voice/lore review of the wiki writes), `CLAUDE.md` "Agent Instructions → Team boundaries" section.
**Rationale:** The boundary exists to keep voice/lore authoring in copy-team hands and prevent drift. Coverage gates create legitimate cross-scope writes that aren''t authoring. The boundary should accommodate this or provide an alternative that keeps the boundary clean.
Re-homed under maintenance (process/docs hygiene) per cascade refocus 2026-06-12.', 'backlog', 'low', NULL, 'planning', NULL, '2026-04-22 08:00:12', '2026-06-12 10:23:05', NULL, 'e4b38eace7ca5713b74b8e4206e6637a', 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 ('06FB0TNSRZBH1C2R0DXM00C66R', 'task', '06FBPPMMF7HS6FWRYAKMECTXX0', 'D-027 criterion 4: Layer 2/3 E2E test for RoutineDeviation tell after triangle activation', 'v01_integration_playthrough.rs was deleted in #878 as archetype-dependent. Its only non-archetype coverage — D-027 criterion 4 (RoutineDeviation tell after triangle activation) — was already #[ignore]-blocked on #589 (escalate_tells_on_activation). Layer 1 tell priority is covered by tell_escalation.rs. This ticket tracks the missing Layer 2 ECS-world test: activation event → RoutineDeviation insertion, and (optionally) a Layer 3 subprocess proof once #589 lands. Non-blocking for sprint 37 merge.', 'backlog', 'low', NULL, 'server', NULL, '2026-04-22 08:06:52', '2026-06-12 10:23:05', NULL, '35fe3775c85a044230ef004c5c3ad68d', 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 ('06FB0TNSRZBH1C2R0DXM00C66R', 'task', '06FBPPMMF7HS6FWRYAKMECTXX0', 'D-027 criterion 4: Layer 2/3 E2E test for RoutineDeviation tell after triangle activation', 'v01_integration_playthrough.rs was deleted in #878 as archetype-dependent. Its only non-archetype coverage — D-027 criterion 4 (RoutineDeviation tell after triangle activation) — was already #[ignore]-blocked on #589 (escalate_tells_on_activation). Layer 1 tell priority is covered by tell_escalation.rs. This ticket tracks the missing Layer 2 ECS-world test: activation event → RoutineDeviation insertion, and (optionally) a Layer 3 subprocess proof once #589 lands. Non-blocking for sprint 37 merge.
Parked under post-cascade gameplay backlog per cascade refocus 2026-06-12; D-027 criterion-4 coverage requirement preserved picks up when tell escalation (#589) lands.', 'backlog', 'low', NULL, 'server', NULL, '2026-04-22 08:06:52', '2026-06-12 10:23:05', NULL, '818c1064298b607a49a4c1b81c8bc13c', 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 ('06FB0TNSRXN360AQN3973AHS8M', 'bug', '06FBPPMZNNEV052DBYYY3A897C', 'test_dialogue_sprint20: 5 failures — AudioManager.get_active_dip or other API drift', '5 failing test cases in test_dialogue_sprint20.gd. The suite tests D-020 signal decoupling for dialogue_box. Likely failure: test_show_dialogue_does_not_call_audio_manager_directly compares AudioManager.get_active_dip() before/after show_dialogue — if AudioManager.get_active_dip() behavior changed or is not returning clean state, this would fail. Investigate by running the suite in isolation and reading specific assertion failures from the log. Sprint 38 triage #871.', 'backlog', 'low', NULL, 'client', NULL, '2026-05-02 08:11:54', '2026-06-12 10:23:05', NULL, 'e148dfda5fd7150e055f2b5bde931544', 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 ('06FB0TNSRXN360AQN3973AHS8M', 'bug', '06FBPPMZNNEV052DBYYY3A897C', 'test_dialogue_sprint20: 5 failures — AudioManager.get_active_dip or other API drift', '5 failing test cases in test_dialogue_sprint20.gd. The suite tests D-020 signal decoupling for dialogue_box. Likely failure: test_show_dialogue_does_not_call_audio_manager_directly compares AudioManager.get_active_dip() before/after show_dialogue — if AudioManager.get_active_dip() behavior changed or is not returning clean state, this would fail. Investigate by running the suite in isolation and reading specific assertion failures from the log. Sprint 38 triage #871.
Re-homed under maintenance from done umbrella T-871 per cascade refocus 2026-06-12.', 'backlog', 'low', NULL, 'client', NULL, '2026-05-02 08:11:54', '2026-06-12 10:23:05', NULL, '40788a6ba0cfe9aa73c10849ff2a77b2', 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 ('06FB0TNSRXMVYQJV2QDHH8H7P8', 'bug', '06FBPPMZNNEV052DBYYY3A897C', 'test_input_roundtrip: 3 failures — server binary missing or LocalBridge API change', '3 failing test cases in test_input_roundtrip.gd. All tests check _connect_to_server() which skips if server binary not found — but 3 still fail, suggesting either: (1) server binary is present but something in LocalBridge.send_message, poll, or Protocol.encode_player_inputs changed, or (2) test environment returns false from _connect_to_server but then asserts fail. Investigate by running with --filter test_input_roundtrip and checking the log for exact assertion sites. Sprint 38 triage #871.', 'backlog', 'low', NULL, 'client', NULL, '2026-05-02 08:11:59', '2026-06-12 10:23:05', NULL, 'be5c5f0ba84eed9f4703b19bc8a01b3e', 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 ('06FB0TNSRXMVYQJV2QDHH8H7P8', 'bug', '06FBPPMZNNEV052DBYYY3A897C', 'test_input_roundtrip: 3 failures — server binary missing or LocalBridge API change', '3 failing test cases in test_input_roundtrip.gd. All tests check _connect_to_server() which skips if server binary not found — but 3 still fail, suggesting either: (1) server binary is present but something in LocalBridge.send_message, poll, or Protocol.encode_player_inputs changed, or (2) test environment returns false from _connect_to_server but then asserts fail. Investigate by running with --filter test_input_roundtrip and checking the log for exact assertion sites. Sprint 38 triage #871.
Re-homed under maintenance from done umbrella T-871 per cascade refocus 2026-06-12.', 'backlog', 'low', NULL, 'client', NULL, '2026-05-02 08:11:59', '2026-06-12 10:23:05', NULL, 'dfe49e914543e46781fb2f5b462cafad', 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 ('06FB0TNSRY3TXD5HDKHFVGDG18', 'bug', '06FBPPMZNNEV052DBYYY3A897C', 'test_implant_app_lifecycle: 1 failure — ImplantApp or HudGroups state API', '1 failing test case in test_implant_app_lifecycle.gd. Suite tests ImplantApp._internal_app_changed, nav stack, preserves_state, and HudGroups state. after_test resets HudGroups._active_app, _active_mode, _groups — if these private fields were renamed or removed, after_test would fail and bleed state. Or a specific on_open/on_close hook fires differently. Run --filter test_implant_app_lifecycle and check specific assertion. Sprint 38 triage #871.', 'backlog', 'low', NULL, 'client', NULL, '2026-05-02 08:12:32', '2026-06-12 10:23:05', NULL, 'd4da304caced40c2c10675937368d0c0', 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 ('06FB0TNSRY3TXD5HDKHFVGDG18', 'bug', '06FBPPMZNNEV052DBYYY3A897C', 'test_implant_app_lifecycle: 1 failure — ImplantApp or HudGroups state API', '1 failing test case in test_implant_app_lifecycle.gd. Suite tests ImplantApp._internal_app_changed, nav stack, preserves_state, and HudGroups state. after_test resets HudGroups._active_app, _active_mode, _groups — if these private fields were renamed or removed, after_test would fail and bleed state. Or a specific on_open/on_close hook fires differently. Run --filter test_implant_app_lifecycle and check specific assertion. Sprint 38 triage #871.
Re-homed under maintenance from done umbrella T-871 per cascade refocus 2026-06-12.', 'backlog', 'low', NULL, 'client', NULL, '2026-05-02 08:12:32', '2026-06-12 10:23:05', NULL, 'b2dbffcf6181766c4d024b912ab6ee90', 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 ('06FB0TNSRWK87PCWGZ6GWT2TBM', 'bug', '06FBPPMZNNEV052DBYYY3A897C', 'test_game_state_sprint20: 1 failure — SnapshotHandler or stationary_ticks path', '1 failing test case in test_game_state_sprint20.gd. before_each resets SnapshotHandler._prev_player_position. If this static var was renamed or moved, the before_each hook would error. Alternatively a stationary_ticks path changed in SnapshotHandler. Verify SnapshotHandler still has static var _prev_player_position at that exact name. Sprint 38 triage #871.', 'backlog', 'low', NULL, 'client', NULL, '2026-05-02 08:12:38', '2026-06-12 10:23:05', NULL, '2689f06827000dc8c864d171238dbe69', 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 ('06FB0TNSRWK87PCWGZ6GWT2TBM', 'bug', '06FBPPMZNNEV052DBYYY3A897C', 'test_game_state_sprint20: 1 failure — SnapshotHandler or stationary_ticks path', '1 failing test case in test_game_state_sprint20.gd. before_each resets SnapshotHandler._prev_player_position. If this static var was renamed or moved, the before_each hook would error. Alternatively a stationary_ticks path changed in SnapshotHandler. Verify SnapshotHandler still has static var _prev_player_position at that exact name. Sprint 38 triage #871.
Re-homed under maintenance from done umbrella T-871 per cascade refocus 2026-06-12.', 'backlog', 'low', NULL, 'client', NULL, '2026-05-02 08:12:38', '2026-06-12 10:23:05', NULL, '993364218aebbbc6986cf535566b1990', 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 ('06FB0TNSRYF23MZ86S1XF1542G', 'bug', '06FBPPMZNNEV052DBYYY3A897C', 'test_fog_shader: 1 failure — stale VIS_PERIPHERAL or peripheral sector assertion', '1 failing test case in test_fog_shader.gd. The most likely failure is test_fog_state_forward_vs_peripheral: it asserts Forward > Peripheral visibility values, but Sprint 22 (#569) removed peripheral sector. Now all visible tiles write VIS_FORWARD regardless. The test checks the texture is non-null (not the actual byte values), so it should pass... unless the failure is in test_fog_state_exploration_persists which has a weak assertion. Run --filter test_fog_shader to identify the specific failure. Sprint 38 triage #871.', 'backlog', 'low', NULL, 'client', NULL, '2026-05-02 08:12:45', '2026-06-12 10:23:05', NULL, '3c27c41707376c03b0ca5a0acf24035b', 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 ('06FB0TNSRYF23MZ86S1XF1542G', 'bug', '06FBPPMZNNEV052DBYYY3A897C', 'test_fog_shader: 1 failure — stale VIS_PERIPHERAL or peripheral sector assertion', '1 failing test case in test_fog_shader.gd. The most likely failure is test_fog_state_forward_vs_peripheral: it asserts Forward > Peripheral visibility values, but Sprint 22 (#569) removed peripheral sector. Now all visible tiles write VIS_FORWARD regardless. The test checks the texture is non-null (not the actual byte values), so it should pass... unless the failure is in test_fog_state_exploration_persists which has a weak assertion. Run --filter test_fog_shader to identify the specific failure. Sprint 38 triage #871.
Re-homed under maintenance from done umbrella T-871 per cascade refocus 2026-06-12.', 'backlog', 'low', NULL, 'client', NULL, '2026-05-02 08:12:45', '2026-06-12 10:23:05', NULL, 'bb63cf321016aa94052c0eca3ad7ec77', 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 ('06FB0TNSRZYDBRV5T9QVQAXGV0', 'bug', '06FBPPMZNNEV052DBYYY3A897C', 'test_e2e_connection: 1 failure — server binary path or TCP connection state', '1 failing test case in test_e2e_connection.gd. test_send_input_receive_snapshot skips if server binary not found. If it fails, either: (1) server binary exists but connection fails (port collision, timing), or (2) LocalBridge.reset() method was removed (the test calls _bridge.reset() but this may not exist on LocalBridge). Verify LocalBridge has a reset() method. Sprint 38 triage #871.', 'backlog', 'low', NULL, 'client', NULL, '2026-05-02 08:12:51', '2026-06-12 10:23:05', NULL, '7ab8b3846917c88efeca3d50990e3d89', 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 ('06FB0TNSRZYDBRV5T9QVQAXGV0', 'bug', '06FBPPMZNNEV052DBYYY3A897C', 'test_e2e_connection: 1 failure — server binary path or TCP connection state', '1 failing test case in test_e2e_connection.gd. test_send_input_receive_snapshot skips if server binary not found. If it fails, either: (1) server binary exists but connection fails (port collision, timing), or (2) LocalBridge.reset() method was removed (the test calls _bridge.reset() but this may not exist on LocalBridge). Verify LocalBridge has a reset() method. Sprint 38 triage #871.
Re-homed under maintenance from done umbrella T-871 per cascade refocus 2026-06-12.', 'backlog', 'low', NULL, 'client', NULL, '2026-05-02 08:12:51', '2026-06-12 10:23:05', NULL, 'deffb71bafcbd07b22c520943f7a846f', 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 ('06FB0TNSRY9FV0S9RE42WY7SHW', 'bug', '06FBPPMZNNEV052DBYYY3A897C', 'test_audio_sprint13: 1 failure — AudioManager.clear_dip or API drift', '1 failing test case in test_audio_sprint13.gd. before_test calls AudioManager.clear_dip(), stop_all_loops(), set_volume() for all buses. If any of these methods were renamed or a bus constant changed, setup would fail and cascade. Or a specific dip timing assertion is stale. Run --filter test_audio_sprint13 and read the specific failure. Sprint 38 triage #871.', 'backlog', 'low', NULL, 'client', NULL, '2026-05-02 08:12:56', '2026-06-12 10:23:05', NULL, '5cec2383dbf80f22833e696c8ed290ab', 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 ('06FB0TNSRY9FV0S9RE42WY7SHW', 'bug', '06FBPPMZNNEV052DBYYY3A897C', 'test_audio_sprint13: 1 failure — AudioManager.clear_dip or API drift', '1 failing test case in test_audio_sprint13.gd. before_test calls AudioManager.clear_dip(), stop_all_loops(), set_volume() for all buses. If any of these methods were renamed or a bus constant changed, setup would fail and cascade. Or a specific dip timing assertion is stale. Run --filter test_audio_sprint13 and read the specific failure. Sprint 38 triage #871.
Re-homed under maintenance from done umbrella T-871 per cascade refocus 2026-06-12.', 'backlog', 'low', NULL, 'client', NULL, '2026-05-02 08:12:56', '2026-06-12 10:23:05', NULL, 'e163d908f7547e589b11a97343cbf93c', 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 ('06FB0TNSRXCE9D9JYBZWVXMG68', 'bug', '06FBPPMZNNEV052DBYYY3A897C', 'test_ai_dialogue_sprint26: 1 failure — HardwareDetector autoload missing or settings_dialog API', '1 failing test case in test_ai_dialogue_sprint26.gd. The HardwareDetector tests skip if autoload not found. The GameState field tests (ai_enhanced_dialogue_enabled) look correct. The failing test is likely in the settings_dialog section: SETTINGS_DIALOG_SCENE preloaded at class level — if settings_dialog.tscn doesn''t exist or a method was renamed, class-level preload would fail. Check res://ui/settings_dialog.tscn exists and the relevant methods. Sprint 38 triage #871.', 'backlog', 'low', NULL, 'client', NULL, '2026-05-02 08:13:02', '2026-06-12 10:23:05', NULL, 'ed7e0cd1fa885a1a9d20b79a3917f417', 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 ('06FB0TNSRXCE9D9JYBZWVXMG68', 'bug', '06FBPPMZNNEV052DBYYY3A897C', 'test_ai_dialogue_sprint26: 1 failure — HardwareDetector autoload missing or settings_dialog API', '1 failing test case in test_ai_dialogue_sprint26.gd. The HardwareDetector tests skip if autoload not found. The GameState field tests (ai_enhanced_dialogue_enabled) look correct. The failing test is likely in the settings_dialog section: SETTINGS_DIALOG_SCENE preloaded at class level — if settings_dialog.tscn doesn''t exist or a method was renamed, class-level preload would fail. Check res://ui/settings_dialog.tscn exists and the relevant methods. Sprint 38 triage #871.
Re-homed under maintenance from done umbrella T-871 per cascade refocus 2026-06-12.', 'backlog', 'low', NULL, 'client', NULL, '2026-05-02 08:13:02', '2026-06-12 10:23:05', NULL, 'd30ab47be78dcd540d431e8ed6a8c352', 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 ('06FB0TNSRZ9Q7NHVDRT6ARMCWW', 'task', '06FB0TNSRZXCHGS16BFHSSGSV4', 'D-210 SubBiomeVariant implementation', 'D-210 defines SubBiomeVariant for fine-grained biome classification within SettingType::Wilderness districts. Currently deferred — SettingType::Wilderness carries a plain String biome field. Implement SubBiomeVariant enum and wire it into the atlas skeleton generator when the biome taxonomy is finalized.', 'backlog', 'low', NULL, 'server', NULL, '2026-05-03 10:30:14', '2026-06-12 10:23:05', NULL, 'bfb4923b6526a378a3baf298854b4083', 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 ('06FB0TNSRZ9Q7NHVDRT6ARMCWW', 'task', '06FB0TNSRZXCHGS16BFHSSGSV4', 'D-210 SubBiomeVariant implementation', 'D-210 defines SubBiomeVariant for fine-grained biome classification within SettingType::Wilderness districts. Currently deferred — SettingType::Wilderness carries a plain String biome field. Implement SubBiomeVariant enum and wire it into the atlas skeleton generator when the biome taxonomy is finalized.
Re-parented under Phase 4 epic per cascade refocus 2026-06-12 biome taxonomy for the atlas/cascade generator.', 'backlog', 'low', NULL, 'server', NULL, '2026-05-03 10:30:14', '2026-06-12 10:23:05', NULL, 'a1cd9d5b72f7a9748c52d23ed948b0b6', 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 ('06FB0TNSRW2ZSPJ3D9NEZ6JBW8', 'story', '06FB0TNSRZXCHGS16BFHSSGSV4', 'Atlas data delivery — replace client-side file reads with server API calls', 'The client currently reads markers.json and star_map_data.json directly from the filesystem. This bypasses the server layer entirely — the client should request all game data through IPC calls to the Rust backend.
Implementation can be simple: the server exposes a query/proxy endpoint that reads the JSON file or runs a DB query and returns the result. The client asks, the server responds. No complex protocol needed just the boundary enforcement that the client never reads files or DB directly.
Affects: atlas app (reach, system, planet, regional screens), economics monitor. The server-side handler can start as a thin proxy (read file, return contents) and evolve into perception-filtered queries (D-012) later.', 'backlog', 'medium', NULL, 'client', NULL, '2026-05-03 14:14:23', '2026-06-12 10:23:05', NULL, '026273cf1c27b3c46ca83df235265d72', 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 ('06FB0TNSRW2ZSPJ3D9NEZ6JBW8', 'story', '06FB0TNSRZXCHGS16BFHSSGSV4', 'Atlas data delivery — replace client-side file reads with server API calls', 'The client currently reads markers.json and star_map_data.json directly from the filesystem. This bypasses the server layer entirely — the client should request all game data through IPC calls to the Rust backend.
Implementation can be simple: the server exposes a query/proxy endpoint that reads the JSON file or runs a DB query and returns the result. The client asks, the server responds. No complex protocol needed just the boundary enforcement that the client never reads files or DB directly.
Affects: atlas app (reach, system, planet, regional screens), economics monitor. The server-side handler can start as a thin proxy (read file, return contents) and evolve into perception-filtered queries (D-012) later.
Re-parented under Phase 4 epic per cascade refocus 2026-06-12 atlas data delivery underpins viewing cascade layers through the implant Atlas.', 'backlog', 'medium', NULL, 'client', NULL, '2026-05-03 14:14:23', '2026-06-12 10:23:05', NULL, 'ff64aa82b1f15c4cea86ee3268f20995', 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 ('06FB0TNSRYEM4VSX74MS4NKQ1C', 'bug', '06FBPPMZNNEV052DBYYY3A897C', 'Client test suite — pre-existing failures under bare run-godot', 'Surfaced 2026-05-24 running the full client suite (tests/run-godot, no server) during #960. NOT caused by #960 — verified: test_input_roundtrip fails identically at the pre-change baseline, and the rest are unrelated subsystems. Two categories to triage:
CATEGORY 1 server-dependent (expected-fail under bare run-godot): test_e2e_connection (test_send_input_receive_snapshot), test_input_roundtrip (movement/interact/move_then_interact). They error with ''Nil snapshot'' / ''.tick on Nil'' because no sim server is spawned. They need the run-ipc-* harness or SR_LIVE=1. FIX OPTIONS: gate/skip these under bare run-godot (mark as requiring a server) OR have run-godot spawn the server for the e2e tier, so tests/run-godot
{"suite":"godot","total":2522,"passed":2482,"failed":40,"duration_ms":96836,"log":"/tmp/sr-run-godot.1737738.log"} is green without false negatives.
CATEGORY 2 genuine logic failures in subsystems unrelated to current work: test_audio_sprint13 (test_d067_chime_duration_spec_is_300_to_400ms, line 547 ''Expecting true but is false''), test_fog_sprint22 (exploration_data_preserved_across_resize), test_fog_shader (visibility_texture_update_performance), test_dialogue_sprint18/20 (signal/audio-dip), test_monologue_display (queue_never_exceeds_max_depth), test_implant_app_lifecycle (on_insert_deactivated_closes_insert_app), test_ai_dialogue_sprint26 (settings_dialog warning label). Triage each: fix or remove/xfail with a reason.
Goal: a green (or explicitly-gated) bare `make test-client` so client regressions are detectable. Until then, run targeted suites (run-godot --filter <stem>).', 'backlog', 'medium', NULL, 'client', NULL, '2026-05-24 16:49:54', '2026-06-12 10:23:05', NULL, 'f0d9f237aabd31e5f8c0d43d7e626f1e', 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 ('06FB0TNSRYEM4VSX74MS4NKQ1C', 'bug', '06FBPPMZNNEV052DBYYY3A897C', 'Client test suite — pre-existing failures under bare run-godot', 'Surfaced 2026-05-24 running the full client suite (tests/run-godot, no server) during #960. NOT caused by #960 — verified: test_input_roundtrip fails identically at the pre-change baseline, and the rest are unrelated subsystems. Two categories to triage:
CATEGORY 1 server-dependent (expected-fail under bare run-godot): test_e2e_connection (test_send_input_receive_snapshot), test_input_roundtrip (movement/interact/move_then_interact). They error with ''Nil snapshot'' / ''.tick on Nil'' because no sim server is spawned. They need the run-ipc-* harness or SR_LIVE=1. FIX OPTIONS: gate/skip these under bare run-godot (mark as requiring a server) OR have run-godot spawn the server for the e2e tier, so tests/run-godot
{"suite":"godot","total":2522,"passed":2482,"failed":40,"duration_ms":96836,"log":"/tmp/sr-run-godot.1737738.log"} is green without false negatives.
CATEGORY 2 genuine logic failures in subsystems unrelated to current work: test_audio_sprint13 (test_d067_chime_duration_spec_is_300_to_400ms, line 547 ''Expecting true but is false''), test_fog_sprint22 (exploration_data_preserved_across_resize), test_fog_shader (visibility_texture_update_performance), test_dialogue_sprint18/20 (signal/audio-dip), test_monologue_display (queue_never_exceeds_max_depth), test_implant_app_lifecycle (on_insert_deactivated_closes_insert_app), test_ai_dialogue_sprint26 (settings_dialog warning label). Triage each: fix or remove/xfail with a reason.
Goal: a green (or explicitly-gated) bare `make test-client` so client regressions are detectable. Until then, run targeted suites (run-godot --filter <stem>).
Re-homed under maintenance (test-failure debt / suite hygiene) per cascade refocus 2026-06-12.', 'backlog', 'medium', NULL, 'client', NULL, '2026-05-24 16:49:54', '2026-06-12 10:23:05', NULL, '48c6b07c7558342430ef5822e873ce5a', 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 ('06FB0TNSRYYR0QJC12EMA0SV1W', 'task', '06FB0TNSRZXCHGS16BFHSSGSV4', 'Add East-African-interior heritage token to cultural_specialization taxonomy', 'The #1016 cultural pass found two systems founded by East-African-INTERIOR peoples that the canonical 47-value heritage taxonomy has no token for, so they currently borrow ''swahili'' (a coastal value) as the nearest fit (documented inline in wiki/economics/system_specialization.toml):
- GJ 667B Kampala Gate Baganda/Ugandan (Great Lakes interior)
- GJ 1292 Moyale Kenyan/Ethiopian (Borana/Oromo, Horn)
(Mwangaza GJ 693 is genuinely coastal Swahili correct, leave it.)
SCOPE: add an appropriate heritage value (or values) to the canonical taxonomy at the nationality/people granularity the taxonomy uses candidates: a Great Lakes / interior East African token and/or a Horn-of-Africa token. Update:
1. docs/workshops/system-economic-specialization/heritage-taxonomy-draft.md (canon list + count)
2. _CULTURAL_HERITAGE in tooling/economy-db/import_economics.py
3. repin GJ 667B and GJ 1292 in system_specialization.toml to the new value(s)
4. regen-db + verify (V-SES-04) + commit
Surfaced by the PR #147 (#1016) review (Paula HIGH / Miri). Low priority current ''swahili'' approximation is documented, not silently wrong.', 'backlog', 'low', NULL, 'server', 'D-237', '2026-06-03 08:27:09', '2026-06-12 10:23:06', NULL, 'ec06b91574202a0b7377d07afdd15cde', 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 ('06FB0TNSRYYR0QJC12EMA0SV1W', 'task', '06FB0TNSRZXCHGS16BFHSSGSV4', 'Add East-African-interior heritage token to cultural_specialization taxonomy', 'The #1016 cultural pass found two systems founded by East-African-INTERIOR peoples that the canonical 47-value heritage taxonomy has no token for, so they currently borrow ''swahili'' (a coastal value) as the nearest fit (documented inline in wiki/economics/system_specialization.toml):
- GJ 667B Kampala Gate Baganda/Ugandan (Great Lakes interior)
- GJ 1292 Moyale Kenyan/Ethiopian (Borana/Oromo, Horn)
(Mwangaza GJ 693 is genuinely coastal Swahili correct, leave it.)
SCOPE: add an appropriate heritage value (or values) to the canonical taxonomy at the nationality/people granularity the taxonomy uses candidates: a Great Lakes / interior East African token and/or a Horn-of-Africa token. Update:
1. docs/workshops/system-economic-specialization/heritage-taxonomy-draft.md (canon list + count)
2. _CULTURAL_HERITAGE in tooling/economy-db/import_economics.py
3. repin GJ 667B and GJ 1292 in system_specialization.toml to the new value(s)
4. regen-db + verify (V-SES-04) + commit
Surfaced by the PR #147 (#1016) review (Paula HIGH / Miri). Low priority current ''swahili'' approximation is documented, not silently wrong.
Re-parented under Phase 4 epic per cascade refocus 2026-06-12 cultural_specialization taxonomy is a generation-input data fix (D-237).', 'backlog', 'low', NULL, 'server', 'D-237', '2026-06-03 08:27:09', '2026-06-12 10:23:06', NULL, 'e72c53971dca82a234a7129493fbfca0', 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 ('06FB0TNSRZ9NXNX40J476N2EQM', 'task', '06FB0TNSRZXCHGS16BFHSSGSV4', 'Persist deterministic cascade output (build-time bake or local cache)', 'Deferred from the #955 pair session. The Phase-4 cascade (Layers 0-5) is fully deterministic (D-010 + SeedChain) — its output (settlement placements, and eventually the full BodyWorldState) is a pure function of (heightmap, authored context, world seed), so it can be cached rather than re-derived on every cold load.
CONSTRAINT: systems.db is read-only from the server''s perspective (schema header) the runtime server CANNOT write it. So a persistent cache is one of:
(A) Build-time whole-cascade bake into systems.db (a tool runs the Rust cascade, bakes BodyWorldState/placements; runtime reads). Matches the D-223/#951 ''cascade fills the geometry tables'' intent; staleness handled by the existing meta-stamp. Cost: committed binary artifact + re-bake on input change.
(B) Runtime local cache in a gitignored .cache/ keyed by (world_seed, schema_version, body_id), written on first derive, read after. No commit/merge issues; per-machine first-derive cost.
DESIGN DECISION NEEDED: A vs B (or both A for shipped worlds, B for dev iteration).
WHY DEFERRED (not now): (1) every cascade layer is a PURE function, so a cache wraps it later at ZERO retrofit determinism makes deferral free. (2) Layer-2 inputs are still churning (#1014/#982 dominant-commodity, #977 trait_selection, #956 political archetype all change placement inputs) a bake now would be stale/constantly re-baked. (3) Bake the WHOLE cascade once it is end-to-end (post Layer 5, #959), not one layer. (4) No measured perf need yet (Layer 3 = Hungarian on a small grid).
TRIGGER: pick this up when the cascade is end-to-end (after #959) OR the Layer-2 context freezes whichever first. The in-memory hot cache (BodyWorldState / D-203, #968) already covers ''no IO while on a system''; this ticket is only about cross-session/cold-load persistence.
Seam: run_layer3 (and each run_layerN) is pure wrap at the run_cascade call site (a // cache seam comment marks it).', 'backlog', 'low', NULL, 'server', 'D-200', '2026-06-03 10:46:13', '2026-06-12 10:23:06', NULL, '1bf12c7eeaa86d0d9cfac470577f0419', 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 ('06FB0TNSRZ9NXNX40J476N2EQM', 'task', '06FB0TNSRZXCHGS16BFHSSGSV4', 'Persist deterministic cascade output (build-time bake or local cache)', 'Deferred from the #955 pair session. The Phase-4 cascade (Layers 0-5) is fully deterministic (D-010 + SeedChain) — its output (settlement placements, and eventually the full BodyWorldState) is a pure function of (heightmap, authored context, world seed), so it can be cached rather than re-derived on every cold load.
CONSTRAINT: systems.db is read-only from the server''s perspective (schema header) the runtime server CANNOT write it. So a persistent cache is one of:
(A) Build-time whole-cascade bake into systems.db (a tool runs the Rust cascade, bakes BodyWorldState/placements; runtime reads). Matches the D-223/#951 ''cascade fills the geometry tables'' intent; staleness handled by the existing meta-stamp. Cost: committed binary artifact + re-bake on input change.
(B) Runtime local cache in a gitignored .cache/ keyed by (world_seed, schema_version, body_id), written on first derive, read after. No commit/merge issues; per-machine first-derive cost.
DESIGN DECISION NEEDED: A vs B (or both A for shipped worlds, B for dev iteration).
WHY DEFERRED (not now): (1) every cascade layer is a PURE function, so a cache wraps it later at ZERO retrofit determinism makes deferral free. (2) Layer-2 inputs are still churning (#1014/#982 dominant-commodity, #977 trait_selection, #956 political archetype all change placement inputs) a bake now would be stale/constantly re-baked. (3) Bake the WHOLE cascade once it is end-to-end (post Layer 5, #959), not one layer. (4) No measured perf need yet (Layer 3 = Hungarian on a small grid).
TRIGGER: pick this up when the cascade is end-to-end (after #959) OR the Layer-2 context freezes whichever first. The in-memory hot cache (BodyWorldState / D-203, #968) already covers ''no IO while on a system''; this ticket is only about cross-session/cold-load persistence.
Seam: run_layer3 (and each run_layerN) is pure wrap at the run_cascade call site (a // cache seam comment marks it).
Re-parented under Phase 4 epic per cascade refocus 2026-06-12 cascade-output persistence; trigger remains end-to-end cascade (post #959) or Layer-2 context freeze.', 'backlog', 'low', NULL, 'server', 'D-200', '2026-06-03 10:46:13', '2026-06-12 10:23:06', NULL, '3c1d1e516c50c02cc3064888b530ca27', 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 ('06FB0TNSRW7FZPYXXCGWBBRBEC', 'initiative', NULL, 'v0.2 Life-Sim Pivot', 'Generator-first life sim pivot following the Where''s the Fun? workshop (2026-03-05). 24 decisions locked: all NPCs generated, tycoon bookmark, culture-implicit-in-location, broad life verbs, dual-scale consequence model. Detective/smuggler framing retired. Critical path: Sprint 25 generator spike. See docs/workshops/wheres-the-fun/workshop-outcomes.md.', 'cancelled', 'critical', NULL, NULL, NULL, '2026-03-05 23:11:31', '2026-06-12 10:23:06', NULL, 'aa6302dbd4a06a68ef49847672d55a98', 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 ('06FB0TNSRW7FZPYXXCGWBBRBEC', 'initiative', NULL, 'v0.2 Life-Sim Pivot', 'Generator-first life sim pivot following the Where''s the Fun? workshop (2026-03-05). 24 decisions locked: all NPCs generated, tycoon bookmark, culture-implicit-in-location, broad life verbs, dual-scale consequence model. Detective/smuggler framing retired. Critical path: Sprint 25 generator spike. See docs/workshops/wheres-the-fun/workshop-outcomes.md.
Cancelled 2026-06-12: the v0.2 Life-Sim Pivot initiative shell the v0.2 target is dropped (D-166, amendment 2026-06-12; D-114/D-115/D-117/D-118/D-120 superseded). Its children with surviving functional content (T-604 proof-of-life playtest concept, T-605 tycoon bookmark, T-606 creation flow, T-608 world feel) are preserved under the post-cascade gameplay parking epic T-1036.', 'cancelled', 'critical', NULL, NULL, NULL, '2026-03-05 23:11:31', '2026-06-12 10:23:06', NULL, 'f274d9d9b2b4e4d642160d2a5939e400', 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 ('06FB0TNSRXXP903QTD8Q2YWRJ8', 'story', NULL, 'One campaign or separate eras', NULL, 'cancelled', 'medium', NULL, NULL, 'Q-004', '2026-02-09 15:21:44', '2026-06-12 10:23:06', NULL, '02d52e37abbfcc5c53bc5102a7bcca63', 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 ('06FB0TNSRXXP903QTD8Q2YWRJ8', 'story', NULL, 'One campaign or separate eras', 'Cancelled 2026-06-12: administrative mirror of Q-004 (resolved); no surviving open requirement.', 'cancelled', 'medium', NULL, NULL, 'Q-004', '2026-02-09 15:21:44', '2026-06-12 10:23:06', NULL, 'b7de7f9179cf45b865a5213b4ef73f71', 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 ('06FB0TNSRZYTPACQCYNGVK5XSC', 'story', NULL, 'Prototype scale', NULL, 'cancelled', 'medium', NULL, NULL, 'Q-005', '2026-02-09 15:21:44', '2026-06-12 10:23:06', NULL, '98d983109528446550201f10d509f082', 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 ('06FB0TNSRZYTPACQCYNGVK5XSC', 'story', NULL, 'Prototype scale', 'Cancelled 2026-06-12: administrative mirror of Q-005 (resolved); no surviving open requirement.', 'cancelled', 'medium', NULL, NULL, 'Q-005', '2026-02-09 15:21:44', '2026-06-12 10:23:06', NULL, '187fa74f3477b1c151aab02f1141e09f', 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 ('06FB0TNSRW3ASVAZZNYN9M59AW', 'story', NULL, 'Target platforms', NULL, 'cancelled', 'medium', NULL, NULL, 'Q-007', '2026-02-09 15:21:44', '2026-06-12 10:23:06', NULL, '4b73cb10b8de519d6ff097d1f6cffb1c', 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 ('06FB0TNSRW3ASVAZZNYN9M59AW', 'story', NULL, 'Target platforms', 'Cancelled 2026-06-12: administrative mirror of Q-007 (resolved); no surviving open requirement.', 'cancelled', 'medium', NULL, NULL, 'Q-007', '2026-02-09 15:21:44', '2026-06-12 10:23:06', NULL, '858b65923473224fabb431a3fd8901bb', 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 ('06FB0TNSRWJYV3ZVY7D7G3P4FW', 'story', NULL, 'Character selection roster', NULL, 'cancelled', 'medium', NULL, NULL, 'Q-011', '2026-02-09 15:21:44', '2026-06-12 10:23:06', NULL, '59062c659a8bbaafed2b1b1aa3ae7114', 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 ('06FB0TNSRWJYV3ZVY7D7G3P4FW', 'story', NULL, 'Character selection roster', 'Cancelled 2026-06-12: administrative mirror of Q-011 (resolved); no surviving open requirement.', 'cancelled', 'medium', NULL, NULL, 'Q-011', '2026-02-09 15:21:44', '2026-06-12 10:23:06', NULL, '167022f80bd2d726d24acf15ad1d2a9f', 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 ('06FB0TNSRWXPRPS7G2MA786GR0', 'initiative', NULL, 'Map & Navigation', 'Implement D-010 (information boundaries), D-012 (chunk-based maps), D-013 (diegetic insert/POI navigation), D-014 revised (station district map). World structure and player navigation.', 'cancelled', 'high', NULL, NULL, 'D-010, D-012, D-013, D-014', '2026-02-10 23:14:31', '2026-06-12 10:23:06', NULL, '61398f7c2b04f52e511045b668574972', 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 ('06FB0TNSRWXPRPS7G2MA786GR0', 'initiative', NULL, 'Map & Navigation', 'Implement D-010 (information boundaries), D-012 (chunk-based maps), D-013 (diegetic insert/POI navigation), D-014 revised (station district map). World structure and player navigation.
Cancelled 2026-06-12: pre-cascade umbrella emptied by the cascade refocus children re-homed (T-50/T-52 to Phase 4, T-49/T-51 to Phase 5).', 'cancelled', 'high', NULL, NULL, 'D-010, D-012, D-013, D-014', '2026-02-10 23:14:31', '2026-06-12 10:23:06', NULL, '95c525f21dd7543ce253a5740edc5c82', 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 ('06FB0TNSRY3XYFKDGVPQR87JHM', 'initiative', NULL, 'Content Architecture', 'Implement D-023 (three-tier content model), D-025 (social site templates), D-028 (dialogue system), D-029 (population entanglement). Template system and dialogue.', 'cancelled', 'high', NULL, NULL, 'D-023, D-025, D-028, D-029', '2026-02-10 23:14:31', '2026-06-12 10:23:06', NULL, 'd8df203786f39c6e92a9d2913e10fe92', 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 ('06FB0TNSRY3XYFKDGVPQR87JHM', 'initiative', NULL, 'Content Architecture', 'Implement D-023 (three-tier content model), D-025 (social site templates), D-028 (dialogue system), D-029 (population entanglement). Template system and dialogue.
Cancelled 2026-06-12: pre-cascade umbrella emptied by the cascade refocus children re-homed (T-54 to Phase 4, T-55/T-56 to Phase 6, T-53 to gameplay parking T-1036).', 'cancelled', 'high', NULL, NULL, 'D-023, D-025, D-028, D-029', '2026-02-10 23:14:31', '2026-06-12 10:23:06', NULL, '0cbd1450dd90539f8c3832dcbc9d4777', 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 ('06FB0TNSRZK0EWD2NW4D2MGGV0', 'initiative', NULL, 'Testability Infrastructure', 'Build comprehensive testing framework for both Rust/bevy_ecs simulation and Godot 4 client. External test harness, minimal production code pollution. NEEDS REFINEMENT.
Cancelled 2026-06-12: pre-cascade umbrella test-infra children re-homed under maintenance initiative T-1037; discussion child T-64 cancelled (testing approach long established).', 'backlog', 'high', NULL, NULL, NULL, '2026-02-10 23:14:31', '2026-06-12 10:23:06', NULL, 'fec9f2d05551b0cba66b78a3551a0365', 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 ('06FB0TNSRXG2Z9ZAR42SQ9GNP4', 'epic', '06FB0TNSRZK0EWD2NW4D2MGGV0', 'Testability Architecture Refinement', 'Discussion: Jeroen + Tyre + Gestalt + Hoshe + Troblum. Determine optimal testing approach for Claude Code execution. Define patterns, constraints, tooling needs.
Cancelled 2026-06-12: discussion premise fulfilled testing approach established and documented (three-tier strategy, Gauntlet-first, D-239 harness); doc deliverables live on in T-215/T-216/T-217 under T-1037.', 'backlog', 'critical', NULL, NULL, NULL, '2026-02-10 23:17:38', '2026-06-12 10:23:06', NULL, '3e6e5ff3e35895a0ef31c0aa471eaaac', 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 ('06FB0TNSRZS8C6ZGVR5M7D3974', 'story', '06FB0TNSRXG2Z9ZAR42SQ9GNP4', 'Refinement discussion - Multi-agent', 'NEEDS REFINEMENT. Jeroen + Tyre + Gestalt + Hoshe + Troblum. Determine optimal testing approach for Claude Code. External vs integrated, patterns, constraints.', 'cancelled', 'critical', NULL, NULL, NULL, '2026-02-10 23:27:10', '2026-06-12 10:23:06', NULL, '29df606f5a3cb9358100b4f1a045ee95', 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 ('06FB0TNSRZS8C6ZGVR5M7D3974', 'story', '06FB0TNSRXG2Z9ZAR42SQ9GNP4', 'Refinement discussion - Multi-agent', 'NEEDS REFINEMENT. Jeroen + Tyre + Gestalt + Hoshe + Troblum. Determine optimal testing approach for Claude Code. External vs integrated, patterns, constraints.
Cancelled 2026-06-12: refinement-discussion artifact; testing approach since decided and documented; surviving doc work in T-215/T-216/T-217.', 'cancelled', 'critical', NULL, NULL, NULL, '2026-02-10 23:27:10', '2026-06-12 10:23:06', NULL, '135f59c8ac7fd5c181164665618c24b6', 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 ('06FB0TNSRXMPF6176KB9CSBH2C', 'story', '06FB0TNSRXD5W32VCV5YZY3NX0', 'Auto-generated apartment', 'SPLIT — see #681 (server: apartment generator logic) and #682 (client: visual rendering + first-moment sequence). Original: Player starting apartment is auto-generated to reflect economic position and cultural context. Decision D-136 (First Settled Reach moment: apartment + insert activation). Decision D-126 (Groundhog Day alarm clock homage).', 'cancelled', 'high', NULL, 'server', NULL, '2026-03-05 23:12:44', '2026-06-12 10:23:06', NULL, 'bde5feed7399cfe87c04b2c282a1ad66', 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 ('06FB0TNSRXMPF6176KB9CSBH2C', 'story', '06FB0TNSRXD5W32VCV5YZY3NX0', 'Auto-generated apartment', 'SPLIT — see #681 (server: apartment generator logic) and #682 (client: visual rendering + first-moment sequence). Original: Player starting apartment is auto-generated to reflect economic position and cultural context. Decision D-136 (First Settled Reach moment: apartment + insert activation). Decision D-126 (Groundhog Day alarm clock homage).
Cancelled 2026-06-12: administrative split shell full scope carried by T-681 (Phase 6) and T-682 (gameplay parking); no functional requirement lost.', 'cancelled', 'high', NULL, 'server', NULL, '2026-03-05 23:12:44', '2026-06-12 10:23:06', NULL, '1e10bbf0334bf20ff35499bb2e9fe499', 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 ('06FB0TNSRXAPVCJAZ0ZKGESCP4', 'initiative', NULL, 'Rendering & Perception System', 'Implement D-011 (fog of perception), D-015 (locked camera), D-016 (internal monologue), D-017 (perception modes), D-018 (3-range sound), D-019 (top-down rendering). Client-side observation systems.', 'cancelled', 'critical', NULL, NULL, 'D-011, D-015, D-016, D-017, D-018, D-019', '2026-02-10 23:14:31', '2026-06-12 10:23:06', NULL, 'e4401eadc02e74cef17b1ef213e93dfa', 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 ('06FB0TNSRXAPVCJAZ0ZKGESCP4', 'initiative', NULL, 'Rendering & Perception System', 'Implement D-011 (fog of perception), D-015 (locked camera), D-016 (internal monologue), D-017 (perception modes), D-018 (3-range sound), D-019 (top-down rendering). Client-side observation systems.
Cancelled 2026-06-12: pre-cascade umbrella emptied by the cascade refocus perception/rendering epics re-homed under Phase 5 (T-43T-48), T-234 observation/interaction loop preserved in gameplay parking T-1036.', 'cancelled', 'critical', NULL, NULL, 'D-011, D-015, D-016, D-017, D-018, D-019', '2026-02-10 23:14:31', '2026-06-12 10:23:06', NULL, '6101d3b9b540d1dba1e6fa1c14334255', 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 ('06FB0TNSRXXEKGTNRJ7Z6FTDRM', 'initiative', NULL, 'Engine Architecture - Godot + Rust IPC', 'Implement D-020: Godot 4 client + Rust/bevy_ecs simulation via subprocess/IPC. MessagePack protocol, ObserverSnapshot pattern, deterministic simulation.', 'done', 'critical', NULL, NULL, 'D-020', '2026-02-10 23:14:11', '2026-06-12 10:23:06', NULL, '03ca8a84bebb780a80b87e5b4ac28130', 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 ('06FB0TNSRXXEKGTNRJ7Z6FTDRM', 'initiative', NULL, 'Engine Architecture - Godot + Rust IPC', 'Implement D-020: Godot 4 client + Rust/bevy_ecs simulation via subprocess/IPC. MessagePack protocol, ObserverSnapshot pattern, deterministic simulation.
Closed 2026-06-12: engine architecture delivered (T-35T-38 done); the one open child (T-235 game state management) re-homed under Phase 5 epic T-749. Umbrella complete.', 'done', 'critical', NULL, NULL, 'D-020', '2026-02-10 23:14:11', '2026-06-12 10:23:06', NULL, 'b481c1488565c0b7a0457c3454b3a367', 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 ('06FB0TNSRY5G9GMPV8B0RDD1JR', 'initiative', NULL, 'Fog of perception non-negotiable', NULL, 'done', 'medium', NULL, NULL, 'D-011', '2026-02-09 15:21:44', '2026-06-12 10:23:07', NULL, '72ba932e57b004c9e757e0627496adc6', 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 ('06FB0TNSRY5G9GMPV8B0RDD1JR', 'initiative', NULL, 'Fog of perception non-negotiable', 'Closed 2026-06-12: decision-mirror initiative for D-011 (fog of perception non-negotiable). D-011 is confirmed and the fog/perception system is implemented (shadowcasting, vision cone, observer snapshots); the mirror served its purpose. Cleared from the perpetual review queue.', 'done', 'medium', NULL, NULL, 'D-011', '2026-02-09 15:21:44', '2026-06-12 10:23:07', NULL, '26db2495bc0c57c0411dc6ffcd123da3', 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 ('06FB0TNSRZE4CSS8YR0FCEXMK8', 'initiative', NULL, 'Development Cascade — 6-phase first-things-first build order', 'The Settled Reach builds core system to core system in strict cascade order. Each phase completes before the next begins. No scoping negotiations, no v0.2 target. Established 2026-03-24 during world generation workshop. See CLAUDE.md for the full cascade table.', 'in_progress', 'critical', NULL, NULL, NULL, '2026-03-25 13:28:54', '2026-06-12 10:23:07', NULL, '77e2967b4c7c1916c90b3a1320d08716', 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 ('06FB0TNSRXG2Z9ZAR42SQ9GNP4', 'epic', '06FB0TNSRZK0EWD2NW4D2MGGV0', 'Testability Architecture Refinement', 'Discussion: Jeroen + Tyre + Gestalt + Hoshe + Troblum. Determine optimal testing approach for Claude Code execution. Define patterns, constraints, tooling needs.
Cancelled 2026-06-12: discussion premise fulfilled testing approach established and documented (three-tier strategy, Gauntlet-first, D-239 harness); doc deliverables live on in T-215/T-216/T-217 under T-1037.', 'cancelled', 'critical', NULL, NULL, NULL, '2026-02-10 23:17:38', '2026-06-12 10:23:17', NULL, '232d6129e2016ef3d34b1968d322a881', 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 ('06FB0TNSRXG2Z9ZAR42SQ9GNP4', 'epic', '06FB0TNSRZK0EWD2NW4D2MGGV0', 'Testability Architecture Refinement', 'Discussion: Jeroen + Tyre + Gestalt + Hoshe + Troblum. Determine optimal testing approach for Claude Code execution. Define patterns, constraints, tooling needs.
Cancelled 2026-06-12: discussion premise fulfilled testing approach established and documented (three-tier strategy, Gauntlet-first, D-239 harness); doc deliverables live on in T-215/T-216/T-217 under T-1037.
Cancelled 2026-06-12: discussion premise fulfilled testing approach established and documented (three-tier strategy, Gauntlet-first, D-239 harness); doc deliverables live on in T-215/T-216/T-217 under T-1037.', 'cancelled', 'critical', NULL, NULL, NULL, '2026-02-10 23:17:38', '2026-06-12 10:23:17', NULL, '7d0b7fdb0c114f9307b9c392173c3b4f', 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 ('06FB0TNSRZK0EWD2NW4D2MGGV0', 'initiative', NULL, 'Testability Infrastructure', 'Build comprehensive testing framework for both Rust/bevy_ecs simulation and Godot 4 client. External test harness, minimal production code pollution. NEEDS REFINEMENT.
Cancelled 2026-06-12: pre-cascade umbrella test-infra children re-homed under maintenance initiative T-1037; discussion child T-64 cancelled (testing approach long established).', 'cancelled', 'high', NULL, NULL, NULL, '2026-02-10 23:14:31', '2026-06-12 10:23:17', NULL, '9dfd8085ccf2ad48acc1aebf61e46dc1', 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 ('06FB0TNSRZK0EWD2NW4D2MGGV0', 'initiative', NULL, 'Testability Infrastructure', 'Build comprehensive testing framework for both Rust/bevy_ecs simulation and Godot 4 client. External test harness, minimal production code pollution. NEEDS REFINEMENT.
Cancelled 2026-06-12: pre-cascade umbrella test-infra children re-homed under maintenance initiative T-1037; discussion child T-64 cancelled (testing approach long established).
Cancelled 2026-06-12: pre-cascade umbrella test-infra children re-homed under maintenance initiative T-1037; discussion child T-64 cancelled (testing approach long established).', 'cancelled', 'high', NULL, NULL, NULL, '2026-02-10 23:14:31', '2026-06-12 10:23:17', NULL, '7df7fb4a456a62bce10e65ca10c93f60', 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 ('06FB0TNSRX3R6G3Y7QR4FAJPNM', 'story', '06FB0TNSRZXCHGS16BFHSSGSV4', 'Wiki to Atlas content-set consolidation (Q-107, blocked)', 'Consolidate all wiki content (pages + heightmaps + markers + architecture-flavor) into one first-class, baked Atlas/gamedata content set with a unified bake pipeline -- instead of per-feature file conventions. Resolves where authored per-body content lives (the D-232 flavor source). BLOCKED on Q-107 (open question -- the target tree structure must be decided first). The generator-facing trait_templates + atlas_body_trait_bias tables (D-232) is invariant to this, so it does NOT block the fill seam; sequence this AFTER the fill-seam work. Jeroen: ''the wiki needs to become part of the atlas content set ... not yet another hack.''
Hygiene note 2026-06-12: title says ''blocked'' but no blocker edge exists, so this surfaced in the --unblocked feed. Labelled needs-decision; genuinely gated on Q-107 (wiki→Atlas content consolidation) — resolve Q-107 before picking this up.', 'backlog', 'low', NULL, 'server', 'Q-107', '2026-05-25 19:09:10', '2026-06-12 10:23:21', NULL, 'f2c2f8265f943f2441ea521aa63b716d', 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 ('06FB0TNSRZ8Z6NN74YKCCRCPMR', 'story', '06FB0TNSRZXCHGS16BFHSSGSV4', 'Generation validation pass + Phase 5 dependency gate', 'Validation pass: generated content reads correctly (settlements legible, walkable, named). Establishes the dependency gate that locks Phase 5 (player control, epic #749) behind Phase 4 completion per the cascade rule (D-166 amended 2026-05-22).
Gate trigger updated per D-166 amendment (2026-06-12): Phase 5 ramps in parallel once OUTSIDE generation produces deterministic, walkable exteriors the gate this ticket holds is ''outsides generate deterministically and are walkable'' (validation pass: settlements legible, walkable, named), not ''all Phase-4 polish complete''. Door-boundary contracts and remaining Phase-4 detail may continue alongside early Phase-5 work.', 'backlog', 'medium', NULL, 'server', 'D-166', '2026-05-22 17:42:34', '2026-06-12 10:23:21', NULL, '4c0e71f60b98b366e6c2f7605ef4d2b1', 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 ('06FBPQ02F02JDDBSFMGPX0XASR', 'story', '06FB0TNSRZXCHGS16BFHSSGSV4', 'Layer 2 — inter-settlement road/rail graph (MST + A* over terrain cost, MaintenanceAuthority, named-route identity)', 'Workshopped-but-unticketed cascade work captured 2026-06-12 (cascade-refocus grounding pass). Full grounded scope follows.', 'backlog', 'high', NULL, 'server', 'D-211', '2026-06-12 10:23:49', '2026-06-12 10:23:49', NULL, '08588aaf4eda07347d750feb1ea23e3c', 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 ('06FBPQ02F02JDDBSFMGPX0XASR', 'story', '06FB0TNSRZXCHGS16BFHSSGSV4', 'Layer 2 — inter-settlement road/rail graph (MST + A* over terrain cost, MaintenanceAuthority, named-route identity)', 'Workshopped-but-unticketed cascade work captured 2026-06-12 (cascade-refocus grounding pass). Full grounded scope follows.
Generate the inter-settlement road/rail graph at Layer 2 the workshopped-but-never-ticketed link between settlement placement (T-955/T-956, done) and everything that consumes transport topology. No road code exists today (zero RoadGraph/road_segment hits in server/src; TerritorialStatus shipped without its road-coverage inputs).
Scope (algorithm fully decided, docs/workshops/planet-down-cascade/tyre-round1.md:274-299):
1. MST force-connect all CityPlacements (Euclidean), then secondary direct links for city pairs within 30-60% of body scale whose MST path exceeds 1.5x Euclidean.
2. Route each edge with A* over the L1 terrain-cost field (terrain_modification_cost, D-210, server/src/atlas/subbiome.rs; cost spec: water impassable, roughness>0.7 = 10.0, river corridor = 0.5, flat = 1.0 rivers as preferred valley routes). Budget ~30ms/body (round-1-notes.md:348).
3. Assign MaintenanceAuthority per edge from endpoint relationships (5-value enum Administrative/Corporate/Communal/Trade/Abandoned generation-cascade/workshop-outcomes.md:177, resolution :257; player-readable in road condition per ozzie-round1.md:86-92).
4. Place waypoint sub-settlement nodes at midpoints of edges > ~12 regional cells (tyre-round1.md:267-272).
5. Named-route identity assignment: post-generation join of generated edges to systems.db named highway routes via optional named_route_id FK (paula-round1.md:107,:140; round-1-notes.md:322 L2-Q3 resolution under Amendment 3).
6. RailHeadFacing second pass: settlements at high-connectivity road/rail junctions get FoundingOrientation::RailHeadFacing, overriding AdminFacing-from-Synthetic (paula-round3.md:218-236) wire into attractor_matching.rs.
Storage: RoadGraph{nodes,edges} on BodyWorldState (round-1-notes.md:257-267), session-cached, never serialized runtime Rust, not systems.db (the atlas_road_nodes/atlas_road_edges schema shape carries forward per tyre-round1.md:42 but lives in session memory).
Downstream consumers (do NOT scope in, but design the output for them): road_entry_directions per city (see road-entry-octants ticket; generation-cascade/round-3-notes.md:104), TerritorialStatus quantitative road-coverage thresholds (round-1-notes.md:329-338), per-economic_role hinterland fill (round-1-notes.md:324-327, BRIEF.md:279), prosperity/atlas overlays.
Cascade-first fit: this is direction step (2) the econ layer drawn onto the world between settlements. Parent: T-750. Suggested deps: blocks the road-entry-octants ticket; references D-205 (provinces), D-210, D-211, D-212, D-213.', 'backlog', 'high', NULL, 'server', 'D-211', '2026-06-12 10:23:49', '2026-06-12 10:23:49', NULL, 'c40784a5ec08335377f6792c59db914d', 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 ('06FBPQ02KN9147H4Z12KJW7H1M', 'task', '06FB0TNSRZXCHGS16BFHSSGSV4', 'Thread political_archetype / arrangement_pattern / morphology_zone through the L3→L4 GenerateSkeleton dispatch', 'Workshopped-but-unticketed cascade work captured 2026-06-12 (cascade-refocus grounding pass). Full grounded scope follows.', 'backlog', 'high', NULL, 'server', 'D-234', '2026-06-12 10:23:49', '2026-06-12 10:23:49', NULL, '01610fdfddc224719cf3550b15b51724', 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 ('06FBPQ02KN9147H4Z12KJW7H1M', 'task', '06FB0TNSRZXCHGS16BFHSSGSV4', 'Thread political_archetype / arrangement_pattern / morphology_zone through the L3→L4 GenerateSkeleton dispatch', 'Workshopped-but-unticketed cascade work captured 2026-06-12 (cascade-refocus grounding pass). Full grounded scope follows.
Thread the remaining Layer-3 character fields through the L3->L4 GenerateSkeleton dispatch. T-1022 wired the dispatch, but build_skeleton_work_item (server/src/atlas/plugin.rs:179-212) overrides only founding_orientation (:192-193); political_archetype stays the Commission stub (city_context_reader.rs:471-474) and morphology_zone stays AlluvialPlain (:487-488) even though:
- CityPlacement already carries the real political_archetype (D-214, derived from TerritorialStatus + economic_role at attractor_matching.rs:595-602) and arrangement_pattern (D-215, city_character at :282-293) fields :49-64;
- the covering region''s real morphology_zone (D-239 §6 frozen vocab, T-1027, region_profile.rs:180/:499) is available from snapshot.layer_region, populated in the same cascade run (cascade.rs:238-240) map placement.position to its covering region cell.
Consequences of the stubs: skeleton_gen''s morphology gating (D-234a Topology selection) always takes the AlluvialPlain Prim-MST mesh path fjord/delta cities get plains street networks; block_irregularity/layout-mode always sees Commission (skeleton_gen.rs:68-77). D-234''s implementation note explicitly lists this threading as the pending dependency of the (done, tested, dormant) morphology-gated street rules.
Also decide arrangement_pattern''s path: CityGenerationContext has NO arrangement_pattern field (generator.rs:1078 has political_archetype only; ArrangementPattern :442 is defined but unconsumed at L4). Either (a) add the field and have skeleton_gen consume the D-215 explicit pattern, or (b) record that L4 derives layout from archetype alone and the placement''s pattern is Atlas/UI-only. Option (a) matches the workshop intent (ozzie-round1.md:112-118 backs explicit arrangement).
Miri''s queryability requirement (tile-derivation-contract/tyre-round1.md:308-311) morphology_zone readable at Atlas-generation time is satisfied by reading from BodyWorldState regions, no recompute.
Acceptance: dispatch a body with a FjordWall-region coastal placement in a CorpTerritory province -> the generated quarter uses Ribbon topology and CompanyTown-class layout, not mesh+Commission. Parent: T-750. Refs: D-214, D-215, D-228, D-234, D-239 §6; T-1022 (predecessor), T-983, T-1014 (adjacent, different fields).', 'backlog', 'high', NULL, 'server', 'D-234', '2026-06-12 10:23:49', '2026-06-12 10:23:49', NULL, '5079cc1b2a704183c368b377244a8a4e', 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 ('06FBPQ02QTVSZ1PXTGNCN6Y8KM', 'bug', '06FB0TNSRZXCHGS16BFHSSGSV4', 'BUG: river channel centrelines anchored to the world-origin axis — channels absent in almost every chunk', 'Workshopped-but-unticketed cascade work captured 2026-06-12 (cascade-refocus grounding pass). Full grounded scope follows.', 'backlog', 'high', NULL, 'server', 'D-239', '2026-06-12 10:23:49', '2026-06-12 10:23:49', NULL, '14718b3824035133a5f018e209941e99', 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 ('06FBPQ02QTVSZ1PXTGNCN6Y8KM', 'bug', '06FB0TNSRZXCHGS16BFHSSGSV4', 'BUG: river channel centrelines anchored to the world-origin axis — channels absent in almost every chunk', 'Workshopped-but-unticketed cascade work captured 2026-06-12 (cascade-refocus grounding pass). Full grounded scope follows.
BUG: channel centrelines are anchored to the world-origin axis. compute_channel_state (AlluvialPlain, server/src/atlas/voxel.rs:1648-1707) and compute_meander_channel_state (MeanderReach, :1556-1595) compute perp_distance = (cross - meander_displacement).abs() (:1694, :1583) where cross is the raw world-space voxel coordinate (derive_voxel_column takes tile_x/tile_y in world metres, :328-338; cross = vx or vy at :1653-1661). The channel centreline is therefore the world x=0/y=0 axis plus-or-minus meander amplitude: only chunks within ~(channel_width/2 + amplitude + jitter) metres of the world origin axis ever contain channel water, regardless of ChunkContext.has_active_channel / channel_width_m (chunk_context.rs:103-110). in_levee_band (:1602-1633) inherits the same defect, so levees are origin-locked too. Every has_active_channel chunk elsewhere on the body silently renders dry floodplain.
Intended model (workshopped): channel positions derive from region/chunk-scale data, not world axes D-239 §10 (one basin-direction + global meander-curve params; wavelength > 64 m seeds Region-or-higher) and tile-derivation-contract/gestalt-round1.md:152-162 (channel branch positions from a multi-seed Voronoi partition of the chunk area with D8 flow direction as attractor; meander_intensity controls deviation from the straight downslope path).
Fix, two stages:
1. Minimal correctness: derive a deterministic cross-offset channel anchor at region scale (alongside meander_phase in derive_chunk_context, chunk_context.rs:124-141 same Region-or-higher seed path) and measure perp_distance from that anchor, so an active channel actually crosses the chunks the region says it crosses, continuously across chunk boundaries.
2. Full model: gestalt''s multi-seed Voronoi + D8-attractor branch placement when BraidedDelta sub-classification (D-239 implementation note: deferred to ChunkContext) lands.
Add a T-1031-harness believability check: a has_active_channel chunk at an arbitrary large world offset (e.g. chunk_pos (1000, -750)) contains in-channel voxels; channel position is continuous across adjacent chunk pairs. Sibling bug: landform-64m-repeat (same family, opposite direction channels appear nowhere, landforms appear everywhere). Parent: T-750. Refs: D-239 §10, D-208 (D8), D-010; T-1029 (origin), T-1031 (harness).', 'backlog', 'high', NULL, 'server', 'D-239', '2026-06-12 10:23:49', '2026-06-12 10:23:49', NULL, 'f260380c0c57cab5233fc47a0b220461', 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 ('06FBPQ02VWJGXWDYT2SMXM9DTC', 'bug', '06FB0TNSRZXCHGS16BFHSSGSV4', 'BUG: fjord/cliff/gorge/delta landforms repeat on the 64 m chunk grid (D-239 §10 violation)', 'Workshopped-but-unticketed cascade work captured 2026-06-12 (cascade-refocus grounding pass). Full grounded scope follows.', 'backlog', 'high', NULL, 'server', 'D-239', '2026-06-12 10:23:49', '2026-06-12 10:23:49', NULL, 'be00a918d51ac4a1529097175f01dcd2', 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 ('06FBPQ02VWJGXWDYT2SMXM9DTC', 'bug', '06FB0TNSRZXCHGS16BFHSSGSV4', 'BUG: fjord/cliff/gorge/delta landforms repeat on the 64 m chunk grid (D-239 §10 violation)', 'Workshopped-but-unticketed cascade work captured 2026-06-12 (cascade-refocus grounding pass). Full grounded scope follows.
BUG: four morphology generators fold world coordinates into the 64 m chunk frame, so region-scale landforms repeat every chunk violating D-239 §10 (''features with wavelength > 64 m seed from Region-or-higher, not the chunk seed''; deliberately strengthened from Block-or-higher in the adversarial verification pass, tile-derivation-contract/workshop-outcomes.md:83).
Sites (server/src/atlas/voxel.rs):
- generate_fjord_wall :594-597 cross.rem_euclid(64)-32: a complete fjord (floor|moraine|wall cross-section) centred in EVERY chunk of a FjordWall region; a real fjord valley is one feature spanning the region.
- generate_cliff_coast :721 seaward_coord.rem_euclid(64): the cliff face sits at intra-chunk offset 48-55 in every chunk, sawtoothing the coastline at 64 m pitch.
- generate_braided_delta :825 cross.rem_euclid(64): the same three braid threads restart per chunk instead of anastomosing across the fan.
- generate_incised_gorge :1054-1057 same fold: a gorge per chunk.
Fix: compute each landform''s axis/centreline in REGION-anchored coordinates derive the feature anchor (centreline position, coast-face line) once per region from the region-scale seed path that meander_phase/basin_direction already use correctly (chunk_context.rs:124-141), then measure each voxel''s distance to that anchor in continuous world coordinates (no rem_euclid against the chunk size). This matches the workshop''s seam-freedom principle: the algorithm must see positions with no knowledge of the chunk grid (tyre-round1.md:174-176). Preserve D-239 §9 chokepoint widths (fjord floor 4-8 m, gorge floor 2-8 m currently honoured at :607-609, :1059-1062).
Harness gap to close (T-1031 follow-up): current tests check per-chunk boundary smoothness, not feature uniqueness add a multi-chunk assertion that a FjordWall/IncisedGorge region contains ONE valley spanning its chunks, and a CliffCoast region one continuous (warp-displaced) coast line. Sibling bug: river-channel-anchor (channels are origin-anchored and appear nowhere; landforms are chunk-folded and appear everywhere fix both against the same region-anchor mechanism). Depends on scale-anchoring Q for the region''s physical extent, but the region-index anchor works regardless. Parent: T-750. Refs: D-239 §5/§8/§9/§10, D-010; T-1029, T-1031.', 'backlog', 'high', NULL, 'server', 'D-239', '2026-06-12 10:23:49', '2026-06-12 10:23:50', NULL, '47206289748cad953d760f41bd60fb03', 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 ('06FBPQ0308CFF9WKNGBBYQ763W', 'task', '06FB0TNSRZXCHGS16BFHSSGSV4', 'Cross-region parameter blending at chunk/voxel scale (replace single-profile walking skeleton)', 'Workshopped-but-unticketed cascade work captured 2026-06-12 (cascade-refocus grounding pass). Full grounded scope follows.', 'backlog', 'medium', NULL, 'server', 'D-239', '2026-06-12 10:23:50', '2026-06-12 10:23:50', NULL, '2d06c86d7704f839f8e18d491d060b84', 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 ('06FBPQ0308CFF9WKNGBBYQ763W', 'task', '06FB0TNSRZXCHGS16BFHSSGSV4', 'Cross-region parameter blending at chunk/voxel scale (replace single-profile walking skeleton)', 'Workshopped-but-unticketed cascade work captured 2026-06-12 (cascade-refocus grounding pass). Full grounded scope follows.
Implement cross-region parameter blending at the chunk/voxel scale, replacing the walking-skeleton single-profile restriction (server/src/atlas/chunk_context.rs:119-123: ''in the future a blend of adjacent profiles will handle cross-region chunk seams''). Today every voxel generator reads the one covering RegionProfile''s values directly (region.elev_q at voxel.rs:614, :731, :1067-1068; channel/meander params likewise), so continuous parameters step discontinuously at every region-grid border elevation cliffs at the region pitch, visible as a grid at Atlas/voxel scale.
Design is decided stay inside the D-239 §7 seam policy:
- NEVER blend morphology family selection. Family seams are prevented at source (gate ordering + build-time compatibility matrix) or kept sharp (cliff-fjord, lithology faults are real geology). Tyre''s cross-family elevation-blend was explicitly resolved against (D-239 dissent line).
- DO blend continuous positional parameters: elevation, channel width, meander wavelength/phase, freeze/moisture scalars. Mechanism from tile-derivation-contract/tyre-round1.md: ChunkContext gains secondary: Option<RegionProfile> + blend_weight: u8 (255 = fully primary; :123-125), blend zone one chunk (64 m) each side of the region border (:101-102); derive_voxel resolves parameters from both profiles and integer-blends BEFORE material selection (:217-220), reusing the same warp offset so the blend seam cannot align with the chunk edge; elevation sampled bilinearly from the region grid to chunk resolution (:130, the elevation_grid sketch).
- D-010 discipline: integer blend arithmetic; the f64 path only for position math per D-239 §4.
Note: region size in metres is currently ambiguous (see the scale-anchoring Q-record) the blend can be implemented against the region grid index regardless, but the Q should be resolved before tuning blend-zone width in metres.
Acceptance: T-1031 harness cross-region chunk pairs show no elevation step exceeding the lithology-permitted slope (D-239 §8) at region borders; family seams remain sharp; determinism golden-seed unchanged for chunks far from borders. Parent: T-750. Refs: D-239 §4/§7/§8, D-010; Q-102; T-1026/T-1028/T-1029 (predecessors).', 'backlog', 'medium', NULL, 'server', 'D-239', '2026-06-12 10:23:50', '2026-06-12 10:23:50', NULL, 'fb33e89b93753d08f1056f28a9dcf6dc', 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 ('06FBPQ034DKN4ENSGX5HTYTBJG', 'task', '06FB0TNSRZXCHGS16BFHSSGSV4', 'Derive road_entry_directions at L3 and thread through the dispatch (interim: MST-neighbor bearings + water_bearing)', 'Workshopped-but-unticketed cascade work captured 2026-06-12 (cascade-refocus grounding pass). Full grounded scope follows.', 'backlog', 'medium', NULL, 'server', 'D-234', '2026-06-12 10:23:50', '2026-06-12 10:23:50', NULL, '4b3a52bda75e3abf6bed5fbbb566a76c', 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 ('06FBPQ034DKN4ENSGX5HTYTBJG', 'task', '06FB0TNSRZXCHGS16BFHSSGSV4', 'Derive road_entry_directions at L3 and thread through the dispatch (interim: MST-neighbor bearings + water_bearing)', 'Workshopped-but-unticketed cascade work captured 2026-06-12 (cascade-refocus grounding pass). Full grounded scope follows.
Derive road_entry_directions at Layer 3 and thread them through the GenerateSkeleton dispatch. CityGenerationContext.road_entry_directions (server/src/simulation/generator.rs:1083-1084, compass octants 0=N..7=NW) is stubbed empty (city_context_reader.rs:478-479) and never overridden by the T-1022 dispatch, so derive_access_points (skeleton_gen.rs:1008-1036) never emits QuarterEdge access nodes every quarter falls back to reservation gates or a single central BlockJunction (:1029-1034), and the D-234 arterial graph has no outward connection to the world.
Workshop contract: the field is a per-city output of the inter-settlement road graph (generation-cascade/round-3-notes.md:104 ''Layer C: Road graph (road_entry_directions per city)''; burnelli-sheldon-round4.md:308). Full-fidelity derivation therefore lands with the inter-settlement-transport ticket: octant = bearing of each connecting road edge where it crosses the city footprint radius (D-204 footprint), de-duplicated per octant, retaining per-entry quality for the consumer rule below.
Interim derivation (no road graph required, deterministic, replace-don''t-rework): derive octants at L3 from (a) bearings to the settlement''s MST-neighbor placements (positions already in BodyWorldState.placements) and (b) the founding-orientation water bearing (TerrainAnalysis::water_bearing, 8-octant integer D-234 implementation note) for port/river settlements. Thread through build_skeleton_work_item (plugin.rs:179-212) next to the founding_orientation override.
Consumer rule to honour (already decided): the AdminFacing arrangement pattern picks its prestige edge as the edge facing the highest-quality road entry (paula-round2.md:428-433, paula-round3.md:320-322) so the octant list should be ordered or annotated by quality once the graph exists. Player-experience intent: the approach should present the city''s FoundingOrientation face (ozzie-round1.md:96-100).
Acceptance: a dispatched settlement with >=1 neighbor produces >=1 AccessKind::QuarterEdge node on the correct octant; the BlockJunction fallback fires only for genuinely isolated settlements. Parent: T-750. Blocked-by (soft): inter-settlement-transport ticket for full fidelity. Refs: D-234, D-213, D-204; T-990 (consumer, done), T-1022 (dispatch, done).', 'backlog', 'medium', NULL, 'server', 'D-234', '2026-06-12 10:23:50', '2026-06-12 10:23:50', NULL, '6fd8ab9c614fad67a56d43d9a7d1f9bf', 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 ('06FBPQ0381QWDAQABZAY7MRD8M', 'task', '06FB0TNSRZXCHGS16BFHSSGSV4', 'Cache TerrainAnalysis on Layer1Output — drop the redundant per-body drainage re-run', 'Workshopped-but-unticketed cascade work captured 2026-06-12 (cascade-refocus grounding pass). Full grounded scope follows.', 'backlog', 'medium', NULL, 'server', 'D-203', '2026-06-12 10:23:50', '2026-06-12 10:23:50', NULL, 'faf98efa168dfd6a6d1b5e49ff6e63e2', 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 ('06FBPQ0381QWDAQABZAY7MRD8M', 'task', '06FB0TNSRZXCHGS16BFHSSGSV4', 'Cache TerrainAnalysis on Layer1Output — drop the redundant per-body drainage re-run', 'Workshopped-but-unticketed cascade work captured 2026-06-12 (cascade-refocus grounding pass). Full grounded scope follows.
Drop the redundant per-body drainage + terrain re-run in the RegionProfile cascade layer by caching TerrainAnalysis on Layer1Output. cascade.rs:213-241: run_layer1 already computes drainage and (transitively) the terrain masks, but Layer1Output (layer1.rs:28-41) stores only river_network/basins/attractors so the RegionProfile arm re-runs drainage::analyze (:228-233) AND TerrainAnalysis::analyze (:234) on every AnalyzeBody. The in-code PERF/TODO (:219-221) cites T-1028, which is closed; T-1032 then wired the real body_params read, making this a live production cost on every analyzed body (:221-224). Drainage alone is ~50ms of the ~82ms Layer-1 subtotal (planet-down-cascade/round-1-notes.md:300-306), so the re-run roughly doubles the dominant per-body cost.
Scope (the TODO already prescribes it):
1. Carry TerrainAnalysis (features.rs:66+) on Layer1Output or a parallel field on the cascade snapshot, populated once in run_layer1.
2. Reuse it at cascade.rs:228-234 for region_profile::derive_all_regions.
3. Memory check: TerrainAnalysis holds several full-working-grid Vecs and Layer1Output rides the BodyWorldState LRU (D-203) either store the slim subset region derivation actually reads, or drop the analysis from the cached state after the region layer runs.
4. Validate combined cost against the D-239 §10 ~45 ms/body budget in the T-1031 verification harness (the TODO''s own acceptance criterion).
Pure refactor: derivation inputs unchanged, so T-952 golden-seed outputs must be byte-identical assert it. Also update the stale TODO text (it references a closed ticket). Parent: T-750. Refs: D-239 §10, D-203; T-1028/T-1031/T-1032 (context), T-952 (determinism gate).', 'backlog', 'medium', NULL, 'server', 'D-203', '2026-06-12 10:23:50', '2026-06-12 10:23:50', NULL, '63b7bd8220b902524fb879256990dfb1', 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);
+1 -1
View File
@@ -46,7 +46,7 @@ Development follows a strict cascade. Each phase has a concrete deliverable. **D
**v0.2 target is dropped.** No scoping negotiations. Build the base systems fully.
**Generation before player (D-166, amended 2026-05-22).** No player-control or in-world rendering work begins until the generator can deterministically seed-generate every tile of every world via the full multilayer cascade. There is **no hand-made test map** — test layers are produced by the generator itself once layer-drawing begins. Progress is viewed through the implant **Atlas** (per-layer maps), which already exists (Phase 3). The current in-world rendering code is **left as-is until Phase 5** — do not build on it or rip it out before then.
**Generation before player (D-166, amended 2026-05-22 and 2026-06-12).** The world is built **outside-in**: geo layer → economic layer drawn onto the world (cities, buildings, streets, blocks, inter-settlement roads/rail) → building templates → **door boundary contracts** to building insides → only then the background NPC layer + interiors (Phase 6) → only then gameplay/scenarios ("making it a game again", parked in epic T-1036). Player control and visual rendering (Phase 5) ramp **in parallel once outside generation produces walkable exteriors** (gate held by T-962) — not before. There is **no hand-made test map** — test layers are produced by the generator itself. Progress is viewed through the implant **Atlas** (per-layer maps), which already exists (Phase 3). The current in-world rendering code is **left as-is until Phase 5** — do not build on it or rip it out before then. Guiding statement: *before this is a game, it is a Reach a character can travel through.* Phase-independent maintenance/test debt lives under initiative T-1037, not a phase epic.
## Work Modes
@@ -2,11 +2,14 @@
title: "Character Creation Screen Wireframe"
description: "UI layout specification for the character creation screen — wireframe deliverable for ticket #685"
type: design
status: active
status: superseded
sprint: 28
ticket: 685
created: 2026-03-19
superseded_by: "D-166"
---
> **SUPERSEDED (2026-06-12, cascade-refocus sweep):** superseded by D-166 (Phase 5 player work; built on the superseded D-115 skills+bookmark scope — the D-146 tile-scale preview decision still stands). Kept as historical record; do not build against it.
# Character Creation Screen Wireframe
+4 -1
View File
@@ -2,13 +2,16 @@
title: "Content Directory Structure"
description: "Source of truth for the content/ directory layout, schemas, validation pipeline, and mod-compatible conventions"
type: design
status: active
status: superseded
ticket: "#384"
decision_refs: [D-024, D-027, D-028, D-032, D-034, D-035, D-036, D-049, D-057]
author: ""
created: 2026-02-19
updated: 2026-02-19
superseded_by: "docs/design/content-structure-canonical.md"
---
> **SUPERSEDED (2026-06-12, cascade-refocus sweep):** superseded by docs/design/content-structure-canonical.md (the canonical doc explicitly supersedes this v0.1 layout). Kept as historical record; do not build against it.
# Content Directory Structure — The Settled Reach v0.1
+2 -2
View File
@@ -1,5 +1,5 @@
---
title: "Content Structure — Canonical Template (v0.2+)"
title: "Content Structure — Canonical Template"
description: "Post-cleanup canonical directory layout for campaign content, superseding v0.1 content-directory-structure"
type: design
status: active
@@ -10,7 +10,7 @@ created: 2026-03-13
updated: 2026-03-13
---
# Content Structure — Canonical Template (v0.2+)
# Content Structure — Canonical Template
**Created:** 2026-03-13 (Sprint 26, #656 cleanup)
**Supersedes:** `content-directory-structure.md` v0.1 design spec (that doc describes the *removed* structure)
+4 -1
View File
@@ -2,13 +2,16 @@
title: "Faction Mechanics Reference"
description: "Quick reference for six-faction gameplay systems including resources, blind spots, and reputation mechanics"
type: design
status: active
status: superseded
ticket: ""
decision_refs: []
author: ""
created: 2026-02-19
updated: 2026-02-19
superseded_by: "docs/design/systems-framework.md + the wiki faction pages"
---
> **SUPERSEDED (2026-06-12, cascade-refocus sweep):** superseded by docs/design/systems-framework.md + the wiki faction pages (the political model was rebuilt as the institutional systems framework across 301 systems). Kept as historical record; do not build against it.
# Faction Mechanics Reference
+4 -1
View File
@@ -2,13 +2,16 @@
title: "First 5 Minutes Experience Design"
description: "Systemic opening sequence design for both characters covering triggers, beat sequences, and seed variants"
type: design
status: active
status: superseded
ticket: "#259"
decision_refs: [D-027, D-032, D-041]
author: "Paula"
created: 2026-02-19
updated: 2026-02-19
superseded_by: "D-166"
---
> **SUPERSEDED (2026-06-12, cascade-refocus sweep):** superseded by D-166 (gameplay/scenario design is last in the cascade; the detective/smuggler frame was abandoned per D-117). Kept as historical record; do not build against it.
# First 5 Minutes Experience Design
+4 -1
View File
@@ -2,13 +2,16 @@
title: "Insert/HUD Wireframe and Visual Specification — v0.1"
description: "Neural lattice insert HUD layout, entity markers, border arrows, and interaction states for the diegetic UI"
type: design
status: active
status: superseded
ticket: "#314"
decision_refs: [D-013, D-014, D-019, D-031, D-033, D-048, D-049, D-051, D-056, D-057, D-059, D-065, D-066, D-117]
author: "Araminta"
created: 2026-02-24
updated: 2026-03-13
superseded_by: "D-169"
---
> **SUPERSEDED (2026-06-12, cascade-refocus sweep):** superseded by D-169 (implant UI component library) + D-170 (HUD visibility groups). Kept as historical record; do not build against it.
# Insert/HUD Wireframe and Visual Specification — v0.1
+4 -1
View File
@@ -2,13 +2,16 @@
title: "Interaction Verb Specification v0.1"
description: "Seven interaction verbs, single context-sensitive action button, and verbs[] architecture for player-world interaction"
type: design
status: active
status: superseded
ticket: "#402"
decision_refs: [D-005, D-011, D-015, D-027, D-028, D-032, D-035, D-041, D-044, D-051, D-054, D-060]
author: ""
created: 2026-02-12
updated: 2026-02-12
superseded_by: "D-166"
---
> **SUPERSEDED (2026-06-12, cascade-refocus sweep):** superseded by D-166 (player interaction is Phase 5 work on the generated world). Kept as historical record; do not build against it.
# Interaction Verb Specification v0.1
+4 -1
View File
@@ -2,13 +2,16 @@
title: "Knowledge Flags — v0.1 Quick Reference"
description: "Quick reference of valid fact IDs, prerequisite formats, and starting knowledge for monologue content authoring"
type: design
status: active
status: superseded
ticket: "#309"
decision_refs: [D-028, D-035, D-041, D-075]
author: ""
created: 2026-02-19
updated: 2026-02-19
superseded_by: "D-122"
---
> **SUPERSEDED (2026-06-12, cascade-refocus sweep):** superseded by D-122 (all NPCs generated — no hand-authored starting knowledge) + D-166. Kept as historical record; do not build against it.
# Knowledge Flags — v0.1 Quick Reference
@@ -2,13 +2,16 @@
title: "Meridian Coverage Map — Sova Transit District"
description: "Zone-by-zone Meridian network coverage map with gameplay implications for investigation and smuggling"
type: design
status: active
status: superseded
ticket: "#335"
decision_refs: [D-017, D-018, D-036, D-037]
author: "Miri"
created: 2026-02-19
updated: 2026-02-19
superseded_by: "D-166"
---
> **SUPERSEDED (2026-06-12, cascade-refocus sweep):** superseded by D-166 (the hand-built Transit District is replaced by the generated world; coverage becomes a generator output — D-017/D-018 themselves survive). Kept as historical record; do not build against it.
# Meridian Coverage Map — Sova Transit District
**Ticket:** #335
+4 -1
View File
@@ -2,13 +2,16 @@
title: "Mirror Moment Design Document"
description: "Seven core mirror moments where the same trigger fires different monologue for smuggler and detective"
type: design
status: active
status: superseded
ticket: "#329"
decision_refs: [D-032, D-034, D-039]
author: ""
created: 2026-02-19
updated: 2026-02-19
superseded_by: "D-122"
---
> **SUPERSEDED (2026-06-12, cascade-refocus sweep):** superseded by D-122 (no named characters) + D-132 (consequence replaces the complicity frame). Kept as historical record; do not build against it.
# Mirror Moment Design Document
@@ -2,13 +2,16 @@
title: "Monologue Content Architecture"
description: "Authoring contract for internal monologue: interpretive frames, five categories, trigger mappings, volume targets, and prerequisite design"
type: design
status: active
status: superseded
ticket: "#253"
decision_refs: [D-016, D-032, D-034, D-035, D-041]
author: "Mellanie"
created: 2026-02-20
updated: 2026-02-20
superseded_by: "D-032 supersession note"
---
> **SUPERSEDED (2026-06-12, cascade-refocus sweep):** superseded by D-032 supersession note (per-character pools deferred) + D-166 Phase 6 (monologue as a system, D-016, survives). Kept as historical record; do not build against it.
# Monologue Content Architecture
+4 -1
View File
@@ -2,13 +2,16 @@
title: "Placeholder Art Specification v0.1"
description: "Technical requirements for procedural placeholder art assets with zero image files"
type: design
status: active
status: superseded
ticket: "#133"
decision_refs: [D-043, D-046, D-047, D-049, D-066]
author: "Araminta"
created: 2026-02-19
updated: 2026-02-19
superseded_by: "D-235"
---
> **SUPERSEDED (2026-06-12, cascade-refocus sweep):** superseded by D-235 (building-exterior visual grammar) + D-228 (composite tile schema). NOTE: the 64 px visual-tile constant defined here remains normative until re-homed into D-228/a client constants reference. Kept as historical record; do not build against it.
# The Settled Reach — Placeholder Art Specification v0.1
+4 -1
View File
@@ -2,13 +2,16 @@
title: "Span Gate Transit Schedule"
description: "Canonical daily transit schedule driving NPC routines, ring operational windows, and investigation timelines"
type: design
status: active
status: superseded
ticket: "#336"
decision_refs: [D-031, D-036, D-050]
author: "Miri"
created: 2026-02-19
updated: 2026-02-19
superseded_by: "D-166"
---
> **SUPERSEDED (2026-06-12, cascade-refocus sweep):** superseded by D-166 (NPC routines/schedules become generator+economics outputs; gate-transit lore lives in the wiki). Kept as historical record; do not build against it.
# Span Gate Transit Schedule — Sova Transit District
**Ticket:** #336
+4 -1
View File
@@ -2,13 +2,16 @@
title: "Spatial Layout: The Last Shift (Bar)"
description: "Tile-level floor plan, sightline analysis, and zone breakdown for the bar with NPC traffic annotations"
type: design
status: active
status: superseded
ticket: "#312"
decision_refs: [D-043]
author: "Araminta"
created: 2026-02-19
updated: 2026-02-19
superseded_by: "D-166"
---
> **SUPERSEDED (2026-06-12, cascade-refocus sweep):** superseded by D-166 (hand-built layouts are replaced by generated building templates — outside-in order: templates, then door contracts, then interiors). Kept as historical record; do not build against it.
# Spatial Layout: The Last Shift (Bar)
+4 -1
View File
@@ -2,13 +2,16 @@
title: "Spatial Layout: Gate Cluster"
description: "Floor plan and sightline analysis for the span gate processing facility with dual-z observation gallery"
type: design
status: active
status: superseded
ticket: "#153"
decision_refs: [D-095]
author: "Araminta"
created: 2026-02-25
updated: 2026-03-05
superseded_by: "D-166"
---
> **SUPERSEDED (2026-06-12, cascade-refocus sweep):** superseded by D-166 (generated building templates replace hand-built layouts). Kept as historical record; do not build against it.
# Spatial Layout: Gate Cluster (Span Gate Processing Facility)
@@ -2,13 +2,16 @@
title: "Spatial Layout: Smuggling Spaces and Transition Corridors"
description: "Ring operational footprint overlay covering restricted storage, maintenance corridors, dead-drops, and transition corridor"
type: design
status: active
status: superseded
ticket: "#313"
decision_refs: []
author: "Araminta"
created: 2026-02-19
updated: 2026-02-19
superseded_by: "D-166 + D-117 supersession"
---
> **SUPERSEDED (2026-06-12, cascade-refocus sweep):** superseded by D-166 + D-117 supersession (the smuggler frame is abandoned; layouts become generator output). Kept as historical record; do not build against it.
# Spatial Layout: Smuggling Spaces and Transition Corridors
+4 -1
View File
@@ -2,13 +2,16 @@
title: "Spatial Layout: The Terminal (Sova Logistics Hub)"
description: "Tile-level floor plan, sightline analysis, and zone breakdown for the logistics hub with narrative triangle notes"
type: design
status: active
status: superseded
ticket: "#311"
decision_refs: []
author: "Araminta"
created: 2026-02-19
updated: 2026-02-19
superseded_by: "D-166"
---
> **SUPERSEDED (2026-06-12, cascade-refocus sweep):** superseded by D-166 (generated building templates replace hand-built layouts). Kept as historical record; do not build against it.
# Spatial Layout: The Terminal (Sova Logistics Hub)
+4 -1
View File
@@ -2,13 +2,16 @@
title: "THE FRIEND Visual Treatment"
description: "Visual specification for THE FRIEND NPC pattern: no special marking, earned detail, green-to-amber colour transition"
type: design
status: active
status: superseded
ticket: "#318"
decision_refs: [D-027, D-033, D-034, D-044, D-047, D-052, D-063]
author: "Araminta"
created: 2026-02-20
updated: 2026-02-20
superseded_by: "D-122"
---
> **SUPERSEDED (2026-06-12, cascade-refocus sweep):** superseded by D-122 (all NPCs generated — the named v0.1 FRIENDs are gone; the D-034 FRIEND pattern itself survives). Kept as historical record; do not build against it.
# THE FRIEND — Visual Treatment Specification
+4 -1
View File
@@ -2,13 +2,16 @@
title: "v0.1 Wow Moment Content Checklist"
description: "Delivery status tracker for all six D-039 wow moments with content deliverables and implementation dependencies"
type: design
status: active
status: superseded
ticket: "#400"
decision_refs: [D-027, D-032, D-034, D-035, D-038, D-039, D-041, D-054, D-056, D-058, D-059]
author: ""
created: 2026-02-12
updated: 2026-02-12
superseded_by: "D-166"
---
> **SUPERSEDED (2026-06-12, cascade-refocus sweep):** superseded by D-166 (its governing D-039 is already superseded; the cascade replaces the v0.1 delivery program). Kept as historical record; do not build against it.
# v0.1 Wow Moment Content Checklist
+4 -1
View File
@@ -2,13 +2,16 @@
title: "v0.1 Visual Grammar"
description: "Source of truth for all v0.1 visual decisions: zone palettes, entity colours, z-level stack, typography, and animation tiers"
type: design
status: active
status: superseded
ticket: ""
decision_refs: [D-033, D-043, D-044, D-045, D-046, D-047, D-048, D-049, D-052, D-056, D-057, D-059, D-061, D-066]
author: "Araminta"
created: 2026-02-19
updated: 2026-02-20
superseded_by: "D-235/D-228"
---
> **SUPERSEDED (2026-06-12, cascade-refocus sweep):** superseded by D-235/D-228 (generated-world visual grammar) + docs/design/character-visuals-spec.md (character rules). Kept as historical record; do not build against it.
# The Settled Reach — v0.1 Visual Grammar
+4 -1
View File
@@ -2,13 +2,16 @@
title: "Character Voice Speech Patterns"
description: "Sentence-level execution rules for both characters: contractions, punctuation, starters, stress markers, and verbal tics"
type: design
status: active
status: superseded
ticket: "#310"
decision_refs: []
author: "Mellanie"
created: 2026-02-13
updated: 2026-02-13
superseded_by: "D-122"
---
> **SUPERSEDED (2026-06-12, cascade-refocus sweep):** superseded by D-122 (no named characters) + D-138 (LLM re-voicing pipeline carries NPC voice). Kept as historical record; do not build against it.
# Character Voice Speech Patterns
+10 -8
View File
@@ -180,13 +180,13 @@ line in place — keep the Q-record for the audit trail rather than deleting it.
- [D-111: MobileChunk Idle State Covers Stationary Player Installations](decisions/architecture.md#d-111-mobilechunk-idle-state-covers-stationary-player-installations) — _architecture_
- [D-112: No Separate Location Instancing System](decisions/architecture.md#d-112-no-separate-location-instancing-system) — _architecture_
- [D-113: Tile data model — extensible per-tile properties](decisions/architecture.md#d-113-tile-data-model--extensible-per-tile-properties) — _architecture_
- [D-114: v0.2 proof-of-life — generator + graphics, not hand-built slice](decisions/scope.md#d-114-v02-proof-of-life--generator--graphics-not-hand-built-slice) — _scope_
- [D-115: Character creation scoped to skills + bookmark for v0.2](decisions/scope.md#d-115-character-creation-scoped-to-skills--bookmark-for-v02) — _scope_
- [D-114: v0.2 proof-of-life — generator + graphics, not hand-built slice [SUPERSEDED]](decisions/scope.md#d-114-v02-proof-of-life--generator--graphics-not-hand-built-slice-superseded) — _scope_
- [D-115: Character creation scoped to skills + bookmark for v0.2 [SUPERSEDED]](decisions/scope.md#d-115-character-creation-scoped-to-skills--bookmark-for-v02-superseded) — _scope_
- [D-116: Religion is not a game system](decisions/scope.md#d-116-religion-is-not-a-game-system) — _scope_
- [D-117: Tycoon is the v0.2 bookmark — zero investigation content](decisions/scope.md#d-117-tycoon-is-the-v02-bookmark--zero-investigation-content) — _scope_
- [D-118: Small business owner starting state — tycoon is aspiration, not starting position](decisions/scope.md#d-118-small-business-owner-starting-state--tycoon-is-aspiration-not-starting-position) — _scope_
- [D-117: Tycoon is the v0.2 bookmark — zero investigation content [SUPERSEDED]](decisions/scope.md#d-117-tycoon-is-the-v02-bookmark--zero-investigation-content-superseded) — _scope_
- [D-118: Small business owner starting state — tycoon is aspiration, not starting position [SUPERSEDED]](decisions/scope.md#d-118-small-business-owner-starting-state--tycoon-is-aspiration-not-starting-position-superseded) — _scope_
- [D-119: Generator spike confirmed for Sprint 25 — critical path](decisions/scope.md#d-119-generator-spike-confirmed-for-sprint-25--critical-path) — _scope_
- [D-120: No skill ceiling in v0.2 — transhumanist ladder deferred](decisions/scope.md#d-120-no-skill-ceiling-in-v02--transhumanist-ladder-deferred) — _scope_
- [D-120: No skill ceiling in v0.2 — transhumanist ladder deferred [SUPERSEDED]](decisions/scope.md#d-120-no-skill-ceiling-in-v02--transhumanist-ladder-deferred-superseded) — _scope_
- [D-121: Voice is culture-driven — job as modifier](decisions/content.md#d-121-voice-is-culture-driven--job-as-modifier) — _content_
- [D-122: All NPCs generated — no named hand-authored characters](decisions/content.md#d-122-all-npcs-generated--no-named-hand-authored-characters) — _content_
- [D-123: Generative AI for NPC content — build-time authoring tool and runtime voice pipeline](decisions/content.md#d-123-generative-ai-for-npc-content--build-time-authoring-tool-and-runtime-voice-pipeline) — _content_
@@ -327,7 +327,6 @@ line in place — keep the Q-record for the audit trail rather than deleting it.
- [Q-033: Three-system NPC architecture](questions/content.md#q-033-three-system-npc-architecture) — _content_
- [Q-034: PC archetypes](questions/scope.md#q-034-pc-archetypes) — _scope_
- [Q-035: Sacred/Profane/Middle Kingdom framework](questions/scope.md#q-035-sacredprofanemiddle-kingdom-framework) — _scope_
- [Q-036: District skeleton as generator output](questions/scope.md#q-036-district-skeleton-as-generator-output) — _scope_
- [Q-037: Generator development pipeline](questions/scope.md#q-037-generator-development-pipeline) — _scope_
- [Q-038: Authored content estimate at 300-world scale](questions/scope.md#q-038-authored-content-estimate-at-300-world-scale) — _scope_
- [Q-042: Intra-system transport networks — passenger vs. freight, vehicles and modes](questions/content.md#q-042-intra-system-transport-networks--passenger-vs-freight-vehicles-and-modes) — _content_
@@ -349,7 +348,6 @@ line in place — keep the Q-record for the audit trail rather than deleting it.
- [Q-065: Shooting mechanics — Deep RayCast 3D vs Ballistic Penetration System vs server-side](questions/architecture.md#q-065-shooting-mechanics--deep-raycast-3d-vs-ballistic-penetration-system-vs-server-side) — _architecture_
- [Q-066: PathMesh3D for procedural environment geometry](questions/architecture.md#q-066-pathmesh3d-for-procedural-environment-geometry) — _architecture_
- [Q-067: Vehicle physics for in-world transport](questions/architecture.md#q-067-vehicle-physics-for-in-world-transport) — _architecture_
- [Q-068: Procedural terrain generation patterns — chunk loading and noise](questions/architecture.md#q-068-procedural-terrain-generation-patterns--chunk-loading-and-noise) — _architecture_
- [Q-069: GPU cloth simulation for dynamic clothing](questions/architecture.md#q-069-gpu-cloth-simulation-for-dynamic-clothing) — _architecture_
- [Q-070: NobodyWho LLM patterns vs our Rust voice pipeline](questions/architecture.md#q-070-nobodywho-llm-patterns-vs-our-rust-voice-pipeline) — _architecture_
- [Q-071: Steam integration template for multiplayer lobbies](questions/architecture.md#q-071-steam-integration-template-for-multiplayer-lobbies) — _architecture_
@@ -358,7 +356,6 @@ line in place — keep the Q-record for the audit trail rather than deleting it.
- [Q-074: Screenshot manager for in-game captures and bug reports](questions/architecture.md#q-074-screenshot-manager-for-in-game-captures-and-bug-reports) — _architecture_
- [Q-075: RichText3D for in-world text rendering](questions/architecture.md#q-075-richtext3d-for-in-world-text-rendering) — _architecture_
- [Q-076: DeformableMesh for runtime environment and damage variation](questions/architecture.md#q-076-deformablemesh-for-runtime-environment-and-damage-variation) — _architecture_
- [Q-077: World generation architecture → PROMOTED TO WORKSHOP](questions/architecture.md#q-077-world-generation-architecture--promoted-to-workshop) — _architecture_
- [Q-078: God rays for atmospheric lighting](questions/architecture.md#q-078-god-rays-for-atmospheric-lighting) — _architecture_
- [Q-079: GridMapLayer — 2D tile logic driving 3D grid rendering](questions/architecture.md#q-079-gridmaplayer--2d-tile-logic-driving-3d-grid-rendering) — _architecture_
- [Q-080: Mod loader architecture reference](questions/architecture.md#q-080-mod-loader-architecture-reference) — _architecture_
@@ -383,6 +380,8 @@ line in place — keep the Q-record for the audit trail rather than deleting it.
- [Q-107: Wiki → Atlas content-set consolidation](questions/architecture.md#q-107-wiki--atlas-content-set-consolidation) — _architecture_
- [Q-108: Subterranean / domed / sealed-habitat settlement morphology — does the built-world fill model need a surface-vs-enclosed branch](questions/architecture.md#q-108-subterranean--domed--sealed-habitat-settlement-morphology--does-the-built-world-fill-model-need-a-surface-vs-enclosed-branch) — _architecture_
- [Q-109: Cascade generation-source dispatch — planetary / station / mod-DLC-forked / save-only](questions/architecture.md#q-109-cascade-generation-source-dispatch--planetary--station--mod-dlc-forked--save-only) — _architecture_
- [Q-110: Region/chunk physical-scale anchoring — what is a region in metres, and what anchors a heightmap pixel?](questions/architecture.md#q-110-regionchunk-physical-scale-anchoring--what-is-a-region-in-metres-and-what-anchors-a-heightmap-pixel) — _architecture_
- [Q-111: Live-econ coupling of generation inputs — which inputs refresh from the rolling sim vs stay static-authored?](questions/architecture.md#q-111-live-econ-coupling-of-generation-inputs--which-inputs-refresh-from-the-rolling-sim-vs-stay-static-authored) — _architecture_
## Resolved questions
@@ -403,6 +402,7 @@ line in place — keep the Q-record for the audit trail rather than deleting it.
- [Q-025: Knowledge graph cap and eviction strategy](questions/perception.md#q-025-knowledge-graph-cap-and-eviction-strategy) — _perception_
- [Q-026: Contradiction detection algorithm](questions/perception.md#q-026-contradiction-detection-algorithm) — _perception_
- [Q-028: Collision-resistant line IDs for auto-generated NPCs](questions/content.md#q-028-collision-resistant-line-ids-for-auto-generated-npcs) — _content_
- [Q-036: District skeleton as generator output](questions/scope.md#q-036-district-skeleton-as-generator-output) — _scope_
- [Q-039: Gate topology generation](questions/scope.md#q-039-gate-topology-generation) — _scope_
- [Q-040: Gate dual-use topology — freight and commuter on shared span gate infrastructure](questions/content.md#q-040-gate-dual-use-topology--freight-and-commuter-on-shared-span-gate-infrastructure) — _content_
- [Q-041: Interstellar travel mechanics — horizon stations and gate architecture](questions/content.md#q-041-interstellar-travel-mechanics--horizon-stations-and-gate-architecture) — _content_
@@ -412,6 +412,8 @@ line in place — keep the Q-record for the audit trail rather than deleting it.
- [Q-057: Composable behavior generation — decompose culture × role × context into assembled behaviors](questions/content.md#q-057-composable-behavior-generation--decompose-culture--role--context-into-assembled-behaviors) — _content_
- [Q-059: PlatformInfo full interface scope](questions/architecture.md#q-059-platforminfo-full-interface-scope) — _architecture_
- [Q-064: 3D planet generator for wiki system screenshots](questions/architecture.md#q-064-3d-planet-generator-for-wiki-system-screenshots) — _architecture_
- [Q-068: Procedural terrain generation patterns — chunk loading and noise](questions/architecture.md#q-068-procedural-terrain-generation-patterns--chunk-loading-and-noise) — _architecture_
- [Q-077: World generation architecture → PROMOTED TO WORKSHOP](questions/architecture.md#q-077-world-generation-architecture--promoted-to-workshop) — _architecture_
- [Q-094: Chart widgets for economy/market insert UI](questions/architecture.md#q-094-chart-widgets-for-economymarket-insert-ui) — _architecture_
- [Q-095: Commission formal name — authoritative designation](questions/content.md#q-095-commission-formal-name--authoritative-designation) — _content_
- [Q-096: Replace sprint workflow with kanban + milestones](questions/process.md#q-096-replace-sprint-workflow-with-kanban--milestones) — _process_
+3 -2
View File
@@ -451,7 +451,7 @@ Technical foundation decisions that constrain implementation: engine, client-ser
- **Source:** Where's the Fun? Workshop, Round 4 Interview, Decision 5
- **Raised by:** Team Leader (Jeroen) — outcome model (option C)
- **Dissent:** None
- **Cross-reference:** [D-120](scope.md#d-120-no-skill-ceiling-in-v02--transhumanist-ladder-deferred) (no skill ceiling in v0.2)
- **Cross-reference:** [D-120](scope.md#d-120-no-skill-ceiling-in-v02--transhumanist-ladder-deferred-superseded) (no skill ceiling in v0.2)
### D-134: Full character customization — hair, clothing, colors at tile scale
- **Date:** 2026-03-05
@@ -486,7 +486,7 @@ Technical foundation decisions that constrain implementation: engine, client-ser
- **Source:** Where's the Fun? Workshop, Round 5 Interview, Decision 23
- **Raised by:** Team Leader (Jeroen)
- **Dissent:** None
- **Cross-reference:** [D-114](scope.md#d-114-v02-proof-of-life--generator--graphics-not-hand-built-slice) (generator proof-of-life), [D-119](scope.md#d-119-generator-spike-confirmed-for-sprint-25--critical-path) (Sprint 25 generator spike)
- **Cross-reference:** [D-114](scope.md#d-114-v02-proof-of-life--generator--graphics-not-hand-built-slice-superseded) (generator proof-of-life), [D-119](scope.md#d-119-generator-spike-confirmed-for-sprint-25--critical-path) (Sprint 25 generator spike)
### D-141: PlatformInfo — client-side OS abstraction autoload
- **Date:** 2026-03-13
@@ -597,6 +597,7 @@ Technical foundation decisions that constrain implementation: engine, client-ser
| 6 | Detail coloring — room-level content, cultural architecture | Only when the world is walkable |
- **Amendment (2026-05-22):** Phases 4 and 5 swapped — **world generation now precedes player control**. The rule: no player-control or in-world rendering work begins until the generator can deterministically seed-generate every tile of every world via the full multilayer cascade. The original Phase 4 "2-floor test map" is **dropped** — test layers are produced by the generator itself once layer-drawing begins; we start drawing the world only when generation knows what to draw. Generation progress is viewed as **per-layer maps in the implant Atlas** (the Phase 3 deliverable, already built), not via an in-world renderer. The existing in-world rendering code is **left as-is until Phase 5** — neither built upon nor removed before then. Rationale: building player systems against a throwaway test substrate means rebuilding them against real generated tiles later; gating player work on deterministic generation avoids that waste. Epics T-749 (now Phase 5) and T-750 (now Phase 4) and the CLAUDE.md cascade table are updated to match.
- **Amendment (2026-06-12):** Build order **within and after** the cascade clarified (Jeroen). The world is built **outside-in**: (1) geo layer; (2) the economic layer drawn onto the world — cities, buildings, streets, blocks, and the inter-settlement road/rail network; (3) building templates; (4) **door boundary contracts** defining the seam between exteriors and building interiors. Only then (5) the background NPC layer and building interiors (Phase 6), and only after that does gameplay/scenario design resume ("making it a game again" — tracked in the post-cascade gameplay parking epic, outside any phase). **Player control and visual rendering (Phase 5) ramp in parallel once outside generation produces walkable exteriors** — the Phase-5 trigger is "outsides generate deterministically and are walkable", not "all Phase-4 polish complete"; T-962 holds the gate and is updated to this trigger. Guiding statement: *"Before this is a game I want it to be a Reach a character can travel through."* NPCs, scenarios, and gameplay systems are conceived, designed, and built only after the traversable world exists. This amendment absorbs the v0.2 scope cluster — D-114, D-115, D-117, D-118, D-120 are marked superseded by this record, with each one's surviving design substance noted on the record itself.
- **Rationale:** The pattern of negotiating pragmatic v0.2 cuts while discussing room-level detail repeatedly produced superseded decisions, confused agents, and distracted from building the actual product. The cascade enforces a first-things-first discipline: each layer of the game is grounded in the layer below it before detail is added.
- **Raised by:** Jeroen, established 2026-03-24 during world generation workshop.
- **Dissent:** None.
+4 -4
View File
@@ -10,7 +10,7 @@ How narrative, NPCs, and world content are created: content tiers, NPC generatio
- **Rationale:** A galaxy-spanning game needs content architecture that scales without hand-crafting everything. The life-sim substrate creates attachment that gives conspiracies emotional weight. Pool-based Tier 1 modules enable replayability and DLC expansion.
- **Raised by:** Team Leader (Jeroen), with full team endorsement across 3 rounds
- **Dissent:** None
- **Amendment (2026-03-05, Where's the Fun? Workshop):** Tier 1 "authored drama modules" concept is deferred for v0.2. [D-114](scope.md#d-114-v02-proof-of-life--generator--graphics-not-hand-built-slice) (generator-first proof-of-life) and [D-127](#d-127-player-choices-are-the-content--rimworld-model-job-as-rails) (player choices are the content) establish that v0.2 ships zero authored drama modules. The three-tier architecture remains valid for the full game, but the Tier 1 pool is empty by design in v0.2 — generator-first validates Tier 2 and Tier 3 before Tier 1 modules are authored. Tier 1 will be authored after the generator spike (D-119) proves legible characters and readable relationships.
- **Amendment (2026-03-05, Where's the Fun? Workshop):** Tier 1 "authored drama modules" concept is deferred for v0.2. [D-114](scope.md#d-114-v02-proof-of-life--generator--graphics-not-hand-built-slice-superseded) (generator-first proof-of-life) and [D-127](#d-127-player-choices-are-the-content--rimworld-model-job-as-rails) (player choices are the content) establish that v0.2 ships zero authored drama modules. The three-tier architecture remains valid for the full game, but the Tier 1 pool is empty by design in v0.2 — generator-first validates Tier 2 and Tier 3 before Tier 1 modules are authored. Tier 1 will be authored after the generator spike (D-119) proves legible characters and readable relationships.
### D-024: NPC generation model — 10 axes + combat component
- **Date:** 2026-02-10
@@ -42,7 +42,7 @@ How narrative, NPCs, and world content are created: content tiers, NPC generatio
- **Rationale:** If every NPC is suspicious, investigation collapses. The mundane triangles ARE the life-sim game — hours of play that never touch conspiracy. Variable entanglement rate defeats metagaming across playthroughs. Quiet life must feel genuinely good, not empty.
- **Raised by:** Gore (thematic), Paula (30/50/20 split), Nigel (anti-metagaming), Team Leader (majority unentangled)
- **Dissent:** None
- **Amendment (2026-03-05, Where's the Fun? Workshop):** The 30/50/20 population split rationale survives but implementation context changes. [D-122](#d-122-all-npcs-generated--no-named-hand-authored-characters) (all NPCs generated) means no NPC is hand-authored. The "entangled 20%" are generated NPCs whose triangles happen to be flagged for intrigue content. For the tycoon v0.2 bookmark ([D-117](scope.md#d-117-tycoon-is-the-v02-bookmark--zero-investigation-content)), the split applies to economic, social, and mundane triangles rather than investigation-intrigue triangles. The specific ratios will be revisited after the generator spike ([D-119](scope.md#d-119-generator-spike-confirmed-for-sprint-25--critical-path)) proves what population density the generator can sustain.
- **Amendment (2026-03-05, Where's the Fun? Workshop):** The 30/50/20 population split rationale survives but implementation context changes. [D-122](#d-122-all-npcs-generated--no-named-hand-authored-characters) (all NPCs generated) means no NPC is hand-authored. The "entangled 20%" are generated NPCs whose triangles happen to be flagged for intrigue content. For the tycoon v0.2 bookmark ([D-117](scope.md#d-117-tycoon-is-the-v02-bookmark--zero-investigation-content-superseded)), the split applies to economic, social, and mundane triangles rather than investigation-intrigue triangles. The specific ratios will be revisited after the generator spike ([D-119](scope.md#d-119-generator-spike-confirmed-for-sprint-25--critical-path)) proves what population density the generator can sustain.
### D-032: Separate monologue pools per character [SUPERSEDED — deferred to Phase 6]
- **Date:** 2026-02-11
@@ -106,7 +106,7 @@ How narrative, NPCs, and world content are created: content tiers, NPC generatio
- **Cross-reference:** Vertical slice ([D-027](scope.md#d-027-vertical-slice--smuggler--detective-two-character-proof)), contraband ([D-037](#d-037-contraband-specification))
- **Raised by:** Miri (Sova setting brief, Round 1; Van Maanen's Star profile, Round 2), project lead (confirmed as worldbuilding milestone, directive T-6)
- **Dissent:** None
- **Amendment (2026-03-05, Where's the Fun? Workshop):** Station Sova / Van Maanen's Star confirmed as the v0.2 setting. [D-128](#d-128-culture-implicit-in-starting-location--van-maanens-star-system-equals-van-maanens-star-culture) makes Van Maanen's Star culture the cultural context for the tycoon bookmark — Van Maanen's Star IS Van Maanen's Star culture by default. The setting details (naming conventions, atmosphere, sensory palette) survive as generator inputs and culture profile content. However, the Sova Transit District spatial layout (D-093) was designed for the v0.1 hand-built slice. v0.2 generates the location via the generator ([D-114](scope.md#d-114-v02-proof-of-life--generator--graphics-not-hand-built-slice)); the Van Maanen's Star culture profile (Miri prerequisite for [D-119](scope.md#d-119-generator-spike-confirmed-for-sprint-25--critical-path)) captures the setting identity as generator inputs. Sova remains the canonical example system and the first culture profile to author.
- **Amendment (2026-03-05, Where's the Fun? Workshop):** Station Sova / Van Maanen's Star confirmed as the v0.2 setting. [D-128](#d-128-culture-implicit-in-starting-location--van-maanens-star-system-equals-van-maanens-star-culture) makes Van Maanen's Star culture the cultural context for the tycoon bookmark — Van Maanen's Star IS Van Maanen's Star culture by default. The setting details (naming conventions, atmosphere, sensory palette) survive as generator inputs and culture profile content. However, the Sova Transit District spatial layout (D-093) was designed for the v0.1 hand-built slice. v0.2 generates the location via the generator ([D-114](scope.md#d-114-v02-proof-of-life--generator--graphics-not-hand-built-slice-superseded)); the Van Maanen's Star culture profile (Miri prerequisite for [D-119](scope.md#d-119-generator-spike-confirmed-for-sprint-25--critical-path)) captures the setting identity as generator inputs. Sova remains the canonical example system and the first culture profile to author.
### D-037: Contraband specification — unlicensed lattice components
- **Date:** 2026-02-11
@@ -216,7 +216,7 @@ How narrative, NPCs, and world content are created: content tiers, NPC generatio
### D-090: PC voice registers — smuggler and detective speech patterns `[SUPERSEDED]`
- **Date:** 2026-02-12
- **Superseded by:** [D-117](scope.md#d-117-tycoon-is-the-v02-bookmark--zero-investigation-content) (2026-03-05). The smuggler/detective dual-lens frame is eliminated for v0.2. The tycoon is the single playable character. Voice register design for v0.2 follows culture-driven voice (D-121) applied to the player character, not the smuggler/detective partition below.
- **Superseded by:** [D-117](scope.md#d-117-tycoon-is-the-v02-bookmark--zero-investigation-content-superseded) (2026-03-05). The smuggler/detective dual-lens frame is eliminated for v0.2. The tycoon is the single playable character. Voice register design for v0.2 follows culture-driven voice (D-121) applied to the player character, not the smuggler/detective partition below.
- **Decision:** Each playable character has a defined voice register for monologue and dialogue:
- **Smuggler:** Feeling-first. Sentence fragments. Concrete/physical vocabulary. Notices bodies, spaces, exits. Emotional baseline: wary comfort. Lies by omission. Relationship to authority: avoidance.
- **Detective:** Analysis-first. Complete sentences. Institutional vocabulary. Notices patterns, inconsistencies, procedural gaps. Emotional baseline: professional detachment. Lies by reframing. Relationship to authority: representative.
+1 -1
View File
@@ -398,7 +398,7 @@ This domain covers: currency system, commodity taxonomy, shadow economy, corpora
- **Rationale:** Administered pricing is the correct model because brands violate all three tâtonnement assumptions: heterogeneity (Calloway ≠ VGV ≠ generic spirits), supply inelasticity (terroir production cannot respond to price signals per D-177), and Veblen demand effects (prestige goods can have upward-sloping demand). The one-way interface (commodity prices → brand input costs; brand output prices do NOT feed back into tâtonnement) is architecturally clean and matches the D-178 layer model. The identity/exotic split in cultural premium is the minimal structural addition needed to produce all three observed pricing curves (Scarcity-Distance, Dual-Peak, Aspirational Gradient). Population asymmetry (~80B total Reach population, systems ranging from 10B to <50k) makes the halo/volume tier pattern structurally necessary — brands from tiny worlds are astronomically exclusive and need volume derivatives to be economically relevant.
- **Raised by:** Full planning team workshop, Sprint 34 (T-811).
- **Dissent:** None.
- **Cross-reference:** [D-185](#d-185-brands-are-not-commodities) (brands are not commodities), [D-184](#d-184-commodity-catalog-36-types) (commodity catalog), [D-177](#d-177-productivity-constraints-lore-derived) (productivity constraints), [D-175](#d-175-corporation-taxonomy-and-prerequisite) (corporation taxonomy), [D-178](#d-178-economic-model-architecture) (economic model architecture), [D-180](#d-180-event-input-port) (event input port), [D-181](#d-181-signal-vocabulary) (signal vocabulary), [D-173](#d-173-commodity-taxonomy) (commodity taxonomy), [D-171](#d-171-three-currency-system) (three-currency system), [D-131](content.md#d-131-broad-economic-verb-vocabulary--life-verbs-not-tycoon-specific) (economic verb vocabulary), [D-118](scope.md#d-118-small-business-owner-starting-state--tycoon-is-aspiration-not-starting-position) (small business owner starting state)
- **Cross-reference:** [D-185](#d-185-brands-are-not-commodities) (brands are not commodities), [D-184](#d-184-commodity-catalog-36-types) (commodity catalog), [D-177](#d-177-productivity-constraints-lore-derived) (productivity constraints), [D-175](#d-175-corporation-taxonomy-and-prerequisite) (corporation taxonomy), [D-178](#d-178-economic-model-architecture) (economic model architecture), [D-180](#d-180-event-input-port) (event input port), [D-181](#d-181-signal-vocabulary) (signal vocabulary), [D-173](#d-173-commodity-taxonomy) (commodity taxonomy), [D-171](#d-171-three-currency-system) (three-currency system), [D-131](content.md#d-131-broad-economic-verb-vocabulary--life-verbs-not-tycoon-specific) (economic verb vocabulary), [D-118](scope.md#d-118-small-business-owner-starting-state--tycoon-is-aspiration-not-starting-position-superseded) (small business owner starting state)
---
+1 -1
View File
@@ -476,7 +476,7 @@ How the player observes and interacts with the world: camera, fog, line-of-sight
- **Cross-reference:** Insert overlay ([D-048](#d-048-neural-insert-overlay--visual-design)), insert HUD wireframe (`docs/design/insert-hud-wireframe-v01.md`), visual grammar (`docs/design/visual-grammar-v01.md` §7), cursor states ([D-056](#d-056-cursor-states--insert-styled-geometric))
- **Raised by:** Araminta (analysis and recommendation), project lead (confirmed).
- **Dissent:** None.
- **Amendment (2026-04-05):** "Smuggler only per D-065" scope on inventory item silhouettes is obsolete. [D-117](scope.md#d-117-tycoon-is-the-v02-bookmark--zero-investigation-content) eliminates the smuggler/detective frame; [D-122](content.md#d-122-all-npcs-generated--no-named-hand-authored-characters) removes named characters. Inventory icons are no longer character-specific. D-065 cross-reference removed.
- **Amendment (2026-04-05):** "Smuggler only per D-065" scope on inventory item silhouettes is obsolete. [D-117](scope.md#d-117-tycoon-is-the-v02-bookmark--zero-investigation-content-superseded) eliminates the smuggler/detective frame; [D-122](content.md#d-122-all-npcs-generated--no-named-hand-authored-characters) removes named characters. Inventory icons are no longer character-specific. D-065 cross-reference removed.
---
+2 -1
View File
@@ -84,7 +84,8 @@ How the team works: composition, naming, workflow.
- **Source:** Q-096 (raised 2026-04-20, expanded 2026-05-01)
- **Raised by:** Jeroen
- **Dissent:** None
- **Amendment (2026-06-12):** **Milestones are retired.** pql has no milestone entity; phase gating is the **cascade ticket hierarchy** — initiative T-745 holds the six phase epics, a ticket is in a phase by being parented under that phase epic, and the active phase is the `in_progress` phase epic (currently T-750, Phase 4). The two milestone bullets above ("Sprint boundaries → milestones tied to concrete deliverables" and "Milestones are many-to-many with tickets, can run in parallel, can block other milestones") are superseded by this mechanism; kanban, topic branches, and the rest of the record stand. Phase-independent maintenance and test-debt work lives under a dedicated maintenance initiative rather than a phase epic. See CLAUDE.md "Work Modes" and `.claude/rules/ticket-cli.md`, which already describe the hierarchy model.
---
*5 decisions. Last updated: 2026-05-03*
*5 decisions. Last updated: 2026-06-12*
+17 -12
View File
@@ -73,7 +73,7 @@ What we're building: game concept, design pillars, prototype definition, map spe
### D-014: v0.1 map specification [SUPERSEDED]
- **Date:** 2026-02-09
- **Superseded by:** [D-114](#d-114-v02-proof-of-life--generator--graphics-not-hand-built-slice) (generator-first proof-of-life replaces hand-built map spec; auto-generated locations at scale replace the hand-crafted tile map approach)
- **Superseded by:** [D-114](#d-114-v02-proof-of-life--generator--graphics-not-hand-built-slice-superseded) (generator-first proof-of-life replaces hand-built map spec; auto-generated locations at scale replace the hand-crafted tile map approach)
- **Decision:** First playable tech demo map spec:
| Layer | Spec |
@@ -96,7 +96,7 @@ What we're building: game concept, design pillars, prototype definition, map spe
### D-027: Vertical slice — smuggler + detective, two-character proof [SUPERSEDED]
- **Date:** 2026-02-10
- **Superseded by:** [D-114](#d-114-v02-proof-of-life--generator--graphics-not-hand-built-slice) (generator-first proof-of-life) and [D-117](#d-117-tycoon-is-the-v02-bookmark--zero-investigation-content) (tycoon bookmark replaces smuggler + detective; zero investigation content for v0.2)
- **Superseded by:** [D-114](#d-114-v02-proof-of-life--generator--graphics-not-hand-built-slice-superseded) (generator-first proof-of-life) and [D-117](#d-117-tycoon-is-the-v02-bookmark--zero-investigation-content-superseded) (tycoon bookmark replaces smuggler + detective; zero investigation content for v0.2)
- **Decision:** The proof-of-concept vertical slice is one station district containing: 1 workplace social site, 1 social venue (bar), 1 smuggling ring template, shared NPCs. Two playable characters: smuggler (logistics worker, insider access to criminal templates, social camouflage) and detective (institutional investigator, authority access, analytical). Success criteria: (1) 30 minutes of daily-life breathing room before contamination activates, (2) both playthroughs feel like fundamentally different games, (3) after each playthrough player names an NPC they felt conflicted about, (4) the observe→notice→follow→discover sequence emerges from systems not scripts.
- **Supersedes:** [D-006](#d-006-prototype-scenario--institutearmstrongguardians-superseded)
- **Rationale:** Smuggler + detective creates adversarial divergence — the detective's target IS the smuggler's daily life. Same templates, same NPCs, inverted relationships. Proves character-as-lens, contamination, life-sim attachment, and replayability simultaneously. Tyre confirms: ~20% more effort than single-character, no new architecture.
@@ -168,7 +168,7 @@ What we're building: game concept, design pillars, prototype definition, map spe
### D-065: Smuggler inventory — knowledge-primary with physical evidence [SUPERSEDED]
- **Date:** 2026-02-13
- **Superseded by:** [D-117](#d-117-tycoon-is-the-v02-bookmark--zero-investigation-content) (no smuggler character in v0.2). The knowledge-primary inventory concept and physical evidence design survive as patterns for future character implementation.
- **Superseded by:** [D-117](#d-117-tycoon-is-the-v02-bookmark--zero-investigation-content-superseded) (no smuggler character in v0.2). The knowledge-primary inventory concept and physical evidence design survive as patterns for future character implementation.
- **Decision:** Knowledge is the primary "inventory" for all characters (you SAW the manifest, not you HAVE it). The smuggler additionally gets a minimal physical inventory for v0.1: 3 specific items (manifest copy, corridor access token, personal comm log). Capacity per archetype: smuggler 3-4 slots, detective 2 slots. Carried items are PRIVATE — they exist behind the information boundary ([D-010](architecture.md#d-010-multiplayer-ready-architectural-baseline) principle 2) and are not visible to other entities unless revealed via search, scan, or confrontation. Server implementation: world entities with CarriedBy component. Verbs: Take, Place.
- **Evidence presentation differs by archetype:** Detective sees case-file-style entries (structured: what/where/when/source/confidence, insert suggests links). Smuggler sees personal notebook (organized by person, informal voice, no contradiction flags). Same underlying knowledge graph, different presentation layer.
- **v0.1 items (Paula):**
@@ -184,7 +184,7 @@ What we're building: game concept, design pillars, prototype definition, map spe
### D-087: v0.1 triangle configuration — 3 active forks, 2 passive tensions [SUPERSEDED]
- **Date:** 2026-02-12
- **Superseded by:** [D-122](content.md#d-122-all-npcs-generated--no-named-hand-authored-characters) (all NPCs generated; no named triangles with hand-authored characters) and [D-117](#d-117-tycoon-is-the-v02-bookmark--zero-investigation-content) (no investigation-specific triangle configuration for v0.2). Triangle generation follows the generator-first model (D-114).
- **Superseded by:** [D-122](content.md#d-122-all-npcs-generated--no-named-hand-authored-characters) (all NPCs generated; no named triangles with hand-authored characters) and [D-117](#d-117-tycoon-is-the-v02-bookmark--zero-investigation-content-superseded) (no investigation-specific triangle configuration for v0.2). Triangle generation follows the generator-first model (D-114).
- **Decision:** v0.1 vertical slice uses 5 relationship triangles. Three are active forks (T1: Kael-Smuggler-Ring, T2: Sera-Detective-Commission, T4: Drin-System-Ring) with branching outcomes driven by player observation. Two are passive tensions (T3: Naia-Kael-Hael, T5: Worried Partner background) that provide atmosphere and secondary discovery paths. Active forks require authored content per branch. Passive tensions are system-driven.
- **Rationale:** Three active forks are within v0.1 content authoring capacity. Passive tensions require no branching content — they enrich discovery space without multiplying authored lines.
- **Raised by:** Gestalt, Paula
@@ -194,7 +194,7 @@ What we're building: game concept, design pillars, prototype definition, map spe
### D-089: Self-contained triangle forks for v0.1, no cross-triangle cascade [SUPERSEDED]
- **Date:** 2026-02-12
- **Superseded by:** [D-117](#d-117-tycoon-is-the-v02-bookmark--zero-investigation-content) and [D-122](content.md#d-122-all-npcs-generated--no-named-hand-authored-characters). No hand-authored triangle forks in v0.2; triangle generation follows the generator-first model. Cross-triangle cascade design is preserved as a future consideration once the generator proves relationships are readable.
- **Superseded by:** [D-117](#d-117-tycoon-is-the-v02-bookmark--zero-investigation-content-superseded) and [D-122](content.md#d-122-all-npcs-generated--no-named-hand-authored-characters). No hand-authored triangle forks in v0.2; triangle generation follows the generator-first model. Cross-triangle cascade design is preserved as a future consideration once the generator proves relationships are readable.
- **Decision:** In v0.1, each triangle fork resolves independently. No triangle outcome triggers escalation in another triangle. Cross-triangle cascade (storyteller-managed, where resolving T1 affects T2 pressure) is deferred to v0.2+. This keeps v0.1 content authoring manageable — each triangle is a self-contained narrative unit.
- **Rationale:** Cross-triangle cascade requires the storyteller to track inter-triangle state and authors to write contingent branches. Both are out of scope for v0.1. Self-contained triangles can be authored, tested, and validated independently.
- **Raised by:** Paula, Gestalt
@@ -214,8 +214,9 @@ What we're building: game concept, design pillars, prototype definition, map spe
---
### D-114: v0.2 proof-of-life — generator + graphics, not hand-built slice
### D-114: v0.2 proof-of-life — generator + graphics, not hand-built slice [SUPERSEDED]
- **Date:** 2026-03-05
- **Superseded by:** [D-166](architecture.md#d-166-development-cascade--6-phase-first-things-first-build-order) (the v0.2 target and its proof-of-life milestone are dropped; the cascade's Phase-4 generator deliverable replaces it — D-166 amendment 2026-06-12)
- **Decision:** The v0.2 proof-of-life milestone is defined as: the generator producing usable output (auto-generated locations at scale with legible characters) plus better graphics. A hand-built vertical slice is explicitly NOT the proof-of-life. The v0.1 lesson: descoping toward a hand-built approach produced the wrong game. v0.2 must first prove the foundational generator can produce usable output, then build the game on top of that foundation.
- **Rationale:** v0.1 was built as a detective puzzle game with hand-placed NPCs and dots for characters. The designer's vision is a single-character life sim. The generator-first approach prevents the same mistake — we prove the generative foundation works before committing to content on top of it.
- **Source:** Where's the Fun? Workshop, Round 4 Interview, Decision 1
@@ -223,8 +224,9 @@ What we're building: game concept, design pillars, prototype definition, map spe
- **Dissent:** None
- **Supersedes:** [D-027](#d-027-vertical-slice--smuggler--detective-two-character-proof-superseded) (hand-built vertical slice), [D-014](#d-014-v01-map-specification-superseded) (hand-built map spec)
### D-115: Character creation scoped to skills + bookmark for v0.2
### D-115: Character creation scoped to skills + bookmark for v0.2 [SUPERSEDED]
- **Date:** 2026-03-05
- **Superseded by:** [D-166](architecture.md#d-166-development-cascade--6-phase-first-things-first-build-order) (v0.2 character-creation scope fell with the v0.2 target; character creation is post-cascade gameplay work — the skills+bookmark minimalism survives as design input when that work resumes)
- **Decision:** v0.2 character creation is limited to two elements: skills (what the character is good at) and bookmark (which starting scenario/location the character inhabits). Family, culture, and religion are deferred from character creation. Culture is available in the game through the starting location (see [D-128](content.md#d-128-culture-implicit-in-starting-location--van-maanens-star-system-equals-van-maanens-star-culture)), not as a creation slider.
- **Rationale:** Skills and bookmark are the minimum needed to differentiate playthroughs. Adding family/culture/religion at creation gates content that is better delivered through gameplay. Religion in particular is NOT a game system (D-116).
- **Source:** Where's the Fun? Workshop, Round 4 Interview, Decision 2
@@ -240,8 +242,9 @@ What we're building: game concept, design pillars, prototype definition, map spe
- **Raised by:** Team Leader (Jeroen)
- **Dissent:** None
### D-117: Tycoon is the v0.2 bookmark — zero investigation content
### D-117: Tycoon is the v0.2 bookmark — zero investigation content [SUPERSEDED]
- **Date:** 2026-03-05
- **Superseded by:** [D-166](architecture.md#d-166-development-cascade--6-phase-first-things-first-build-order) (the v0.2 bookmark frame is dropped; the tycoon concept is parked as post-cascade gameplay under the gameplay parking epic. The investigation-content abandonment and the career-blend insight survive as design input)
- **Decision:** The v0.2 bookmark is the tycoon — a small business owner in Van Maanen's Star. v0.2 ships zero investigation content. The detective and smuggler framing from v0.1 is explicitly abandoned for v0.2. The tycoon naturally blends career models: active management, remote investment via insert (WFH model), and one-off deals (gig model). Investigation content will be revisited when the life-sim foundation is proven stable.
- **Rationale:** v0.1's detective/smuggler frame produced the wrong game. The tycoon bookmark is thematically and mechanically richer: economic complicity, life-sim attachment loops, and narrative emergence from everyday decisions. Clean break from investigation content removes the frame that distorted v0.1.
- **Source:** Where's the Fun? Workshop, Round 4 Interview, Decision 4
@@ -249,8 +252,9 @@ What we're building: game concept, design pillars, prototype definition, map spe
- **Dissent:** None
- **Supersedes:** [D-027](#d-027-vertical-slice--smuggler--detective-two-character-proof-superseded)
### D-118: Small business owner starting state — tycoon is aspiration, not starting position
### D-118: Small business owner starting state — tycoon is aspiration, not starting position [SUPERSEDED]
- **Date:** 2026-03-05
- **Superseded by:** [D-166](architecture.md#d-166-development-cascade--6-phase-first-things-first-build-order) (v0.2 frame dropped; the small-business-owner starting-state design survives with the parked tycoon bookmark — T-615)
- **Decision:** The tycoon bookmark begins as an existing small business owner, not a mogul. The player starts with a small operation (bar, logistics contract, storage franchise) and grows into a tycoon over time — or sells out and pivots to exploration. The bookmark name "tycoon" describes the aspiration and growth trajectory, not the starting state. A true tycoon starting position would be overpowered and would skip the interesting growth phase.
- **Rationale:** Economic complicity and life-sim attachment require a character with something to lose and room to grow. Starting as a mogul eliminates the growth arc and removes economic stakes. The small business owner start grounds the player in a human-scale economic reality before scaling up.
- **Source:** Where's the Fun? Workshop, Round 5 Interview, Decision 20
@@ -264,11 +268,12 @@ What we're building: game concept, design pillars, prototype definition, map spe
- **Source:** Where's the Fun? Workshop, Round 5 Interview, Decision 22
- **Raised by:** Tyre (proposal), Team Leader (confirmed)
- **Dissent:** None
- **Cross-reference:** [D-114](#d-114-v02-proof-of-life--generator--graphics-not-hand-built-slice) (generator-first proof-of-life)
- **Cross-reference:** [D-114](#d-114-v02-proof-of-life--generator--graphics-not-hand-built-slice-superseded) (generator-first proof-of-life)
- **Amendment (2026-04-05):** The sequencing described here (Sprint 25 as first deliverable, generator proof-of-life gates all subsequent work) is superseded by [D-166](architecture.md#d-166-development-cascade--6-phase-first-things-first-build-order) (2026-03-24), which establishes a strict 6-phase development cascade. The generator spike falls in Phase 5 (World Generation), not Phase 1. The cascade is the authoritative build order.
### D-120: No skill ceiling in v0.2 — transhumanist ladder deferred
### D-120: No skill ceiling in v0.2 — transhumanist ladder deferred [SUPERSEDED]
- **Date:** 2026-03-05
- **Superseded by:** [D-166](architecture.md#d-166-development-cascade--6-phase-first-things-first-build-order) (v0.2 frame dropped; the surviving substance — no hard skill cap until the base loop is proven, transhumanist ladder deferred, `skill_ceiling` field preserved in the implementation — carries into post-cascade gameplay design)
- **Decision:** Skills have no hard cap in v0.2. The transhumanist ladder (baseline human → Higher → ANA-connected) is a later design layer. v0.2 proves the life-sim loop without skill constraints. The `skill_ceiling` architectural field is preserved in the implementation but not enforced in gameplay until the base game loop is proven.
- **Rationale:** Skill ceilings add complexity that is not load-bearing for the v0.2 proof-of-life. The life-sim loop must prove itself first. The transhumanist ladder is a rich design space but belongs in a later iteration when the foundational systems are stable.
- **Source:** Where's the Fun? Workshop, Round 5 Interview, Decision 24
@@ -296,7 +301,7 @@ What we're building: game concept, design pillars, prototype definition, map spe
- **Source:** Sprint 27 planning pass — Q-WTF-039 resolution
- **Raised by:** Tyre (architecture), Paula (narrative), Gestalt (systems), confirmed by project lead
- **Dissent:** Ozzie argued for portrait render (emotional attachment). Overruled: tile-scale at heavy zoom provides sufficient character identity without a second rendering pipeline.
- **Cross-reference:** [D-115](#d-115-character-creation-scoped-to-skills--bookmark-for-v02) (creation scope), [D-134](architecture.md#d-134-full-character-customisation--hair-clothing-colors-at-tile-scale) (full character customisation), [D-136](architecture.md#d-136-first-settled-reach-moment-auto-generated-apartment--insert-activation) (first game moment), ticket T-618 (CK3-style character creation screen)
- **Cross-reference:** [D-115](#d-115-character-creation-scoped-to-skills--bookmark-for-v02-superseded) (creation scope), [D-134](architecture.md#d-134-full-character-customisation--hair-clothing-colors-at-tile-scale) (full character customisation), [D-136](architecture.md#d-136-first-settled-reach-moment-auto-generated-apartment--insert-activation) (first game moment), ticket T-618 (CK3-style character creation screen)
- **Resolves:** Q-WTF-039
---
+22 -3
View File
@@ -138,7 +138,7 @@ Technical foundation questions: engine, protocols, data structures, performance,
---
### Q-068: Procedural terrain generation patterns — chunk loading and noise
- **Status:** Open (reference/inspiration)
- **Status:** Resolved (2026-06-12) — the seed-deterministic chunked-terrain question this reference was held for shipped in the Phase-4 cascade: T-963 (Layer 0 canonical heightmap), T-953 (Layer 1 topography/drainage/sub-biome), T-955 (Layer 3 settlement placement), all done; chunk streaming follows the D-225/D-227 derive-on-demand model rather than this demo's pattern.
- **Question:** Block-based 3D Procedural Map Generation Demo (https://godotengine.org/asset-library/asset/2698) — Perlin noise terrain with chunk-based loading/unloading. Not directly usable (block-based, Godot 4.2) but the patterns are relevant: seed-deterministic generation for consistent worlds across sessions, chunk loading within player proximity for memory/performance, terrain type placement from noise values. Reference for when the world generator produces location terrain and the client needs to stream it. The chunk load/unload pattern maps to our simulation tier system (Active → Background → State-saved).
- **Cross-reference:** Generator architecture, D-097 (simulation tiers), D-096 (chunk loading)
@@ -201,7 +201,7 @@ Technical foundation questions: engine, protocols, data structures, performance,
---
### Q-077: World generation architecture → PROMOTED TO WORKSHOP
- **Status:** Promoted — see `docs/workshops/world-generation/BRIEF.md`
- **Status:** Resolved → [D-166](../decisions/architecture.md#d-166-development-cascade--6-phase-first-things-first-build-order) — the promoted workshop ran 2026-03-24 and produced the development cascade (`docs/workshops/world-generation/workshop-outcomes.md`); the asset-library references were consolidated into the brief and remain available there. Loop closed 2026-06-12.
- **Question:** Outgrew Q-record format. All references (CityCrafter3D, Chunk Manager, Retro Terrain, Spatial Gardener, GridMapLayer, PathMesh3D, DeformableMesh, Poly Haven) consolidated into the workshop brief.
- **Cross-reference:** `docs/workshops/world-generation/BRIEF.md`
@@ -428,4 +428,23 @@ Technical foundation questions: engine, protocols, data structures, performance,
---
*58 questions (11 resolved, 1 partially resolved, 46 open). Last updated: 2026-06-05.*
### Q-110: Region/chunk physical-scale anchoring — what is a region in metres, and what anchors a heightmap pixel?
- **Status:** Open — surfaced 2026-06-12 during cascade-work grounding (post-D-239 implementation)
- **Question:** The refinement chain's nominal physical anchors (workshop brief: 78 km L1 cell → ~1 km region → 64 m chunk → 1 m voxel, `docs/workshops/tile-derivation-contract/tile-derivation-contract-workshop-brief.md:19-22`) are mutually inconsistent in the implementation, and no record fixes metres-per-heightmap-pixel. Evidence: (1) `region_profile.rs:3-4` documents ~1 km² regions, ~6,000/body (80×75); (2) `derive_all_regions` (`region_profile.rs:1014-1044`) actually tiles the 512×256 L1 working grid at 8 cells/region spanning ±90° latitude — for a planet-scale equirect map an L1 cell is body-relative (~78 km on an Earth-like body), making such a region ~624 km, not 1 km; (3) `cascade.rs:235-237` claims "8 cells per region on a 128×64 working grid → ~80×32 = ~2,560 regions" — internally inconsistent and inconsistent with `heightmap.rs` GRID 512×256; (4) `chunk_context.rs:137-141` assumes a region is 16 chunks ≈ 1.024 km; (5) D-239 §10 asserts "D8 ≈ 152 m/cell" — true only if the whole 512-cell grid spans ~78 km, i.e. one nominal L1 cell, not a planet; (6) D-201's tier-4 "Region" is the 50500 km Province, colliding with the D-239 ~1 km RegionProfile vocabulary. Voxel/chunk scales are absolute (D-222: 1 m / 64 m) but the heightmap pixel is body-relative — the cascade currently glues them with three contradictory assumptions. **Which anchoring model is canonical?**
- **(a) Full-planet anchoring:** fix metres/pixel per body from `body_radius_km` (D-204): `px_m = 2πR/1024`. Regions become fixed ~1 km cells whose count varies per body (millions for a planet) — requires lazy region derivation (already the D-225/D-227 model) plus an explicit L1→region resampling stage; the 8-cells-per-region shortcut and the ~6,000/body budget die.
- **(b) Working-window anchoring:** L1L3 stay planet-equirect; the voxel cascade (region→chunk→voxel) operates on bounded windows (~one 78 km L1 cell) anchored at points of interest (settlements), with fixed metres/pixel inside the window. Matches the brief's chain literally and keeps ~6,000 regions/window; needs a window-addressing scheme in BodyWorldState and a rule for inter-window terrain.
- **(c) Body-relative everything:** keep pure grid-ratio anchoring (region = L1cell/8, chunk = region/16) and let metre meanings float per body — rejected-shaped: breaks the D-222/D-227 absolute 1 m tile vocabulary, D-239 §9 chokepoint widths, and the budget math.
- **Context:** Blocks metre-precise tuning of the cross-region blend and the landform region-anchoring fix; needed for Atlas scale bars (T-960) and the D-239 §10 ~45 ms/body budget accounting (assumes ~6,000 regions/body). A D-201 amendment is likely required to disambiguate Region-vs-Province vocabulary.
- **Cross-reference:** D-201, D-202, D-204, D-222, D-225, D-227, D-239 §9/§10, Q-105
---
### Q-111: Live-econ coupling of generation inputs — which inputs refresh from the rolling sim vs stay static-authored?
- **Status:** Open — surfaced 2026-06-12 during cascade-work grounding
- **Question:** The generation cascade reads every economic input from static systems.db at build/dispatch time (D-199 read-set via `city_context_reader.rs`; D-200 tier-1), while the live economy independently rebuilds `EconStateResource` — all 7 D-181 signals per (system_id, commodity_id) — every ECON_TICK_RATE (`economy.rs:107-120`). `EconStateResource` has NO generation consumer (only the IPC bridge + debug command read it). D-227 already names the coupling mechanism — the derived economic base is "recomputed on expiry, and force-evicted on an event (e.g. the player tanks a system's economy)" — but no record fixes the policy. For each generation input, which bucket: **(a) static-authored forever** (economic_role, founding_age_years, D-237 specializations — authored identity); **(b) epoch-refreshed** (re-read at save/load or world-epoch boundaries: prosperity_baseline_bps? world_tier? dominant commodity/BulkClass?); **(c) live-coupled via D-227 force-eviction + re-derivation** (settlement active/ghost flips per D-196, building condition/occupancy per D-217/T-999, road MaintenanceAuthority degradation)? And what is the eviction contract: who emits the event (an EconEvent threshold? storyteller?), which cache tiers evict (BodyWorldState regions/quarters vs chunk/voxel caches), and at what granularity (per-settlement, per-body, per-system)?
- **Context:** T-1007 defers economic_tier derivation "until it earns a use case in the rolling sim" and T-982's dominant-commodity lookup is static build-time — both park fields whose home depends on this answer. T-999 is the only ticketed live-econ→world consumer. D-198 fixed the reverse direction (econ sim never reads spatial layers); this is the forward direction. Per the cascade-first direction (2026-06-12 D-166 amendment: geo → econ-on-world → templates → door contracts → NPC/interiors → gameplay), default-static is acceptable through Phase 4; the answer gates Phase 5+ (a Reach a character travels through must show economic life without invalidating walked terrain) and the save model (D-227).
- **Cross-reference:** D-181, D-196, D-197, D-198, D-199, D-200, D-217, D-227, D-237; T-999, T-1007, T-982; Q-103 (mutator schema), Q-105 (region clock state)
---
*60 questions (13 resolved, 1 partially resolved, 46 open). Last updated: 2026-06-12.*
+8 -7
View File
@@ -5,19 +5,19 @@ Game concept, prototype boundaries, production pipeline, and feature decisions.
---
### Q-002: Scope of v0.1 playable prototype
- **Status:** Resolved → [D-117](../decisions/scope.md#d-117-tycoon-is-the-v02-bookmark--zero-investigation-content), [D-166](../decisions/architecture.md#d-166-development-cascade--6-phase-first-things-first-build-order)
- **Status:** Resolved → [D-117](../decisions/scope.md#d-117-tycoon-is-the-v02-bookmark--zero-investigation-content-superseded), [D-166](../decisions/architecture.md#d-166-development-cascade--6-phase-first-things-first-build-order)
- **Resolution:** The v0.1 prototype framing is superseded. D-117 establishes the tycoon as the v0.2 bookmark; D-166 defines the 6-phase development cascade as the authoritative build order. Prototype scope is determined by the cascade phases, not a standalone v0.1 spec.
- **Date resolved:** 2026-03-24 (D-166 development cascade)
- **Assigned to:** Full team
### Q-004: One campaign spanning all eras or separate era scenarios?
- **Status:** Resolved (implicitly) → [D-117](../decisions/scope.md#d-117-tycoon-is-the-v02-bookmark--zero-investigation-content), [D-166](../decisions/architecture.md#d-166-development-cascade--6-phase-first-things-first-build-order)
- **Status:** Resolved (implicitly) → [D-117](../decisions/scope.md#d-117-tycoon-is-the-v02-bookmark--zero-investigation-content-superseded), [D-166](../decisions/architecture.md#d-166-development-cascade--6-phase-first-things-first-build-order)
- **Resolution:** v0.2 is single-era (contemporary Settled Reach). The development cascade (D-166) defers all multi-era considerations well beyond current scope. The question remains interesting for the full game but is not load-bearing for any active phase.
- **Date resolved:** 2026-04-05 (closed as implicitly resolved)
- **Assigned to:** Gore, Miri to lead discussion
### Q-005: Scale for prototype - locations, characters, factions
- **Status:** Resolved → [D-117](../decisions/scope.md#d-117-tycoon-is-the-v02-bookmark--zero-investigation-content), [D-118](../decisions/scope.md#d-118-small-business-owner-starting-state--3-configurations), [D-166](../decisions/architecture.md#d-166-development-cascade--6-phase-first-things-first-build-order)
- **Status:** Resolved → [D-117](../decisions/scope.md#d-117-tycoon-is-the-v02-bookmark--zero-investigation-content-superseded), [D-118](../decisions/scope.md#d-118-small-business-owner-starting-state--3-configurations), [D-166](../decisions/architecture.md#d-166-development-cascade--6-phase-first-things-first-build-order)
- **Resolution:** Scale is determined by the development cascade (D-166), not pre-scoped. 301 systems in the star map. All NPCs generated (D-122). Single character type (tycoon, D-117). Starting configurations defined in D-118. The "~10-20 characters" estimate is obsolete — NPC count is a generator output, not a hand-authored target.
- **Date resolved:** 2026-03-24 (D-166 development cascade)
- **Assigned to:** Gestalt, Tyre, Miri
@@ -34,7 +34,7 @@ Game concept, prototype boundaries, production pipeline, and feature decisions.
- **Assigned to:** Team Leader
### Q-011: Character selection and playable characters
- **Status:** Resolved → [D-117](../decisions/scope.md#d-117-tycoon-is-the-v02-bookmark--zero-investigation-content), [D-115](../decisions/scope.md#d-115-character-creation-scoped-to-skills--bookmark-for-v02), [D-122](../decisions/content.md#d-122-all-npcs-generated--no-named-hand-authored-characters)
- **Status:** Resolved → [D-117](../decisions/scope.md#d-117-tycoon-is-the-v02-bookmark--zero-investigation-content-superseded), [D-115](../decisions/scope.md#d-115-character-creation-scoped-to-skills--bookmark-for-v02-superseded), [D-122](../decisions/content.md#d-122-all-npcs-generated--no-named-hand-authored-characters)
- **Resolution:** v0.2 has one playable character type: the tycoon (small business owner starting state, D-118). One bookmark. All NPCs are generated — no canon named characters. Character creation is skills + bookmark only. The "how different are their starting positions?" question is answered by the small business owner economic variation (D-118: bar, logistics contract, storage franchise as starting configurations). The "canon characters vs original" question is answered by D-122: all NPCs generated, no canon characters exist in v0.2.
- **Date resolved:** 2026-03-05 (Where's the Fun? Workshop)
- **Question:** Which characters are playable in the prototype? How different are their starting positions? Can you play canon characters or only original ones?
@@ -58,7 +58,7 @@ Game concept, prototype boundaries, production pipeline, and feature decisions.
- **Source:** Wiki Review Workshop R4, lead interview
### Q-034: PC archetypes
- **Status:** Partially resolved → [D-117](../decisions/scope.md#d-117-tycoon-is-the-v02-bookmark--zero-investigation-content) (v0.2 scope only: tycoon bookmark, zero investigation)
- **Status:** Partially resolved → [D-117](../decisions/scope.md#d-117-tycoon-is-the-v02-bookmark--zero-investigation-content-superseded) (v0.2 scope only: tycoon bookmark, zero investigation)
- **Partial resolution:** v0.2 scope is settled — one bookmark (tycoon, small business owner start per D-118). Smuggler and detective are abandoned for v0.2. The full 8-archetype model, fluid archetype transitions, and "vulnerable window" mechanics remain undesigned for the full game. The "detective, smuggler, tycoon are jobs you can have, not the game's identity" framing (Where's the Fun? Workshop) is the guiding principle for future archetype design.
- **Question:** Should the full game support 8 fluid PC archetypes (Smuggler, Detective, Engineer, Diplomat, Medic, Scholar, Soldier, Merchant) with transition mechanics where archetype shifts during play based on player behavior? The lead approved 8 archetypes with fluid transitions as a game mechanic. v0.1 ships smuggler + detective only (D-027). Full archetype spec, transition triggers, and "vulnerable window" mechanics are undesigned. NOTE: The character-creation-game-setup workshop (Q-011) will address this — coordinate.
- **Assigned to:** Nigel, Gestalt
@@ -71,8 +71,9 @@ Game concept, prototype boundaries, production pipeline, and feature decisions.
- **Source:** Wiki Review Workshop R4, lead interview
### Q-036: District skeleton as generator output
- **Status:** Open
- **Status:** Resolved → [D-222](../decisions/architecture.md#d-222) (spatial hierarchy: Quarter as the skeleton unit), T-957/T-985 (Layer-4 quarter skeleton, done)
- **Question:** For the 300-world model, should the district skeleton (social sites, NPC slots, triangle templates, economic function, access topology) be the atomic output unit of the world generator? D-025 defines social sites as the atomic template unit for hand-authoring. The generator model reframes the district as a composed output from ingredient inputs. How does this interact with D-025?
- **Resolution (2026-06-12):** Answered by events: the generator's atomic output unit shipped as the **QuarterSkeleton** (D-222 naming; T-957 Layer-4 skeleton + T-985 QuarterWorldState, both done) — zoned blocks, reservations, access topology, and building footprints as a composed output. Social-site templates (D-025) remain the authoring unit for the Phase-6 interior/NPC layer that colonizes the skeleton; NPC slots and triangle templates deliberately stay out of the generator output per the cascade order.
- **Assigned to:** Tyre, Gestalt
- **Source:** Wiki Review Workshop R4
@@ -118,4 +119,4 @@ Game concept, prototype boundaries, production pipeline, and feature decisions.
---
*17 questions (6 resolved, 3 partially resolved, 8 open). Last updated: 2026-04-05 (Q-002, Q-004, Q-005, Q-007 closed as resolved)*
*17 questions (7 resolved, 3 partially resolved, 7 open). Last updated: 2026-06-12 (Q-036 closed as resolved — quarter skeleton shipped)*