INSERTINTOticket_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)ONCONFLICT(hash)DONOTHING;
INSERTINTOticket_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)ONCONFLICT(hash)DONOTHING;
INSERTINTOticket_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)ONCONFLICT(hash)DONOTHING;
INSERTINTOticket_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-parentedunderPhase5epicpercascaderefocus2026-06-12—fog-of-perceptionvisionisaplayer-surfacesystembuiltongeneratedtiles;functionalrequirementpreserved.', NULL, '2026-06-1210:23:02', '2026-06-1210:23:02', '2026-06-1210:23:02', NULL, 'f27fb8bb3f82aa2c2e640ac1bcb2a0c2', 2) ON CONFLICT(hash) DO NOTHING;
INSERTINTOticket_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-parentedunderPhase5epicpercascaderefocus2026-06-12—lockedcameraisplayer-controlwork;functionalrequirementpreserved.', NULL, '2026-06-1210:23:02', '2026-06-1210:23:02', '2026-06-1210:23:02', NULL, '2935f673242e4ff88f0c7b14ce178227', 2) ON CONFLICT(hash) DO NOTHING;
INSERTINTOticket_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-parentedunderPhase5epicpercascaderefocus2026-06-12—internalmonologueisaplayerperceptionsurface;line-contentdetailcandeepeninPhase6.Functionalrequirementpreserved.', NULL, '2026-06-1210:23:02', '2026-06-1210:23:02', '2026-06-1210:23:02', NULL, '5cb0f2cc30572fbd4e0c4e326a690fd6', 2) ON CONFLICT(hash) DO NOTHING;
INSERTINTOticket_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-parentedunderPhase5epicpercascaderefocus2026-06-12—observer-accessinformationtaggingisthefoundationforfog/perceptionplayersurfaces;functionalrequirementpreserved.', NULL, '2026-06-1210:23:02', '2026-06-1210:23:02', '2026-06-1210:23:02', NULL, 'f56430bad89233185505cfd24fd56f44', 2) ON CONFLICT(hash) DO NOTHING;
INSERTINTOticket_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-parentedunderPhase5epicpercascaderefocus2026-06-12—minimap/POIdiscoveryisaHUDnavigationsurfaceforin-worldplay;functionalrequirementpreserved.', NULL, '2026-06-1210:23:02', '2026-06-1210:23:02', '2026-06-1210:23:02', NULL, 'c28b1ea27a5afab3f9e6a5960270178a', 2) ON CONFLICT(hash) DO NOTHING;
INSERTINTOticket_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-parentedunderPhase4epicpercascaderefocus2026-06-12—thev0.1vertical-sliceframingissuperseded,butstationdistrictlayoutwithfunctionalclusterssurvivesasecon-layer/building-placementgenerationwork.', NULL, '2026-06-1210:23:02', '2026-06-1210:23:02', '2026-06-1210:23:02', NULL, '387bd6989f40f1223efdff0357cd71ac', 2) ON CONFLICT(hash) DO NOTHING;
INSERTINTOticket_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-parentedunderPhase6epicpercascaderefocus2026-06-12—populationentanglementratiosarebackground-NPC-layerwork;functionalrequirementpreserved.', NULL, '2026-06-1210:23:02', '2026-06-1210:23:02', '2026-06-1210:23:02', NULL, '57ee2ecbff7e57e7c04c9db0bce007f9', 2) ON CONFLICT(hash) DO NOTHING;
INSERTINTOticket_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-homedunderthemaintenanceumbrellapercascaderefocus2026-06-12—servertestinfrastructureisongoinginfrahygiene(muchalreadydeliveredviatheGauntlet/verificationharness);remainingscopepreserved.', NULL, '2026-06-1210:23:02', '2026-06-1210:23:02', '2026-06-1210:23:02', NULL, 'fd801d30de40ef78e44be5f0c73d4ce7', 2) ON CONFLICT(hash) DO NOTHING;
INSERTINTOticket_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-homedunderthemaintenanceumbrellapercascaderefocus2026-06-12—headlessCLIharnessistesttoolinghygieneunderdoneepicT-35;verifyremaininggapvstheexisting--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;
INSERTINTOticket_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.
Parkedpost-cascadeperrefocus2026-06-12—theTCPNetworkBridgeforfuturemultiplayerhasnogenerationdependencyandstaysdeferred;functionalrequirementpreserved(sameinterfaceasLocalBridge).', NULL, '2026-06-1210:23:02', '2026-06-1210:23:02', '2026-06-1210:23:02', NULL, '0bc66738b138867012998db30c3e47ac', 2) ON CONFLICT(hash) DO NOTHING;
INSERTINTOticket_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.
Parkedaspost-cascadegameplaypercascaderefocus2026-06-12;functionalrequirement(knowledge-gatedmonologueaccuracy)preserved,notcancelled.', NULL, '2026-06-1210:23:02', '2026-06-1210:23:02', '2026-06-1210:23:02', NULL, '47e981f0914997d744de13d003d99aa9', 2) ON CONFLICT(hash) DO NOTHING;
INSERTINTOticket_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-parentedunderPhase4epic(T-750)percascaderefocus2026-06-12;scopeupdatedfromv0.1placeholderarttothefinal-versionassetpipelineperD-166(noplaceholders,notestmap)—functionalrequirement(assetproductionpipeline)preserved.', NULL, '2026-06-1210:23:02', '2026-06-1210:23:02', '2026-06-1210:23:02', NULL, 'dda68f7fbce543e1d4483060a27976f0', 2) ON CONFLICT(hash) DO NOTHING;
INSERTINTOticket_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.
Parkedaspost-cascadegameplaypercascaderefocus2026-06-12;profession/faction/relationship-gatedPOIvisibilitypreserved,notcancelled.', NULL, '2026-06-1210:23:02', '2026-06-1210:23:02', '2026-06-1210:23:02', NULL, 'b03d0c586f36e9e08e47b1993ec5b31e', 2) ON CONFLICT(hash) DO NOTHING;
INSERTINTOticket_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.
Parkedaspost-cascadegameplaypercascaderefocus2026-06-12;drama-moduleattachmentratios(anti-metagaming)preserved,notcancelled.', NULL, '2026-06-1210:23:02', '2026-06-1210:23:02', '2026-06-1210:23:02', NULL, '5e39ddd2b0467615325fb3c7371cc08c', 2) ON CONFLICT(hash) DO NOTHING;
INSERTINTOticket_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-homedundermaintenancepercascaderefocus2026-06-12;production-codetest-hookpolicyisengineering-hygienedocumentation.', NULL, '2026-06-1210:23:02', '2026-06-1210:23:02', '2026-06-1210:23:02', NULL, '131a8ef9207d04512a3c52e8a794b3f5', 2) ON CONFLICT(hash) DO NOTHING;
INSERTINTOticket_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.
ParkedunderPhase5epic(T-749)percascaderefocus2026-06-12;previousparentinitiativeT-29iscancelled—tilecollision/pathfinding/clockistheplayer-walkingfoundation(NPCmovementportionfollowsinPhase6).', NULL, '2026-06-1210:23:03', '2026-06-1210:23:03', '2026-06-1210:23:03', NULL, '1329583e026c26024db16b70da7878f3', 2) ON CONFLICT(hash) DO NOTHING;
INSERTINTOticket_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.
Parkedaspost-cascadegameplaypercascaderefocus2026-06-12;theobservation/interactionspineofthecoregameplayloopispreserved,notcancelled.', NULL, '2026-06-1210:23:03', '2026-06-1210:23:03', '2026-06-1210:23:03', NULL, '26149fcd78db4ea4888549edb6a66308', 2) ON CONFLICT(hash) DO NOTHING;
INSERTINTOticket_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.
ParkedunderPhase5epic(T-749)percascaderefocus2026-06-12;save/loadandsessionmanagementaretiedtoplayablesessions(savegamelineageisdocumentedasPhase5+).', NULL, '2026-06-1210:23:03', '2026-06-1210:23:03', '2026-06-1210:23:03', NULL, 'e6ea3e6e6ce541d5a4140209eac0f075', 2) ON CONFLICT(hash) DO NOTHING;
INSERTINTOticket_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.
INSERTINTOticket_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.
INSERTINTOticket_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.
INSERTINTOticket_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.
INSERTINTOticket_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)ONCONFLICT(hash)DONOTHING;
INSERTINTOticket_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.
INSERTINTOticket_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.
Parkedingameplaybacklogpercascaderefocus2026-06-12;template-assemblygenerationsupersededbytheT-750cascade—proof-of-lifeplaytestconceptpreserved.', NULL, '2026-06-1210:23:03', '2026-06-1210:23:03', '2026-06-1210:23:03', NULL, '8637267369c90396682245eaf70e3583', 2) ON CONFLICT(hash) DO NOTHING;
INSERTINTOticket_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.
Parkedingameplaybacklogpercascaderefocus2026-06-12;bookmarkconceptpreservedforpost-cascadegame-making.', NULL, '2026-06-1210:23:03', '2026-06-1210:23:03', '2026-06-1210:23:03', NULL, 'f48ed040780f6cda4ee5a5d83d4be639', 2) ON CONFLICT(hash) DO NOTHING;
INSERTINTOticket_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.
Parkedingameplaybacklogpercascaderefocus2026-06-12;bookmark-selectionflowpreserved—cosmeticcustomisationtrackedseparatelyunderPhase5(T-619).', NULL, '2026-06-1210:23:03', '2026-06-1210:23:03', '2026-06-1210:23:03', NULL, '952fc393969df30789555e0e1c86cd3a', 2) ON CONFLICT(hash) DO NOTHING;
INSERTINTOticket_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.
Parkedingameplaybacklogpercascaderefocus2026-06-12;world-feeldecisionspreservedforpost-cascadegame-making.', NULL, '2026-06-1210:23:03', '2026-06-1210:23:03', '2026-06-1210:23:03', NULL, 'f73bbff50e3086e97148bbec5e270859', 2) ON CONFLICT(hash) DO NOTHING;
INSERTINTOticket_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).
ParkedunderPhase5epicpercascaderefocus2026-06-12;character-visualscustomisationresumeswithplayerrendering(overlapsT-694).', NULL, '2026-06-1210:23:03', '2026-06-1210:23:03', '2026-06-1210:23:03', NULL, '93028af6bfd2b06dd2b1e7f143b6306e', 2) ON CONFLICT(hash) DO NOTHING;
INSERTINTOticket_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.
ParkedunderPhase6epicpercascaderefocus2026-06-12(previousparentT-607cancelled);relationship-formationrequirementpreservedfortheNPClayer.', NULL, '2026-06-1210:23:03', '2026-06-1210:23:03', '2026-06-1210:23:03', NULL, 'db160085efbdb1baa50e081cee38348c', 2) ON CONFLICT(hash) DO NOTHING;
INSERTINTOticket_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.
ParkedunderPhase6epicpercascaderefocus2026-06-12;quietly-responsive-worldrequirementpreservedfortheNPClayer.', NULL, '2026-06-1210:23:03', '2026-06-1210:23:03', '2026-06-1210:23:03', NULL, '0222df0f946a02c1b17fc43a5d501275', 2) ON CONFLICT(hash) DO NOTHING;
INSERTINTOticket_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-homedundermaintenancepercascaderefocus2026-06-12;GPUbuild-featureenablementisinfrahygieneontheexistingvoicepipeline.', NULL, '2026-06-1210:23:03', '2026-06-1210:23:03', '2026-06-1210:23:03', NULL, '9ce4fe243def647e8b9e361acbc388ad', 2) ON CONFLICT(hash) DO NOTHING;
INSERTINTOticket_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-homedundermaintenancepercascaderefocus2026-06-12;triggerconditionsunchanged.', NULL, '2026-06-1210:23:03', '2026-06-1210:23:03', '2026-06-1210:23:03', NULL, 'fa543df4e53e1f4640de0f2d8fd0e564', 2) ON CONFLICT(hash) DO NOTHING;
INSERTINTOticket_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-homedundermaintenancepercascaderefocus2026-06-12;recastsprintprotocolforkanban/batchmode—functionalrequirementpreserved.', NULL, '2026-06-1210:23:03', '2026-06-1210:23:03', '2026-06-1210:23:03', NULL, '51ed1f7c869ab7763db1515b15da102b', 2) ON CONFLICT(hash) DO NOTHING;
INSERTINTOticket_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)ONCONFLICT(hash)DONOTHING;
INSERTINTOticket_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.
INSERTINTOticket_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.
ParkedunderPhase5epicpercascaderefocus2026-06-12;crowd-renderingresearchresumeswithin-worldrenderingwork.', NULL, '2026-06-1210:23:03', '2026-06-1210:23:03', '2026-06-1210:23:03', NULL, '4a9d9c7110d535cea09345cae53cb0c4', 2) ON CONFLICT(hash) DO NOTHING;
INSERTINTOticket_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.
ParkedunderPhase5epicpercascaderefocus2026-06-12;character-visualsleftoverpreserved.', NULL, '2026-06-1210:23:03', '2026-06-1210:23:03', '2026-06-1210:23:03', NULL, 'd7bdc6daa348e5174a109160ea402783', 2) ON CONFLICT(hash) DO NOTHING;
INSERTINTOticket_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.
ParkedunderPhase5epicpercascaderefocus2026-06-12;character-visualsleftoverpreserved.', NULL, '2026-06-1210:23:03', '2026-06-1210:23:03', '2026-06-1210:23:03', NULL, 'ceaf1f9cd8543b84b113a5fa0eec9a63', 2) ON CONFLICT(hash) DO NOTHING;
INSERTINTOticket_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.
ParkedunderPhase5epicpercascaderefocus2026-06-12;character-visualsleftoverpreserved.', NULL, '2026-06-1210:23:03', '2026-06-1210:23:03', '2026-06-1210:23:03', NULL, '8df024d88478e4c5ccb02746b2533f20', 2) ON CONFLICT(hash) DO NOTHING;
INSERTINTOticket_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.
ParkedunderPhase5epicpercascaderefocus2026-06-12;latentcreation-UIbugfixedalongsidecharacter-visualsleftovers.', NULL, '2026-06-1210:23:03', '2026-06-1210:23:03', '2026-06-1210:23:03', NULL, '12b79e07db27041708b58a1bdf1a9878', 2) ON CONFLICT(hash) DO NOTHING;
INSERTINTOticket_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.
ParkedunderPhase5epicpercascaderefocus2026-06-12;adoptthepatternwhengameplayUIsurfacesarebuilt.', NULL, '2026-06-1210:23:03', '2026-06-1210:23:03', '2026-06-1210:23:03', NULL, 'afff3234f7568416f12bf3798f3430a2', 2) ON CONFLICT(hash) DO NOTHING;
INSERTINTOticket_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.
ParkedunderPhase5epicpercascaderefocus2026-06-12;installwhenHUD/gameplayUIdevelopmentresumes.', NULL, '2026-06-1210:23:03', '2026-06-1210:23:03', '2026-06-1210:23:03', NULL, '4e602b09bdc4bb576bd084869518b5d1', 2) ON CONFLICT(hash) DO NOTHING;
INSERTINTOticket_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.
ParkedunderPhase5epicpercascaderefocus2026-06-12;functionalrequirement(multi-resolutionvisualregression)preserved—resumeswithcharacterrenderingwork.', NULL, '2026-06-1210:23:03', '2026-06-1210:23:03', '2026-06-1210:23:03', NULL, '97136ab4f9f1f22de5a449b159c72d6d', 2) ON CONFLICT(hash) DO NOTHING;
INSERTINTOticket_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.
Parkedunderpost-cascadegameplay/releasebacklogpercascaderefocus2026-06-12;legalattributionrequirementpreservedforreleasepreparation.', NULL, '2026-06-1210:23:03', '2026-06-1210:23:03', '2026-06-1210:23:03', NULL, 'b02383d6350c79eba1708421aece23a2', 2) ON CONFLICT(hash) DO NOTHING;
INSERTINTOticket_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.
Parkedunderpost-cascadegameplaybacklogpercascaderefocus2026-06-12;preserved,notcancelled.', NULL, '2026-06-1210:23:04', '2026-06-1210:23:04', '2026-06-1210:23:04', NULL, '837ba526ee51d3d1b1dbe0e57fc2ba1f', 2) ON CONFLICT(hash) DO NOTHING;
INSERTINTOticket_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.
ParkedunderPhase5epicpercascaderefocus2026-06-12;server-authoritativeminimaprequirementpreserved—resumeswithplayerrendering.', NULL, '2026-06-1210:23:04', '2026-06-1210:23:04', '2026-06-1210:23:04', NULL, 'fcb9b5c82f6c26c92293090c073d1211', 2) ON CONFLICT(hash) DO NOTHING;
INSERTINTOticket_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.
ParkedunderPhase5epicpercascaderefocus2026-06-12;asymmetric-informationtooltiprequirementpreserved—resumeswithgameplayUIwork.', NULL, '2026-06-1210:23:04', '2026-06-1210:23:04', '2026-06-1210:23:04', NULL, 'e08809c3d8eb525b1be278e52a4ece9f', 2) ON CONFLICT(hash) DO NOTHING;
INSERTINTOticket_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.
ParkedunderPhase5epicpercascaderefocus2026-06-12;unifiedsettings/inputdesignrequirementpreserved—resumeswithplayercontrolwork.', NULL, '2026-06-1210:23:04', '2026-06-1210:23:04', '2026-06-1210:23:04', NULL, '1bc7c74d446e342f697d8d9ad596184a', 2) ON CONFLICT(hash) DO NOTHING;
INSERTINTOticket_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-parentedunderPhase4epicpercascaderefocus2026-06-12—asset-pipelinetoolingfeedingthePhase-4assetcatalog.', NULL, '2026-06-1210:23:04', '2026-06-1210:23:04', '2026-06-1210:23:04', NULL, '6fa7e591ddac231484991527587cb530', 2) ON CONFLICT(hash) DO NOTHING;
INSERTINTOticket_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.
ParkedunderPhase5epicpercascaderefocus2026-06-12;interactable-highlightrequirementpreserved—evaluatewhentheinteractionsystemisbuilt.', NULL, '2026-06-1210:23:04', '2026-06-1210:23:04', '2026-06-1210:23:04', NULL, 'cefee7bdb82d9c9b16a18e6af89a7917', 2) ON CONFLICT(hash) DO NOTHING;
INSERTINTOticket_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.
ParkedunderPhase5epicpercascaderefocus2026-06-12;HUDstatus-iconrequirementpreserved—resumeswithgameplayUIwork.', NULL, '2026-06-1210:23:04', '2026-06-1210:23:04', '2026-06-1210:23:04', NULL, 'a6c4857ba57ea9ffa1c933f2c133f194', 2) ON CONFLICT(hash) DO NOTHING;
INSERTINTOticket_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.
ParkedunderPhase5epicpercascaderefocus2026-06-12;keybinddocumentationandremappingrequirementpreserved—pairswithT-735.', NULL, '2026-06-1210:23:04', '2026-06-1210:23:04', '2026-06-1210:23:04', NULL, '7551e65c0732fbcbc9f32f9ec75a1388', 2) ON CONFLICT(hash) DO NOTHING;
INSERTINTOticket_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-parentedunderPhase4epicpercascaderefocus2026-06-12—generation-toolingtestcoverage(atlasstar-mapgenerator).', NULL, '2026-06-1210:23:04', '2026-06-1210:23:04', '2026-06-1210:23:04', NULL, '28b48f03517057f089201fa0be6bcea9', 2) ON CONFLICT(hash) DO NOTHING;
INSERTINTOticket_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-parentedunderPhase4epicpercascaderefocus2026-06-12—atlasmarkersschemaisgeneration-outputdata.', NULL, '2026-06-1210:23:04', '2026-06-1210:23:04', '2026-06-1210:23:04', NULL, '4e23b109798083d8dc6c365ca5602d6f', 2) ON CONFLICT(hash) DO NOTHING;
INSERTINTOticket_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)
Alsoneeds:releasebuildpipeline(CI/cross-compilation)foreachtargetplatform,devpackageinstallationinstructionsforeachbackend(e.g.ROCmrocm-hip-develonFedoraisrequiredfor--features rocm to build), runtime hardware detection in the game launcher to pick the right binary.
Filedduringthe#833namingpipelinework—theROCmrebuildonthedevmachinesurfacedthatthecurrentMakefiletarget`build-sr-voice`producesCPU-onlybinariesregardlessofthehardwarepresent,whichisfineforthedev''s#833batchbutabsolutelywrongforshippedreleasebinaries.Parentwork:D-138(Gemma2voicepipeline).', 'ThegamewillshiponmultipleGPUvendors.Thecurrentsr-voiceCargo.tomlhasoptionalfeatureflagsformetal/vulkan/cuda/rocmbutdefault=[]—whichmeans`cargobuild--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)
Alsoneeds:releasebuildpipeline(CI/cross-compilation)foreachtargetplatform,devpackageinstallationinstructionsforeachbackend(e.g.ROCmrocm-hip-develonFedoraisrequiredfor--features rocm to build), runtime hardware detection in the game launcher to pick the right binary.
INSERTINTOticket_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-homedundermaintenance(testdebt)percascaderefocus2026-06-12.', NULL, '2026-06-1210:23:04', '2026-06-1210:23:04', '2026-06-1210:23:04', NULL, '4b580afc32e9395363db47830ae00254', 2) ON CONFLICT(hash) DO NOTHING;
INSERTINTOticket_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-homedundermaintenance(test-revivaldebtfrom#870deletions)percascaderefocus2026-06-12.', NULL, '2026-06-1210:23:04', '2026-06-1210:23:04', '2026-06-1210:23:04', NULL, 'd6bbde49b03c7193e985e2c8edae61b9', 2) ON CONFLICT(hash) DO NOTHING;
INSERTINTOticket_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-homedundermaintenance(test-revivaldebtfrom#870deletions)percascaderefocus2026-06-12.', NULL, '2026-06-1210:23:04', '2026-06-1210:23:04', '2026-06-1210:23:04', NULL, '9eb2d0145e5d69b8a9a1da782a2cae33', 2) ON CONFLICT(hash) DO NOTHING;
INSERTINTOticket_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-homedundermaintenance(test-revivaldebtfrom#870deletions)percascaderefocus2026-06-12.', NULL, '2026-06-1210:23:04', '2026-06-1210:23:04', '2026-06-1210:23:04', NULL, 'd1200b1c150086e91d428b6806d6dca1', 2) ON CONFLICT(hash) DO NOTHING;
INSERTINTOticket_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.
INSERTINTOticket_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):
INSERTINTOticket_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#137includes21fileeditsunder`wiki/`authoredbytheserverteam(6newcorpwikipages+15tagupdates,shippedunder#860—"Close D-175 Phase 2 coverage gate").`CLAUDE.md`team-boundariespolicysays:*"Stay within your team''s scope. Server team modifies `server/`. Copy team modifies `wiki/`."*Thewikiwriteswereacceptedforthissprintasapragmaticfix(andcopy-teamfollow-upreviewfiledas#884),butHoshecorrectlyflaggedtheprecedentconcern:
>"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."
**Cross-reference:**PR#137,#860(D-175Phase2coveragegate),#884(copy-teamvoice/lorereviewofthewikiwrites),`CLAUDE.md`"Agent Instructions → Team boundaries"section.
PR#137includes21fileeditsunder`wiki/`authoredbytheserverteam(6newcorpwikipages+15tagupdates,shippedunder#860—"Close D-175 Phase 2 coverage gate").`CLAUDE.md`team-boundariespolicysays:*"Stay within your team''s scope. Server team modifies `server/`. Copy team modifies `wiki/`."*Thewikiwriteswereacceptedforthissprintasapragmaticfix(andcopy-teamfollow-upreviewfiledas#884),butHoshecorrectlyflaggedtheprecedentconcern:
>"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."
**Cross-reference:**PR#137,#860(D-175Phase2coveragegate),#884(copy-teamvoice/lorereviewofthewikiwrites),`CLAUDE.md`"Agent Instructions → Team boundaries"section.
INSERTINTOticket_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.
Parkedunderpost-cascadegameplaybacklogpercascaderefocus2026-06-12;D-027criterion-4coveragerequirementpreserved—picksupwhentellescalation(#589)lands.', NULL, '2026-06-1210:23:05', '2026-06-1210:23:05', '2026-06-1210:23:05', NULL, '9c1136adea956745fd8c509a5220d750', 2) ON CONFLICT(hash) DO NOTHING;
INSERTINTOticket_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-homedundermaintenancefromdoneumbrellaT-871percascaderefocus2026-06-12.', NULL, '2026-06-1210:23:05', '2026-06-1210:23:05', '2026-06-1210:23:05', NULL, 'aafb0b06053995e8abd23fa978f55329', 2) ON CONFLICT(hash) DO NOTHING;
INSERTINTOticket_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-homedundermaintenancefromdoneumbrellaT-871percascaderefocus2026-06-12.', NULL, '2026-06-1210:23:05', '2026-06-1210:23:05', '2026-06-1210:23:05', NULL, '2e20c8d57ebb36df3ec4c62a4019a0ae', 2) ON CONFLICT(hash) DO NOTHING;
INSERTINTOticket_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-homedundermaintenancefromdoneumbrellaT-871percascaderefocus2026-06-12.', NULL, '2026-06-1210:23:05', '2026-06-1210:23:05', '2026-06-1210:23:05', NULL, '66a1757301b4be02a42e6fe14cb907e4', 2) ON CONFLICT(hash) DO NOTHING;
INSERTINTOticket_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-homedundermaintenancefromdoneumbrellaT-871percascaderefocus2026-06-12.', NULL, '2026-06-1210:23:05', '2026-06-1210:23:05', '2026-06-1210:23:05', NULL, '15fd6bc1637771fb36b0361658f5b12f', 2) ON CONFLICT(hash) DO NOTHING;
INSERTINTOticket_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-homedundermaintenancefromdoneumbrellaT-871percascaderefocus2026-06-12.', NULL, '2026-06-1210:23:05', '2026-06-1210:23:05', '2026-06-1210:23:05', NULL, '627f13f72010cc6e168d832ba4dadce6', 2) ON CONFLICT(hash) DO NOTHING;
INSERTINTOticket_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-homedundermaintenancefromdoneumbrellaT-871percascaderefocus2026-06-12.', NULL, '2026-06-1210:23:05', '2026-06-1210:23:05', '2026-06-1210:23:05', NULL, '8e04e917f9de6e7ab8b8c70b39826d9d', 2) ON CONFLICT(hash) DO NOTHING;
INSERTINTOticket_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-homedundermaintenancefromdoneumbrellaT-871percascaderefocus2026-06-12.', NULL, '2026-06-1210:23:05', '2026-06-1210:23:05', '2026-06-1210:23:05', NULL, 'bf9041705c59d84b0ccee690f5eb57a5', 2) ON CONFLICT(hash) DO NOTHING;
INSERTINTOticket_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-homedundermaintenancefromdoneumbrellaT-871percascaderefocus2026-06-12.', NULL, '2026-06-1210:23:05', '2026-06-1210:23:05', '2026-06-1210:23:05', NULL, '80a3b0d7891f6d8a3dbd5d4210a1d283', 2) ON CONFLICT(hash) DO NOTHING;
INSERTINTOticket_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-parentedunderPhase4epicpercascaderefocus2026-06-12—biometaxonomyfortheatlas/cascadegenerator.', NULL, '2026-06-1210:23:05', '2026-06-1210:23:05', '2026-06-1210:23:05', NULL, '7f7f52c2e35c84f0a91c571949aeebbe', 2) ON CONFLICT(hash) DO NOTHING;
INSERTINTOticket_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.
INSERTINTOticket_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:
Goal:agreen(orexplicitly-gated)bare`maketest-client`soclientregressionsaredetectable.Untilthen,runtargetedsuites(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:
INSERTINTOticket_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):
INSERTINTOticket_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.
INSERTINTOticket_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)ONCONFLICT(hash)DONOTHING;
INSERTINTOticket_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)ONCONFLICT(hash)DONOTHING;
INSERTINTOticket_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)ONCONFLICT(hash)DONOTHING;
INSERTINTOticket_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)ONCONFLICT(hash)DONOTHING;
INSERTINTOticket_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.
Cancelled2026-06-12:pre-cascadeumbrellaemptiedbythecascaderefocus—childrenre-homed(T-54toPhase4,T-55/T-56toPhase6,T-53togameplayparkingT-1036).', NULL, '2026-06-1210:23:06', '2026-06-1210:23:06', '2026-06-1210:23:06', NULL, 'ff38957b48287803e268bc019bba7bed', 2) ON CONFLICT(hash) DO NOTHING;
INSERTINTOticket_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.
Cancelled2026-06-12:pre-cascadeumbrella—test-infrachildrenre-homedundermaintenanceinitiativeT-1037;discussionchildT-64cancelled(testingapproachlongestablished).', NULL, '2026-06-1210:23:06', '2026-06-1210:23:06', '2026-06-1210:23:06', NULL, '75630490b06810bdd8b4f04b2bbf6dd7', 2) ON CONFLICT(hash) DO NOTHING;
INSERTINTOticket_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.
Cancelled2026-06-12:discussionpremisefulfilled—testingapproachestablishedanddocumented(three-tierstrategy,Gauntlet-first,D-239harness);docdeliverablesliveoninT-215/T-216/T-217underT-1037.', NULL, '2026-06-1210:23:06', '2026-06-1210:23:06', '2026-06-1210:23:06', NULL, 'e524883fd40476112076fdadb5902f62', 2) ON CONFLICT(hash) DO NOTHING;
INSERTINTOticket_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)ONCONFLICT(hash)DONOTHING;
INSERTINTOticket_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.
Cancelled2026-06-12:pre-cascadeumbrella—test-infrachildrenre-homedundermaintenanceinitiativeT-1037;discussionchildT-64cancelled(testingapproachlongestablished).', NULL, '2026-06-1210:23:17', '2026-06-1210:23:17', '2026-06-1210:23:17', NULL, '949dfa994e19abe55b5c87c45acea3a7', 2) ON CONFLICT(hash) DO NOTHING;
INSERTINTOticket_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.''
Hygienenote2026-06-12:titlesays''blocked''butnoblockeredgeexists,sothissurfacedinthe--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;
INSERTINTOticket_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).
GatetriggerupdatedperD-166amendment(2026-06-12):Phase5rampsinparallelonceOUTSIDEgenerationproducesdeterministic,walkableexteriors—thegatethisticketholdsis''outsidesgeneratedeterministicallyandarewalkable''(validationpass:settlementslegible,walkable,named),not''allPhase-4polishcomplete''.Door-boundarycontractsandremainingPhase-4detailmaycontinuealongsideearlyPhase-5work.', NULL, '2026-06-1210:23:21', '2026-06-1210:23:21', '2026-06-1210:23:21', NULL, '95c4da6eebe02dc3d59875a7ff11646e', 2) ON CONFLICT(hash) DO NOTHING;
INSERTINTOticket_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.
INSERTINTOtickets(record_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)ONCONFLICT(record_id)DOUPDATESETtype=excluded.type,parent_record_id=excluded.parent_record_id,title=excluded.title,description=excluded.description,status=excluded.status,priority=excluded.priority,assigned_to=excluded.assigned_to,team=excluded.team,decision_ref=excluded.decision_ref,updated_at=excluded.updated_at,deleted_at=excluded.deleted_at,hash=excluded.hash,canonical_version=excluded.canonical_versionWHEREexcluded.updated_at>tickets.updated_atOR(excluded.updated_at=tickets.updated_atANDexcluded.hash>tickets.hash);
INSERTINTOtickets(record_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)ONCONFLICT(record_id)DOUPDATESETtype=excluded.type,parent_record_id=excluded.parent_record_id,title=excluded.title,description=excluded.description,status=excluded.status,priority=excluded.priority,assigned_to=excluded.assigned_to,team=excluded.team,decision_ref=excluded.decision_ref,updated_at=excluded.updated_at,deleted_at=excluded.deleted_at,hash=excluded.hash,canonical_version=excluded.canonical_versionWHEREexcluded.updated_at>tickets.updated_atOR(excluded.updated_at=tickets.updated_atANDexcluded.hash>tickets.hash);
INSERTINTOtickets(record_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)ONCONFLICT(record_id)DOUPDATESETtype=excluded.type,parent_record_id=excluded.parent_record_id,title=excluded.title,description=excluded.description,status=excluded.status,priority=excluded.priority,assigned_to=excluded.assigned_to,team=excluded.team,decision_ref=excluded.decision_ref,updated_at=excluded.updated_at,deleted_at=excluded.deleted_at,hash=excluded.hash,canonical_version=excluded.canonical_versionWHEREexcluded.updated_at>tickets.updated_atOR(excluded.updated_at=tickets.updated_atANDexcluded.hash>tickets.hash);
INSERTINTOtickets(record_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)ONCONFLICT(record_id)DOUPDATESETtype=excluded.type,parent_record_id=excluded.parent_record_id,title=excluded.title,description=excluded.description,status=excluded.status,priority=excluded.priority,assigned_to=excluded.assigned_to,team=excluded.team,decision_ref=excluded.decision_ref,updated_at=excluded.updated_at,deleted_at=excluded.deleted_at,hash=excluded.hash,canonical_version=excluded.canonical_versionWHEREexcluded.updated_at>tickets.updated_atOR(excluded.updated_at=tickets.updated_atANDexcluded.hash>tickets.hash);
INSERTINTOtickets(record_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)ONCONFLICT(record_id)DOUPDATESETtype=excluded.type,parent_record_id=excluded.parent_record_id,title=excluded.title,description=excluded.description,status=excluded.status,priority=excluded.priority,assigned_to=excluded.assigned_to,team=excluded.team,decision_ref=excluded.decision_ref,updated_at=excluded.updated_at,deleted_at=excluded.deleted_at,hash=excluded.hash,canonical_version=excluded.canonical_versionWHEREexcluded.updated_at>tickets.updated_atOR(excluded.updated_at=tickets.updated_atANDexcluded.hash>tickets.hash);
INSERTINTOtickets(record_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)ONCONFLICT(record_id)DOUPDATESETtype=excluded.type,parent_record_id=excluded.parent_record_id,title=excluded.title,description=excluded.description,status=excluded.status,priority=excluded.priority,assigned_to=excluded.assigned_to,team=excluded.team,decision_ref=excluded.decision_ref,updated_at=excluded.updated_at,deleted_at=excluded.deleted_at,hash=excluded.hash,canonical_version=excluded.canonical_versionWHEREexcluded.updated_at>tickets.updated_atOR(excluded.updated_at=tickets.updated_atANDexcluded.hash>tickets.hash);
INSERTINTOtickets(record_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)ONCONFLICT(record_id)DOUPDATESETtype=excluded.type,parent_record_id=excluded.parent_record_id,title=excluded.title,description=excluded.description,status=excluded.status,priority=excluded.priority,assigned_to=excluded.assigned_to,team=excluded.team,decision_ref=excluded.decision_ref,updated_at=excluded.updated_at,deleted_at=excluded.deleted_at,hash=excluded.hash,canonical_version=excluded.canonical_versionWHEREexcluded.updated_at>tickets.updated_atOR(excluded.updated_at=tickets.updated_atANDexcluded.hash>tickets.hash);
INSERTINTOtickets(record_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)ONCONFLICT(record_id)DOUPDATESETtype=excluded.type,parent_record_id=excluded.parent_record_id,title=excluded.title,description=excluded.description,status=excluded.status,priority=excluded.priority,assigned_to=excluded.assigned_to,team=excluded.team,decision_ref=excluded.decision_ref,updated_at=excluded.updated_at,deleted_at=excluded.deleted_at,hash=excluded.hash,canonical_version=excluded.canonical_versionWHEREexcluded.updated_at>tickets.updated_atOR(excluded.updated_at=tickets.updated_atANDexcluded.hash>tickets.hash);
INSERTINTOtickets(record_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)ONCONFLICT(record_id)DOUPDATESETtype=excluded.type,parent_record_id=excluded.parent_record_id,title=excluded.title,description=excluded.description,status=excluded.status,priority=excluded.priority,assigned_to=excluded.assigned_to,team=excluded.team,decision_ref=excluded.decision_ref,updated_at=excluded.updated_at,deleted_at=excluded.deleted_at,hash=excluded.hash,canonical_version=excluded.canonical_versionWHEREexcluded.updated_at>tickets.updated_atOR(excluded.updated_at=tickets.updated_atANDexcluded.hash>tickets.hash);
Re-parentedunderPhase6epicpercascaderefocus2026-06-12—backgroundNPCsimulationtiersfollowworldgenerationanddoorboundarycontracts;formerparentT-29iscancelled.Functionalrequirementpreserved.', 'backlog', 'critical', NULL, NULL, 'D-026', '2026-02-1023:15:58', '2026-06-1210: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);
INSERTINTOtickets(record_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)ONCONFLICT(record_id)DOUPDATESETtype=excluded.type,parent_record_id=excluded.parent_record_id,title=excluded.title,description=excluded.description,status=excluded.status,priority=excluded.priority,assigned_to=excluded.assigned_to,team=excluded.team,decision_ref=excluded.decision_ref,updated_at=excluded.updated_at,deleted_at=excluded.deleted_at,hash=excluded.hash,canonical_version=excluded.canonical_versionWHEREexcluded.updated_at>tickets.updated_atOR(excluded.updated_at=tickets.updated_atANDexcluded.hash>tickets.hash);
INSERTINTOtickets(record_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-parentedunderPhase5epicpercascaderefocus2026-06-12—fog-of-perceptionvisionisaplayer-surfacesystembuiltongeneratedtiles;functionalrequirementpreserved.', 'backlog', 'critical', NULL, NULL, 'D-011', '2026-02-1023:16:24', '2026-06-1210: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);
INSERTINTOtickets(record_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)ONCONFLICT(record_id)DOUPDATESETtype=excluded.type,parent_record_id=excluded.parent_record_id,title=excluded.title,description=excluded.description,status=excluded.status,priority=excluded.priority,assigned_to=excluded.assigned_to,team=excluded.team,decision_ref=excluded.decision_ref,updated_at=excluded.updated_at,deleted_at=excluded.deleted_at,hash=excluded.hash,canonical_version=excluded.canonical_versionWHEREexcluded.updated_at>tickets.updated_atOR(excluded.updated_at=tickets.updated_atANDexcluded.hash>tickets.hash);
INSERTINTOtickets(record_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-parentedunderPhase5epicpercascaderefocus2026-06-12—lockedcameraisplayer-controlwork;functionalrequirementpreserved.', 'backlog', 'critical', NULL, NULL, 'D-015', '2026-02-1023:16:24', '2026-06-1210: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);
INSERTINTOtickets(record_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)ONCONFLICT(record_id)DOUPDATESETtype=excluded.type,parent_record_id=excluded.parent_record_id,title=excluded.title,description=excluded.description,status=excluded.status,priority=excluded.priority,assigned_to=excluded.assigned_to,team=excluded.team,decision_ref=excluded.decision_ref,updated_at=excluded.updated_at,deleted_at=excluded.deleted_at,hash=excluded.hash,canonical_version=excluded.canonical_versionWHEREexcluded.updated_at>tickets.updated_atOR(excluded.updated_at=tickets.updated_atANDexcluded.hash>tickets.hash);
INSERTINTOtickets(record_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-parentedunderPhase5epicpercascaderefocus2026-06-12—internalmonologueisaplayerperceptionsurface;line-contentdetailcandeepeninPhase6.Functionalrequirementpreserved.', 'backlog', 'high', NULL, NULL, 'D-016', '2026-02-1023:16:24', '2026-06-1210: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);
INSERTINTOtickets(record_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)ONCONFLICT(record_id)DOUPDATESETtype=excluded.type,parent_record_id=excluded.parent_record_id,title=excluded.title,description=excluded.description,status=excluded.status,priority=excluded.priority,assigned_to=excluded.assigned_to,team=excluded.team,decision_ref=excluded.decision_ref,updated_at=excluded.updated_at,deleted_at=excluded.deleted_at,hash=excluded.hash,canonical_version=excluded.canonical_versionWHEREexcluded.updated_at>tickets.updated_atOR(excluded.updated_at=tickets.updated_atANDexcluded.hash>tickets.hash);
INSERTINTOtickets(record_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-parentedunderPhase5epicpercascaderefocus2026-06-12—three-rangesoundpropagationisaplayerperceptionsurface;functionalrequirementpreserved.', 'backlog', 'high', NULL, NULL, 'D-018', '2026-02-1023:16:24', '2026-06-1210: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);
INSERTINTOtickets(record_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)ONCONFLICT(record_id)DOUPDATESETtype=excluded.type,parent_record_id=excluded.parent_record_id,title=excluded.title,description=excluded.description,status=excluded.status,priority=excluded.priority,assigned_to=excluded.assigned_to,team=excluded.team,decision_ref=excluded.decision_ref,updated_at=excluded.updated_at,deleted_at=excluded.deleted_at,hash=excluded.hash,canonical_version=excluded.canonical_versionWHEREexcluded.updated_at>tickets.updated_atOR(excluded.updated_at=tickets.updated_atANDexcluded.hash>tickets.hash);
INSERTINTOtickets(record_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-parentedunderPhase5epicpercascaderefocus2026-06-12—in-worldtile/spriterenderingongeneratedtiles(D-019supersededbyD-148);functionalrequirementpreserved.', 'backlog', 'critical', NULL, NULL, 'D-019', '2026-02-1023:16:24', '2026-06-1210: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);
INSERTINTOtickets(record_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)ONCONFLICT(record_id)DOUPDATESETtype=excluded.type,parent_record_id=excluded.parent_record_id,title=excluded.title,description=excluded.description,status=excluded.status,priority=excluded.priority,assigned_to=excluded.assigned_to,team=excluded.team,decision_ref=excluded.decision_ref,updated_at=excluded.updated_at,deleted_at=excluded.deleted_at,hash=excluded.hash,canonical_version=excluded.canonical_versionWHEREexcluded.updated_at>tickets.updated_atOR(excluded.updated_at=tickets.updated_atANDexcluded.hash>tickets.hash);
INSERTINTOtickets(record_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-parentedunderPhase5epicpercascaderefocus2026-06-12—perceptionmodeframeworkextendstheplayervisionbaseline;functionalrequirementpreserved.', 'backlog', 'medium', NULL, NULL, 'D-017', '2026-02-1023:16:24', '2026-06-1210: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);
INSERTINTOtickets(record_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)ONCONFLICT(record_id)DOUPDATESETtype=excluded.type,parent_record_id=excluded.parent_record_id,title=excluded.title,description=excluded.description,status=excluded.status,priority=excluded.priority,assigned_to=excluded.assigned_to,team=excluded.team,decision_ref=excluded.decision_ref,updated_at=excluded.updated_at,deleted_at=excluded.deleted_at,hash=excluded.hash,canonical_version=excluded.canonical_versionWHEREexcluded.updated_at>tickets.updated_atOR(excluded.updated_at=tickets.updated_atANDexcluded.hash>tickets.hash);
INSERTINTOtickets(record_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-parentedunderPhase5epicpercascaderefocus2026-06-12—observer-accessinformationtaggingisthefoundationforfog/perceptionplayersurfaces;functionalrequirementpreserved.', 'backlog', 'critical', NULL, NULL, 'D-010', '2026-02-1023:16:38', '2026-06-1210: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);
INSERTINTOtickets(record_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)ONCONFLICT(record_id)DOUPDATESETtype=excluded.type,parent_record_id=excluded.parent_record_id,title=excluded.title,description=excluded.description,status=excluded.status,priority=excluded.priority,assigned_to=excluded.assigned_to,team=excluded.team,decision_ref=excluded.decision_ref,updated_at=excluded.updated_at,deleted_at=excluded.deleted_at,hash=excluded.hash,canonical_version=excluded.canonical_versionWHEREexcluded.updated_at>tickets.updated_atOR(excluded.updated_at=tickets.updated_atANDexcluded.hash>tickets.hash);
INSERTINTOtickets(record_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-parentedunderPhase4epicpercascaderefocus2026-06-12—chunkgeneration/loadingistile/chunkworld-generationwork;functionalrequirementpreserved.', 'backlog', 'high', NULL, NULL, 'D-012', '2026-02-1023:16:38', '2026-06-1210: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);
INSERTINTOtickets(record_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)ONCONFLICT(record_id)DOUPDATESETtype=excluded.type,parent_record_id=excluded.parent_record_id,title=excluded.title,description=excluded.description,status=excluded.status,priority=excluded.priority,assigned_to=excluded.assigned_to,team=excluded.team,decision_ref=excluded.decision_ref,updated_at=excluded.updated_at,deleted_at=excluded.deleted_at,hash=excluded.hash,canonical_version=excluded.canonical_versionWHEREexcluded.updated_at>tickets.updated_atOR(excluded.updated_at=tickets.updated_atANDexcluded.hash>tickets.hash);
INSERTINTOtickets(record_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-parentedunderPhase5epicpercascaderefocus2026-06-12—minimap/POIdiscoveryisaHUDnavigationsurfaceforin-worldplay;functionalrequirementpreserved.', 'backlog', 'high', NULL, NULL, 'D-013', '2026-02-1023:16:38', '2026-06-1210: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);
INSERTINTOtickets(record_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)ONCONFLICT(record_id)DOUPDATESETtype=excluded.type,parent_record_id=excluded.parent_record_id,title=excluded.title,description=excluded.description,status=excluded.status,priority=excluded.priority,assigned_to=excluded.assigned_to,team=excluded.team,decision_ref=excluded.decision_ref,updated_at=excluded.updated_at,deleted_at=excluded.deleted_at,hash=excluded.hash,canonical_version=excluded.canonical_versionWHEREexcluded.updated_at>tickets.updated_atOR(excluded.updated_at=tickets.updated_atANDexcluded.hash>tickets.hash);
INSERTINTOtickets(record_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-parentedunderPhase4epicpercascaderefocus2026-06-12—thev0.1vertical-sliceframingissuperseded,butstationdistrictlayoutwithfunctionalclusterssurvivesasecon-layer/building-placementgenerationwork.', 'backlog', 'high', NULL, NULL, 'D-014,D-027', '2026-02-1023:16:38', '2026-06-1210: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);
Re-parentedunderPhase4epicpercascaderefocus2026-06-12—thespatialfunctional-clustertemplate(15-40tilespaces,sightlines,template-to-instancelifecycle)isthebuilding-templatescascadestep;NPC-rolepopulationdetailfollowsinPhase6.', 'backlog', 'high', NULL, NULL, 'D-025', '2026-02-1023:16:54', '2026-06-1210: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);
INSERTINTOtickets(record_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)ONCONFLICT(record_id)DOUPDATESETtype=excluded.type,parent_record_id=excluded.parent_record_id,title=excluded.title,description=excluded.description,status=excluded.status,priority=excluded.priority,assigned_to=excluded.assigned_to,team=excluded.team,decision_ref=excluded.decision_ref,updated_at=excluded.updated_at,deleted_at=excluded.deleted_at,hash=excluded.hash,canonical_version=excluded.canonical_versionWHEREexcluded.updated_at>tickets.updated_atOR(excluded.updated_at=tickets.updated_atANDexcluded.hash>tickets.hash);
INSERTINTOtickets(record_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-parentedunderPhase6epicpercascaderefocus2026-06-12—dialoguearchitectureandrelationallayersareNPCdetail-coloringwork;functionalrequirementpreserved.', 'backlog', 'high', NULL, NULL, 'D-028', '2026-02-1023:16:54', '2026-06-1210: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);
INSERTINTOtickets(record_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)ONCONFLICT(record_id)DOUPDATESETtype=excluded.type,parent_record_id=excluded.parent_record_id,title=excluded.title,description=excluded.description,status=excluded.status,priority=excluded.priority,assigned_to=excluded.assigned_to,team=excluded.team,decision_ref=excluded.decision_ref,updated_at=excluded.updated_at,deleted_at=excluded.deleted_at,hash=excluded.hash,canonical_version=excluded.canonical_versionWHEREexcluded.updated_at>tickets.updated_atOR(excluded.updated_at=tickets.updated_atANDexcluded.hash>tickets.hash);
INSERTINTOtickets(record_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-parentedunderPhase6epicpercascaderefocus2026-06-12—populationentanglementratiosarebackground-NPC-layerwork;functionalrequirementpreserved.', 'backlog', 'medium', NULL, NULL, 'D-029', '2026-02-1023:16:54', '2026-06-1210: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);
INSERTINTOtickets(record_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)ONCONFLICT(record_id)DOUPDATESETtype=excluded.type,parent_record_id=excluded.parent_record_id,title=excluded.title,description=excluded.description,status=excluded.status,priority=excluded.priority,assigned_to=excluded.assigned_to,team=excluded.team,decision_ref=excluded.decision_ref,updated_at=excluded.updated_at,deleted_at=excluded.deleted_at,hash=excluded.hash,canonical_version=excluded.canonical_versionWHEREexcluded.updated_at>tickets.updated_atOR(excluded.updated_at=tickets.updated_atANDexcluded.hash>tickets.hash);
INSERTINTOtickets(record_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-homedunderthemaintenanceumbrellapercascaderefocus2026-06-12—servertestinfrastructureisongoinginfrahygiene(muchalreadydeliveredviatheGauntlet/verificationharness);remainingscopepreserved.', 'backlog', 'high', NULL, NULL, NULL, '2026-02-1023:17:38', '2026-06-1210: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);
INSERTINTOtickets(record_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)ONCONFLICT(record_id)DOUPDATESETtype=excluded.type,parent_record_id=excluded.parent_record_id,title=excluded.title,description=excluded.description,status=excluded.status,priority=excluded.priority,assigned_to=excluded.assigned_to,team=excluded.team,decision_ref=excluded.decision_ref,updated_at=excluded.updated_at,deleted_at=excluded.deleted_at,hash=excluded.hash,canonical_version=excluded.canonical_versionWHEREexcluded.updated_at>tickets.updated_atOR(excluded.updated_at=tickets.updated_atANDexcluded.hash>tickets.hash);
INSERTINTOtickets(record_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-homedunderthemaintenanceumbrellapercascaderefocus2026-06-12—clienttestinfrastructureisongoinginfrahygiene(TestHarnessandlive-tiertestingalreadyexist);remainingscopepreserved.', 'backlog', 'high', NULL, NULL, NULL, '2026-02-1023:17:38', '2026-06-1210: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);
INSERTINTOtickets(record_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)ONCONFLICT(record_id)DOUPDATESETtype=excluded.type,parent_record_id=excluded.parent_record_id,title=excluded.title,description=excluded.description,status=excluded.status,priority=excluded.priority,assigned_to=excluded.assigned_to,team=excluded.team,decision_ref=excluded.decision_ref,updated_at=excluded.updated_at,deleted_at=excluded.deleted_at,hash=excluded.hash,canonical_version=excluded.canonical_versionWHEREexcluded.updated_at>tickets.updated_atOR(excluded.updated_at=tickets.updated_atANDexcluded.hash>tickets.hash);
INSERTINTOtickets(record_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-homedunderthemaintenanceumbrellapercascaderefocus2026-06-12—cross-IPCintegrationtestingisongoinginfrahygiene(liveGauntletpipelinealreadycoversmuchofit);remainingscopepreserved.', 'backlog', 'medium', NULL, NULL, NULL, '2026-02-1023:17:38', '2026-06-1210: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);
INSERTINTOtickets(record_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)ONCONFLICT(record_id)DOUPDATESETtype=excluded.type,parent_record_id=excluded.parent_record_id,title=excluded.title,description=excluded.description,status=excluded.status,priority=excluded.priority,assigned_to=excluded.assigned_to,team=excluded.team,decision_ref=excluded.decision_ref,updated_at=excluded.updated_at,deleted_at=excluded.deleted_at,hash=excluded.hash,canonical_version=excluded.canonical_versionWHEREexcluded.updated_at>tickets.updated_atOR(excluded.updated_at=tickets.updated_atANDexcluded.hash>tickets.hash);
INSERTINTOtickets(record_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-homedunderthemaintenanceumbrellapercascaderefocus2026-06-12—headlessCLIharnessistesttoolinghygieneunderdoneepicT-35;verifyremaininggapvstheexisting--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);
INSERTINTOtickets(record_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)ONCONFLICT(record_id)DOUPDATESETtype=excluded.type,parent_record_id=excluded.parent_record_id,title=excluded.title,description=excluded.description,status=excluded.status,priority=excluded.priority,assigned_to=excluded.assigned_to,team=excluded.team,decision_ref=excluded.decision_ref,updated_at=excluded.updated_at,deleted_at=excluded.deleted_at,hash=excluded.hash,canonical_version=excluded.canonical_versionWHEREexcluded.updated_at>tickets.updated_atOR(excluded.updated_at=tickets.updated_atANDexcluded.hash>tickets.hash);
INSERTINTOtickets(record_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.
Parkedpost-cascadeperrefocus2026-06-12—theTCPNetworkBridgeforfuturemultiplayerhasnogenerationdependencyandstaysdeferred;functionalrequirementpreserved(sameinterfaceasLocalBridge).', 'backlog', 'low', NULL, NULL, NULL, '2026-02-1023:18:24', '2026-06-1210: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);
Re-parentedunderPhase6epicpercascaderefocus2026-06-12—NPCmoodsimulationisbackground-NPC-layerwork;rescuedfromcancelledparentepicT-41.Functionalrequirementpreserved.', 'backlog', 'medium', NULL, NULL, NULL, '2026-02-1023:19:21', '2026-06-1210: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);
INSERTINTOtickets(record_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)ONCONFLICT(record_id)DOUPDATESETtype=excluded.type,parent_record_id=excluded.parent_record_id,title=excluded.title,description=excluded.description,status=excluded.status,priority=excluded.priority,assigned_to=excluded.assigned_to,team=excluded.team,decision_ref=excluded.decision_ref,updated_at=excluded.updated_at,deleted_at=excluded.deleted_at,hash=excluded.hash,canonical_version=excluded.canonical_versionWHEREexcluded.updated_at>tickets.updated_atOR(excluded.updated_at=tickets.updated_atANDexcluded.hash>tickets.hash);
INSERTINTOtickets(record_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-parentedunderPhase6epicpercascaderefocus2026-06-12—NPCjob-performancesimulationisbackground-NPC-layerwork;rescuedfromcancelledparentepicT-41.Functionalrequirementpreserved.', 'backlog', 'low', NULL, NULL, NULL, '2026-02-1023:19:21', '2026-06-1210: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);
INSERTINTOtickets(record_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)ONCONFLICT(record_id)DOUPDATESETtype=excluded.type,parent_record_id=excluded.parent_record_id,title=excluded.title,description=excluded.description,status=excluded.status,priority=excluded.priority,assigned_to=excluded.assigned_to,team=excluded.team,decision_ref=excluded.decision_ref,updated_at=excluded.updated_at,deleted_at=excluded.deleted_at,hash=excluded.hash,canonical_version=excluded.canonical_versionWHEREexcluded.updated_at>tickets.updated_atOR(excluded.updated_at=tickets.updated_atANDexcluded.hash>tickets.hash);
INSERTINTOtickets(record_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.
Parkedaspost-cascadegameplaypercascaderefocus2026-06-12;functionalrequirement(knowledge-gatedmonologueaccuracy)preserved,notcancelled.', 'backlog', 'low', NULL, NULL, NULL, '2026-02-1023:20:40', '2026-06-1210: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);
INSERTINTOtickets(record_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)ONCONFLICT(record_id)DOUPDATESETtype=excluded.type,parent_record_id=excluded.parent_record_id,title=excluded.title,description=excluded.description,status=excluded.status,priority=excluded.priority,assigned_to=excluded.assigned_to,team=excluded.team,decision_ref=excluded.decision_ref,updated_at=excluded.updated_at,deleted_at=excluded.deleted_at,hash=excluded.hash,canonical_version=excluded.canonical_versionWHEREexcluded.updated_at>tickets.updated_atOR(excluded.updated_at=tickets.updated_atANDexcluded.hash>tickets.hash);
INSERTINTOtickets(record_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-parentedunderPhase4epic(T-750)percascaderefocus2026-06-12;scopeupdatedfromv0.1placeholderarttothefinal-versionassetpipelineperD-166(noplaceholders,notestmap)—functionalrequirement(assetproductionpipeline)preserved.', 'backlog', 'high', NULL, NULL, NULL, '2026-02-1023:21:12', '2026-06-1210: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);
INSERTINTOtickets(record_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)ONCONFLICT(record_id)DOUPDATESETtype=excluded.type,parent_record_id=excluded.parent_record_id,title=excluded.title,description=excluded.description,status=excluded.status,priority=excluded.priority,assigned_to=excluded.assigned_to,team=excluded.team,decision_ref=excluded.decision_ref,updated_at=excluded.updated_at,deleted_at=excluded.deleted_at,hash=excluded.hash,canonical_version=excluded.canonical_versionWHEREexcluded.updated_at>tickets.updated_atOR(excluded.updated_at=tickets.updated_atANDexcluded.hash>tickets.hash);
INSERTINTOtickets(record_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.
Parkedaspost-cascadegameplaypercascaderefocus2026-06-12;thermal/camera-feed/unisphere/audiomodesareD-017character-buildfeatures,preservednotcancelled.', 'backlog', 'low', NULL, NULL, NULL, '2026-02-1023:21:23', '2026-06-1210: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);
INSERTINTOtickets(record_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)ONCONFLICT(record_id)DOUPDATESETtype=excluded.type,parent_record_id=excluded.parent_record_id,title=excluded.title,description=excluded.description,status=excluded.status,priority=excluded.priority,assigned_to=excluded.assigned_to,team=excluded.team,decision_ref=excluded.decision_ref,updated_at=excluded.updated_at,deleted_at=excluded.deleted_at,hash=excluded.hash,canonical_version=excluded.canonical_versionWHEREexcluded.updated_at>tickets.updated_atOR(excluded.updated_at=tickets.updated_atANDexcluded.hash>tickets.hash);
INSERTINTOtickets(record_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.
Parkedaspost-cascadegameplaypercascaderefocus2026-06-12;profession/faction/relationship-gatedPOIvisibilitypreserved,notcancelled.', 'backlog', 'medium', NULL, NULL, NULL, '2026-02-1023:22:17', '2026-06-1210: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);
ParkedunderPhase6epic(T-751)percascaderefocus2026-06-12;shared-NPC/relationshiplinksbetweentemplatesbelongtotheNPCdetaillayer.', 'backlog', 'medium', NULL, NULL, NULL, '2026-02-1023:24:06', '2026-06-1210: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);
INSERTINTOtickets(record_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)ONCONFLICT(record_id)DOUPDATESETtype=excluded.type,parent_record_id=excluded.parent_record_id,title=excluded.title,description=excluded.description,status=excluded.status,priority=excluded.priority,assigned_to=excluded.assigned_to,team=excluded.team,decision_ref=excluded.decision_ref,updated_at=excluded.updated_at,deleted_at=excluded.deleted_at,hash=excluded.hash,canonical_version=excluded.canonical_versionWHEREexcluded.updated_at>tickets.updated_atOR(excluded.updated_at=tickets.updated_atANDexcluded.hash>tickets.hash);
INSERTINTOtickets(record_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.
Parkedaspost-cascadegameplaypercascaderefocus2026-06-12;drama-moduleattachmentratios(anti-metagaming)preserved,notcancelled.', 'backlog', 'low', NULL, NULL, NULL, '2026-02-1023:24:37', '2026-06-1210: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);
Re-homedundermaintenancepercascaderefocus2026-06-12;test-toolingrequirementsspecisinfrahygiene(muchisdefactosettled:gdUnit4,cargotest,Gauntlet).', 'backlog', 'high', NULL, NULL, NULL, '2026-02-1023:27:10', '2026-06-1210: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);
INSERTINTOtickets(record_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)ONCONFLICT(record_id)DOUPDATESETtype=excluded.type,parent_record_id=excluded.parent_record_id,title=excluded.title,description=excluded.description,status=excluded.status,priority=excluded.priority,assigned_to=excluded.assigned_to,team=excluded.team,decision_ref=excluded.decision_ref,updated_at=excluded.updated_at,deleted_at=excluded.deleted_at,hash=excluded.hash,canonical_version=excluded.canonical_versionWHEREexcluded.updated_at>tickets.updated_atOR(excluded.updated_at=tickets.updated_atANDexcluded.hash>tickets.hash);
INSERTINTOtickets(record_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-homedundermaintenancepercascaderefocus2026-06-12;production-codetest-hookpolicyisengineering-hygienedocumentation.', 'backlog', 'high', NULL, NULL, NULL, '2026-02-1023:27:10', '2026-06-1210: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);
INSERTINTOtickets(record_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)ONCONFLICT(record_id)DOUPDATESETtype=excluded.type,parent_record_id=excluded.parent_record_id,title=excluded.title,description=excluded.description,status=excluded.status,priority=excluded.priority,assigned_to=excluded.assigned_to,team=excluded.team,decision_ref=excluded.decision_ref,updated_at=excluded.updated_at,deleted_at=excluded.deleted_at,hash=excluded.hash,canonical_version=excluded.canonical_versionWHEREexcluded.updated_at>tickets.updated_atOR(excluded.updated_at=tickets.updated_atANDexcluded.hash>tickets.hash);
INSERTINTOtickets(record_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.
ParkedunderPhase5epic(T-749)percascaderefocus2026-06-12;previousparentinitiativeT-29iscancelled—tilecollision/pathfinding/clockistheplayer-walkingfoundation(NPCmovementportionfollowsinPhase6).', 'backlog', 'critical', NULL, NULL, NULL, '2026-02-1100:00:57', '2026-06-1210: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);
INSERTINTOtickets(record_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)ONCONFLICT(record_id)DOUPDATESETtype=excluded.type,parent_record_id=excluded.parent_record_id,title=excluded.title,description=excluded.description,status=excluded.status,priority=excluded.priority,assigned_to=excluded.assigned_to,team=excluded.team,decision_ref=excluded.decision_ref,updated_at=excluded.updated_at,deleted_at=excluded.deleted_at,hash=excluded.hash,canonical_version=excluded.canonical_versionWHEREexcluded.updated_at>tickets.updated_atOR(excluded.updated_at=tickets.updated_atANDexcluded.hash>tickets.hash);
INSERTINTOtickets(record_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.
Parkedaspost-cascadegameplaypercascaderefocus2026-06-12;theobservation/interactionspineofthecoregameplayloopispreserved,notcancelled.', 'backlog', 'critical', NULL, NULL, NULL, '2026-02-1100:01:05', '2026-06-1210: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);
INSERTINTOtickets(record_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)ONCONFLICT(record_id)DOUPDATESETtype=excluded.type,parent_record_id=excluded.parent_record_id,title=excluded.title,description=excluded.description,status=excluded.status,priority=excluded.priority,assigned_to=excluded.assigned_to,team=excluded.team,decision_ref=excluded.decision_ref,updated_at=excluded.updated_at,deleted_at=excluded.deleted_at,hash=excluded.hash,canonical_version=excluded.canonical_versionWHEREexcluded.updated_at>tickets.updated_atOR(excluded.updated_at=tickets.updated_atANDexcluded.hash>tickets.hash);
INSERTINTOtickets(record_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.
ParkedunderPhase5epic(T-749)percascaderefocus2026-06-12;save/loadandsessionmanagementaretiedtoplayablesessions(savegamelineageisdocumentedasPhase5+).', 'backlog', 'high', NULL, NULL, NULL, '2026-02-1100:01:13', '2026-06-1210: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);
Re-homedundermaintenancepercascaderefocus2026-06-12;testtooling,notphasework.', 'backlog', 'low', NULL, NULL, NULL, '2026-02-1100:05:00', '2026-06-1210: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);
INSERTINTOtickets(record_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)ONCONFLICT(record_id)DOUPDATESETtype=excluded.type,parent_record_id=excluded.parent_record_id,title=excluded.title,description=excluded.description,status=excluded.status,priority=excluded.priority,assigned_to=excluded.assigned_to,team=excluded.team,decision_ref=excluded.decision_ref,updated_at=excluded.updated_at,deleted_at=excluded.deleted_at,hash=excluded.hash,canonical_version=excluded.canonical_versionWHEREexcluded.updated_at>tickets.updated_atOR(excluded.updated_at=tickets.updated_atANDexcluded.hash>tickets.hash);
INSERTINTOtickets(record_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-homedundermaintenancepercascaderefocus2026-06-12;infrarequirementpreservedunchanged.', 'backlog', 'medium', NULL, NULL, NULL, '2026-02-1120:27:45', '2026-06-1210: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);
INSERTINTOtickets(record_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:
-Graphstructure(nodes,edges,timestamps,certainty)
-Informationboundaries(whatNPCsknowvsdonotknow)
-Propagationrules(gossip,observation,inference)
-Queryinterfacefordialogue/behaviorsystems
-Memorylimitsandforgettingmechanics
Pillar-1mechanic.CRITICALpriority.
Sprint2blocker.
Participants:Tyre(lead),Morve,Dudley,SI
Source:ArchitectureReviewAudit2026-02-11', 'backlog', 'critical', NULL, NULL, NULL, '2026-02-1120:27:52', '2026-06-1210: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);
INSERTINTOtickets(record_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:
-Graphstructure(nodes,edges,timestamps,certainty)
-Informationboundaries(whatNPCsknowvsdonotknow)
-Propagationrules(gossip,observation,inference)
-Queryinterfacefordialogue/behaviorsystems
-Memorylimitsandforgettingmechanics
Pillar-1mechanic.CRITICALpriority.
Sprint2blocker.
Participants:Tyre(lead),Morve,Dudley,SI
Source:ArchitectureReviewAudit2026-02-11
ParkedunderPhase6epicpercascaderefocus2026-06-12;NPCknowledgesystemsfollowthebackgroundNPClayer.', 'backlog', 'critical', NULL, NULL, NULL, '2026-02-1120:27:52', '2026-06-1210: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);
INSERTINTOtickets(record_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.
Pipelinestages:
1.Spatialquery(entitiesinrange)
2.Line-of-sightfiltering
3.Soundpropagation
4.Knowledgegraphintegration
5.Snapshotassembly
CRITICALpriority.Sprint2blocker.
DependsonWorkshop1(KnowledgeGraph).
Participants:Tyre(lead),Morve,Dudley,SI
Source:ArchitectureReviewAudit2026-02-11', 'backlog', 'critical', NULL, NULL, NULL, '2026-02-1120:28:05', '2026-06-1210: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);
INSERTINTOtickets(record_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.
Pipelinestages:
1.Spatialquery(entitiesinrange)
2.Line-of-sightfiltering
3.Soundpropagation
4.Knowledgegraphintegration
5.Snapshotassembly
CRITICALpriority.Sprint2blocker.
DependsonWorkshop1(KnowledgeGraph).
Participants:Tyre(lead),Morve,Dudley,SI
Source:ArchitectureReviewAudit2026-02-11
ParkedunderPhase5epicpercascaderefocus2026-06-12;playerperceptionpipelineactivateswithplayerviewportwork.', 'backlog', 'critical', NULL, NULL, NULL, '2026-02-1120:28:05', '2026-06-1210: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);
INSERTINTOtickets(record_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.
Keydecisions:
-CustomSaveStatestructvsbevy_reflect
-Versionnumberschemeandmigrationstrategy
-Relationshiptotiersystem(serializebytier?)
-Incrementalsavesvsfullsnapshots
-Quicksavevsnamedsaves
MEDIUMpriority.Mustberesolvedbeforeverticalslice.
Participants:Dudley(lead),Tyre,Morve,SI
Source:ArchitectureReviewAudit2026-02-11', 'backlog', 'medium', NULL, NULL, NULL, '2026-02-1120:28:16', '2026-06-1210: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);
INSERTINTOtickets(record_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.
Keydecisions:
-CustomSaveStatestructvsbevy_reflect
-Versionnumberschemeandmigrationstrategy
-Relationshiptotiersystem(serializebytier?)
-Incrementalsavesvsfullsnapshots
-Quicksavevsnamedsaves
MEDIUMpriority.Mustberesolvedbeforeverticalslice.
Participants:Dudley(lead),Tyre,Morve,SI
Source:ArchitectureReviewAudit2026-02-11
ParkedunderPhase5epicpercascaderefocus2026-06-12;savegamelineagealreadyplannedasPhase5+inasset-pipeline.md.', 'backlog', 'medium', NULL, NULL, NULL, '2026-02-1120:28:16', '2026-06-1210: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);
INSERTINTOtickets(record_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.
Keydecisions:
-Toolselection:TiledvsGodotTileMapvsYAML
-Mapformat(JSON,TMX,custom?)
-Collisionlayerspecification
-Entityspawnpoints
-Loaderimplementation(server+client)
-Hotreloadsupportforiteration
MEDIUMpriority.Sprint2-3target.
Participants:Morve(lead),Tyre,Dudley,SI
Source:ArchitectureReviewAudit2026-02-11', 'backlog', 'medium', NULL, NULL, NULL, '2026-02-1120:28:22', '2026-06-1210: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);
INSERTINTOtickets(record_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.
Keydecisions:
-Toolselection:TiledvsGodotTileMapvsYAML
-Mapformat(JSON,TMX,custom?)
-Collisionlayerspecification
-Entityspawnpoints
-Loaderimplementation(server+client)
-Hotreloadsupportforiteration
MEDIUMpriority.Sprint2-3target.
Participants:Morve(lead),Tyre,Dudley,SI
Source:ArchitectureReviewAudit2026-02-11
Re-parentedunderPhase4epicpercascaderefocus2026-06-12;authoring-toolframingsupersededbyD-166(nohand-mademaps)—survivingscopeisformat/collision/loaderforgeneratoroutput.', 'backlog', 'medium', NULL, NULL, NULL, '2026-02-1120:28:22', '2026-06-1210: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);
INSERTINTOtickets(record_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)ONCONFLICT(record_id)DOUPDATESETtype=excluded.type,parent_record_id=excluded.parent_record_id,title=excluded.title,description=excluded.description,status=excluded.status,priority=excluded.priority,assigned_to=excluded.assigned_to,team=excluded.team,decision_ref=excluded.decision_ref,updated_at=excluded.updated_at,deleted_at=excluded.deleted_at,hash=excluded.hash,canonical_version=excluded.canonical_versionWHEREexcluded.updated_at>tickets.updated_atOR(excluded.updated_at=tickets.updated_atANDexcluded.hash>tickets.hash);
INSERTINTOtickets(record_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)ONCONFLICT(record_id)DOUPDATESETtype=excluded.type,parent_record_id=excluded.parent_record_id,title=excluded.title,description=excluded.description,status=excluded.status,priority=excluded.priority,assigned_to=excluded.assigned_to,team=excluded.team,decision_ref=excluded.decision_ref,updated_at=excluded.updated_at,deleted_at=excluded.deleted_at,hash=excluded.hash,canonical_version=excluded.canonical_versionWHEREexcluded.updated_at>tickets.updated_atOR(excluded.updated_at=tickets.updated_atANDexcluded.hash>tickets.hash);
INSERTINTOtickets(record_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.
D-065(insertUI),D-012(informationboundary),D-010(determinism),Q-055', 'backlog', 'high', NULL, NULL, 'D-065,Q-055', '2026-03-0510:28:30', '2026-06-1210: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);
INSERTINTOtickets(record_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.
Parkedingameplaybacklogpercascaderefocus2026-06-12;feedplumbingdesignresumeswhengameplaysystemsexisttofeedit.', 'backlog', 'high', NULL, NULL, 'D-065,Q-055', '2026-03-0510:28:30', '2026-06-1210: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);
INSERTINTOtickets(record_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)ONCONFLICT(record_id)DOUPDATESETtype=excluded.type,parent_record_id=excluded.parent_record_id,title=excluded.title,description=excluded.description,status=excluded.status,priority=excluded.priority,assigned_to=excluded.assigned_to,team=excluded.team,decision_ref=excluded.decision_ref,updated_at=excluded.updated_at,deleted_at=excluded.deleted_at,hash=excluded.hash,canonical_version=excluded.canonical_versionWHEREexcluded.updated_at>tickets.updated_atOR(excluded.updated_at=tickets.updated_atANDexcluded.hash>tickets.hash);
INSERTINTOtickets(record_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.
Parkedingameplaybacklogpercascaderefocus2026-06-12;template-assemblygenerationsupersededbytheT-750cascade—proof-of-lifeplaytestconceptpreserved.', 'backlog', 'critical', NULL, NULL, NULL, '2026-03-0523:11:39', '2026-06-1210: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);
INSERTINTOtickets(record_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)ONCONFLICT(record_id)DOUPDATESETtype=excluded.type,parent_record_id=excluded.parent_record_id,title=excluded.title,description=excluded.description,status=excluded.status,priority=excluded.priority,assigned_to=excluded.assigned_to,team=excluded.team,decision_ref=excluded.decision_ref,updated_at=excluded.updated_at,deleted_at=excluded.deleted_at,hash=excluded.hash,canonical_version=excluded.canonical_versionWHEREexcluded.updated_at>tickets.updated_atOR(excluded.updated_at=tickets.updated_atANDexcluded.hash>tickets.hash);
INSERTINTOtickets(record_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.
Parkedingameplaybacklogpercascaderefocus2026-06-12;bookmarkconceptpreservedforpost-cascadegame-making.', 'backlog', 'high', NULL, NULL, NULL, '2026-03-0523:11:42', '2026-06-1210: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);
INSERTINTOtickets(record_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)ONCONFLICT(record_id)DOUPDATESETtype=excluded.type,parent_record_id=excluded.parent_record_id,title=excluded.title,description=excluded.description,status=excluded.status,priority=excluded.priority,assigned_to=excluded.assigned_to,team=excluded.team,decision_ref=excluded.decision_ref,updated_at=excluded.updated_at,deleted_at=excluded.deleted_at,hash=excluded.hash,canonical_version=excluded.canonical_versionWHEREexcluded.updated_at>tickets.updated_atOR(excluded.updated_at=tickets.updated_atANDexcluded.hash>tickets.hash);
INSERTINTOtickets(record_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.
Parkedingameplaybacklogpercascaderefocus2026-06-12;bookmark-selectionflowpreserved—cosmeticcustomisationtrackedseparatelyunderPhase5(T-619).', 'backlog', 'high', NULL, NULL, NULL, '2026-03-0523:11:48', '2026-06-1210: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);
INSERTINTOtickets(record_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)ONCONFLICT(record_id)DOUPDATESETtype=excluded.type,parent_record_id=excluded.parent_record_id,title=excluded.title,description=excluded.description,status=excluded.status,priority=excluded.priority,assigned_to=excluded.assigned_to,team=excluded.team,decision_ref=excluded.decision_ref,updated_at=excluded.updated_at,deleted_at=excluded.deleted_at,hash=excluded.hash,canonical_version=excluded.canonical_versionWHEREexcluded.updated_at>tickets.updated_atOR(excluded.updated_at=tickets.updated_atANDexcluded.hash>tickets.hash);
INSERTINTOtickets(record_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.
Parkedingameplaybacklogpercascaderefocus2026-06-12;world-feeldecisionspreservedforpost-cascadegame-making.', 'backlog', 'high', NULL, NULL, NULL, '2026-03-0523:11:59', '2026-06-1210: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);
INSERTINTOtickets(record_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)ONCONFLICT(record_id)DOUPDATESETtype=excluded.type,parent_record_id=excluded.parent_record_id,title=excluded.title,description=excluded.description,status=excluded.status,priority=excluded.priority,assigned_to=excluded.assigned_to,team=excluded.team,decision_ref=excluded.decision_ref,updated_at=excluded.updated_at,deleted_at=excluded.deleted_at,hash=excluded.hash,canonical_version=excluded.canonical_versionWHEREexcluded.updated_at>tickets.updated_atOR(excluded.updated_at=tickets.updated_atANDexcluded.hash>tickets.hash);
INSERTINTOtickets(record_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).
ParkedunderPhase5epicpercascaderefocus2026-06-12;character-visualscustomisationresumeswithplayerrendering(overlapsT-694).', 'backlog', 'high', NULL, 'client', NULL, '2026-03-0523:12:52', '2026-06-1210: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);
INSERTINTOtickets(record_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)ONCONFLICT(record_id)DOUPDATESETtype=excluded.type,parent_record_id=excluded.parent_record_id,title=excluded.title,description=excluded.description,status=excluded.status,priority=excluded.priority,assigned_to=excluded.assigned_to,team=excluded.team,decision_ref=excluded.decision_ref,updated_at=excluded.updated_at,deleted_at=excluded.deleted_at,hash=excluded.hash,canonical_version=excluded.canonical_versionWHEREexcluded.updated_at>tickets.updated_atOR(excluded.updated_at=tickets.updated_atANDexcluded.hash>tickets.hash);
INSERTINTOtickets(record_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.
ParkedunderPhase6epicpercascaderefocus2026-06-12(previousparentT-607cancelled);relationship-formationrequirementpreservedfortheNPClayer.', 'backlog', 'high', NULL, 'server', NULL, '2026-03-0523:13:08', '2026-06-1210: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);
INSERTINTOtickets(record_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)ONCONFLICT(record_id)DOUPDATESETtype=excluded.type,parent_record_id=excluded.parent_record_id,title=excluded.title,description=excluded.description,status=excluded.status,priority=excluded.priority,assigned_to=excluded.assigned_to,team=excluded.team,decision_ref=excluded.decision_ref,updated_at=excluded.updated_at,deleted_at=excluded.deleted_at,hash=excluded.hash,canonical_version=excluded.canonical_versionWHEREexcluded.updated_at>tickets.updated_atOR(excluded.updated_at=tickets.updated_atANDexcluded.hash>tickets.hash);
INSERTINTOtickets(record_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.
ParkedunderPhase6epicpercascaderefocus2026-06-12;quietly-responsive-worldrequirementpreservedfortheNPClayer.', 'backlog', 'high', NULL, 'server', NULL, '2026-03-0523:13:22', '2026-06-1210: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);
INSERTINTOtickets(record_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)ONCONFLICT(record_id)DOUPDATESETtype=excluded.type,parent_record_id=excluded.parent_record_id,title=excluded.title,description=excluded.description,status=excluded.status,priority=excluded.priority,assigned_to=excluded.assigned_to,team=excluded.team,decision_ref=excluded.decision_ref,updated_at=excluded.updated_at,deleted_at=excluded.deleted_at,hash=excluded.hash,canonical_version=excluded.canonical_versionWHEREexcluded.updated_at>tickets.updated_atOR(excluded.updated_at=tickets.updated_atANDexcluded.hash>tickets.hash);
INSERTINTOtickets(record_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-homedundermaintenancepercascaderefocus2026-06-12;GPUbuild-featureenablementisinfrahygieneontheexistingvoicepipeline.', 'backlog', 'low', NULL, 'server', NULL, '2026-03-0718:19:29', '2026-06-1210: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);
INSERTINTOtickets(record_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)ONCONFLICT(record_id)DOUPDATESETtype=excluded.type,parent_record_id=excluded.parent_record_id,title=excluded.title,description=excluded.description,status=excluded.status,priority=excluded.priority,assigned_to=excluded.assigned_to,team=excluded.team,decision_ref=excluded.decision_ref,updated_at=excluded.updated_at,deleted_at=excluded.deleted_at,hash=excluded.hash,canonical_version=excluded.canonical_versionWHEREexcluded.updated_at>tickets.updated_atOR(excluded.updated_at=tickets.updated_atANDexcluded.hash>tickets.hash);
INSERTINTOtickets(record_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-homedundermaintenancepercascaderefocus2026-06-12;triggerconditionsunchanged.', 'backlog', 'low', NULL, 'server', NULL, '2026-03-1309:49:07', '2026-06-1210: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);
INSERTINTOtickets(record_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)ONCONFLICT(record_id)DOUPDATESETtype=excluded.type,parent_record_id=excluded.parent_record_id,title=excluded.title,description=excluded.description,status=excluded.status,priority=excluded.priority,assigned_to=excluded.assigned_to,team=excluded.team,decision_ref=excluded.decision_ref,updated_at=excluded.updated_at,deleted_at=excluded.deleted_at,hash=excluded.hash,canonical_version=excluded.canonical_versionWHEREexcluded.updated_at>tickets.updated_atOR(excluded.updated_at=tickets.updated_atANDexcluded.hash>tickets.hash);
INSERTINTOtickets(record_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-homedundermaintenancepercascaderefocus2026-06-12;recastsprintprotocolforkanban/batchmode—functionalrequirementpreserved.', 'backlog', 'low', NULL, 'meta', NULL, '2026-03-1311:37:34', '2026-06-1210: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);
INSERTINTOtickets(record_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)ONCONFLICT(record_id)DOUPDATESETtype=excluded.type,parent_record_id=excluded.parent_record_id,title=excluded.title,description=excluded.description,status=excluded.status,priority=excluded.priority,assigned_to=excluded.assigned_to,team=excluded.team,decision_ref=excluded.decision_ref,updated_at=excluded.updated_at,deleted_at=excluded.deleted_at,hash=excluded.hash,canonical_version=excluded.canonical_versionWHEREexcluded.updated_at>tickets.updated_atOR(excluded.updated_at=tickets.updated_atANDexcluded.hash>tickets.hash);
INSERTINTOtickets(record_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)ONCONFLICT(record_id)DOUPDATESETtype=excluded.type,parent_record_id=excluded.parent_record_id,title=excluded.title,description=excluded.description,status=excluded.status,priority=excluded.priority,assigned_to=excluded.assigned_to,team=excluded.team,decision_ref=excluded.decision_ref,updated_at=excluded.updated_at,deleted_at=excluded.deleted_at,hash=excluded.hash,canonical_version=excluded.canonical_versionWHEREexcluded.updated_at>tickets.updated_atOR(excluded.updated_at=tickets.updated_atANDexcluded.hash>tickets.hash);
ParkedunderPhase6epicpercascaderefocus2026-06-12;interior/furnituregenerationisroom-leveldetail—pairswithT-682(parkedgameplay).', 'backlog', 'high', NULL, 'server', NULL, '2026-03-1707:06:30', '2026-06-1210: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);
INSERTINTOtickets(record_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.
Blockedby:#693(compositor)', 'backlog', 'high', NULL, 'client', NULL, '2026-03-1708:21:47', '2026-06-1210: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);
INSERTINTOtickets(record_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.
ParkedunderPhase5epicpercascaderefocus2026-06-12;creationscreenshipswithplayercontrolandcharacterrendering.', 'backlog', 'high', NULL, 'client', NULL, '2026-03-1708:21:47', '2026-06-1210: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);
INSERTINTOtickets(record_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)ONCONFLICT(record_id)DOUPDATESETtype=excluded.type,parent_record_id=excluded.parent_record_id,title=excluded.title,description=excluded.description,status=excluded.status,priority=excluded.priority,assigned_to=excluded.assigned_to,team=excluded.team,decision_ref=excluded.decision_ref,updated_at=excluded.updated_at,deleted_at=excluded.deleted_at,hash=excluded.hash,canonical_version=excluded.canonical_versionWHEREexcluded.updated_at>tickets.updated_atOR(excluded.updated_at=tickets.updated_atANDexcluded.hash>tickets.hash);
INSERTINTOtickets(record_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.
ParkedunderPhase5epicpercascaderefocus2026-06-12;crowd-renderingresearchresumeswithin-worldrenderingwork.', 'backlog', 'medium', NULL, 'client', NULL, '2026-03-1717:48:12', '2026-06-1210: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);
INSERTINTOtickets(record_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)ONCONFLICT(record_id)DOUPDATESETtype=excluded.type,parent_record_id=excluded.parent_record_id,title=excluded.title,description=excluded.description,status=excluded.status,priority=excluded.priority,assigned_to=excluded.assigned_to,team=excluded.team,decision_ref=excluded.decision_ref,updated_at=excluded.updated_at,deleted_at=excluded.deleted_at,hash=excluded.hash,canonical_version=excluded.canonical_versionWHEREexcluded.updated_at>tickets.updated_atOR(excluded.updated_at=tickets.updated_atANDexcluded.hash>tickets.hash);
INSERTINTOtickets(record_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.
ParkedunderPhase5epicpercascaderefocus2026-06-12;character-visualsleftoverpreserved.', 'backlog', 'medium', NULL, 'visual', NULL, '2026-03-2214:30:36', '2026-06-1210: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);
INSERTINTOtickets(record_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)ONCONFLICT(record_id)DOUPDATESETtype=excluded.type,parent_record_id=excluded.parent_record_id,title=excluded.title,description=excluded.description,status=excluded.status,priority=excluded.priority,assigned_to=excluded.assigned_to,team=excluded.team,decision_ref=excluded.decision_ref,updated_at=excluded.updated_at,deleted_at=excluded.deleted_at,hash=excluded.hash,canonical_version=excluded.canonical_versionWHEREexcluded.updated_at>tickets.updated_atOR(excluded.updated_at=tickets.updated_atANDexcluded.hash>tickets.hash);
INSERTINTOtickets(record_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.
ParkedunderPhase5epicpercascaderefocus2026-06-12;character-visualsleftoverpreserved.', 'backlog', 'medium', NULL, 'visual', NULL, '2026-03-2214:30:42', '2026-06-1210: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);
INSERTINTOtickets(record_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)ONCONFLICT(record_id)DOUPDATESETtype=excluded.type,parent_record_id=excluded.parent_record_id,title=excluded.title,description=excluded.description,status=excluded.status,priority=excluded.priority,assigned_to=excluded.assigned_to,team=excluded.team,decision_ref=excluded.decision_ref,updated_at=excluded.updated_at,deleted_at=excluded.deleted_at,hash=excluded.hash,canonical_version=excluded.canonical_versionWHEREexcluded.updated_at>tickets.updated_atOR(excluded.updated_at=tickets.updated_atANDexcluded.hash>tickets.hash);
INSERTINTOtickets(record_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.
ParkedunderPhase5epicpercascaderefocus2026-06-12;character-visualsleftoverpreserved.', 'backlog', 'medium', NULL, 'visual', NULL, '2026-03-2214:30:49', '2026-06-1210: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);
INSERTINTOtickets(record_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)ONCONFLICT(record_id)DOUPDATESETtype=excluded.type,parent_record_id=excluded.parent_record_id,title=excluded.title,description=excluded.description,status=excluded.status,priority=excluded.priority,assigned_to=excluded.assigned_to,team=excluded.team,decision_ref=excluded.decision_ref,updated_at=excluded.updated_at,deleted_at=excluded.deleted_at,hash=excluded.hash,canonical_version=excluded.canonical_versionWHEREexcluded.updated_at>tickets.updated_atOR(excluded.updated_at=tickets.updated_atANDexcluded.hash>tickets.hash);
INSERTINTOtickets(record_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.
ParkedunderPhase5epicpercascaderefocus2026-06-12;latentcreation-UIbugfixedalongsidecharacter-visualsleftovers.', 'backlog', 'low', 'client', NULL, NULL, '2026-03-2216:33:07', '2026-06-1210: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);
INSERTINTOtickets(record_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)ONCONFLICT(record_id)DOUPDATESETtype=excluded.type,parent_record_id=excluded.parent_record_id,title=excluded.title,description=excluded.description,status=excluded.status,priority=excluded.priority,assigned_to=excluded.assigned_to,team=excluded.team,decision_ref=excluded.decision_ref,updated_at=excluded.updated_at,deleted_at=excluded.deleted_at,hash=excluded.hash,canonical_version=excluded.canonical_versionWHEREexcluded.updated_at>tickets.updated_atOR(excluded.updated_at=tickets.updated_atANDexcluded.hash>tickets.hash);
INSERTINTOtickets(record_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.
ParkedunderPhase5epicpercascaderefocus2026-06-12;adoptthepatternwhengameplayUIsurfacesarebuilt.', 'backlog', 'low', NULL, 'client', NULL, '2026-03-2317:42:32', '2026-06-1210: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);
INSERTINTOtickets(record_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)ONCONFLICT(record_id)DOUPDATESETtype=excluded.type,parent_record_id=excluded.parent_record_id,title=excluded.title,description=excluded.description,status=excluded.status,priority=excluded.priority,assigned_to=excluded.assigned_to,team=excluded.team,decision_ref=excluded.decision_ref,updated_at=excluded.updated_at,deleted_at=excluded.deleted_at,hash=excluded.hash,canonical_version=excluded.canonical_versionWHEREexcluded.updated_at>tickets.updated_atOR(excluded.updated_at=tickets.updated_atANDexcluded.hash>tickets.hash);
INSERTINTOtickets(record_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.
ParkedunderPhase5epicpercascaderefocus2026-06-12;installwhenHUD/gameplayUIdevelopmentresumes.', 'backlog', 'low', NULL, 'client', NULL, '2026-03-2318:19:22', '2026-06-1210: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);
INSERTINTOtickets(record_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)ONCONFLICT(record_id)DOUPDATESETtype=excluded.type,parent_record_id=excluded.parent_record_id,title=excluded.title,description=excluded.description,status=excluded.status,priority=excluded.priority,assigned_to=excluded.assigned_to,team=excluded.team,decision_ref=excluded.decision_ref,updated_at=excluded.updated_at,deleted_at=excluded.deleted_at,hash=excluded.hash,canonical_version=excluded.canonical_versionWHEREexcluded.updated_at>tickets.updated_atOR(excluded.updated_at=tickets.updated_atANDexcluded.hash>tickets.hash);
INSERTINTOtickets(record_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.
ParkedunderPhase5epicpercascaderefocus2026-06-12;functionalrequirement(multi-resolutionvisualregression)preserved—resumeswithcharacterrenderingwork.', 'backlog', 'medium', NULL, 'client', NULL, '2026-03-2318:27:51', '2026-06-1210: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);
INSERTINTOtickets(record_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)ONCONFLICT(record_id)DOUPDATESETtype=excluded.type,parent_record_id=excluded.parent_record_id,title=excluded.title,description=excluded.description,status=excluded.status,priority=excluded.priority,assigned_to=excluded.assigned_to,team=excluded.team,decision_ref=excluded.decision_ref,updated_at=excluded.updated_at,deleted_at=excluded.deleted_at,hash=excluded.hash,canonical_version=excluded.canonical_versionWHEREexcluded.updated_at>tickets.updated_atOR(excluded.updated_at=tickets.updated_atANDexcluded.hash>tickets.hash);
INSERTINTOtickets(record_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.
Parkedunderpost-cascadegameplay/releasebacklogpercascaderefocus2026-06-12;functionalrequirementpreservedforreleasepreparation.', 'backlog', 'low', NULL, 'client', NULL, '2026-03-2318:31:35', '2026-06-1210: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);
INSERTINTOtickets(record_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)ONCONFLICT(record_id)DOUPDATESETtype=excluded.type,parent_record_id=excluded.parent_record_id,title=excluded.title,description=excluded.description,status=excluded.status,priority=excluded.priority,assigned_to=excluded.assigned_to,team=excluded.team,decision_ref=excluded.decision_ref,updated_at=excluded.updated_at,deleted_at=excluded.deleted_at,hash=excluded.hash,canonical_version=excluded.canonical_versionWHEREexcluded.updated_at>tickets.updated_atOR(excluded.updated_at=tickets.updated_atANDexcluded.hash>tickets.hash);
INSERTINTOtickets(record_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.
Parkedunderpost-cascadegameplay/releasebacklogpercascaderefocus2026-06-12;legalattributionrequirementpreservedforreleasepreparation.', 'backlog', 'medium', NULL, 'client', NULL, '2026-03-2318:33:04', '2026-06-1210: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);
INSERTINTOtickets(record_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)ONCONFLICT(record_id)DOUPDATESETtype=excluded.type,parent_record_id=excluded.parent_record_id,title=excluded.title,description=excluded.description,status=excluded.status,priority=excluded.priority,assigned_to=excluded.assigned_to,team=excluded.team,decision_ref=excluded.decision_ref,updated_at=excluded.updated_at,deleted_at=excluded.deleted_at,hash=excluded.hash,canonical_version=excluded.canonical_versionWHEREexcluded.updated_at>tickets.updated_atOR(excluded.updated_at=tickets.updated_atANDexcluded.hash>tickets.hash);
INSERTINTOtickets(record_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.
Parkedunderpost-cascadegameplaybacklogpercascaderefocus2026-06-12;preserved,notcancelled.', 'backlog', 'low', NULL, 'client', NULL, '2026-03-2318:38:37', '2026-06-1210: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);
INSERTINTOtickets(record_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)ONCONFLICT(record_id)DOUPDATESETtype=excluded.type,parent_record_id=excluded.parent_record_id,title=excluded.title,description=excluded.description,status=excluded.status,priority=excluded.priority,assigned_to=excluded.assigned_to,team=excluded.team,decision_ref=excluded.decision_ref,updated_at=excluded.updated_at,deleted_at=excluded.deleted_at,hash=excluded.hash,canonical_version=excluded.canonical_versionWHEREexcluded.updated_at>tickets.updated_atOR(excluded.updated_at=tickets.updated_atANDexcluded.hash>tickets.hash);
INSERTINTOtickets(record_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.
ParkedunderPhase5epicpercascaderefocus2026-06-12;server-authoritativeminimaprequirementpreserved—resumeswithplayerrendering.', 'backlog', 'medium', NULL, 'client', NULL, '2026-03-2318:48:16', '2026-06-1210: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);
INSERTINTOtickets(record_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)ONCONFLICT(record_id)DOUPDATESETtype=excluded.type,parent_record_id=excluded.parent_record_id,title=excluded.title,description=excluded.description,status=excluded.status,priority=excluded.priority,assigned_to=excluded.assigned_to,team=excluded.team,decision_ref=excluded.decision_ref,updated_at=excluded.updated_at,deleted_at=excluded.deleted_at,hash=excluded.hash,canonical_version=excluded.canonical_versionWHEREexcluded.updated_at>tickets.updated_atOR(excluded.updated_at=tickets.updated_atANDexcluded.hash>tickets.hash);
INSERTINTOtickets(record_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.
ParkedunderPhase5epicpercascaderefocus2026-06-12;asymmetric-informationtooltiprequirementpreserved—resumeswithgameplayUIwork.', 'backlog', 'medium', NULL, 'client', NULL, '2026-03-2318:49:04', '2026-06-1210: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);
INSERTINTOtickets(record_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)ONCONFLICT(record_id)DOUPDATESETtype=excluded.type,parent_record_id=excluded.parent_record_id,title=excluded.title,description=excluded.description,status=excluded.status,priority=excluded.priority,assigned_to=excluded.assigned_to,team=excluded.team,decision_ref=excluded.decision_ref,updated_at=excluded.updated_at,deleted_at=excluded.deleted_at,hash=excluded.hash,canonical_version=excluded.canonical_versionWHEREexcluded.updated_at>tickets.updated_atOR(excluded.updated_at=tickets.updated_atANDexcluded.hash>tickets.hash);
INSERTINTOtickets(record_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.
ParkedunderPhase5epicpercascaderefocus2026-06-12;unifiedsettings/inputdesignrequirementpreserved—resumeswithplayercontrolwork.', 'backlog', 'medium', NULL, 'client', NULL, '2026-03-2318:53:39', '2026-06-1210: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);
INSERTINTOtickets(record_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)ONCONFLICT(record_id)DOUPDATESETtype=excluded.type,parent_record_id=excluded.parent_record_id,title=excluded.title,description=excluded.description,status=excluded.status,priority=excluded.priority,assigned_to=excluded.assigned_to,team=excluded.team,decision_ref=excluded.decision_ref,updated_at=excluded.updated_at,deleted_at=excluded.deleted_at,hash=excluded.hash,canonical_version=excluded.canonical_versionWHEREexcluded.updated_at>tickets.updated_atOR(excluded.updated_at=tickets.updated_atANDexcluded.hash>tickets.hash);
INSERTINTOtickets(record_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-parentedunderPhase4epicpercascaderefocus2026-06-12—asset-pipelinetoolingfeedingthePhase-4assetcatalog.', 'backlog', 'low', NULL, 'client', NULL, '2026-03-2319:08:40', '2026-06-1210: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);
INSERTINTOtickets(record_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)ONCONFLICT(record_id)DOUPDATESETtype=excluded.type,parent_record_id=excluded.parent_record_id,title=excluded.title,description=excluded.description,status=excluded.status,priority=excluded.priority,assigned_to=excluded.assigned_to,team=excluded.team,decision_ref=excluded.decision_ref,updated_at=excluded.updated_at,deleted_at=excluded.deleted_at,hash=excluded.hash,canonical_version=excluded.canonical_versionWHEREexcluded.updated_at>tickets.updated_atOR(excluded.updated_at=tickets.updated_atANDexcluded.hash>tickets.hash);
INSERTINTOtickets(record_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.
ParkedunderPhase5epicpercascaderefocus2026-06-12;interactable-highlightrequirementpreserved—evaluatewhentheinteractionsystemisbuilt.', 'backlog', 'low', NULL, 'client', NULL, '2026-03-2319:28:45', '2026-06-1210: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);
INSERTINTOtickets(record_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)ONCONFLICT(record_id)DOUPDATESETtype=excluded.type,parent_record_id=excluded.parent_record_id,title=excluded.title,description=excluded.description,status=excluded.status,priority=excluded.priority,assigned_to=excluded.assigned_to,team=excluded.team,decision_ref=excluded.decision_ref,updated_at=excluded.updated_at,deleted_at=excluded.deleted_at,hash=excluded.hash,canonical_version=excluded.canonical_versionWHEREexcluded.updated_at>tickets.updated_atOR(excluded.updated_at=tickets.updated_atANDexcluded.hash>tickets.hash);
INSERTINTOtickets(record_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.
ParkedunderPhase5epicpercascaderefocus2026-06-12;HUDstatus-iconrequirementpreserved—resumeswithgameplayUIwork.', 'backlog', 'medium', NULL, 'client', NULL, '2026-04-0510:28:05', '2026-06-1210: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);
INSERTINTOtickets(record_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)ONCONFLICT(record_id)DOUPDATESETtype=excluded.type,parent_record_id=excluded.parent_record_id,title=excluded.title,description=excluded.description,status=excluded.status,priority=excluded.priority,assigned_to=excluded.assigned_to,team=excluded.team,decision_ref=excluded.decision_ref,updated_at=excluded.updated_at,deleted_at=excluded.deleted_at,hash=excluded.hash,canonical_version=excluded.canonical_versionWHEREexcluded.updated_at>tickets.updated_atOR(excluded.updated_at=tickets.updated_atANDexcluded.hash>tickets.hash);
INSERTINTOtickets(record_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.
ParkedunderPhase5epicpercascaderefocus2026-06-12;keybinddocumentationandremappingrequirementpreserved—pairswithT-735.', 'backlog', 'medium', NULL, 'client', NULL, '2026-04-1020:20:28', '2026-06-1210: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);
INSERTINTOtickets(record_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)ONCONFLICT(record_id)DOUPDATESETtype=excluded.type,parent_record_id=excluded.parent_record_id,title=excluded.title,description=excluded.description,status=excluded.status,priority=excluded.priority,assigned_to=excluded.assigned_to,team=excluded.team,decision_ref=excluded.decision_ref,updated_at=excluded.updated_at,deleted_at=excluded.deleted_at,hash=excluded.hash,canonical_version=excluded.canonical_versionWHEREexcluded.updated_at>tickets.updated_atOR(excluded.updated_at=tickets.updated_atANDexcluded.hash>tickets.hash);
INSERTINTOtickets(record_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-parentedunderPhase4epicpercascaderefocus2026-06-12—generation-toolingtestcoverage(atlasstar-mapgenerator).', 'backlog', 'low', NULL, 'client', NULL, '2026-04-1507:06:33', '2026-06-1210: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);
INSERTINTOtickets(record_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)ONCONFLICT(record_id)DOUPDATESETtype=excluded.type,parent_record_id=excluded.parent_record_id,title=excluded.title,description=excluded.description,status=excluded.status,priority=excluded.priority,assigned_to=excluded.assigned_to,team=excluded.team,decision_ref=excluded.decision_ref,updated_at=excluded.updated_at,deleted_at=excluded.deleted_at,hash=excluded.hash,canonical_version=excluded.canonical_versionWHEREexcluded.updated_at>tickets.updated_atOR(excluded.updated_at=tickets.updated_atANDexcluded.hash>tickets.hash);
INSERTINTOtickets(record_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-parentedunderPhase4epicpercascaderefocus2026-06-12—atlasmarkersschemaisgeneration-outputdata.', 'backlog', 'low', NULL, 'client', NULL, '2026-04-1507:06:42', '2026-06-1210: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);
INSERTINTOtickets(record_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)
Alsoneeds:releasebuildpipeline(CI/cross-compilation)foreachtargetplatform,devpackageinstallationinstructionsforeachbackend(e.g.ROCmrocm-hip-develonFedoraisrequiredfor--features rocm to build), runtime hardware detection in the game launcher to pick the right binary.
Filedduringthe#833namingpipelinework—theROCmrebuildonthedevmachinesurfacedthatthecurrentMakefiletarget`build-sr-voice`producesCPU-onlybinariesregardlessofthehardwarepresent,whichisfineforthedev''s#833batchbutabsolutelywrongforshippedreleasebinaries.Parentwork:D-138(Gemma2voicepipeline).', 'backlog', 'medium', NULL, 'server', NULL, '2026-04-1510:57:11', '2026-06-1210: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);
INSERTINTOtickets(record_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)
Alsoneeds:releasebuildpipeline(CI/cross-compilation)foreachtargetplatform,devpackageinstallationinstructionsforeachbackend(e.g.ROCmrocm-hip-develonFedoraisrequiredfor--features rocm to build), runtime hardware detection in the game launcher to pick the right binary.
Re-homedundermaintenancepercascaderefocus2026-06-12—build-pipelineinfrastructure;multi-GPUrelease-binaryrequirementpreserved.', 'backlog', 'medium', NULL, 'server', NULL, '2026-04-1510:57:11', '2026-06-1210: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);
INSERTINTOtickets(record_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)ONCONFLICT(record_id)DOUPDATESETtype=excluded.type,parent_record_id=excluded.parent_record_id,title=excluded.title,description=excluded.description,status=excluded.status,priority=excluded.priority,assigned_to=excluded.assigned_to,team=excluded.team,decision_ref=excluded.decision_ref,updated_at=excluded.updated_at,deleted_at=excluded.deleted_at,hash=excluded.hash,canonical_version=excluded.canonical_versionWHEREexcluded.updated_at>tickets.updated_atOR(excluded.updated_at=tickets.updated_atANDexcluded.hash>tickets.hash);
INSERTINTOtickets(record_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-homedundermaintenance(testdebt)percascaderefocus2026-06-12.', 'backlog', 'low', NULL, 'client', NULL, '2026-04-2011:17:20', '2026-06-1210: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);
INSERTINTOtickets(record_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)ONCONFLICT(record_id)DOUPDATESETtype=excluded.type,parent_record_id=excluded.parent_record_id,title=excluded.title,description=excluded.description,status=excluded.status,priority=excluded.priority,assigned_to=excluded.assigned_to,team=excluded.team,decision_ref=excluded.decision_ref,updated_at=excluded.updated_at,deleted_at=excluded.deleted_at,hash=excluded.hash,canonical_version=excluded.canonical_versionWHEREexcluded.updated_at>tickets.updated_atOR(excluded.updated_at=tickets.updated_atANDexcluded.hash>tickets.hash);
INSERTINTOtickets(record_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-homedundermaintenance(test-revivaldebtfrom#870deletions)percascaderefocus2026-06-12.', 'backlog', 'low', NULL, 'client', NULL, '2026-04-2115:01:17', '2026-06-1210: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);
INSERTINTOtickets(record_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)ONCONFLICT(record_id)DOUPDATESETtype=excluded.type,parent_record_id=excluded.parent_record_id,title=excluded.title,description=excluded.description,status=excluded.status,priority=excluded.priority,assigned_to=excluded.assigned_to,team=excluded.team,decision_ref=excluded.decision_ref,updated_at=excluded.updated_at,deleted_at=excluded.deleted_at,hash=excluded.hash,canonical_version=excluded.canonical_versionWHEREexcluded.updated_at>tickets.updated_atOR(excluded.updated_at=tickets.updated_atANDexcluded.hash>tickets.hash);
INSERTINTOtickets(record_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-homedundermaintenance(test-revivaldebtfrom#870deletions)percascaderefocus2026-06-12.', 'backlog', 'low', NULL, 'client', NULL, '2026-04-2115:01:23', '2026-06-1210: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);
INSERTINTOtickets(record_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)ONCONFLICT(record_id)DOUPDATESETtype=excluded.type,parent_record_id=excluded.parent_record_id,title=excluded.title,description=excluded.description,status=excluded.status,priority=excluded.priority,assigned_to=excluded.assigned_to,team=excluded.team,decision_ref=excluded.decision_ref,updated_at=excluded.updated_at,deleted_at=excluded.deleted_at,hash=excluded.hash,canonical_version=excluded.canonical_versionWHEREexcluded.updated_at>tickets.updated_atOR(excluded.updated_at=tickets.updated_atANDexcluded.hash>tickets.hash);
INSERTINTOtickets(record_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-homedundermaintenance(test-revivaldebtfrom#870deletions)percascaderefocus2026-06-12.', 'backlog', 'low', NULL, 'client', NULL, '2026-04-2207:56:26', '2026-06-1210: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);
INSERTINTOtickets(record_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.
Spec:#872(TCP-batchracefix),#258(mainmenuflow).', 'backlog', 'low', NULL, 'client', NULL, '2026-04-2207:56:41', '2026-06-1210: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);
INSERTINTOtickets(record_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.
Parkedunderpost-cascadegameplaybacklogpercascaderefocus2026-06-12;loading-timeoutrobustnessrequirementpreservedwiththebookmarkflow.', 'backlog', 'low', NULL, 'client', NULL, '2026-04-2207:56:41', '2026-06-1210: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);
INSERTINTOtickets(record_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):
Spec:#873(merge-pathtests),D-020(IPCarchitecture—testharnesslayer).', 'backlog', 'low', NULL, 'client', NULL, '2026-04-2207:57:10', '2026-06-1210: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);
INSERTINTOtickets(record_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):
Re-homedundermaintenance(test-infrahygiene)percascaderefocus2026-06-12.', 'backlog', 'low', NULL, 'client', NULL, '2026-04-2207:57:10', '2026-06-1210: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);
INSERTINTOtickets(record_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#137includes21fileeditsunder`wiki/`authoredbytheserverteam(6newcorpwikipages+15tagupdates,shippedunder#860—"Close D-175 Phase 2 coverage gate").`CLAUDE.md`team-boundariespolicysays:*"Stay within your team''s scope. Server team modifies `server/`. Copy team modifies `wiki/`."*Thewikiwriteswereacceptedforthissprintasapragmaticfix(andcopy-teamfollow-upreviewfiledas#884),butHoshecorrectlyflaggedtheprecedentconcern:
>"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."
**Cross-reference:**PR#137,#860(D-175Phase2coveragegate),#884(copy-teamvoice/lorereviewofthewikiwrites),`CLAUDE.md`"Agent Instructions → Team boundaries"section.
**Rationale:**Theboundaryexiststokeepvoice/loreauthoringincopy-teamhandsandpreventdrift.Coveragegatescreatelegitimatecross-scopewritesthataren''tauthoring.Theboundaryshouldaccommodatethisorprovideanalternativethatkeepstheboundaryclean.', 'backlog', 'low', NULL, 'planning', NULL, '2026-04-2208:00:12', '2026-06-1210: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);
INSERTINTOtickets(record_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#137includes21fileeditsunder`wiki/`authoredbytheserverteam(6newcorpwikipages+15tagupdates,shippedunder#860—"Close D-175 Phase 2 coverage gate").`CLAUDE.md`team-boundariespolicysays:*"Stay within your team''s scope. Server team modifies `server/`. Copy team modifies `wiki/`."*Thewikiwriteswereacceptedforthissprintasapragmaticfix(andcopy-teamfollow-upreviewfiledas#884),butHoshecorrectlyflaggedtheprecedentconcern:
>"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."
**Cross-reference:**PR#137,#860(D-175Phase2coveragegate),#884(copy-teamvoice/lorereviewofthewikiwrites),`CLAUDE.md`"Agent Instructions → Team boundaries"section.
Re-homedundermaintenance(process/docshygiene)percascaderefocus2026-06-12.', 'backlog', 'low', NULL, 'planning', NULL, '2026-04-2208:00:12', '2026-06-1210: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);
INSERTINTOtickets(record_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)ONCONFLICT(record_id)DOUPDATESETtype=excluded.type,parent_record_id=excluded.parent_record_id,title=excluded.title,description=excluded.description,status=excluded.status,priority=excluded.priority,assigned_to=excluded.assigned_to,team=excluded.team,decision_ref=excluded.decision_ref,updated_at=excluded.updated_at,deleted_at=excluded.deleted_at,hash=excluded.hash,canonical_version=excluded.canonical_versionWHEREexcluded.updated_at>tickets.updated_atOR(excluded.updated_at=tickets.updated_atANDexcluded.hash>tickets.hash);
INSERTINTOtickets(record_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.
Parkedunderpost-cascadegameplaybacklogpercascaderefocus2026-06-12;D-027criterion-4coveragerequirementpreserved—picksupwhentellescalation(#589)lands.', 'backlog', 'low', NULL, 'server', NULL, '2026-04-2208:06:52', '2026-06-1210: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);
INSERTINTOtickets(record_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)ONCONFLICT(record_id)DOUPDATESETtype=excluded.type,parent_record_id=excluded.parent_record_id,title=excluded.title,description=excluded.description,status=excluded.status,priority=excluded.priority,assigned_to=excluded.assigned_to,team=excluded.team,decision_ref=excluded.decision_ref,updated_at=excluded.updated_at,deleted_at=excluded.deleted_at,hash=excluded.hash,canonical_version=excluded.canonical_versionWHEREexcluded.updated_at>tickets.updated_atOR(excluded.updated_at=tickets.updated_atANDexcluded.hash>tickets.hash);
INSERTINTOtickets(record_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-homedundermaintenancefromdoneumbrellaT-871percascaderefocus2026-06-12.', 'backlog', 'low', NULL, 'client', NULL, '2026-05-0208:11:54', '2026-06-1210: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);
INSERTINTOtickets(record_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)ONCONFLICT(record_id)DOUPDATESETtype=excluded.type,parent_record_id=excluded.parent_record_id,title=excluded.title,description=excluded.description,status=excluded.status,priority=excluded.priority,assigned_to=excluded.assigned_to,team=excluded.team,decision_ref=excluded.decision_ref,updated_at=excluded.updated_at,deleted_at=excluded.deleted_at,hash=excluded.hash,canonical_version=excluded.canonical_versionWHEREexcluded.updated_at>tickets.updated_atOR(excluded.updated_at=tickets.updated_atANDexcluded.hash>tickets.hash);
INSERTINTOtickets(record_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-homedundermaintenancefromdoneumbrellaT-871percascaderefocus2026-06-12.', 'backlog', 'low', NULL, 'client', NULL, '2026-05-0208:11:59', '2026-06-1210: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);
INSERTINTOtickets(record_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)ONCONFLICT(record_id)DOUPDATESETtype=excluded.type,parent_record_id=excluded.parent_record_id,title=excluded.title,description=excluded.description,status=excluded.status,priority=excluded.priority,assigned_to=excluded.assigned_to,team=excluded.team,decision_ref=excluded.decision_ref,updated_at=excluded.updated_at,deleted_at=excluded.deleted_at,hash=excluded.hash,canonical_version=excluded.canonical_versionWHEREexcluded.updated_at>tickets.updated_atOR(excluded.updated_at=tickets.updated_atANDexcluded.hash>tickets.hash);
INSERTINTOtickets(record_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-homedundermaintenancefromdoneumbrellaT-871percascaderefocus2026-06-12.', 'backlog', 'low', NULL, 'client', NULL, '2026-05-0208:12:32', '2026-06-1210: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);
INSERTINTOtickets(record_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)ONCONFLICT(record_id)DOUPDATESETtype=excluded.type,parent_record_id=excluded.parent_record_id,title=excluded.title,description=excluded.description,status=excluded.status,priority=excluded.priority,assigned_to=excluded.assigned_to,team=excluded.team,decision_ref=excluded.decision_ref,updated_at=excluded.updated_at,deleted_at=excluded.deleted_at,hash=excluded.hash,canonical_version=excluded.canonical_versionWHEREexcluded.updated_at>tickets.updated_atOR(excluded.updated_at=tickets.updated_atANDexcluded.hash>tickets.hash);
INSERTINTOtickets(record_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-homedundermaintenancefromdoneumbrellaT-871percascaderefocus2026-06-12.', 'backlog', 'low', NULL, 'client', NULL, '2026-05-0208:12:38', '2026-06-1210: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);
INSERTINTOtickets(record_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)ONCONFLICT(record_id)DOUPDATESETtype=excluded.type,parent_record_id=excluded.parent_record_id,title=excluded.title,description=excluded.description,status=excluded.status,priority=excluded.priority,assigned_to=excluded.assigned_to,team=excluded.team,decision_ref=excluded.decision_ref,updated_at=excluded.updated_at,deleted_at=excluded.deleted_at,hash=excluded.hash,canonical_version=excluded.canonical_versionWHEREexcluded.updated_at>tickets.updated_atOR(excluded.updated_at=tickets.updated_atANDexcluded.hash>tickets.hash);
INSERTINTOtickets(record_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-homedundermaintenancefromdoneumbrellaT-871percascaderefocus2026-06-12.', 'backlog', 'low', NULL, 'client', NULL, '2026-05-0208:12:45', '2026-06-1210: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);
INSERTINTOtickets(record_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)ONCONFLICT(record_id)DOUPDATESETtype=excluded.type,parent_record_id=excluded.parent_record_id,title=excluded.title,description=excluded.description,status=excluded.status,priority=excluded.priority,assigned_to=excluded.assigned_to,team=excluded.team,decision_ref=excluded.decision_ref,updated_at=excluded.updated_at,deleted_at=excluded.deleted_at,hash=excluded.hash,canonical_version=excluded.canonical_versionWHEREexcluded.updated_at>tickets.updated_atOR(excluded.updated_at=tickets.updated_atANDexcluded.hash>tickets.hash);
INSERTINTOtickets(record_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-homedundermaintenancefromdoneumbrellaT-871percascaderefocus2026-06-12.', 'backlog', 'low', NULL, 'client', NULL, '2026-05-0208:12:51', '2026-06-1210: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);
INSERTINTOtickets(record_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)ONCONFLICT(record_id)DOUPDATESETtype=excluded.type,parent_record_id=excluded.parent_record_id,title=excluded.title,description=excluded.description,status=excluded.status,priority=excluded.priority,assigned_to=excluded.assigned_to,team=excluded.team,decision_ref=excluded.decision_ref,updated_at=excluded.updated_at,deleted_at=excluded.deleted_at,hash=excluded.hash,canonical_version=excluded.canonical_versionWHEREexcluded.updated_at>tickets.updated_atOR(excluded.updated_at=tickets.updated_atANDexcluded.hash>tickets.hash);
INSERTINTOtickets(record_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-homedundermaintenancefromdoneumbrellaT-871percascaderefocus2026-06-12.', 'backlog', 'low', NULL, 'client', NULL, '2026-05-0208:12:56', '2026-06-1210: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);
INSERTINTOtickets(record_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)ONCONFLICT(record_id)DOUPDATESETtype=excluded.type,parent_record_id=excluded.parent_record_id,title=excluded.title,description=excluded.description,status=excluded.status,priority=excluded.priority,assigned_to=excluded.assigned_to,team=excluded.team,decision_ref=excluded.decision_ref,updated_at=excluded.updated_at,deleted_at=excluded.deleted_at,hash=excluded.hash,canonical_version=excluded.canonical_versionWHEREexcluded.updated_at>tickets.updated_atOR(excluded.updated_at=tickets.updated_atANDexcluded.hash>tickets.hash);
INSERTINTOtickets(record_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-homedundermaintenancefromdoneumbrellaT-871percascaderefocus2026-06-12.', 'backlog', 'low', NULL, 'client', NULL, '2026-05-0208:13:02', '2026-06-1210: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);
INSERTINTOtickets(record_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)ONCONFLICT(record_id)DOUPDATESETtype=excluded.type,parent_record_id=excluded.parent_record_id,title=excluded.title,description=excluded.description,status=excluded.status,priority=excluded.priority,assigned_to=excluded.assigned_to,team=excluded.team,decision_ref=excluded.decision_ref,updated_at=excluded.updated_at,deleted_at=excluded.deleted_at,hash=excluded.hash,canonical_version=excluded.canonical_versionWHEREexcluded.updated_at>tickets.updated_atOR(excluded.updated_at=tickets.updated_atANDexcluded.hash>tickets.hash);
INSERTINTOtickets(record_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-parentedunderPhase4epicpercascaderefocus2026-06-12—biometaxonomyfortheatlas/cascadegenerator.', 'backlog', 'low', NULL, 'server', NULL, '2026-05-0310:30:14', '2026-06-1210: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);
INSERTINTOtickets(record_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.
Affects:atlasapp(reach,system,planet,regionalscreens),economicsmonitor.Theserver-sidehandlercanstartasathinproxy(readfile,returncontents)andevolveintoperception-filteredqueries(D-012)later.', 'backlog', 'medium', NULL, 'client', NULL, '2026-05-0314:14:23', '2026-06-1210: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);
INSERTINTOtickets(record_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.
Re-parentedunderPhase4epicpercascaderefocus2026-06-12—atlasdatadeliveryunderpinsviewingcascadelayersthroughtheimplantAtlas.', 'backlog', 'medium', NULL, 'client', NULL, '2026-05-0314:14:23', '2026-06-1210: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);
INSERTINTOtickets(record_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:
Goal:agreen(orexplicitly-gated)bare`maketest-client`soclientregressionsaredetectable.Untilthen,runtargetedsuites(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);
INSERTINTOtickets(record_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:
Re-homedundermaintenance(test-failuredebt/suitehygiene)percascaderefocus2026-06-12.', 'backlog', 'medium', NULL, 'client', NULL, '2026-05-2416:49:54', '2026-06-1210: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);
INSERTINTOtickets(record_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):
SurfacedbythePR#147(#1016)review(PaulaHIGH/Miri).Lowpriority—current''swahili''approximationisdocumented,notsilentlywrong.', 'backlog', 'low', NULL, 'server', 'D-237', '2026-06-0308:27:09', '2026-06-1210: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);
INSERTINTOtickets(record_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):
Re-parentedunderPhase4epicpercascaderefocus2026-06-12—cultural_specializationtaxonomyisageneration-inputdatafix(D-237).', 'backlog', 'low', NULL, 'server', 'D-237', '2026-06-0308:27:09', '2026-06-1210: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);
INSERTINTOtickets(record_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.
Seam:run_layer3(andeachrun_layerN)ispure—wrapattherun_cascadecallsite(a//cacheseamcommentmarksit).', 'backlog', 'low', NULL, 'server', 'D-200', '2026-06-0310:46:13', '2026-06-1210: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);
INSERTINTOtickets(record_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.
Re-parentedunderPhase4epicpercascaderefocus2026-06-12—cascade-outputpersistence;triggerremainsend-to-endcascade(post#959)orLayer-2contextfreeze.', 'backlog', 'low', NULL, 'server', 'D-200', '2026-06-0310:46:13', '2026-06-1210: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);
INSERTINTOtickets(record_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)ONCONFLICT(record_id)DOUPDATESETtype=excluded.type,parent_record_id=excluded.parent_record_id,title=excluded.title,description=excluded.description,status=excluded.status,priority=excluded.priority,assigned_to=excluded.assigned_to,team=excluded.team,decision_ref=excluded.decision_ref,updated_at=excluded.updated_at,deleted_at=excluded.deleted_at,hash=excluded.hash,canonical_version=excluded.canonical_versionWHEREexcluded.updated_at>tickets.updated_atOR(excluded.updated_at=tickets.updated_atANDexcluded.hash>tickets.hash);
INSERTINTOtickets(record_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.
Cancelled2026-06-12:thev0.2Life-SimPivotinitiativeshell—thev0.2targetisdropped(D-166,amendment2026-06-12;D-114/D-115/D-117/D-118/D-120superseded).Itschildrenwithsurvivingfunctionalcontent(T-604proof-of-lifeplaytestconcept,T-605tycoonbookmark,T-606creationflow,T-608worldfeel)arepreservedunderthepost-cascadegameplayparkingepicT-1036.', 'cancelled', 'critical', NULL, NULL, NULL, '2026-03-0523:11:31', '2026-06-1210: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);
INSERTINTOtickets(record_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)ONCONFLICT(record_id)DOUPDATESETtype=excluded.type,parent_record_id=excluded.parent_record_id,title=excluded.title,description=excluded.description,status=excluded.status,priority=excluded.priority,assigned_to=excluded.assigned_to,team=excluded.team,decision_ref=excluded.decision_ref,updated_at=excluded.updated_at,deleted_at=excluded.deleted_at,hash=excluded.hash,canonical_version=excluded.canonical_versionWHEREexcluded.updated_at>tickets.updated_atOR(excluded.updated_at=tickets.updated_atANDexcluded.hash>tickets.hash);
INSERTINTOtickets(record_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)ONCONFLICT(record_id)DOUPDATESETtype=excluded.type,parent_record_id=excluded.parent_record_id,title=excluded.title,description=excluded.description,status=excluded.status,priority=excluded.priority,assigned_to=excluded.assigned_to,team=excluded.team,decision_ref=excluded.decision_ref,updated_at=excluded.updated_at,deleted_at=excluded.deleted_at,hash=excluded.hash,canonical_version=excluded.canonical_versionWHEREexcluded.updated_at>tickets.updated_atOR(excluded.updated_at=tickets.updated_atANDexcluded.hash>tickets.hash);
INSERTINTOtickets(record_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)ONCONFLICT(record_id)DOUPDATESETtype=excluded.type,parent_record_id=excluded.parent_record_id,title=excluded.title,description=excluded.description,status=excluded.status,priority=excluded.priority,assigned_to=excluded.assigned_to,team=excluded.team,decision_ref=excluded.decision_ref,updated_at=excluded.updated_at,deleted_at=excluded.deleted_at,hash=excluded.hash,canonical_version=excluded.canonical_versionWHEREexcluded.updated_at>tickets.updated_atOR(excluded.updated_at=tickets.updated_atANDexcluded.hash>tickets.hash);
INSERTINTOtickets(record_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)ONCONFLICT(record_id)DOUPDATESETtype=excluded.type,parent_record_id=excluded.parent_record_id,title=excluded.title,description=excluded.description,status=excluded.status,priority=excluded.priority,assigned_to=excluded.assigned_to,team=excluded.team,decision_ref=excluded.decision_ref,updated_at=excluded.updated_at,deleted_at=excluded.deleted_at,hash=excluded.hash,canonical_version=excluded.canonical_versionWHEREexcluded.updated_at>tickets.updated_atOR(excluded.updated_at=tickets.updated_atANDexcluded.hash>tickets.hash);
INSERTINTOtickets(record_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)ONCONFLICT(record_id)DOUPDATESETtype=excluded.type,parent_record_id=excluded.parent_record_id,title=excluded.title,description=excluded.description,status=excluded.status,priority=excluded.priority,assigned_to=excluded.assigned_to,team=excluded.team,decision_ref=excluded.decision_ref,updated_at=excluded.updated_at,deleted_at=excluded.deleted_at,hash=excluded.hash,canonical_version=excluded.canonical_versionWHEREexcluded.updated_at>tickets.updated_atOR(excluded.updated_at=tickets.updated_atANDexcluded.hash>tickets.hash);
INSERTINTOtickets(record_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)ONCONFLICT(record_id)DOUPDATESETtype=excluded.type,parent_record_id=excluded.parent_record_id,title=excluded.title,description=excluded.description,status=excluded.status,priority=excluded.priority,assigned_to=excluded.assigned_to,team=excluded.team,decision_ref=excluded.decision_ref,updated_at=excluded.updated_at,deleted_at=excluded.deleted_at,hash=excluded.hash,canonical_version=excluded.canonical_versionWHEREexcluded.updated_at>tickets.updated_atOR(excluded.updated_at=tickets.updated_atANDexcluded.hash>tickets.hash);
INSERTINTOtickets(record_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.
Cancelled2026-06-12:pre-cascadeumbrellaemptiedbythecascaderefocus—childrenre-homed(T-50/T-52toPhase4,T-49/T-51toPhase5).', 'cancelled', 'high', NULL, NULL, 'D-010,D-012,D-013,D-014', '2026-02-1023:14:31', '2026-06-1210: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);
INSERTINTOtickets(record_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)ONCONFLICT(record_id)DOUPDATESETtype=excluded.type,parent_record_id=excluded.parent_record_id,title=excluded.title,description=excluded.description,status=excluded.status,priority=excluded.priority,assigned_to=excluded.assigned_to,team=excluded.team,decision_ref=excluded.decision_ref,updated_at=excluded.updated_at,deleted_at=excluded.deleted_at,hash=excluded.hash,canonical_version=excluded.canonical_versionWHEREexcluded.updated_at>tickets.updated_atOR(excluded.updated_at=tickets.updated_atANDexcluded.hash>tickets.hash);
INSERTINTOtickets(record_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.
Cancelled2026-06-12:pre-cascadeumbrellaemptiedbythecascaderefocus—childrenre-homed(T-54toPhase4,T-55/T-56toPhase6,T-53togameplayparkingT-1036).', 'cancelled', 'high', NULL, NULL, 'D-023,D-025,D-028,D-029', '2026-02-1023:14:31', '2026-06-1210: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);
INSERTINTOtickets(record_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.
Cancelled2026-06-12:pre-cascadeumbrella—test-infrachildrenre-homedundermaintenanceinitiativeT-1037;discussionchildT-64cancelled(testingapproachlongestablished).', 'backlog', 'high', NULL, NULL, NULL, '2026-02-1023:14:31', '2026-06-1210: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);
INSERTINTOtickets(record_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.
Cancelled2026-06-12:discussionpremisefulfilled—testingapproachestablishedanddocumented(three-tierstrategy,Gauntlet-first,D-239harness);docdeliverablesliveoninT-215/T-216/T-217underT-1037.', 'backlog', 'critical', NULL, NULL, NULL, '2026-02-1023:17:38', '2026-06-1210: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);
INSERTINTOtickets(record_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)ONCONFLICT(record_id)DOUPDATESETtype=excluded.type,parent_record_id=excluded.parent_record_id,title=excluded.title,description=excluded.description,status=excluded.status,priority=excluded.priority,assigned_to=excluded.assigned_to,team=excluded.team,decision_ref=excluded.decision_ref,updated_at=excluded.updated_at,deleted_at=excluded.deleted_at,hash=excluded.hash,canonical_version=excluded.canonical_versionWHEREexcluded.updated_at>tickets.updated_atOR(excluded.updated_at=tickets.updated_atANDexcluded.hash>tickets.hash);
INSERTINTOtickets(record_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.
Cancelled2026-06-12:refinement-discussionartifact;testingapproachsincedecidedanddocumented;survivingdocworkinT-215/T-216/T-217.', 'cancelled', 'critical', NULL, NULL, NULL, '2026-02-1023:27:10', '2026-06-1210: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);
INSERTINTOtickets(record_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)ONCONFLICT(record_id)DOUPDATESETtype=excluded.type,parent_record_id=excluded.parent_record_id,title=excluded.title,description=excluded.description,status=excluded.status,priority=excluded.priority,assigned_to=excluded.assigned_to,team=excluded.team,decision_ref=excluded.decision_ref,updated_at=excluded.updated_at,deleted_at=excluded.deleted_at,hash=excluded.hash,canonical_version=excluded.canonical_versionWHEREexcluded.updated_at>tickets.updated_atOR(excluded.updated_at=tickets.updated_atANDexcluded.hash>tickets.hash);
INSERTINTOtickets(record_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).
Cancelled2026-06-12:administrativesplitshell—fullscopecarriedbyT-681(Phase6)andT-682(gameplayparking);nofunctionalrequirementlost.', 'cancelled', 'high', NULL, 'server', NULL, '2026-03-0523:12:44', '2026-06-1210: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);
Closed2026-06-12:enginearchitecturedelivered(T-35–T-38done);theoneopenchild(T-235gamestatemanagement)re-homedunderPhase5epicT-749.Umbrellacomplete.', 'done', 'critical', NULL, NULL, 'D-020', '2026-02-1023:14:11', '2026-06-1210: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);
INSERTINTOtickets(record_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)ONCONFLICT(record_id)DOUPDATESETtype=excluded.type,parent_record_id=excluded.parent_record_id,title=excluded.title,description=excluded.description,status=excluded.status,priority=excluded.priority,assigned_to=excluded.assigned_to,team=excluded.team,decision_ref=excluded.decision_ref,updated_at=excluded.updated_at,deleted_at=excluded.deleted_at,hash=excluded.hash,canonical_version=excluded.canonical_versionWHEREexcluded.updated_at>tickets.updated_atOR(excluded.updated_at=tickets.updated_atANDexcluded.hash>tickets.hash);
INSERTINTOtickets(record_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)ONCONFLICT(record_id)DOUPDATESETtype=excluded.type,parent_record_id=excluded.parent_record_id,title=excluded.title,description=excluded.description,status=excluded.status,priority=excluded.priority,assigned_to=excluded.assigned_to,team=excluded.team,decision_ref=excluded.decision_ref,updated_at=excluded.updated_at,deleted_at=excluded.deleted_at,hash=excluded.hash,canonical_version=excluded.canonical_versionWHEREexcluded.updated_at>tickets.updated_atOR(excluded.updated_at=tickets.updated_atANDexcluded.hash>tickets.hash);
INSERTINTOtickets(record_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)ONCONFLICT(record_id)DOUPDATESETtype=excluded.type,parent_record_id=excluded.parent_record_id,title=excluded.title,description=excluded.description,status=excluded.status,priority=excluded.priority,assigned_to=excluded.assigned_to,team=excluded.team,decision_ref=excluded.decision_ref,updated_at=excluded.updated_at,deleted_at=excluded.deleted_at,hash=excluded.hash,canonical_version=excluded.canonical_versionWHEREexcluded.updated_at>tickets.updated_atOR(excluded.updated_at=tickets.updated_atANDexcluded.hash>tickets.hash);
INSERTINTOtickets(record_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.
Cancelled2026-06-12:discussionpremisefulfilled—testingapproachestablishedanddocumented(three-tierstrategy,Gauntlet-first,D-239harness);docdeliverablesliveoninT-215/T-216/T-217underT-1037.', 'cancelled', 'critical', NULL, NULL, NULL, '2026-02-1023:17:38', '2026-06-1210: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);
INSERTINTOtickets(record_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.
Cancelled2026-06-12:discussionpremisefulfilled—testingapproachestablishedanddocumented(three-tierstrategy,Gauntlet-first,D-239harness);docdeliverablesliveoninT-215/T-216/T-217underT-1037.', 'cancelled', 'critical', NULL, NULL, NULL, '2026-02-1023:17:38', '2026-06-1210: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);
INSERTINTOtickets(record_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.
Cancelled2026-06-12:pre-cascadeumbrella—test-infrachildrenre-homedundermaintenanceinitiativeT-1037;discussionchildT-64cancelled(testingapproachlongestablished).', 'cancelled', 'high', NULL, NULL, NULL, '2026-02-1023:14:31', '2026-06-1210: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);
INSERTINTOtickets(record_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.
Cancelled2026-06-12:pre-cascadeumbrella—test-infrachildrenre-homedundermaintenanceinitiativeT-1037;discussionchildT-64cancelled(testingapproachlongestablished).', 'cancelled', 'high', NULL, NULL, NULL, '2026-02-1023:14:31', '2026-06-1210: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);
INSERTINTOtickets(record_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.''
Hygienenote2026-06-12:titlesays''blocked''butnoblockeredgeexists,sothissurfacedinthe--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);
INSERTINTOtickets(record_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).
GatetriggerupdatedperD-166amendment(2026-06-12):Phase5rampsinparallelonceOUTSIDEgenerationproducesdeterministic,walkableexteriors—thegatethisticketholdsis''outsidesgeneratedeterministicallyandarewalkable''(validationpass:settlementslegible,walkable,named),not''allPhase-4polishcomplete''.Door-boundarycontractsandremainingPhase-4detailmaycontinuealongsideearlyPhase-5work.', 'backlog', 'medium', NULL, 'server', 'D-166', '2026-05-2217:42:34', '2026-06-1210: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);
INSERTINTOtickets(record_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)ONCONFLICT(record_id)DOUPDATESETtype=excluded.type,parent_record_id=excluded.parent_record_id,title=excluded.title,description=excluded.description,status=excluded.status,priority=excluded.priority,assigned_to=excluded.assigned_to,team=excluded.team,decision_ref=excluded.decision_ref,updated_at=excluded.updated_at,deleted_at=excluded.deleted_at,hash=excluded.hash,canonical_version=excluded.canonical_versionWHEREexcluded.updated_at>tickets.updated_atOR(excluded.updated_at=tickets.updated_atANDexcluded.hash>tickets.hash);
INSERTINTOtickets(record_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.
Acceptance:dispatchabodywithaFjordWall-regioncoastalplacementinaCorpTerritoryprovince->thegeneratedquarterusesRibbontopologyandCompanyTown-classlayout,notmesh+Commission.Parent:T-750.Refs:D-214,D-215,D-228,D-234,D-239§6;T-1022(predecessor),T-983,T-1014(adjacent,differentfields).', 'backlog', 'high', NULL, 'server', 'D-234', '2026-06-1210:23:49', '2026-06-1210: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);
INSERTINTOtickets(record_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)ONCONFLICT(record_id)DOUPDATESETtype=excluded.type,parent_record_id=excluded.parent_record_id,title=excluded.title,description=excluded.description,status=excluded.status,priority=excluded.priority,assigned_to=excluded.assigned_to,team=excluded.team,decision_ref=excluded.decision_ref,updated_at=excluded.updated_at,deleted_at=excluded.deleted_at,hash=excluded.hash,canonical_version=excluded.canonical_versionWHEREexcluded.updated_at>tickets.updated_atOR(excluded.updated_at=tickets.updated_atANDexcluded.hash>tickets.hash);
INSERTINTOtickets(record_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.
AddaT-1031-harnessbelievabilitycheck:ahas_active_channelchunkatanarbitrarylargeworldoffset(e.g.chunk_pos(1000,-750))containsin-channelvoxels;channelpositioniscontinuousacrossadjacentchunkpairs.Siblingbug:landform-64m-repeat(samefamily,oppositedirection—channelsappearnowhere,landformsappeareverywhere).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-1210:23:49', '2026-06-1210: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);
INSERTINTOtickets(record_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)ONCONFLICT(record_id)DOUPDATESETtype=excluded.type,parent_record_id=excluded.parent_record_id,title=excluded.title,description=excluded.description,status=excluded.status,priority=excluded.priority,assigned_to=excluded.assigned_to,team=excluded.team,decision_ref=excluded.decision_ref,updated_at=excluded.updated_at,deleted_at=excluded.deleted_at,hash=excluded.hash,canonical_version=excluded.canonical_versionWHEREexcluded.updated_at>tickets.updated_atOR(excluded.updated_at=tickets.updated_atANDexcluded.hash>tickets.hash);
INSERTINTOtickets(record_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.
Acceptance:T-1031harnesscross-regionchunkpairsshownoelevationstepexceedingthelithology-permittedslope(D-239§8)atregionborders;familyseamsremainsharp;determinismgolden-seedunchangedforchunksfarfromborders.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-1210:23:50', '2026-06-1210: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);
INSERTINTOtickets(record_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)ONCONFLICT(record_id)DOUPDATESETtype=excluded.type,parent_record_id=excluded.parent_record_id,title=excluded.title,description=excluded.description,status=excluded.status,priority=excluded.priority,assigned_to=excluded.assigned_to,team=excluded.team,decision_ref=excluded.decision_ref,updated_at=excluded.updated_at,deleted_at=excluded.deleted_at,hash=excluded.hash,canonical_version=excluded.canonical_versionWHEREexcluded.updated_at>tickets.updated_atOR(excluded.updated_at=tickets.updated_atANDexcluded.hash>tickets.hash);
INSERTINTOtickets(record_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.
Acceptance:adispatchedsettlementwith>=1neighborproduces>=1AccessKind::QuarterEdgenodeonthecorrectoctant;theBlockJunctionfallbackfiresonlyforgenuinelyisolatedsettlements.Parent:T-750.Blocked-by(soft):inter-settlement-transportticketforfullfidelity.Refs:D-234,D-213,D-204;T-990(consumer,done),T-1022(dispatch,done).', 'backlog', 'medium', NULL, 'server', 'D-234', '2026-06-1210:23:50', '2026-06-1210: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);
INSERTINTOtickets(record_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)ONCONFLICT(record_id)DOUPDATESETtype=excluded.type,parent_record_id=excluded.parent_record_id,title=excluded.title,description=excluded.description,status=excluded.status,priority=excluded.priority,assigned_to=excluded.assigned_to,team=excluded.team,decision_ref=excluded.decision_ref,updated_at=excluded.updated_at,deleted_at=excluded.deleted_at,hash=excluded.hash,canonical_version=excluded.canonical_versionWHEREexcluded.updated_at>tickets.updated_atOR(excluded.updated_at=tickets.updated_atANDexcluded.hash>tickets.hash);
INSERTINTOtickets(record_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.
@@ -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.
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.
> **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
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.
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.
> **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
> **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.
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.
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.
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.
> **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.
> **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
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
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.
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.
> **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
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)
> **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.
> **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.
> **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.
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.
- [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-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-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-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-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-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-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_
@@ -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_
### 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.
@@ -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.
@@ -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
- **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.
@@ -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:
- **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).
- **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.
- **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.
- **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.
- **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
- **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
- **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.
### 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).
@@ -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.
### 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.
- **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.
- **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)
- **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).
@@ -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.
### 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 50–500 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:** L1–L3 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.
### 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).
- **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?
- **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
- **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
- **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
- **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)*
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.