Files
settled-reach/.pql/changelog/tickets/2026-02.sql
T
jpmschweitzerandClaude Opus 4.8 5adf2b8bd7 migrate ticket changelog to record_id identity (D-26)
Rewrites the committed .pql/changelog/ from the old T-NNN-keyed format to
the record_id identity model (pql 1.10.0, D-26): tickets keyed by a ULID
record_id, the friendly T-NNN in ticket_idmap, references and hashes
recomputed. Produced by the one-off cmd/migrate-ids in the pql repo.

Other clones: install pql >= 1.10.0, then rm .pql/pql.db && pql plan
rebuild to regenerate the local DB from this changelog.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-10 09:29:34 +02:00

802 lines
675 KiB
SQL

INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRYE4QBA6MFDC74SE9C', 'initiative', NULL, 'Perception modes as character build', NULL, 'done', 'medium', NULL, NULL, 'D-017', '2026-02-09 15:21:44', '2026-02-09 15:21:44', NULL, '109d0773406f2d0c699535a9333a7d62', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_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', NULL, 'Art direction', NULL, 'backlog', 'medium', NULL, NULL, 'Q-003', '2026-02-09 15:21:44', '2026-02-09 15:21:44', NULL, '1d3ae0de6171f43704888cf25d986a35', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_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', NULL, 'Licensing/distribution', NULL, 'backlog', 'medium', NULL, NULL, 'Q-008', '2026-02-09 15:21:44', '2026-02-09 15:21:44', NULL, '23c6f843d5d766e74f13faa210b10996', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZMZPFX0V9EWH76620', 'initiative', NULL, 'Diegetic insert/POI navigation', NULL, 'done', 'medium', NULL, NULL, 'D-013', '2026-02-09 15:21:44', '2026-02-09 15:21:44', NULL, '2a9cb9703e638752190b3291f155ef86', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRYR26TCNM7J6Y38Q4R', 'initiative', NULL, 'Action pillar design principles', NULL, 'done', 'medium', NULL, NULL, 'D-008', '2026-02-09 15:21:44', '2026-02-09 15:21:44', NULL, '2f3a69c9b806ae4816a1f70e8ee6d6bf', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRW3ASVAZZNYN9M59AW', 'story', NULL, 'Target platforms', NULL, 'backlog', 'medium', NULL, NULL, 'Q-007', '2026-02-09 15:21:44', '2026-02-09 15:21:44', NULL, '2f3b1cc81f58110c11ad5e250e65767c', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_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', NULL, 'Storyteller AI design', NULL, 'backlog', 'medium', NULL, NULL, 'Q-010', '2026-02-09 15:21:44', '2026-02-09 15:21:44', NULL, '2f90ce6a8b9d2c7d67e21eae9f8888cc', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRX1Q73NZP7NHZJA2KW', 'initiative', NULL, 'Commonwealth as first campaign', NULL, 'done', 'medium', NULL, NULL, 'D-003', '2026-02-09 15:21:44', '2026-02-09 15:21:44', NULL, '35e238d90da08f56fb8f8685c0fe9928', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRXKF53T5AVEN21WTD0', 'initiative', NULL, 'Camera locked to character', NULL, 'done', 'medium', NULL, NULL, 'D-015', '2026-02-09 15:21:44', '2026-02-09 15:21:44', NULL, '43279ef3107fcfb4042ad692a050b44a', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRX2PH3S7S8AD7YZGGC', 'initiative', NULL, 'Three-range sound model', NULL, 'done', 'medium', NULL, NULL, 'D-018', '2026-02-09 15:21:44', '2026-02-09 15:21:44', NULL, '474bd052a87720e4206a95f2b4805de7', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZNXVG981JM13N3E8M', 'initiative', NULL, 'Chunk-based map architecture', NULL, 'done', 'medium', NULL, NULL, 'D-012', '2026-02-09 15:21:44', '2026-02-09 15:21:44', NULL, '517747e0c009c5b8c0cf60eebbe1e2e1', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZRPQRTEBRJZSJDT48', 'initiative', NULL, 'Multiplayer — design for it, build single-player first', NULL, 'done', 'medium', NULL, NULL, 'D-009', '2026-02-09 15:21:44', '2026-02-09 15:21:44', NULL, '57f5fbc28f4b07034eeae413870147d9', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRW66HSK49YE80AKZ8W', 'initiative', NULL, 'Five pillars of game design', NULL, 'done', 'medium', NULL, NULL, 'D-007', '2026-02-09 15:21:44', '2026-02-09 15:21:44', NULL, '7213b67a25c2e58ee9ef7857316edc17', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_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, 'backlog', 'medium', NULL, NULL, 'Q-004', '2026-02-09 15:21:44', '2026-02-09 15:21:44', NULL, '83bea60b4c5a8bb19a873adf78264aad', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZ66CZK5ZGX76V5N2C', 'initiative', NULL, 'v0.1 map specification', NULL, 'done', 'medium', NULL, NULL, 'D-014', '2026-02-09 15:21:44', '2026-02-09 15:21:44', NULL, '904eb834f7956e36e5a94ef21de248a0', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZWWS1V4YR17MGM3K4', 'initiative', NULL, 'Top-down with 3D cutscenes', NULL, 'done', 'medium', NULL, NULL, 'D-019', '2026-02-09 15:21:44', '2026-02-09 15:21:44', NULL, '9a104640dcd2990d8c63fc9d8d80b088', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRY57418KQ0DH9ZS3N8', 'initiative', NULL, 'Multiplayer-ready architectural baseline', NULL, 'done', 'medium', NULL, NULL, 'D-010', '2026-02-09 15:21:44', '2026-02-09 15:21:44', NULL, 'bf5375adfbce4fbbad19fba16e9709da', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRWZ141KXB35ZVE6QBW', 'initiative', NULL, 'Internal monologue system', NULL, 'done', 'medium', NULL, NULL, 'D-016', '2026-02-09 15:21:44', '2026-02-09 15:21:44', NULL, 'c7d72edb16c6240c8c399cd8f166df63', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZYTPACQCYNGVK5XSC', 'story', NULL, 'Prototype scale', NULL, 'backlog', 'medium', NULL, NULL, 'Q-005', '2026-02-09 15:21:44', '2026-02-09 15:21:44', NULL, 'd8750183fed5f679d1f214b1ff544e2b', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRWJYV3ZVY7D7G3P4FW', 'story', NULL, 'Character selection roster', NULL, 'backlog', 'medium', NULL, NULL, 'Q-011', '2026-02-09 15:21:44', '2026-02-09 15:21:44', NULL, 'd964d94400b1e60bbcf6d26c9fa85ef8', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRXHQ22JCSPGQARF3YW', 'initiative', NULL, 'Prototype scenario — Institute/Armstrong City/Guardians', NULL, 'done', 'medium', NULL, NULL, 'D-006', '2026-02-09 15:21:44', '2026-02-09 15:21:44', NULL, 'f321457872438b0ede41dd42842f4e02', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZ37HZ3E29H79HR3HM', 'initiative', NULL, 'Single character first-person story generator', NULL, 'done', 'medium', NULL, NULL, 'D-005', '2026-02-09 15:21:44', '2026-02-09 15:21:44', NULL, 'fbbe3d8e20fafee2605f41347d6f4725', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRXXEKGTNRJ7Z6FTDRM', 'initiative', NULL, 'Engine Architecture - Godot + Rust IPC', 'Implement D-020: Godot 4 client + Rust/bevy_ecs simulation via subprocess/IPC. MessagePack protocol, ObserverSnapshot pattern, deterministic simulation.', 'backlog', 'critical', NULL, NULL, 'D-020', '2026-02-10 23:14:11', '2026-02-10 23:14:11', NULL, '3382fde4b9afab271fccdcba57946411', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_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.', 'backlog', 'high', NULL, NULL, 'D-010, D-012, D-013, D-014', '2026-02-10 23:14:31', '2026-02-10 23:14:31', NULL, '65068704524232781cdf41ef5cf2f570', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_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.', 'backlog', 'high', NULL, NULL, NULL, '2026-02-10 23:14:31', '2026-02-10 23:14:31', NULL, '962eacc98d2aad535f09f4875f7bcdbe', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRYWW5RMQFT9VNSFSZW', 'initiative', NULL, 'Vertical Slice Content', 'Implement D-027: smuggler + detective playthrough, station district, workplace/bar/smuggling ring templates, 20-30 NPCs, 30-minute playable. The proof of concept.
[CANCELLED 2026-03-05] Superseded by Where''s the Fun? Workshop decisions. The workshop killed the detective/smuggler framing, named NPCs, and hand-built vertical slice approach in favour of a generator-first life sim with tycoon bookmark. See docs/workshops/wheres-the-fun/workshop-outcomes.md.', 'cancelled', 'critical', NULL, NULL, 'D-027', '2026-02-10 23:14:31', '2026-02-10 23:14:31', NULL, 'a406af36e87c0d3bb4b8c74df6603e15', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRWHG9VEEMG0B5Q2RFM', 'initiative', NULL, 'Core Simulation - NPCs & Tiers', 'Implement D-024 (NPC generation model with 10 axes), D-026 (simulation tiers with timestamp eviction). Foundation for all NPC behavior.', 'cancelled', 'critical', NULL, NULL, 'D-024, D-026', '2026-02-10 23:14:31', '2026-02-10 23:14:31', NULL, 'af527908cd889eddfa41125655e52ba1', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_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.', 'backlog', 'high', NULL, NULL, 'D-023, D-025, D-028, D-029', '2026-02-10 23:14:31', '2026-02-10 23:14:31', NULL, 'e5a0aaa5964ba3c94ee4b8966711c7ea', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRXAPVCJAZ0ZKGESCP4', 'initiative', NULL, 'Rendering & Perception System', 'Implement D-011 (fog of perception), D-015 (locked camera), D-016 (internal monologue), D-017 (perception modes), D-018 (3-range sound), D-019 (top-down rendering). Client-side observation systems.', 'backlog', 'critical', NULL, NULL, 'D-011, D-015, D-016, D-017, D-018, D-019', '2026-02-10 23:14:31', '2026-02-10 23:14:31', NULL, 'fd4f764c995e3aa7c8f507fe2411e413', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZG2K6AEST2W0ZVV3G', 'epic', '06FB0TNSRWHG9VEEMG0B5Q2RFM', 'NPC Behavior Systems', 'Daily routines, relationship dynamics, mood system, job performance. State machine ticks for Background tier, full behavior for Active tier.', 'cancelled', 'high', NULL, NULL, 'D-024, D-026', '2026-02-10 23:15:58', '2026-02-10 23:15:58', NULL, '00b8221b0cc46a8d50e78257e16d8a64', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRWABN2YJ0SNKRW9D7G', 'epic', '06FB0TNSRWHG9VEEMG0B5Q2RFM', 'Simulation Tier System', 'Four-tier NPC simulation: Active (full sim), Background (state machines), State-saved (frozen structs), Ungenerated. Timestamp-based LRU eviction, scope tags.', 'backlog', 'critical', NULL, NULL, 'D-026', '2026-02-10 23:15:58', '2026-02-10 23:15:58', NULL, '582b338f7b5337428c71f58df4643ff2', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRXF7E7101000E124X0', 'epic', '06FB0TNSRWHG9VEEMG0B5Q2RFM', 'Triangle Generation', 'Create 3-NPC conflicting interest clusters. Minimum 2 triangles per social site template, 1 cross-template triangle.
[CANCELLED 2026-03-05] Superseded by Where''s the Fun? Workshop decisions. The workshop killed the detective/smuggler framing, named NPCs, and hand-built vertical slice approach in favour of a generator-first life sim with tycoon bookmark. See docs/workshops/wheres-the-fun/workshop-outcomes.md.', 'cancelled', 'high', NULL, NULL, 'D-024', '2026-02-10 23:15:58', '2026-02-10 23:15:58', NULL, '66f9226aa66f6db217ff7c53cac42f84', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRYTX3A5XSWREQ03KQW', 'epic', '06FB0TNSRWHG9VEEMG0B5Q2RFM', 'NPC Data Model', 'Implement 10-axis NPC generation: Want, Secret, Relationships (3), Tolerance, Routine, Information inventory, Contentment, Personality traits, Tell system, Skill set. CombatCapability as optional component.', 'cancelled', 'critical', NULL, NULL, 'D-024', '2026-02-10 23:15:58', '2026-02-10 23:15:58', NULL, '6e7eb8b91e034235a511681a258a9fc1', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_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', '06FB0TNSRXAPVCJAZ0ZKGESCP4', '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-02-10 23:16:24', NULL, '21084f497505959c6c64064758771154', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_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', '06FB0TNSRXAPVCJAZ0ZKGESCP4', '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-02-10 23:16:24', NULL, '364ac82fc536c6456ef6e9055fbd9e89', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_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', '06FB0TNSRXAPVCJAZ0ZKGESCP4', '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-02-10 23:16:24', NULL, '875713cb8a404192f297c3c519e7e7ed', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_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', '06FB0TNSRXAPVCJAZ0ZKGESCP4', '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-02-10 23:16:24', NULL, '8a23860d81477a5d944765ab12bbb407', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_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', '06FB0TNSRXAPVCJAZ0ZKGESCP4', '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-02-10 23:16:24', NULL, 'bd66fd8127aab1f3aac08e5a578a832d', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_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', '06FB0TNSRXAPVCJAZ0ZKGESCP4', '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-02-10 23:16:24', NULL, 'd80284afc74d1c551a69ac769a7add36', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_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', '06FB0TNSRWXPRPS7G2MA786GR0', '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-02-10 23:16:38', NULL, '14ee16d10f44a38d8c27ddf399991454', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_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', '06FB0TNSRWXPRPS7G2MA786GR0', '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-02-10 23:16:38', NULL, '7868610405d378ddfe61ebf023efc394', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_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', '06FB0TNSRWXPRPS7G2MA786GR0', '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-02-10 23:16:38', NULL, 'ab903b70ac4f81f8bd97c48b74e6dbc3', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_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', '06FB0TNSRWXPRPS7G2MA786GR0', '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-02-10 23:16:38', NULL, 'dbe9ea8945527e4ffa9f899c92c21aac', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_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', '06FB0TNSRY3XYFKDGVPQR87JHM', '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-02-10 23:16:54', NULL, '228ad115b748ff5216a567fadb3d8283', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_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', '06FB0TNSRY3XYFKDGVPQR87JHM', '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-02-10 23:16:54', NULL, '43a2977032c15c5bc04a39e76ba3326a', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRW5FXRP4KGCC3CBMAW', 'epic', '06FB0TNSRY3XYFKDGVPQR87JHM', 'Social Site Template System', 'Functional cluster definition: 4-8 NPC roles, 15-40 tile spaces, sightline requirements. Single-ownership with reference links. Template → instance lifecycle.', 'backlog', 'high', NULL, NULL, 'D-025', '2026-02-10 23:16:54', '2026-02-10 23:16:54', NULL, '9073bd4219c3e31e526729714c0b2213', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRW1K4QJHAVSJF2ECSC', 'epic', '06FB0TNSRY3XYFKDGVPQR87JHM', 'Three-Tier Content Pipeline', 'Tier 1: Drama module pool system. Tier 2: Template instantiation engine. Tier 3: Procedural filler generation. Storyteller activation logic.', 'backlog', 'high', NULL, NULL, 'D-023', '2026-02-10 23:16:54', '2026-02-10 23:16:54', NULL, 'e470bcbadf20da00c7b5bae7595526b4', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRY449C3GAXT7PKDSY0', 'epic', '06FB0TNSRYWW5RMQFT9VNSFSZW', 'Vertical Slice Authoring', 'Write template content packs: role voice kits, situation scripts, monologue hooks, trait transformation guides. ~165-210 lines per template, 4x generation expansion.
[CANCELLED 2026-03-05] Superseded by Where''s the Fun? Workshop decisions. The workshop killed the detective/smuggler framing, named NPCs, and hand-built vertical slice approach in favour of a generator-first life sim with tycoon bookmark. See docs/workshops/wheres-the-fun/workshop-outcomes.md.', 'cancelled', 'high', NULL, NULL, 'D-027, D-028', '2026-02-10 23:17:09', '2026-02-10 23:17:09', NULL, '125147220d2feee23fe53fe549dcdb39', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRXTSZECBWTKBV2JYNG', 'epic', '06FB0TNSRYWW5RMQFT9VNSFSZW', 'Playable Characters - Smuggler & Detective', 'Two character builds with divergent starting knowledge, relationships, access permissions. Same templates, inverted perspectives.
[CANCELLED 2026-03-05] Superseded by Where''s the Fun? Workshop decisions. The workshop killed the detective/smuggler framing, named NPCs, and hand-built vertical slice approach in favour of a generator-first life sim with tycoon bookmark. See docs/workshops/wheres-the-fun/workshop-outcomes.md.', 'cancelled', 'critical', NULL, NULL, 'D-027', '2026-02-10 23:17:09', '2026-02-10 23:17:09', NULL, '396888705dfeb12b3e7791524030e40b', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRYSBCPK60TQ60MMRVM', 'epic', '06FB0TNSRYWW5RMQFT9VNSFSZW', 'Station District Content', 'Author three social site templates: workplace (logistics hub), social venue (bar), smuggling ring. Shared NPCs across templates, 20-30 total.
[CANCELLED 2026-03-05] Superseded by Where''s the Fun? Workshop decisions. The workshop killed the detective/smuggler framing, named NPCs, and hand-built vertical slice approach in favour of a generator-first life sim with tycoon bookmark. See docs/workshops/wheres-the-fun/workshop-outcomes.md.', 'cancelled', 'critical', NULL, NULL, 'D-027', '2026-02-10 23:17:09', '2026-02-10 23:17:09', NULL, '61164075087e54d31f40240fda1d8c1a', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRXNAK4ZXWVPC1BGDM0', 'epic', '06FB0TNSRYWW5RMQFT9VNSFSZW', 'Success Criteria Validation', 'Playtest and validate: (1) 30-min daily life runway, (2) fundamentally different playthroughs, (3) emotional NPC attachment, (4) emergent observation mechanics.
[CANCELLED 2026-03-05] Superseded by Where''s the Fun? Workshop decisions. The workshop killed the detective/smuggler framing, named NPCs, and hand-built vertical slice approach in favour of a generator-first life sim with tycoon bookmark. See docs/workshops/wheres-the-fun/workshop-outcomes.md.', 'cancelled', 'high', NULL, NULL, 'D-027', '2026-02-10 23:17:09', '2026-02-10 23:17:09', NULL, 'e4f958cdf1943e4c7199cd7ec760e7b8', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_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.', 'backlog', 'critical', NULL, NULL, NULL, '2026-02-10 23:17:38', '2026-02-10 23:17:38', NULL, '2ef033f2286327d2dbc3755c81f31115', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_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', '06FB0TNSRZK0EWD2NW4D2MGGV0', '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-02-10 23:17:38', NULL, '55ff27d87fdcd4d45048425d37a24363', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_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', '06FB0TNSRZK0EWD2NW4D2MGGV0', '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-02-10 23:17:38', NULL, '83db6460b8784af51df37eed1f53c9c6', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_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', '06FB0TNSRZK0EWD2NW4D2MGGV0', '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-02-10 23:17:38', NULL, '8e42241bba85fcd1212d29169d5938ad', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_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', '06FB0TNSRXJB2P833S5Y5AKG7C', '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-02-10 23:17:59', NULL, '6bf9197b86292742d389ed2ada5b9931', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_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', '06FB0TNSRWM2V22WHZ08ANKN10', '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-02-10 23:18:24', NULL, '648e39422bf4d31cd4a817bddfbd5a14', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRX8NA95Q916J8FQZ3G', 'story', '06FB0TNSRWABN2YJ0SNKRW9D7G', 'Ungenerated → instantiation', 'Lazy NPC generation. Template instantiation on-demand. Density follows player movement.', 'backlog', 'medium', NULL, NULL, NULL, '2026-02-10 23:19:08', '2026-02-10 23:19:08', NULL, 'b277df120992bc6bef6262054ba95cfb', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_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', '06FB0TNSRZG2K6AEST2W0ZVV3G', '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-02-10 23:19:21', NULL, '215596044b06cd68add377dd18a40caf', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRW99M5Z3KD8HM0VDT8', 'story', '06FB0TNSRZG2K6AEST2W0ZVV3G', 'Mood system', 'MoodState component. Mood affected by events, relationships, job satisfaction, contentment. Mood influences behavior.', 'backlog', 'medium', NULL, NULL, NULL, '2026-02-10 23:19:21', '2026-02-10 23:19:21', NULL, '23f83a0f44a1692606997c91f379fb2b', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZC34YN56K335PSQSW', 'story', '06FB0TNSRWCSXFAG1E4TS7HAB4', 'Multi-z-level LOS', 'LOS calculation across floors. Stairs, vertical sightlines. Deferred for post-v0.1 if too complex.', 'backlog', 'low', NULL, NULL, NULL, '2026-02-10 23:19:52', '2026-02-10 23:19:52', NULL, '30b65dd567781a3b07da27272cae9371', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZE3PS7W9HJ5HYM3CW', 'story', '06FB0TNSRY3PA3E31NAVQHR5GC', 'Camera rotation stub', 'Architecture for future facing-direction rotation. Disabled for v0.1. Fixed north-up orientation.', 'backlog', 'low', NULL, NULL, NULL, '2026-02-10 23:20:20', '2026-02-10 23:20:20', NULL, '04bad7b0b5145a1853e47a0241b28ecd', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_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', '06FB0TNSRWBH6313PF00570RGR', 'Unreliable narrator mechanics', 'Monologue can be wrong. Character misinterpretations. Knowledge-gated accuracy.', 'backlog', 'low', NULL, NULL, NULL, '2026-02-10 23:20:40', '2026-02-10 23:20:40', NULL, 'e469cf1d543512b4dc83e15f13f20083', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRW2M5QM7KK8QHMDZZ8', 'story', '06FB0TNSRZP5KQ8RHFQQZK1ZJ0', 'Sound propagation physics', 'Wall attenuation, distance falloff, z-level muffling. Realistic sound travel.', 'backlog', 'low', NULL, NULL, NULL, '2026-02-10 23:20:58', '2026-02-10 23:20:58', NULL, '5ae12912fefbc39bb1b829509f365f1e', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRY1F473Z02C6J5N52R', 'story', '06FB0TNSRZP5KQ8RHFQQZK1ZJ0', 'Long-range insert notifications', 'Insert alerts for distant events. Network-based, spoofable. Stretch goal for v0.1.', 'backlog', 'low', NULL, NULL, NULL, '2026-02-10 23:20:58', '2026-02-10 23:20:58', NULL, '704f2fea66ec260fe56891093840ced3', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRYBX3CZVDCXBVDEZWC', 'story', '06FB0TNSRW1VJS6GTSSYHK63F8', 'Lighting system', 'Ambient lighting, local light sources. Affects visibility and atmosphere. Basic implementation for v0.1.', 'backlog', 'medium', NULL, NULL, NULL, '2026-02-10 23:21:12', '2026-02-10 23:21:12', NULL, '403f75d020abc96d035b917fde844be2', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_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', '06FB0TNSRW1VJS6GTSSYHK63F8', '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-02-10 23:21:12', NULL, 'ad5a4218a0743a7470a598d377ff51cd', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRXZCYD147NSW07185W', 'story', '06FB0TNSRY8XYH2CGTVR0TJ7W8', 'Perception mode selector - client', 'UI for switching modes (future). Keybindings, mode indicators. Stub for v0.1.', 'backlog', 'low', NULL, NULL, NULL, '2026-02-10 23:21:23', '2026-02-10 23:21:23', NULL, '3396c0ee74c34eb56f234a0735a467e9', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRWT5KKAG0TTEP6W6JW', 'story', '06FB0TNSRY8XYH2CGTVR0TJ7W8', 'Observer query abstraction', 'Generic observer interface. Different perception modes as different query implementations. Foundation for D-017.', 'backlog', 'medium', NULL, NULL, NULL, '2026-02-10 23:21:23', '2026-02-10 23:21:23', NULL, '490527f472ed64dcb9c3e311ba789ffa', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_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', '06FB0TNSRY8XYH2CGTVR0TJ7W8', '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-02-10 23:21:23', NULL, '72ef37450e5aa5f497b923fbc4a645c3', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZHTMR06ZGGJBACEPW', 'story', '06FB0TNSRY8XYH2CGTVR0TJ7W8', 'Natural vision mode', 'Baseline perception. Full color, detail, identity. Blocked by walls. Default for all characters.', 'backlog', 'high', NULL, NULL, NULL, '2026-02-10 23:21:23', '2026-02-10 23:21:23', NULL, 'f5748ce2f8e4a4001edd6a2df9851c79', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRX6YBFFBGXKCT3TNGR', 'story', '06FB0TNSRXX5X1PDENVXC4DRJ4', 'Borderless expansion stub', 'Architecture supports infinite generation. Disabled for v0.1. Remove boundary check post-v0.1.', 'backlog', 'low', NULL, NULL, NULL, '2026-02-10 23:22:01', '2026-02-10 23:22:01', NULL, 'c830ab82e536e3f90b990749b270827b', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRWBVMBXY4QWCAQC4V4', 'story', '06FB0TNSRXX5X1PDENVXC4DRJ4', 'Chunk serialization', 'Save/load chunk state. Modified tiles, placed objects, NPC spawn points.', 'backlog', 'medium', NULL, NULL, NULL, '2026-02-10 23:22:01', '2026-02-10 23:22:01', NULL, 'f6660a25d07f5f41087092fb3cc57117', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_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', '06FB0TNSRXZK7C4X2DHQ6A0CKR', '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-02-10 23:22:17', NULL, 'e5ddfa627e77c964b4a71b4cd72ca1c1', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRWMGK6BB68HARCD500', 'story', '06FB0TNSRXZK7C4X2DHQ6A0CKR', 'POI manipulation mechanics', 'False POIs (traps), outdated locations, spoofed information. Trust/deception layer.', 'backlog', 'low', NULL, NULL, NULL, '2026-02-10 23:22:17', '2026-02-10 23:22:17', NULL, 'eed4c2d80e55366f66bf1111e0e8adc4', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRW6TM334VZPY7MEA04', 'story', '06FB0TNSRY5H0R4JCAJ6MY4X44', 'Procedural district filler', 'Generate connecting corridors, residential areas, commercial spaces around authored locations. Tier 3 content.', 'backlog', 'medium', NULL, NULL, NULL, '2026-02-10 23:22:44', '2026-02-10 23:22:44', NULL, '450f97bc2d81fb09426dbdd71484daaa', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRY9C4JS3NDEMS5QBXC', 'story', '06FB0TNSRW1K4QJHAVSJF2ECSC', 'Tier 3 procedural generator', 'Generate filler locations from templates. Ambient NPCs, basic interactions, systemic hooks for template colonization.', 'backlog', 'medium', NULL, NULL, NULL, '2026-02-10 23:23:54', '2026-02-10 23:23:54', NULL, '30dcacdf535fb91d9f9be1a9c42267bc', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRY8BRY0E3PH6JA2HAM', 'story', '06FB0TNSRW5FXRP4KGCC3CBMAW', 'Cross-template reference system', 'Create reference links between templates. Shared NPCs, relationship propagation, contamination paths.', 'backlog', 'medium', NULL, NULL, NULL, '2026-02-10 23:24:06', '2026-02-10 23:24:06', NULL, 'b2417883fb3f580e41b348709ef8a2c0', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_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', '06FB0TNSRXYZC8QDKK423KFSKC', '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-02-10 23:24:37', NULL, '89c20d2850151102328bfae8d4b8f573', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRX41XDJT97WT2WGYF4', 'story', '06FB0TNSRXNAK4ZXWVPC1BGDM0', 'Criterion 3: Emotional NPC attachment', 'Validate: after playthrough, player names an NPC they felt conflicted about. Emotional engagement test.
[CANCELLED 2026-03-05] Superseded by Where''s the Fun? Workshop decisions. Parent epic (#60 Success Criteria Validation) superseded — v0.1 vertical slice validation criteria no longer relevant.', 'cancelled', 'high', NULL, NULL, NULL, '2026-02-10 23:26:12', '2026-02-10 23:26:12', NULL, '271ebc6a8a9b769ade800e96a49d7c67', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZ6S38KWFEQ5Z88A0R', 'story', '06FB0TNSRXNAK4ZXWVPC1BGDM0', 'Criterion 1: 30-min daily life runway', 'Validate: player can spend 30 minutes in daily routine before intrigue contamination activates. Pacing test.
[CANCELLED 2026-03-05] Superseded by Where''s the Fun? Workshop decisions. Parent epic (#60 Success Criteria Validation) superseded — v0.1 vertical slice validation criteria no longer relevant.', 'cancelled', 'high', NULL, NULL, NULL, '2026-02-10 23:26:12', '2026-02-10 23:26:12', NULL, '316c1529e35b9d91e83a9b3a4ffd45c1', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRWXP4EQD9G89BT5AT4', 'story', '06FB0TNSRXNAK4ZXWVPC1BGDM0', 'Criterion 4: Emergent observation mechanics', 'Validate: observe→notice→follow→discover sequence emerges from systems, not scripts. Systemic gameplay test.
[CANCELLED 2026-03-05] Superseded by Where''s the Fun? Workshop decisions. Parent epic (#60 Success Criteria Validation) superseded — v0.1 vertical slice validation criteria no longer relevant.', 'cancelled', 'high', NULL, NULL, NULL, '2026-02-10 23:26:12', '2026-02-10 23:26:12', NULL, '4aafec6ae45ce580719fa4026e22e3c1', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRXJSB5YCBPVQNPH0DW', 'story', '06FB0TNSRXNAK4ZXWVPC1BGDM0', 'Criterion 2: Fundamentally different playthroughs', 'Validate: smuggler and detective playthroughs feel like different games. Same NPCs, inverted relationships, distinct experiences.
[CANCELLED 2026-03-05] Superseded by Where''s the Fun? Workshop decisions. Parent epic (#60 Success Criteria Validation) superseded — v0.1 vertical slice validation criteria no longer relevant.', 'cancelled', 'high', NULL, NULL, NULL, '2026-02-10 23:26:12', '2026-02-10 23:26:12', NULL, '943e1a0d4be9262a019fef00b7750d5e', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRX9Z23M8B4HBE8NBFW', 'story', '06FB0TNSRXNAK4ZXWVPC1BGDM0', 'Test plan creation - Hoshe', 'Define test scenarios for all four success criteria. Playthrough scripts, observation checklists, timing validation.
[CANCELLED 2026-03-05] Superseded by Where''s the Fun? Workshop decisions. Parent epic (#60 Success Criteria Validation) superseded — v0.1 vertical slice validation criteria no longer relevant.', 'cancelled', 'high', NULL, NULL, NULL, '2026-02-10 23:26:12', '2026-02-10 23:26:12', NULL, 'e7fa95238b6a3315a76682950e56ba38', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRXSS8VSSFTXK2MMWYM', 'story', '06FB0TNSRZ5AP28E96W00KB0R4', 'Behavior validation framework', 'Scenario setup, behavior triggers, outcome assertions. NPC routine tests, perception tests, tier transition tests.', 'backlog', 'medium', NULL, NULL, NULL, '2026-02-10 23:26:24', '2026-02-10 23:26:24', NULL, '5065ab5456b9f38f68c651ad399642c7', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRYECTS3BJ7SFB3PQEM', 'story', '06FB0TNSRZ5AP28E96W00KB0R4', 'ECS state inspection', 'Query world state from tests. Component dumps, entity listings. Assert on simulation state.', 'backlog', 'high', NULL, NULL, NULL, '2026-02-10 23:26:24', '2026-02-10 23:26:24', NULL, 'a71f8fc1f371f32eeae9da8e7a7c5faf', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZ574ASEZK4XSA2T98', 'story', '06FB0TNSRZ5AP28E96W00KB0R4', 'Performance benchmarks', 'Tick performance, eviction performance, reactivation performance. Track regressions. Budget enforcement.', 'backlog', 'medium', NULL, NULL, NULL, '2026-02-10 23:26:24', '2026-02-10 23:26:24', NULL, 'c361d64882860bbdfeba509f58986864', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRYY87TPWA8ZGTH4Q30', 'story', '06FB0TNSRYDYTDC36V3EPDD7VR', 'Input simulation', 'Programmatic input injection. Simulate keypresses, mouse movement, actions. UI interaction tests.', 'backlog', 'medium', NULL, NULL, NULL, '2026-02-10 23:26:33', '2026-02-10 23:26:33', NULL, '04b8de1f8c4d4455da7b9d876645928f', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZVMHN7RT1SJEZGXZ4', 'story', '06FB0TNSRYDYTDC36V3EPDD7VR', 'UI validation framework', 'HUD element tests, dialogue display, minimap correctness. UI component testing.', 'backlog', 'medium', NULL, NULL, NULL, '2026-02-10 23:26:33', '2026-02-10 23:26:33', NULL, 'd51bc1866d3a67f51f5f0ec695e45686', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRXVSRVJA059457TY2M', 'story', '06FB0TNSRYDYTDC36V3EPDD7VR', 'Rendering verification', 'Screenshot comparison, fog state validation, sprite positioning. Visual regression tests.', 'backlog', 'medium', NULL, NULL, NULL, '2026-02-10 23:26:33', '2026-02-10 23:26:33', NULL, 'f635ae46502fec45d3afafe06394f287', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZWWT4328GNX2H2AC4', 'story', '06FB0TNSRWYX9HMVEXES6GHXPW', 'Full playthrough automation', 'Scripted playthrough sequences. End-to-end scenario tests. Regression detection.', 'backlog', 'medium', NULL, NULL, NULL, '2026-02-10 23:26:53', '2026-02-10 23:26:53', NULL, '37f47c1d40ebdf2665f784c074f78bef', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRYMCDE7C4CGJPYZ1XG', 'story', '06FB0TNSRWYX9HMVEXES6GHXPW', 'Sync verification tests', 'Client-server state consistency. Desync detection. Recovery validation.', 'backlog', 'high', NULL, NULL, NULL, '2026-02-10 23:26:53', '2026-02-10 23:26:53', NULL, '4491384941b6dcf26f8052d18fb79d55', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZHFXK8GVWR87TNWFC', 'story', '06FB0TNSRWYX9HMVEXES6GHXPW', 'IPC protocol tests', 'Verify MessagePack serialization/deserialization. Protocol versioning. Message framing correctness.', 'backlog', 'high', NULL, NULL, NULL, '2026-02-10 23:26:53', '2026-02-10 23:26:53', NULL, 'b3833550248fdd0b59fb2ac5b1accb49', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRYZM6DQ7STASHYS0PC', 'story', '06FB0TNSRWYX9HMVEXES6GHXPW', 'Performance profiling', 'IPC latency measurement, serialization overhead, tick budget enforcement. Cross-boundary profiling.', 'backlog', 'low', NULL, NULL, NULL, '2026-02-10 23:26:53', '2026-02-10 23:26:53', NULL, 'b9d6b74da5debcc7d9bba2589b50e9ad', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_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', '06FB0TNSRXG2Z9ZAR42SQ9GNP4', '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-02-10 23:27:10', NULL, '3951c252f05c5623baba91db42d0a7d8', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZHTCRQY5G1J8SEGXM', 'story', '06FB0TNSRXG2Z9ZAR42SQ9GNP4', 'Tooling requirements spec', 'Define required tooling: test runners, assertion libraries, mocking frameworks. Installation/setup docs.', 'backlog', 'high', NULL, NULL, NULL, '2026-02-10 23:27:10', '2026-02-10 23:27:10', NULL, 'a202234447b4646dc95684ff6e00c3ec', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_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.', 'backlog', 'critical', NULL, NULL, NULL, '2026-02-10 23:27:10', '2026-02-10 23:27:10', NULL, 'bce145c0a9f322ab03ae71905a0af8dc', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRXJ0QD32XB44NESXDW', 'story', '06FB0TNSRXG2Z9ZAR42SQ9GNP4', 'Testing pattern documentation', 'Document agreed patterns. Test organization conventions, naming, structure. Developer guide.', 'backlog', 'high', NULL, NULL, NULL, '2026-02-10 23:27:10', '2026-02-10 23:27:10', NULL, 'f2845bf591eefbada4832f5abc0129b0', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRXBWHEHRPCWWWNAN7R', 'story', '06FB0TNSRZ5AP28E96W00KB0R4', 'Deterministic replay system', 'Record input sequences, replay exactly. Verify identical outcomes. Debugging tool.', 'backlog', 'critical', NULL, NULL, NULL, '2026-02-10 23:26:24', '2026-02-11 00:00:22', NULL, 'dec282fba3891bf0288c6148d33800c2', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_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', '06FB0TNSRWHG9VEEMG0B5Q2RFM', '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-02-11 00:00:57', NULL, 'd02bff699d26bb50dcf71d21957955df', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_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', '06FB0TNSRXAPVCJAZ0ZKGESCP4', '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-02-11 00:01:05', NULL, 'e11059657aed5697bc761f050c5a8451', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_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', '06FB0TNSRXXEKGTNRJ7Z6FTDRM', '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-02-11 00:01:13', NULL, '0065dc2b52e63496ef62c6b9f9aabebf', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRWGG7YH7S5QJHJTZWC', 'story', '06FB0TNSRZ202MPMFH0EDH2BT4', 'Wait/time-skip mechanic', 'Player can wait in place, advancing game time at accelerated rate. Useful for staking out locations and waiting for NPC schedule changes. Deferred observation verb — lower priority than follow/examine. Source: Gestalt R2 M-1.', 'backlog', 'medium', NULL, NULL, NULL, '2026-02-11 00:02:14', '2026-02-11 00:02:14', NULL, '790cc4fe4fc85dd4eda6592f10b53e9b', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRW08ECPF1C1XP18HV8', 'story', '06FB0TNSRXNAK4ZXWVPC1BGDM0', 'Playtest protocol definition', 'Structured form for D-027 success criteria evaluation. Who tests, how, what feedback is captured. Defines done for v0.1 beyond the four success criteria. Source: Hoshe R1 M-11.
[CANCELLED 2026-03-05] Superseded by Where''s the Fun? Workshop decisions. Parent epic (#60 Success Criteria Validation) superseded — v0.1 vertical slice validation criteria no longer relevant.', 'cancelled', 'medium', NULL, NULL, NULL, '2026-02-11 00:04:33', '2026-02-11 00:04:33', NULL, '425ce9421f8098367298db5fc712277a', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRXW8MCGTFXZY0QRFQR', 'story', '06FB0TNSRXNAK4ZXWVPC1BGDM0', 'Same-character-different-seed validation test', 'Automated test: compare two smuggler playthroughs with different seeds. If not measurably different, seed variation has failed. Validates #178 seed-based variation. Source: Nigel R2 M-10.
[CANCELLED 2026-03-05] Superseded by Where''s the Fun? Workshop decisions. Parent epic (#60 Success Criteria Validation) superseded — v0.1 vertical slice validation criteria no longer relevant.', 'cancelled', 'medium', NULL, NULL, NULL, '2026-02-11 00:04:33', '2026-02-11 00:04:33', NULL, '469667756953cdae4dd18c9b74d2376d', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZ9G57M6E9NCW6RZY4', 'story', '06FB0TNSRXNAK4ZXWVPC1BGDM0', 'Demo scenario specification', '2-minute showcase scenario design. The split-screen demo moment: same world, two characters, different realities. Defines what to show to sell the concept. Source: Ozzie R1+R2 M-8.
[CANCELLED 2026-03-05] Superseded by Where''s the Fun? Workshop decisions. Parent epic (#60 Success Criteria Validation) superseded — v0.1 vertical slice validation criteria no longer relevant.', 'cancelled', 'medium', NULL, NULL, NULL, '2026-02-11 00:04:33', '2026-02-11 00:04:33', NULL, '60b53acf1d984cc39f170e03365cfec9', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZH0DF5S7XD7NZSQSW', 'story', '06FB0TNSRXYZC8QDKK423KFSKC', 'False positive NPC design', 'Unentangled NPCs with suspicious-looking-but-innocent routines. Essential anti-metagaming. Player who learned late-night meetings = suspicious gets burned when its just a romance in another seed. Source: Nigel R1+R2 M-9, endorsed by Gestalt.', 'cancelled', 'medium', NULL, NULL, NULL, '2026-02-11 00:04:39', '2026-02-11 00:04:39', NULL, 'c9078383cac7e05e26fb56f160e3e633', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRY5PJH0XRB4Z92JBER', 'story', '06FB0TNSRXG2Z9ZAR42SQ9GNP4', 'Test output formatter CLI', 'Normalize cargo-nextest and gdUnit4 output into consistent JSON schema (suite, total, passed, failed, failures array). Low priority — gdUnit4 already outputs JSON natively. Source: Hoshe R1 T-3.', 'backlog', 'low', NULL, NULL, NULL, '2026-02-11 00:05:00', '2026-02-11 00:05:00', NULL, '8585acb0f63165fd10088bf4dce626e7', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRW5HRT9RBE83RCWE5C', 'epic', '06FB0TNSRWZNZ49DCD27WSHFY4', 'Server Boilerplate (Rust/bevy_ecs)', 'Initialize the Rust simulation server: Cargo project, module structure, core ECS types, plugin scaffolding, deterministic simulation resources, and test infrastructure. Must pass make ci-server when complete.', 'done', 'critical', 'dudley', NULL, 'D-020', '2026-02-11 11:56:08', '2026-02-11 15:53:06', NULL, '3ebd90b8788d6a0c77aef870b445489c', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZ9C8JGMTQEMW0BDK4', 'story', '06FB0TNSRW5HRT9RBE83RCWE5C', 'Set up server test infrastructure', 'Configure test infrastructure per D-030: Hybrid approach with #[cfg(test)] unit tests inside modules + tests/ directory for integration tests. Set up cargo-nextest as test runner. Create test utilities module with ECS World builders for common test scenarios. Ensure JSON summary output format. Create first smoke test that builds the App with all plugins and runs one tick.', 'done', 'high', 'dudley', NULL, 'D-030', '2026-02-11 11:57:03', '2026-02-11 15:53:06', NULL, '426ed963daa16296d7257de0be1edc25', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZWAA5NQ018FNZYRC8', 'story', '06FB0TNSRW5HRT9RBE83RCWE5C', 'Create CauseChain component stub', 'Implement the CauseChain component as a production ECS component (not test-only, per D-030 sub-decision 4). CauseChain tracks information provenance: how did this NPC learn X? What caused this monologue line? Used for monologue provenance, journal entries, debugging, and test verification. Stub with basic chain operations (push cause, query chain, serialize).', 'done', 'high', 'dudley', NULL, 'D-030', '2026-02-11 11:56:55', '2026-02-11 15:53:06', NULL, '4b98e938717ab5f0f644ac71ab77fb18', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZ6WV83NK878SJ112C', 'task', '06FB0TNSRW5HRT9RBE83RCWE5C', 'Verify make ci-server passes', 'Final verification: run make ci-server (lint-server → build-server → test-server) and confirm green. This is the definition of done for the server boilerplate epic. Fix any issues found.', 'done', 'high', 'dudley', NULL, NULL, '2026-02-11 11:57:07', '2026-02-11 15:53:06', NULL, '9763a33d833f78e4136221887888a034', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRYBKPRMXG9H6J42G6C', 'story', '06FB0TNSRW5HRT9RBE83RCWE5C', 'Initialize Cargo project with dependencies', 'Create server/Cargo.toml with workspace setup. Dependencies: bevy_ecs (standalone, no renderer), serde + serde_derive, rmp-serde (MessagePack for client communication per D-020), bincode (reserved for future server-to-server sync). Dev dependencies: cargo-nextest. Set up src/main.rs and src/lib.rs entry points.', 'done', 'high', 'dudley', NULL, 'D-020', '2026-02-11 11:56:32', '2026-02-11 15:53:06', NULL, '9c78174d904d76946f8c734d0edbe946', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZZBD9K2C6YKYCBFHM', 'story', '06FB0TNSRW5HRT9RBE83RCWE5C', 'Set up ECS plugin scaffolding', 'Create bevy_ecs App with plugin architecture. Define plugins: SimulationPlugin (tick loop, core systems), PerceptionPlugin (observer queries), BridgePlugin (communication layer), InputPlugin (input processing), TimePlugin (SimulationTime management per D-031). Each plugin registers its systems and resources. App should build and run (empty tick loop) as a standalone binary.', 'done', 'high', 'dudley', NULL, 'D-020', '2026-02-11 11:56:46', '2026-02-11 15:53:06', NULL, 'b20ff4b47c2b582a12a49b093e601e33', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZCWM4GRE42EYESZ2R', 'story', '06FB0TNSRW5HRT9RBE83RCWE5C', 'Set up deterministic simulation resources', 'Implement injectable resources required by D-010 principle 4 and D-030 sub-decision 7 (CRITICAL): SimulationTime (tick counter, game-time conversion at 10 ticks/game-minute per D-031), SimRng (seeded RNG, reproducible sequences), InputQueue (timestamped PlayerInput buffer). These resources are the ONLY sources of time, randomness, and input for the simulation. Tests inject controlled versions for deterministic replay.', 'done', 'critical', 'dudley', NULL, 'D-010', '2026-02-11 11:56:52', '2026-02-11 15:53:06', NULL, 'e008a46f6584f64aca7d1597ac2e4765', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRWT2BHBKW7GRJXNKJW', 'story', '06FB0TNSRW5HRT9RBE83RCWE5C', 'Create server module structure', 'Create Rust module hierarchy: simulation (tick loop, systems), perception (observer queries, information boundaries), bridge (SimBridge trait, LocalBridge, NetworkBridge stubs), input (PlayerInput types, InputQueue), time (SimulationTime, day phases per D-031), storyteller (placeholder module). Each module gets a mod.rs with public API stubs.', 'done', 'high', 'dudley', NULL, 'D-020', '2026-02-11 11:56:37', '2026-02-11 15:53:06', NULL, 'edbf3dd7a88311d6fffe4ed1e70b03f3', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRYHDWF64TNWNKHAE5C', 'story', '06FB0TNSRW5HRT9RBE83RCWE5C', 'Define core types (ObserverSnapshot, PlayerInput, SimBridge)', 'Define the three key types that cross the client-server boundary (D-020): ObserverSnapshot (visible entities, fog state, sound events, monologue triggers, HUD widget data — variable shape per character build), PlayerInput (semantic actions: MoveNorth, Interact, UsePerceptionMode — timestamped for deterministic processing), SimBridge trait (abstracts transport, implemented by LocalBridge and NetworkBridge). All types derive Serialize/Deserialize.', 'done', 'high', 'dudley', NULL, 'D-020', '2026-02-11 11:56:44', '2026-02-11 15:53:06', NULL, 'f180c2f3d5d000fb1017d580ce63e147', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZ24VYMKPS9R10YECC', 'story', '06FB0TNSRW5HRT9RBE83RCWE5C', 'Create simulation tier type stubs', 'Define the four simulation tier types per D-026: Active (full ECS simulation), Background (state machine with 4 machines: schedule, mood, relationships, job), StateSaved (frozen serialized struct ~1-2KB), Ungenerated (marker). Create tier component and transition interface stubs. Include scope tag types (neighborhood, active-quest, colleague, known-contact) for eviction priority.', 'done', 'medium', 'dudley', NULL, 'D-026', '2026-02-11 11:56:59', '2026-02-11 15:53:06', NULL, 'fb144ca25bf80a29815edababebbe4c1', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRWH3D8W16MF8SB19E0', 'story', '06FB0TNSRZYBPYGFMWCGJ5W004', 'Create UI shell stubs (HUD, minimap, monologue display)', 'Create UI CanvasLayer with stub scenes: HUD (health, perception mode indicator, time display per D-031), minimap (placeholder), internal monologue display (text panel for monologue lines per D-015). All UI elements are data-driven from ObserverSnapshot HUD widget data. Variable shape supports perception mode customization (D-017). Shell only — no logic.', 'done', 'medium', 'stig', NULL, 'D-020', '2026-02-11 11:57:43', '2026-02-11 17:37:55', NULL, '098b8e32ee8fcd4c6849b3faf5cd1c94', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZYBPYGFMWCGJ5W004', 'epic', '06FB0TNSRWZNZ49DCD27WSHFY4', 'Client Boilerplate (Godot 4)', 'Initialize the Godot 4 client: project.godot, directory structure, autoloads, main scene, SimBridge stub, input system, rendering stubs, UI shell, and test infrastructure. Must pass make ci-client when complete.', 'done', 'critical', 'stig', NULL, 'D-020', '2026-02-11 11:56:22', '2026-02-11 17:37:55', NULL, '0a4e4ce755e5b6f8748410faea483e55', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZPS3AKHBTJQ3V7VVM', 'story', '06FB0TNSRZYBPYGFMWCGJ5W004', 'Create input system stub (semantic PlayerInput)', 'Implement InputMapper autoload: maps Godot InputEvents to semantic PlayerInput actions (MoveNorth/South/East/West, Interact, UsePerceptionMode, OpenMenu, etc.). Actions are timestamped per D-010 principle 4. Input is captured and queued, sent to SimBridge each frame. No raw key codes cross the bridge — only semantic actions.', 'done', 'high', 'stig', NULL, 'D-010', '2026-02-11 11:57:38', '2026-02-11 17:37:55', NULL, '2af356d1cf539db4633b34c45ad62b4f', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRXSR76QBJBBXKVGCQM', 'epic', '06FB0TNSRXXEKGTNRJ7Z6FTDRM', 'Godot Client Foundation', 'Pure rendering client in Godot 4/GDScript. Receives ObserverSnapshot, renders tiles/sprites/fog, captures input. No game logic.', 'done', 'critical', NULL, NULL, 'D-020', '2026-02-10 23:15:13', '2026-02-11 17:37:55', NULL, '357f3a0395f61a068ee9ee2c19c2dbf5', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRXJB2P833S5Y5AKG7C', 'epic', '06FB0TNSRXXEKGTNRJ7Z6FTDRM', 'Rust Simulation Server Foundation', 'Standalone Rust binary with bevy_ecs. No Godot dependencies. Basic ECS world, entity management, deterministic tick system.', 'done', 'critical', NULL, NULL, 'D-020', '2026-02-10 23:15:13', '2026-02-11 17:37:55', NULL, '5186cb8b21581f22690199d9d9fd25a6', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRW7DARQ2FGBQ8V57TR', 'story', '06FB0TNSRZYBPYGFMWCGJ5W004', 'Implement SimBridge client stub (MessagePack)', 'Implement the client-side SimBridge autoload: connect to Rust simulation process via MessagePack over local socket (D-020). Stub methods: connect(), disconnect(), send_input(PlayerInput), poll_snapshot() -> ObserverSnapshot. Use hardcoded test data initially — actual connection to Rust binary comes later. Include connection state management (disconnected, connecting, connected, error).', 'done', 'high', 'stig', NULL, 'D-020', '2026-02-11 11:57:36', '2026-02-11 17:37:55', NULL, '5c2f401c79c879fea6636201de29fd5b', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZSC7XH375RCF6JSA4', 'task', '06FB0TNSRZYBPYGFMWCGJ5W004', 'Verify make ci-client passes', 'Final verification: run make ci-client (lint-client → build-client → test-client) and confirm green. This is the definition of done for the client boilerplate epic. Fix any issues found.', 'done', 'high', 'stig', NULL, NULL, '2026-02-11 11:57:49', '2026-02-11 17:37:55', NULL, '7be2a2ea7ed76f93786736d29b80e2ce', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRW84SNCN1W6BT826T8', 'story', '06FB0TNSRZYBPYGFMWCGJ5W004', 'Create client directory structure', 'Set up Godot project directories: scenes/ (game scenes), scripts/ (GDScript files organized by system), assets/ (sprites, tilesets, audio — placeholder), ui/ (UI scenes and scripts), tests/ (gdUnit4 test files). Follow Godot conventions for autoload, resource, and scene organization.', 'done', 'high', 'stig', NULL, 'D-020', '2026-02-11 11:57:24', '2026-02-11 17:37:55', NULL, 'a2713b4d3de95a23887e9f67f971ecc6', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZAFRA488HZTV136E4', 'story', '06FB0TNSRZYBPYGFMWCGJ5W004', 'Set up gdUnit4 test infrastructure', 'Install and configure gdUnit4 test framework per D-030 sub-decision 2. Set up test directory structure, configure headless test runner (GdUnitCmdTool), create first smoke test (main scene loads without errors). Ensure JSON summary output format. Configure GdUnitSceneRunner for scene lifecycle tests.', 'done', 'high', 'stig', NULL, 'D-030', '2026-02-11 11:57:46', '2026-02-11 17:37:55', NULL, 'accac8b434f35952ee1984db68ae30f7', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZ48Y7EA9MAR421BP8', 'story', '06FB0TNSRZYBPYGFMWCGJ5W004', 'Create rendering stubs (TileMap, fog overlay, entity sprites)', 'Set up rendering infrastructure: TileMap node for world tiles (placeholder tileset), fog-of-war overlay (shader or TileMap layer — implements visual side of perception system D-011), entity sprite nodes (positioned from ObserverSnapshot data). All rendering is driven by snapshot data — no game logic. Placeholder art is fine.', 'done', 'medium', 'stig', NULL, 'D-020', '2026-02-11 11:57:41', '2026-02-11 17:37:55', NULL, 'ba848212bb1e89bf9e362bb7c2a5587b', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRXBZDRDC9H0V1M5MNC', 'story', '06FB0TNSRZYBPYGFMWCGJ5W004', 'Initialize Godot 4 project with project.godot', 'Create client/project.godot with project settings. Set up GDScript as primary language. Configure project name, window size, rendering settings for 2D top-down. Set minimum Godot version. Create .gdignore for build artifacts.', 'done', 'high', 'stig', NULL, 'D-020', '2026-02-11 11:57:20', '2026-02-11 17:37:55', NULL, 'c451a5efbbfab0081bd4db0ad7bad45f', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZ0XJ23S46R3R8P094', 'story', '06FB0TNSRZYBPYGFMWCGJ5W004', 'Create main scene tree structure', 'Build the main scene (main.tscn) with the core node hierarchy: root Game node, World node (holds TileMap, entities, fog), Camera2D (locked to player per D-016), UILayer (CanvasLayer for HUD elements), AudioManager node. Scene should load and display an empty world without errors.', 'done', 'high', 'stig', NULL, 'D-020', '2026-02-11 11:57:31', '2026-02-11 17:37:55', NULL, 'c87d43103a2aad42870b29bbf67abd5b', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRWZNZ49DCD27WSHFY4', 'initiative', NULL, 'Boilerplate Code Organization', 'Set up foundational project scaffolding for client (Godot 4) and server (Rust/bevy_ecs). Blocks all vertical slice implementation (D-027). Both client/ and server/ directories are currently empty — this initiative establishes the build targets, module structure, core type stubs, and test infrastructure that all subsequent work depends on.', 'done', 'critical', NULL, NULL, 'D-020', '2026-02-11 11:55:51', '2026-02-11 17:37:55', NULL, 'cebd89c6cec597a843c60bee95b6d8b4', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRY17BS5Z42PFE30BBG', 'story', NULL, 'Game engine selection', NULL, 'done', 'critical', NULL, NULL, 'Q-001', '2026-02-09 15:21:44', '2026-02-11 17:37:55', NULL, 'dd5ab92c8686d4597438ec242e12c905', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZ7F0P0Z308TJX38GM', 'story', '06FB0TNSRZYBPYGFMWCGJ5W004', 'Set up autoloads (SimBridge, GameState, InputMapper)', 'Create and register Godot autoload singletons: SimBridge (client-side bridge to Rust simulation — manages connection, sends PlayerInput, receives ObserverSnapshot), GameState (client-side game state derived from snapshots), InputMapper (maps raw input events to semantic PlayerInput actions per D-020). Register in project.godot.', 'done', 'high', 'stig', NULL, 'D-020', '2026-02-11 11:57:26', '2026-02-11 17:37:55', NULL, 'dd80414874ac9343daeeda5db492ef62', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZ72GYACJEAEG3KZX8', 'story', '06FB0TNSRXJB2P833S5Y5AKG7C', 'Basic entity components', 'Position, Facing, EntityType, ObserverId. Foundation components for all entities.', 'done', 'critical', NULL, NULL, NULL, '2026-02-10 23:17:59', '2026-02-11 17:38:01', NULL, '487a0278935c8bdb3b7de1450cc12e57', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRWA41R5Z38919Z6KS8', 'task', '06FB0TNSRXYQQGWEE902DGTE7W', 'Create simulation/ directory structure', 'mkdir -p simulation/src, simulation/tests. Create subdirs: core, ecs, protocol, io.', 'done', 'critical', 'Tyre', NULL, NULL, '2026-02-10 23:27:28', '2026-02-11 17:38:01', NULL, '51d8ce2924caaa758706fc647da6b785', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRXCDAP009GGTQQ30F4', 'task', '06FB0TNSRZHQSYJ6K0HS9HHY5M', 'Initialize Godot 4 project', 'project.godot file. Configure renderer, window settings, input map.', 'done', 'critical', 'Stig', NULL, NULL, '2026-02-10 23:27:37', '2026-02-11 17:38:01', NULL, '60ebfad464207f9bc546c79606f20383', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZHQSYJ6K0HS9HHY5M', 'story', '06FB0TNSRXSR76QBJBBXKVGCQM', 'Godot project initialization', 'Create client/ directory with Godot 4 project. Scene structure, basic camera setup.', 'done', 'critical', NULL, NULL, NULL, '2026-02-10 23:18:12', '2026-02-11 17:38:01', NULL, '749a907841ba74aae69f0bf353f18ca7', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRYY5KK30YQGFETTYC0', 'story', '06FB0TNSRXJB2P833S5Y5AKG7C', 'ECS world initialization', 'Basic World setup, resource management, entity spawning/despawning infrastructure.', 'done', 'critical', NULL, NULL, NULL, '2026-02-10 23:17:59', '2026-02-11 17:38:01', NULL, '7812f1b5bbc33c10a5606d4ec4ffc255', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRW8RMXFSDGTB4E246M', 'task', '06FB0TNSRZHQSYJ6K0HS9HHY5M', 'Set up project settings', 'Display settings, physics tick rate, input dead zones. Project configuration.', 'done', 'high', 'Stig', NULL, NULL, '2026-02-10 23:27:37', '2026-02-11 17:38:01', NULL, '80209350cac7a68c621e357b70ab79cb', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZ3F20W65TT0PF3WKR', 'task', '06FB0TNSRXYQQGWEE902DGTE7W', 'Configure project metadata', 'Set name, version, authors. Configure build options, target.', 'done', 'critical', 'Tyre', NULL, NULL, '2026-02-10 23:27:28', '2026-02-11 17:38:01', NULL, '8962cb5e2b1f3058082ecadd9ad876dc', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRWQ38WJQ0XA1G9T93C', 'task', '06FB0TNSRXYQQGWEE902DGTE7W', 'Set up CI placeholder', '.github/workflows or .gitignore for build artifacts. Prepare for future CI.', 'done', 'low', 'Tyre', NULL, NULL, '2026-02-10 23:27:28', '2026-02-11 17:38:01', NULL, '9dd20fa43146aeca8bd42e200b2947d5', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRWWX0JTJ7EC759HAM0', 'task', '06FB0TNSRXYQQGWEE902DGTE7W', 'Create main.rs entry point', 'Basic main() function. Logging setup. Argument parsing stub.', 'done', 'critical', 'Tyre', NULL, NULL, '2026-02-10 23:27:28', '2026-02-11 17:38:01', NULL, 'a52b81a1af807dcca3147bd76c7f66e7', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRXYQQGWEE902DGTE7W', 'story', '06FB0TNSRXJB2P833S5Y5AKG7C', 'Project structure setup', 'Create simulation/ directory with Cargo workspace. Set up bevy_ecs dependency, basic project structure.', 'done', 'critical', NULL, NULL, NULL, '2026-02-10 23:17:59', '2026-02-11 17:38:01', NULL, 'ae5f3c5ab0fcb4e45484e91ec733abc5', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZ4CFV6J7GHPWCRY4W', 'task', '06FB0TNSRXYQQGWEE902DGTE7W', 'Initialize Cargo workspace', 'Cargo.toml with workspace members. Set edition, dependencies: bevy_ecs, serde, rmp-serde.', 'done', 'critical', 'Tyre', NULL, NULL, '2026-02-10 23:27:28', '2026-02-11 17:38:01', NULL, 'b7b95208a3df8518a951010372a9c693', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRYHVHGBPAWHAVNQKVG', 'task', '06FB0TNSRZHQSYJ6K0HS9HHY5M', 'Configure camera settings', 'Camera2D with custom_viewport. Zoom levels, smoothing disabled initially.', 'done', 'critical', 'Stig', NULL, NULL, '2026-02-10 23:27:37', '2026-02-11 17:38:01', NULL, 'c1e4b87bd271f62ee068edc58aa09579', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRW3QXJSQWKD00FE8GW', 'story', '06FB0TNSRXJB2P833S5Y5AKG7C', 'Deterministic tick system', 'Timestamped action queue, fixed timestep simulation loop, input event processing order.', 'done', 'critical', NULL, NULL, NULL, '2026-02-10 23:17:59', '2026-02-11 17:38:01', NULL, 'de81f32c325af5bf53cacd30428d88e0', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRWK6CTNQYN6JVXCWMG', 'task', '06FB0TNSRZHQSYJ6K0HS9HHY5M', 'Create main scene hierarchy', 'Main.tscn with World, Camera2D, HUD, UICanvas nodes. Basic scene structure.', 'done', 'critical', 'Stig', NULL, NULL, '2026-02-10 23:27:37', '2026-02-11 17:38:01', NULL, 'e7e7e4cbc1269b84327bc085ebb7044b', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZ85TB91V30EG8EJSW', 'task', '06FB0TNSRZHQSYJ6K0HS9HHY5M', 'Create client/ directory structure', 'mkdir -p client/scenes, client/scripts, client/assets. Godot project organization.', 'done', 'critical', 'Stig', NULL, NULL, '2026-02-10 23:27:37', '2026-02-11 17:38:01', NULL, 'f1c2ebcf58c89dde66521d95e1f870fa', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRYFSZ005QY55S5E2BC', 'task', '06FB0TNSRXNT4SCS3MEPCKGPXG', 'Define ObserverSnapshot structure', 'Document structure: visible_entities (id, pos, sprite_id), fog_state (tile visibility), sound_events, monologue_text, hud_data.', 'done', 'critical', 'Dudley', NULL, NULL, '2026-02-10 23:27:49', '2026-02-11 17:38:06', NULL, '37eecac669611fb24b84dfb4efbb0b3d', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRWTWPPX31YX8EJA2V0', 'task', '06FB0TNSRXNT4SCS3MEPCKGPXG', 'Define PlayerInput structure', 'Document structure: timestamp, action_type (enum: Move, Interact, UseMode, etc), action_data (direction, target_id, etc).', 'done', 'critical', 'Dudley', NULL, NULL, '2026-02-10 23:27:49', '2026-02-11 17:38:06', NULL, '4407fe804e8d450c8199f23a380c08d4', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZX2TSC3HDJ7QBR4RW', 'task', '06FB0TNSRXNT4SCS3MEPCKGPXG', 'Create protocol/ directory', 'mkdir protocol. Shared schema definitions accessible to both Rust and GDScript docs.', 'done', 'critical', 'Dudley', NULL, NULL, '2026-02-10 23:27:49', '2026-02-11 17:38:06', NULL, 'a71f93ab5d9a9483b7b90dcfc747c1db', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZ8CXZ8JB6S2R4GWFG', 'story', '06FB0TNSRWM2V22WHZ08ANKN10', 'MessagePack serialization - Rust', 'Add rmp-serde dependency. Implement serialize/deserialize for protocol messages.', 'done', 'critical', NULL, NULL, NULL, '2026-02-10 23:18:24', '2026-02-11 17:38:06', NULL, 'bc8c1ae8cd728322fb1398927dfdd132', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRXNT4SCS3MEPCKGPXG', 'story', '06FB0TNSRWM2V22WHZ08ANKN10', 'Protocol message definitions', 'Define ObserverSnapshot and PlayerInput structures. Create protocol/ directory with shared schemas.', 'done', 'critical', NULL, NULL, NULL, '2026-02-10 23:18:24', '2026-02-11 17:38:06', NULL, 'bd8c9b205b8cae7ce25992d37a856617', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRYEDNMYSVR0Z0GW1NW', 'task', '06FB0TNSRXNT4SCS3MEPCKGPXG', 'Define entity data structures', 'EntitySnapshot: id, position, entity_type, sprite_id, facing. Supporting structs.', 'done', 'critical', 'Dudley', NULL, NULL, '2026-02-10 23:27:49', '2026-02-11 17:38:06', NULL, 'cbada4a4ed2fa1e8653f6da35b94b72f', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRWM2V22WHZ08ANKN10', 'epic', '06FB0TNSRXXEKGTNRJ7Z6FTDRM', 'IPC Bridge & Protocol', 'MessagePack-based communication layer. ObserverSnapshot (server→client), PlayerInput (client→server). LocalBridge for subprocess, NetworkBridge for TCP.', 'done', 'critical', NULL, NULL, 'D-020', '2026-02-10 23:15:13', '2026-02-11 17:38:59', NULL, '58a29bf6308142b0bdcb18fd8b6af71a', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRXWQ9F7FGH2X8VG9MG', 'story', '06FB0TNSRWM2V22WHZ08ANKN10', 'MessagePack serialization - GDScript', 'Integrate MessagePack library for Godot. Implement encode/decode for protocol messages.', 'done', 'critical', 'client', NULL, NULL, '2026-02-10 23:18:24', '2026-02-11 19:40:08', NULL, 'baaa72380cd32cb0a29e66e839827877', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRW0KV1Q6SE8AWJF6CG', 'task', '06FB0TNSRWABN2YJ0SNKRW9D7G', 'Document tier transition performance budgets', 'Document performance budgets for tier transitions:\n- Active → Background: <1 tick\n- Background → State-saved: <1 tick\n- State-saved → Active: <5ms\n\nAdd as commented-out benchmark tests. Enable when tier system is implemented.\n\nEffort: XS\nCodebase: docs + server\nSource: Architecture Review Audit 2026-02-11\nSprint: 2+', 'backlog', 'medium', NULL, NULL, NULL, '2026-02-11 20:27:30', '2026-02-11 20:27:30', NULL, 'ac52028aec00584f752e98b547221f7b', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZWFAGJ6BHZF8H75CR', 'task', '06FB0TNSRWYX9HMVEXES6GHXPW', 'Timing assertions in integration tests', 'Add tick_completes_within_budget() integration test asserting <100ms tick time at 80 NPCs (20 Active + 60 Background). Regression test against performance degradation.\n\nEffort: S\nCodebase: server\nSource: Architecture Review Audit 2026-02-11\nSprint: 2+', 'backlog', 'medium', NULL, NULL, NULL, '2026-02-11 20:27:41', '2026-02-11 20:27:41', NULL, 'abb12834fb2157a70d9548dea95023af', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_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', '06FB0TNSRZMGXXPB99F23GMH68', '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-02-11 20:27:45', NULL, '7ecc238c5b1cb3f1702c40270b0125d0', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_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', NULL, 'Workshop: Knowledge Graph & Information Boundaries', 'Design workshop for KnowledgeGraph component to replace Vec<String> placeholder.
Scope:
- Graph structure (nodes, edges, timestamps, certainty)
- Information boundaries (what NPCs know vs do not know)
- Propagation rules (gossip, observation, inference)
- Query interface for dialogue/behavior systems
- Memory limits and forgetting mechanics
Pillar-1 mechanic. CRITICAL priority.
Sprint 2 blocker.
Participants: Tyre (lead), Morve, Dudley, SI
Source: Architecture Review Audit 2026-02-11', 'backlog', 'critical', NULL, NULL, NULL, '2026-02-11 20:27:52', '2026-02-11 20:27:52', NULL, '9dbee3c13d85f349ce25578e64aeb56e', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_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', NULL, 'Workshop: Observer Snapshot Generation Pipeline', 'Design workshop for perception query algorithm that generates ObserverSnapshot.
Pipeline stages:
1. Spatial query (entities in range)
2. Line-of-sight filtering
3. Sound propagation
4. Knowledge graph integration
5. Snapshot assembly
CRITICAL priority. Sprint 2 blocker.
Depends on Workshop 1 (Knowledge Graph).
Participants: Tyre (lead), Morve, Dudley, SI
Source: Architecture Review Audit 2026-02-11', 'backlog', 'critical', NULL, NULL, NULL, '2026-02-11 20:28:05', '2026-02-11 20:28:05', NULL, '7edfce360f91d9564ad61e410efe47ac', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZKK141HN5GA7CAA8M', 'epic', NULL, 'Workshop: NPC AI State Machines', 'Design workshop for Background-tier NPC behavior systems.
Four state machines to specify:
1. Schedule FSM (work, home, social, sleep)
2. Mood FSM (calm, stressed, suspicious, friendly)
3. Relationship FSM (stranger, acquaintance, friend, enemy)
4. Job FSM (idle, working, break, commute)
Define: states, transitions, day phase integration, tick budget.
HIGH priority. Sprint 3 target.
Participants: Tyre (lead), Morve, Mellanie, SI
Source: Architecture Review Audit 2026-02-11', 'cancelled', 'high', NULL, NULL, NULL, '2026-02-11 20:28:10', '2026-02-11 20:28:10', NULL, 'e8aae682a3a60f60d06e2d3f78b314ce', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_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', NULL, 'Workshop: Save/Load Architecture', 'Design workshop for save/load system architecture.
Key decisions:
- Custom SaveState struct vs bevy_reflect
- Version number scheme and migration strategy
- Relationship to tier system (serialize by tier?)
- Incremental saves vs full snapshots
- Quick save vs named saves
MEDIUM priority. Must be resolved before vertical slice.
Participants: Dudley (lead), Tyre, Morve, SI
Source: Architecture Review Audit 2026-02-11', 'backlog', 'medium', NULL, NULL, NULL, '2026-02-11 20:28:16', '2026-02-11 20:28:16', NULL, '703456253a983bfaf1163a7da18c6bcb', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_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', NULL, 'Workshop: Map Authoring Pipeline', 'Design workshop for map authoring toolchain and format.
Key decisions:
- Tool selection: Tiled vs Godot TileMap vs YAML
- Map format (JSON, TMX, custom?)
- Collision layer specification
- Entity spawn points
- Loader implementation (server + client)
- Hot reload support for iteration
MEDIUM priority. Sprint 2-3 target.
Participants: Morve (lead), Tyre, Dudley, SI
Source: Architecture Review Audit 2026-02-11', 'backlog', 'medium', NULL, NULL, NULL, '2026-02-11 20:28:22', '2026-02-11 20:28:22', NULL, '3394b46ce90e8f770e2a6df4fedabff3', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRXYZBGFHZN5WSKT57M', 'story', '06FB0TNSRZMGXXPB99F23GMH68', 'Tick loop synchronization', 'Client sends input, server processes tick, server sends snapshot, client renders. Basic game loop.', 'done', 'critical', 'joint', NULL, NULL, '2026-02-10 23:18:35', '2026-02-11 20:29:30', NULL, '6499ab3e04e6f2fad5c923e705e5ee19', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRXWNCEETMZ2T8GE1NR', 'story', '06FB0TNSRZMGXXPB99F23GMH68', 'Moving character proof', 'Player presses arrow key → Godot sends MoveNorth → Rust updates position → Godot receives snapshot → sprite moves. First gameplay.', 'done', 'critical', 'joint', NULL, NULL, '2026-02-10 23:18:35', '2026-02-11 20:29:30', NULL, 'b99fbe8ca2bbfeb97eadd743898a4ff5', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRY0ETJ04X24V4RC7R4', 'story', '06FB0TNSRWM2V22WHZ08ANKN10', 'LocalBridge implementation - GDScript', 'Subprocess spawn, socket connection, message send/receive, reconnection logic.', 'done', 'critical', 'client', NULL, NULL, '2026-02-10 23:18:24', '2026-02-11 20:29:30', NULL, 'ca7e3a302f7d35ef3306badbbbe106f3', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRWDBBSARCPGA4MCBJR', 'story', '06FB0TNSRWM2V22WHZ08ANKN10', 'LocalBridge implementation - Rust', 'Subprocess management, Unix socket (Linux) or localhost TCP, message framing, error handling.', 'done', 'critical', 'server', NULL, NULL, '2026-02-10 23:18:24', '2026-02-11 20:30:10', NULL, 'dada27f008485d7076369c3e6c030fd9', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRY2T08M6WFZR4Q8F30', 'story', '06FB0TNSRZMGXXPB99F23GMH68', 'End-to-end connection test', 'Godot spawns Rust process, establishes connection, sends ping, receives pong. Basic handshake.', 'done', 'critical', 'joint', NULL, NULL, '2026-02-10 23:18:35', '2026-02-11 20:31:07', NULL, 'dbc91c1fb0d3143c4d2564a6348a4043', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRWE318VD50WFVN25T0', 'story', '06FB0TNSRY8KWVN9TCM2G5XXG8', 'Tile collision system', 'Walkability map and movement validation. Each tile has walkable/blocked flag. Movement system checks can_move_to(tile) before allowing position change. Blocks all NPC and player movement. Source: Tyre R1, Gestalt R2 C-1.', 'done', 'critical', 'server', NULL, NULL, '2026-02-11 00:01:39', '2026-02-11 21:05:20', NULL, 'f21191f99d836c59f9b11ae032c379cf', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRYH7TB2DS3ZSQBR804', 'story', '06FB0TNSRY8KWVN9TCM2G5XXG8', 'Tile-based A* pathfinding', 'A* pathfinding over walkability map using pathfinding crate. NPCs request paths between positions; system returns tile sequences. Blocks routine execution (#101). Source: Tyre R1, Gestalt R2 C-2a.', 'done', 'medium', NULL, NULL, NULL, '2026-02-11 00:01:39', '2026-02-11 21:59:59', NULL, '00573aea0d97e4f58788b433b22fb297', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRXZN5GSHP9BAKDR1XW', 'story', '06FB0TNSRZMGXXPB99F23GMH68', 'Multiple entity sync', 'Add 2-3 NPCs to simulation. Verify all entities render correctly on client from snapshot data.', 'done', 'medium', NULL, NULL, NULL, '2026-02-10 23:18:35', '2026-02-11 21:59:59', NULL, '2f9f5e115bd4f4e428d1d4549401d022', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRY1WBEMFN46BFJJVS8', 'story', '06FB0TNSRYTX3A5XSWREQ03KQW', 'Daily routine system', 'DailyRoutine component. Location schedule, activity states, time-based transitions.', 'done', 'medium', NULL, NULL, NULL, '2026-02-10 23:18:49', '2026-02-11 21:59:59', NULL, '61a0a60151c79b7c47900b0ee8d0387b', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRWAZJGP06Y62GWH7HM', 'story', '06FB0TNSRZ202MPMFH0EDH2BT4', 'Player interaction system and dispatcher', 'Decomposed into #421 (ObjectType + verb sets) and #422 (Two-phase verb KG filter) from Control & Interaction workshop (D-057). Original: general dispatcher routing Interact input to subsystems.', 'done', 'medium', NULL, NULL, NULL, '2026-02-11 00:01:51', '2026-02-11 21:59:59', NULL, '6a4a6c87307efd7f2fad9eca1b65e940', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRWDVTDM9TBXMM68JH4', 'initiative', NULL, 'Custom game, not a mod', NULL, 'done', 'medium', NULL, NULL, 'D-001', '2026-02-09 15:21:44', '2026-02-11 21:59:59', NULL, '8581f104cc32e02dcc93ec6a7e1d2487', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRWPJE83GW3E8MFNYW8', 'story', '06FB0TNSRZ202MPMFH0EDH2BT4', 'Observation event generator', 'The unified observation pipeline: compares ObserverSnapshot against character knowledge to generate ObservationEvents. Trigger types: routine deviation, absence detection, social anomaly, new information, contradiction. Character-specific — same NPC behavior generates different events for smuggler vs detective. The mechanical heart of the game per Gestalt R2 C-4. Absorbs: Ozzie observation event pipeline, routine deviation detection; Paula absence detection, knowledge-aware monologue integration; Gestalt NPC off-routine behavior.', 'done', 'medium', NULL, NULL, NULL, '2026-02-11 00:01:50', '2026-02-11 21:59:59', NULL, '89b634d730705025475c57e541734f90', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRY0G8X2Y69C84W3G3G', 'story', '06FB0TNSRYTX3A5XSWREQ03KQW', 'Relationship system', 'RelationshipGraph resource. Per-NPC relationship slots (3 key relationships). Relationship metadata (trust, history, type).', 'done', 'medium', NULL, NULL, NULL, '2026-02-10 23:18:49', '2026-02-11 21:59:59', NULL, '91cf3a86eedca6b83840bb88717535be', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZY1SNJP6PACXJXV74', 'story', '06FB0TNSRY8KWVN9TCM2G5XXG8', 'NPC path following and movement', 'Per-tick NPC position updates along computed paths. Smooth interpolation between tiles. Separate from pathfinding — this is the movement execution system. Source: Tyre R1, Gestalt R2 C-2b.', 'done', 'medium', NULL, NULL, NULL, '2026-02-11 00:01:40', '2026-02-11 21:59:59', NULL, '9bf32be5592fdb50e2d7dfed2be39232', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRXHP4F7H2WRNGD1QG4', 'story', '06FB0TNSRYTX3A5XSWREQ03KQW', 'Core NPC components', 'NPCProfile component with Want, Secret, ToleranceThreshold, Contentment. Entity spawning with profiles.', 'done', 'medium', NULL, NULL, NULL, '2026-02-10 23:18:49', '2026-02-11 21:59:59', NULL, 'c589dff7941c561a852066700e28b965', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRY1NCWVF1YDN1GM0MW', 'task', '06FB0TNSRZMGXXPB99F23GMH68', 'Basic IPC error handling implementation', 'Define minimal error handling for IPC bridge:\n- Deserialization failure: log error + dump raw bytes + show user-facing message\n- Server crash: detect SIGCHLD + display error dialog with last log lines\n- Pipe break: clean shutdown both processes\n\nEffort: S\nCodebase: server + client\nSource: Architecture Review Audit 2026-02-11\nSprint: 1', 'done', 'medium', NULL, NULL, NULL, '2026-02-11 20:26:52', '2026-02-11 21:59:59', NULL, 'ea0d417701deaab5f3fd6151717dd4a9', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRXBEW200Z1S4DS8DT8', 'story', '06FB0TNSRYTX3A5XSWREQ03KQW', 'Information inventory', 'KnowledgeBase component. What NPC knows (facts, secrets, locations). Discovery and sharing mechanics.', 'cancelled', 'high', NULL, NULL, NULL, '2026-02-10 23:18:49', '2026-02-11 22:15:13', NULL, '210afcfd472103b93cde44798efacffe', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRYAKS46XFNKDAXQMXG', 'story', '06FB0TNSRYTW3T8YYBJ0VSSZM8', 'CauseChain component', 'Information provenance tracking: every piece of new information tracks HOW it was learned. Chain traces through perception events (VisualObservation, AudioObservation, DialogueReveal) and flags scripted reveals. Production feature serving monologue integration, knowledge journal, debugging, and criterion 4 validation. Source: Hoshe R1, endorsed by Tyre R2, Gestalt, Paula, Ozzie, Gore.', 'done', 'high', NULL, NULL, NULL, '2026-02-11 00:04:43', '2026-02-11 22:15:14', NULL, '6a55933b2b4cb13c09283d30ba7ca01b', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRWTFCERFN90161Q304', 'story', '06FB0TNSRXVMATNG8QEJVVVCH0', 'Entity visibility filtering', 'ObserverSnapshot only includes entities/components visible to requesting observer. Privacy enforcement.', 'cancelled', 'critical', NULL, NULL, NULL, '2026-02-10 23:21:35', '2026-02-11 22:17:51', NULL, 'd8cd4c726cff99637817b45b5cffa0e0', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRX4XP089MABDZ6EYDM', 'story', '06FB0TNSRY3PA3E31NAVQHR5GC', 'Camera lock to character', 'Camera follows player character position. No panning. Fixed viewport.', 'done', 'critical', 'client', NULL, NULL, '2026-02-10 23:20:20', '2026-02-11 22:32:39', NULL, '7de72acddeecb13b230923dc255d8a9d', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRWAP87D1VXF34JXMXR', 'story', '06FB0TNSRW1VJS6GTSSYHK63F8', 'Tile rendering engine', 'Multi-layer tilemap. Floor, walls, ceiling, objects. Z-level visualization (overlay or switching).', 'done', 'critical', 'client', NULL, NULL, '2026-02-10 23:21:12', '2026-02-11 22:38:49', NULL, '3e4f7c573601a7ea0363d60a3d3be66c', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRX6VWZF46VZ225P1M0', 'story', '06FB0TNSRW1VJS6GTSSYHK63F8', 'Fog overlay rendering', 'Darkened tiles for fog. Gradient for fog edges. Visibility state per tile.', 'done', 'critical', 'client', NULL, NULL, '2026-02-10 23:21:12', '2026-02-11 22:43:57', NULL, 'e074ef0271520ee6ed7d7f0c61ed7d2f', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRXTRBXA9ZSAPNG53ZG', 'task', '06FB0TNSRZMGXXPB99F23GMH68', 'Design ObserverSnapshot v2 schema', 'Expand ObserverSnapshot: add visible_tiles, player_facing, game_time fields. Contract needed before #112, #113, #25 integration.', 'done', 'critical', 'joint', NULL, 'D-020', '2026-02-11 21:20:58', '2026-02-11 23:10:16', NULL, '1db7edfe7c967824fb0185017eb02d3e', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRXV1FZCJTDMBK5VV54', 'story', '06FB0TNSRY8KWVN9TCM2G5XXG8', 'Game clock and day-phase system', NULL, 'done', 'high', 'server', NULL, 'Q-009', '2026-02-09 15:21:44', '2026-02-11 23:10:24', NULL, 'f66b670cd5ca3ecad8ab6a820da86d20', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRY99PXX4H3BC5SRCBM', 'task', '06FB0TNSRWCSXFAG1E4TS7HAB4', 'Resolve Q-018: shadowcasting algorithm selection', 'Benchmark symmetric (Albert Ford) vs recursive shadowcasting at 150x150 scale. Output: decision in decisions/perception.md or questions.md.', 'done', 'critical', 'server', NULL, 'Q-018', '2026-02-11 21:21:10', '2026-02-11 23:11:26', NULL, '2ff05d614ac62865b0fe0dd1f658aaf1', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRYE6YZ5N5JWXBKPFN0', 'story', '06FB0TNSRWCSXFAG1E4TS7HAB4', 'Shadowcasting algorithm - server', 'Implement LOS calculation per z-level. Raycasting or shadowcasting. Wall occlusion. Vision range.', 'done', 'critical', 'server', NULL, NULL, '2026-02-10 23:19:52', '2026-02-11 23:13:42', NULL, '4c06c406d886593de5ecc98ff0c49da8', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRWCKQ88EDEER4AJRG8', 'story', '06FB0TNSRWCSXFAG1E4TS7HAB4', 'Vision cone implementation', 'Forward/peripheral/behind sectors. Directional LOS quality. Range reduction for peripheral vision.', 'done', 'critical', 'server', NULL, NULL, '2026-02-10 23:19:52', '2026-02-11 23:15:58', NULL, '469847d64a758a6dfb1074c36f354709', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRX9CWEA9TG284VDJ8G', 'story', '06FB0TNSRWCSXFAG1E4TS7HAB4', 'Observer visibility query', 'Given observer entity, return visible entities and tiles. Respects information boundaries. Feeds ObserverSnapshot.', 'done', 'critical', 'server', NULL, NULL, '2026-02-10 23:19:52', '2026-02-11 23:19:36', NULL, 'e8b0f4792cb43868da5eeb241c321d66', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRWPGR9Q25WFM7FB938', 'story', '06FB0TNSRZMGXXPB99F23GMH68', 'Fog data through bridge', 'Integration: server sends visibility-filtered ObserverSnapshot, client consumes fog data. Both sides must agree on the expanded snapshot schema.', 'done', 'critical', 'joint', NULL, NULL, '2026-02-11 21:20:32', '2026-02-11 23:35:55', NULL, '466662a8c5e6f880529be7062f4366e5', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRWCDS1X0A93NG2NP9M', 'story', '06FB0TNSRWCSXFAG1E4TS7HAB4', 'Fog rendering - client', 'Render fog overlay in Godot. Reveal explored tiles, hide unexplored. Fog returns on departure (time-based decay).', 'done', 'critical', 'client', NULL, NULL, '2026-02-10 23:19:52', '2026-02-11 23:37:04', NULL, 'ee22dc8bf6b072337f8a2a7b13433cb2', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZNGJFF98G3J94TGMC', 'story', '06FB0TNSRXVMATNG8QEJVVVCH0', 'KnowledgeEventQueue + processing system', 'Event-driven knowledge updates. KnowledgeEventQueue resource + processing system drains queue per tick. Decouples perception from knowledge writes. Estimate: 0.5 day.', 'done', 'high', NULL, 'server', NULL, '2026-02-11 22:14:30', '2026-02-11 23:48:05', NULL, '302096c61414ecec16384030557dfbd1', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRYR4QZAGNPWSW1429G', 'story', '06FB0TNSRXVMATNG8QEJVVVCH0', 'StableEntityId component + EntityRegistry resource', 'StableEntityId component and EntityRegistry resource for bidirectional StableId <-> Entity mapping. Assigns stable IDs at spawn, survives save/load. Partially resolves Q-019. Estimate: 1 day.', 'done', 'critical', NULL, 'server', NULL, '2026-02-11 22:14:29', '2026-02-11 23:48:05', NULL, '4c3beea5f4fe2581697285e263321979', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRYMZ5WYB6XRASWJ4CM', 'story', '06FB0TNSRXVMATNG8QEJVVVCH0', 'Implement KnowledgeGraph component + types (D-041)', 'Full KnowledgeGraph component with BTreeMap<StableId, EntityKnowledge> and BTreeMap<FactId, FactKnowledge>. Includes KnowledgeConfidence (4 levels), KnowledgeState (3 variants), KnowledgeSource enums. All types per D-041 synthesis Part 3. Sprint 2 uses DirectObservation and Background sources only. Estimate: 1 day.', 'done', 'critical', NULL, 'server', NULL, '2026-02-11 22:14:28', '2026-02-11 23:48:05', NULL, '77a631b27a3669bdd9ce2815276687a6', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRW4GT2EBD05S077WSC', 'story', '06FB0TNSRXVMATNG8QEJVVVCH0', 'Basic knowledge decay system', 'Knowledge decay pass once per game-minute (every 10 ticks per D-031). Configurable via DecayThresholds resource. Downgrades confidence based on tick age. Does not generate Stale state yet (Sprint 3). Estimate: 0.5 day.', 'done', 'high', NULL, 'server', NULL, '2026-02-11 22:14:32', '2026-02-11 23:48:06', NULL, 'aa57b4400a8bb98c27e4ac38a01d08b9', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRW1SYJWVV38YTDJ5K0', 'task', '06FB0TNSRXVMATNG8QEJVVVCH0', 'Knowledge graph unit test suite', 'Unit tests for CRUD operations, decay mechanics, confidence ordering, serialization roundtrip, relationship state transitions. Estimate: 1 day.', 'done', 'high', NULL, 'server', NULL, '2026-02-11 22:14:34', '2026-02-11 23:48:06', NULL, 'abb13eabd74b87365db1c647cf8244d1', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRY0ECTYSPMBV47H0NC', 'story', '06FB0TNSRXVMATNG8QEJVVVCH0', 'Direct observation knowledge flow', 'Perception system calls observe_entity() when entity in LOS, observe_entity_leaving_los() when exits. Sets Direct confidence, downgrades to KnowsDetails on departure. Estimate: 0.5 day.', 'done', 'critical', NULL, 'server', NULL, '2026-02-11 22:14:31', '2026-02-11 23:48:06', NULL, 'ff99d0ac16288516ab510eb2342efdb5', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZPFQH9NM9S86ZSGHG', 'story', '06FB0TNSRW1VJS6GTSSYHK63F8', 'Entity sprite management', 'Character sprites, NPC sprites. Animation states (idle, walk, interact). Sprite facing direction.', 'done', 'critical', 'client', NULL, NULL, '2026-02-10 23:21:12', '2026-02-12 00:16:53', NULL, '8273735500f58fd39d59ec59984b64d1', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZQ2BXCMKFPZ48CV74', 'task', '06FB0TNSRZMGXXPB99F23GMH68', 'Resolve Q-019: entity ID stability', 'Define how entity_id (u64) maps to bevy Entity across ticks. Affects client entity lifecycle and sprite management.', 'done', 'high', 'joint', NULL, 'Q-019', '2026-02-11 21:21:22', '2026-02-12 00:16:54', NULL, '178439fbf85baaa561c5232e3633fac3', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRX7GXQN0PG92FXB17G', 'task', '06FB0TNSRXVMATNG8QEJVVVCH0', 'Observer snapshot knowledge integration', 'Observer visibility query (#112) reads KnowledgeGraph to: 1) overlay relationship color on visible entities, 2) include remembered (not visible) entities in snapshot. Implements interface from D-041 Part 5. Estimate: 1 day.', 'done', 'critical', NULL, 'joint', NULL, '2026-02-11 22:14:33', '2026-02-12 00:28:37', NULL, '37432d9cc1104248ad76b104c5361a3e', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZ0VZ6KZVMYFG516ZM', 'task', '06FB0TNSRZYTPVEY4DHRKQEKWC', 'Create environmental text examples file', 'Create wiki/authoring/environmental-text-examples.md. 4 text types: bar menu, safety notice, news ticker cycle, corridor graffiti. Krenn-voiced with cultural notes + monologue pairings (smuggler + detective). Needed for wow moment #1 (Arrival).', 'done', 'medium', NULL, 'copy', NULL, '2026-02-12 15:13:02', '2026-02-12 15:14:52', NULL, '0ac184d1f784c190f80a7eb7373436ba', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRYPJZZTF398DKCCRK4', 'story', '06FB0TNSRZYTPVEY4DHRKQEKWC', 'NPC-format briefs for both PCs — Concept A v0.1', 'When you play the smuggler, the detective exists as an NPC (and vice versa). NPC-mode behavior scripts (5-7 routine entries each), reverse dual-lens notes, observation monologue for PC seeing other-PC-as-NPC (3-5 lines per character). ~20-30 authored items total.', 'done', 'high', NULL, 'copy', NULL, '2026-02-12 15:13:02', '2026-02-12 15:14:52', NULL, '174c5ae9f5c8d97d74d46b90b098bd94', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRW9X6NVN7CJN7PR27C', 'task', '06FB0TNSRZYTPVEY4DHRKQEKWC', 'Create global/enums/ YAML files from D-035', 'Populate enums: situations (13), topics (9), moods (8), triggers (9), access-tiers (5), activities (new -- from Gestalt routine format + Miri cultural patterns).', 'done', 'medium', NULL, 'server', NULL, '2026-02-12 15:13:02', '2026-02-12 15:14:52', NULL, '190f77683f823d0c7a8fd1abdd5fc36d', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZNE4G87NFRZKKDFV4', 'task', '06FB0TNSRZYTPVEY4DHRKQEKWC', 'Create pools.yaml for v0.1 seed-time selection', 'Sova single-candidate pools: friend_smuggler (kael-davan), friend_detective (sera-venn), bar_regulars, compromised_inspector, primary_contraband. Architecture supports N candidates; v0.1 has 1 each.', 'done', 'medium', 'hoshe', 'server', NULL, '2026-02-12 15:13:02', '2026-02-12 15:14:52', NULL, '1a8a26db5a9bbde0b10059e9aedf407c', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRWZCJ8FFVSGWAF9DWC', 'task', '06FB0TNSRZYTPVEY4DHRKQEKWC', 'Add smuggler-perspective FactId progression text', 'Add smuggler-path text for all FactIds where smuggler starts at KnowsDetails or has different knowledge path than detective.', 'done', 'high', NULL, 'copy', NULL, '2026-02-12 15:13:01', '2026-02-12 15:14:52', NULL, '1f5c24a71e44df8f1b8e898d2bb838b5', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRWSP072E0EQER0HEGR', 'task', '06FB0TNSRZYTPVEY4DHRKQEKWC', 'Create global/knowledge/entity-attributes.yaml', 'Machine-readable entity attribute definitions. 16 canonical keys after A7 update (14 original, 4 new, 2 renamed). All observer->target.', 'done', 'medium', 'hoshe', 'server', NULL, '2026-02-12 15:13:02', '2026-02-12 15:14:52', NULL, 'b18cc944899bc5e8e75a7907b287af0b', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZ73AZZGBG2J1RF8N8', 'story', '06FB0TNSRZYTPVEY4DHRKQEKWC', 'NPC Authoring Style Guide', 'Combined document: tier templates (Paula), authoring rules (Mellanie conventions, Gestalt constraints, Ozzie anchor line), regional culture (Miri), content pipeline (Tyre). Reframed as generator specification -- this IS the NPC generator input format. Most complex ticket; many blockers.', 'done', 'critical', 'paula', 'copy', NULL, '2026-02-12 15:13:02', '2026-02-12 15:14:52', NULL, 'c524b1c2e2d66651f35d6f38a8a3bf0a', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRY1ZS1V9C9XWX6AFA0', 'task', '06FB0TNSRZYTPVEY4DHRKQEKWC', 'Create template YAML files with role slot definitions', '3 social sites: logistics-hub.yaml, bar.yaml, smuggling-ring.yaml. Each declares named role slots with count ranges, required flags, pool references, triangle constraints.', 'done', 'medium', 'hoshe', 'server', NULL, '2026-02-12 15:13:02', '2026-02-12 15:14:52', NULL, 'e1ac1d7d25b5fccb3a3af3163d97fda8', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZR23WWXC6C9Y5REAM', 'story', '06FB0TNSRZYTPVEY4DHRKQEKWC', 'Seed configuration schema design', 'Schema for what the randomizer produces at game-start: FRIEND selections, social site population, compromised NPC, contraband type, entanglement overrides. v0.1 has single-candidate pools but architecture must support N. Saved with game state. Location: runtime/ (not content/). Constrained by D-029 ratio (30/50/20).', 'done', 'medium', 'tyre', 'server', NULL, '2026-02-12 15:13:02', '2026-02-12 15:14:53', NULL, '28ab32313184791f00ffb1419fb6f822', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRWY8D0C19JTQSTG7Y0', 'task', '06FB0TNSRZYTPVEY4DHRKQEKWC', 'Line previewer CLI', 'CLI tool to preview monologue/dialogue line selection for a given game state. Lives in tooling/. Helps content authors test prerequisite logic without running the full game.', 'done', 'medium', 'tyre', 'server', NULL, '2026-02-12 15:13:03', '2026-02-12 15:14:53', NULL, '36df5d4b19e4ad0c50b2e67c5fcb8afe', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRXA4XH35XT27YTHHHC', 'task', '06FB0TNSRZYTPVEY4DHRKQEKWC', 'Apply Round 2 NPC pattern/motivation mapping', 'Apply the Round 2 finalized NPC pattern/motivation mapping (Gestalt-Paula synthesis) to wiki and content files. 17 NPCs x (pattern + motivation). Includes Harek structural role formalization (Paula Gap 7).', 'done', 'high', 'copy', 'copy', NULL, '2026-02-12 15:13:02', '2026-02-12 15:14:53', NULL, '72c74f6bd28cb6efa61516950b4ca6a0', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZY7JDYP0QSC7VCQ9M', 'task', '06FB0TNSRZYTPVEY4DHRKQEKWC', 'Create triangle YAML files for 5 v0.1 triangles', '5 triangles: hub-power (T1, active fork), worried-knowledge (T2, active fork), bar-tensions (T3, passive), worried-partner (T4, active fork), informant-question (T5, passive). Self-contained forks -- no cross-triangle cascade (A-17).', 'done', 'medium', 'hoshe', 'server', NULL, '2026-02-12 15:13:02', '2026-02-12 15:14:53', NULL, '764c2742bfa5cacb7cf25c50a484a10a', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRY2M29RD1VXV8K5HDG', 'story', '06FB0TNSRZYTPVEY4DHRKQEKWC', 'YAML content loader Phase 2 — real content loading', 'Content loader Phase 2: load real content from YAML files populated by content conversion (NEW-3) and C4-C8 YAML tickets. Extends Phase 1 skeleton with actual district content, NPC profiles, dialogue/monologue pools, triangle definitions. Hot-reload support for development iteration.', 'done', 'high', 'dudley', 'server', NULL, '2026-02-12 15:13:03', '2026-02-12 15:14:53', NULL, '9a611006e3c6b70fb3f8c6ead148fdd9', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZGNGT4NH1HRY8V320', 'task', '06FB0TNSRZYTPVEY4DHRKQEKWC', 'YAML → RON converter tool', 'Build-time converter: reads content YAML, emits RON. Lives in tooling/. Runs as make target (make content-ron). Not on critical path -- engine consumes YAML in v0.1; RON is future-proofing.', 'done', 'medium', 'tyre', 'server', NULL, '2026-02-12 15:13:03', '2026-02-12 15:14:53', NULL, 'a06295a46e9b135b3e9de3705a517fd4', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZWJPSVKTK30CZHRTW', 'story', '06FB0TNSRZYTPVEY4DHRKQEKWC', 'Monologue content pool — minimum viable (~200 lines)', '~100 lines per character. Categories: arrival observations, NPC routine commentary, environmental flavor, contradiction hints, idle reflections, tutorial/orientation. Follows Mellanie authoring order (FRIEND packs first, then fill to ~200).', 'done', 'high', NULL, 'copy', NULL, '2026-02-12 15:13:03', '2026-02-12 15:14:53', NULL, 'a1894093b5dc0580a297ba4108358e96', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRX0SNAPGC9DK2VNVA8', 'story', '06FB0TNSRZYTPVEY4DHRKQEKWC', 'PC-as-NPC content authoring', 'Author the actual PC-as-NPC lines: 5-7 routine entries per character, 3-5 observation monologue lines, reverse dual-lens notes. ~25 authored items (Mellanie budget). Blocked by FRIEND packs -- must know who the characters ARE before writing how they appear as NPCs.', 'done', 'high', NULL, 'copy', NULL, '2026-02-12 15:13:03', '2026-02-12 15:14:53', NULL, 'a88d9400492ca70d0a51a241eb0485a1', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRY7WQQNPF7D62YHVF0', 'story', '06FB0TNSRZYTPVEY4DHRKQEKWC', 'Wiki → YAML content conversion (Sova NPCs)', 'Convert 17 NPC wiki profiles to engine-readable YAML in content/districts/sova-transit/npcs/. Includes routine YAML layer (Paula Gap 3), triangle fork decision points (Gap 4), location smuggler detail (Gap 6). Must match schemas from C3. Tyre estimates 2-3 full days.', 'done', 'high', NULL, 'copy', NULL, '2026-02-12 15:13:02', '2026-02-12 15:14:53', NULL, 'c6fc3dcc02d3ca4a5c9583ae26813116', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRYK0MA0ZGVFHBP84Z0', 'task', '06FB0TNSRZYTPVEY4DHRKQEKWC', 'News ticker headline pool', '~20 dual-lens headlines for Meridian feed at Leras bar. Mix: freight/commodity data, Assembly politics, local infrastructure, sports, Commission advisories. Each headline works as dual-lens monologue trigger.', 'done', 'medium', NULL, 'copy', NULL, '2026-02-12 15:13:02', '2026-02-12 15:14:53', NULL, 'f56045a4464939f2351c0d809d0f22e2', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRXNFV6T4RHRT37CCVW', 'story', '06FB0TNSRZMGXXPB99F23GMH68', 'Sprint 2 proof: fog of perception', 'Acceptance: (1) player moves, (2) camera follows, (3) tiles render from snapshot, (4) entities appear/disappear via LOS, (5) fog outside vision cone, (6) walls hide, (7) corners reveal.', 'done', 'critical', 'joint', NULL, NULL, '2026-02-11 21:20:44', '2026-02-12 16:14:39', NULL, 'ed64401a27c6bdaca34e2fcdbb319ef2', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRY9G1XGJ6RKEZDBA5R', 'task', '06FB0TNSRZYTPVEY4DHRKQEKWC', 'Rename Hael → Naia Tamm across all wiki files', 'Phonetic collision fix (Kael/Hael). Find-and-replace across ~16 files (Paula full cascade). Triangle 4 becomes Naia-Kael-Sera. Update all relationship references, triangle diagrams, cross-references.', 'done', 'medium', NULL, 'copy', NULL, '2026-02-12 15:13:01', '2026-02-12 16:35:41', NULL, '21ee2ce535160cff0e0b0ca79856faec', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRY1PDE92Q5YMRNTTRG', 'task', '06FB0TNSRZYTPVEY4DHRKQEKWC', 'Apply canonical full names to all NPC wiki pages', 'Apply Miri''s 12 full names to NPC wiki pages. Update Core Identity blocks, environmental text references (manifests, shift rosters, Commission kiosk). Names: Voss->Arvo Voss, Devra->Devra Talsen, Resha->Resha Neven, Harek->Harek Valde, Renn->Renn Harsk, Pell->Pell Torssen, Drin->Drin Rosta, Sess->Sess Kolvur, Olin->Olin Tavren, Sabel->Sabel Hersk, Tav->Tav Merik.', 'done', 'medium', NULL, 'copy', NULL, '2026-02-12 15:13:01', '2026-02-12 16:37:40', NULL, 'c1deeb0a5a0fb39113e66b3b755862d4', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZ85SSD8Y7WK4SWM48', 'task', '06FB0TNSRZYTPVEY4DHRKQEKWC', 'Standardize location shortcodes in monologue-guide.md', 'Fix hub_m_ -> terminal_m_ inconsistency. Canonical shortcodes: terminal, bar, corridor. Add shortcode reference table. Add situation overlap rules and mood exclusivity rules.', 'done', 'medium', NULL, 'copy', NULL, '2026-02-12 15:13:02', '2026-02-12 16:38:44', NULL, '4261b13a8a147e3a865d8b58904e2d58', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRY9MXQC1Q9GK9EH7PW', 'task', '06FB0TNSRZYTPVEY4DHRKQEKWC', 'Stub NPC profile for Nils Davan (off-stage)', 'Minimal off-stage profile: Core Identity, relationship to Kael (siblings), role in ring (upstream pressure), known attributes by other NPCs. Referenced in 5+ NPC profiles but has no wiki page.', 'done', 'medium', NULL, 'copy', NULL, '2026-02-12 15:13:02', '2026-02-12 16:44:06', NULL, '2304945e821688d5eac8d906bd3716b4', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRY568ZWXZAQQ7RZ028', 'task', '06FB0TNSRZYTPVEY4DHRKQEKWC', 'Update entity-attributes.md — smuggler role-perspective keys', 'Add 4 new role-perspective keys: risk_assessment, loyalty_assessment, position_integrity, moral_weight. Rename secret_held -> leverage_held (broader scope: secrets, debts, promises, obligations). Rename secret_confidence -> leverage_confidence. Update trust_level description to absorb trust_read scope. All keys are observer->target. Total after update: 16 canonical keys.', 'done', 'high', NULL, 'copy', NULL, '2026-02-12 15:13:01', '2026-02-12 16:44:06', NULL, '60d9266275a4cc6d9ced3ba26b3754e6', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRWYHNA6ZMQXJ6X99CW', 'story', '06FB0TNSRZYTPVEY4DHRKQEKWC', 'Content directory structure design doc', 'Document converged structure: _meta/ + _schema/ (infrastructure, underscore prefix), global/ + districts/ (game content). Canonical_id format ({system}.{station}.{district}.{type}.{slug}). Mod-compatible directory conventions (no overlay implementation). District as atomic pack unit. Informs all content implementation.', 'done', 'high', NULL, 'copy', NULL, '2026-02-12 15:13:02', '2026-02-12 16:44:06', NULL, 'f1ce0d1507b050db02a170ae08388d71', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRXBY5SXZB9ZRW4FYRG', 'task', '06FB0TNSRZYTPVEY4DHRKQEKWC', 'v0.1 interaction verb spec + verbs[] terminology', 'Document the 7 interaction types (A-04: Move, Look, Monologue, Examine Object, Examine NPC, Talk, Overhear). Define triggers, UI needs, server events per type. v0.1 surfaces single context-sensitive action; architecture supports N verbs via verbs[]. Includes wiki + decisions rename to verbs[] terminology where appropriate. Soft dependency for NEW-9 (InteractionOptions).', 'done', 'medium', NULL, 'copy', NULL, '2026-02-12 15:13:03', '2026-02-12 16:54:03', NULL, '1866ba3e440f8127df7b9391cfc6f6ba', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZTR2ATQXRKQ90CXAM', 'story', '06FB0TNSRY449C3GAXT7PKDSY0', 'Dual Lens Authoring Guide', 'BLOCKING DEPENDENCY — must exist before any content authoring begins. Content design document defining how the same world plays differently through smuggler vs detective perspective. Contents: (1) Core identity + emotional starting state per character, (2) The Dual-Lens Rule with tag implications, (3) Access tier mapping per NPC role + shift paths per character per social site, (4) Divergence escalation curve, (5) Authoring checklist (5 questions per line), (6) THE FRIEND specification section, (7) Voice signature section — speech patterns. ~12-15 pages. Owner: Paula. Source: all 6 workshop agents. Workshop: content-gap-analysis v0.1 R2.', 'done', 'medium', NULL, 'copy', NULL, '2026-02-11 00:03:37', '2026-02-12 16:54:03', NULL, '8ffdeec655da0d0f0b899fb980296902', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRX91NH3XSRTZYH3NA8', 'story', '06FB0TNSRZYTPVEY4DHRKQEKWC', 'THE MIRROR pattern spec', 'Define honest-character NPC pattern. No contradiction arc, no secret, no tell. Tier 1 emotional depth. v0.1 acceptance criteria: Pattern definition with mechanical rules, content requirements (50-70 lines, 10-axis profile), tell system rules (MIRROR has none), Naia Tamm as reference implementation. Output becomes generator template.', 'done', 'high', NULL, 'copy', NULL, '2026-02-12 15:13:02', '2026-02-12 16:54:03', NULL, 'a6c54ef950aa405eca63090129e91292', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRWDH0EGHBDR8DQXFP0', 'task', '06FB0TNSRZYTPVEY4DHRKQEKWC', 'v0.1 wow moment content checklist', 'Map D-039 6 wow moments to specific content deliverables + implementation tickets. Track completion. Acceptance: every moment has identified content + code backing it.', 'done', 'high', NULL, 'copy', NULL, '2026-02-12 15:13:03', '2026-02-12 16:54:03', NULL, 'bb2b09147124a3ab2a47f5d090a1f987', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRWHHQ8YGN65C8Q2MNW', 'task', '06FB0TNSRZYTPVEY4DHRKQEKWC', 'Drin Tier 2 profile expansion', 'Drin confirmed promoted to Tier 2 (A-01 consensus). Expand wiki profile to full Tier 2 depth: all 10 profile axes, smuggler lens section, triangle membership formalized for T2 and T5.', 'done', 'medium', NULL, 'copy', NULL, '2026-02-12 15:13:02', '2026-02-12 17:06:11', NULL, '74eea11ba86a80feec0133adbcf5eb20', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZX3D4TWV5WZYQEE18', 'story', '06FB0TNSRZYTPVEY4DHRKQEKWC', 'Fix Triangle 1 (Hub Power) — Volume Escalation decision', 'Add smuggler decision fork: side with Nils (louder signal), side with Voss (internal tension), or split the route (new exposure surface). Each option cascades within T1 only -- self-contained, no cross-triangle cascade (A-17). Includes Nils partial presence via lattice message (~5-8 lines).', 'done', 'high', NULL, 'copy', NULL, '2026-02-12 15:13:02', '2026-02-12 17:06:11', NULL, '987d592e55494f48bba93f46d3a9ed98', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZ8BVZ0F76HM443CTG', 'story', '06FB0TNSRZYTPVEY4DHRKQEKWC', 'PC-as-NPC unified spec', 'Unified spec: starting knowledge graph, starting relationship map, reverse knowledge (bidirectional -- Gestalt critical insight), orientation monologue (Ozzie first 60 seconds), agency boundaries, authored relationship stubs (Gore requirement), tell inversion. 9-step conversion checklist for content authors. v0.1 scope: 2 PC briefs (smuggler, detective).', 'done', 'high', NULL, 'copy', NULL, '2026-02-12 15:13:02', '2026-02-12 17:06:11', NULL, 'e6c82380743ddbf34d554cd02bf04625', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRW2H2AV4G8MS5XWSRW', 'story', '06FB0TNSRZYTPVEY4DHRKQEKWC', 'Smuggler voice card + moral arc spec', 'Two deliverables: (1) Smuggler voice card -- paired examples with detective showing dual-lens register differences. Thinks in people vs data, first names vs surnames, fragments vs complete sentences, Krenn substrate vocabulary. (2) Smuggler moral arc -- 4 phases (Comfort, Doubt, Reckoning, Compromise), smuggler-specific FactIds, monologue triggers. Subsumes #310 (Character voice speech patterns).', 'done', 'high', NULL, 'copy', NULL, '2026-02-12 15:13:02', '2026-02-12 17:12:35', NULL, '4d13060d779c79a41814b96c152c4d6b', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZPB0X64AATJDRKG08', 'story', '06FB0TNSRZYTPVEY4DHRKQEKWC', 'Content schema definitions (YAML Schema files)', 'Create _schema/ with validation schemas: npc.schema.yaml (tier-conditional rules), location.schema.yaml, faction.schema.yaml, template.schema.yaml, fact.schema.yaml, dialogue.schema.yaml, monologue.schema.yaml, district.schema.yaml, pool.schema.yaml.', 'done', 'high', NULL, 'server', NULL, '2026-02-12 15:13:02', '2026-02-12 22:33:25', NULL, '06fd642dd3505a5ada2234d1b93b83c7', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRW9CCHW4F6S5FXGFNC', 'story', '06FB0TNSRZYTPVEY4DHRKQEKWC', 'Proximity detection + multi-verb InteractionOptions (verbs[])', 'Proximity detection system + server-side InteractionOptions component modeling N available actions per entity via verbs[]. Without proximity, InteractionOptions has no trigger. v0.1 client picks first/best verb; v0.2 client shows menu. Must not be throwaway. Includes ObserverSnapshot v2 -> v3 protocol extension for interaction data.', 'done', 'high', NULL, 'server', NULL, '2026-02-12 15:13:03', '2026-02-12 22:33:25', NULL, '49f9c0dc418e3f303823e2305d695757', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZ6QHANW414X765C34', 'task', '06FB0TNSRZYTPVEY4DHRKQEKWC', 'Create content/ directory skeleton', 'Create directory tree with empty YAML stubs. _meta/, _schema/, global/ (factions, technology, contraband, knowledge, enums, regions), districts/sova-transit/ (district.yaml, npcs/, locations/, templates/, triangles/, lines/).', 'done', 'high', NULL, 'server', NULL, '2026-02-12 15:13:02', '2026-02-12 22:33:25', NULL, '5e29b88be52810d76e88cf7c9a070825', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRYF7MFH57DC0BF67AG', 'story', '06FB0TNSRZYTPVEY4DHRKQEKWC', 'Implement make validate-content CLI', 'Structural + tier-conditional content validation. Same crate as C3 schemas. Reads _schema/ definitions, validates all YAML in content/. v0.1: structural validation (required fields, type checks, enum matching) + tier-conditional rules. v0.2: cross-reference validation (FactId existence, NPC slug resolution).', 'done', 'high', NULL, 'server', NULL, '2026-02-12 15:13:02', '2026-02-12 22:33:25', NULL, '9515baba3cad675dece7eec69b2374a3', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRY1WN7AH2WCTEFATRC', 'story', '06FB0TNSRZYTPVEY4DHRKQEKWC', 'Pause system — server tick rate scaling', 'Tick rate supports 3 states: full speed (normal play), 50% speed (UI overlay open -- knowledge panel, dialogue), 0% (spacebar pause). Server receives pause/speed commands from client via IPC.', 'done', 'medium', NULL, 'server', NULL, '2026-02-12 15:13:03', '2026-02-12 22:33:26', NULL, '4e5f2104d971e68f4b8b179740256744', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRWG3QYN1KT3T9Z5H7G', 'story', '06FB0TNSRYWW5RMQFT9VNSFSZW', 'Krenn System wiki entry — first star system', 'First concrete star system wiki entry. Krenn System: G3V star, mid-Reach, ~180yr settlement, ~2.4M population, freight logistics economy. Establishes template for all future system entries with YAML frontmatter metadata. Owner: Miri. Proposed by: Paula, Miri. Workshop: content-gap-analysis v0.1 R2.', 'done', 'medium', NULL, NULL, NULL, '2026-02-11 19:29:48', '2026-02-12 23:01:13', NULL, '0af680fe9bd7cbe0ba3340645bb84728', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRXV472B1H1AD939KY0', 'story', '06FB0TNSRYWW5RMQFT9VNSFSZW', 'Wiki taxonomy and structure — full future-ready schema', 'Full future-ready wiki taxonomy. Directory structure: star-systems/, characters/, factions/, technology/, cultural-groups/, contraband/, institutions/, species/, lore/, concepts/. Templates per category with YAML frontmatter metadata. Hierarchical spatial (system>station>district>location) with cross-references by ID. Scale-tested from 1 star system to 500+. First entries: Krenn System, Station Sova, Sova Transit District. Governance: Miri owns structure, anyone can create entries following templates. Status field: proposed>draft>canonical. Non-negotiable per project lead. Owners: Miri + Qatux. Proposed by: Mellanie, Paula, Miri. Workshop: content-gap-analysis v0.1 R2.', 'done', 'medium', NULL, NULL, NULL, '2026-02-11 19:27:33', '2026-02-12 23:01:13', NULL, '35e607dca88601eae630945cb11beaab', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRXMA9ZWD128CCWF07R', 'story', '06FB0TNSRXTSZECBWTKBV2JYNG', 'Character voice speech patterns — smuggler + detective', 'Speech-level character detail beyond personality traits. Per character: sentence length patterns, contraction usage, internal monologue style, nervous behavior verbal markers, frustration register, vocabulary level. The micro-decisions that determine whether 500 lines sound like the same person. Blocks voice kits. Owners: Paula + Mellanie. Proposed by: Mellanie, Paula. Workshop: content-gap-analysis v0.1 R2.', 'done', 'high', NULL, NULL, NULL, '2026-02-11 19:28:38', '2026-02-13 00:35:05', NULL, '3c5976395f31d9ebb009d672abbb3677', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRX3YCG15XGS27C16E4', 'story', '06FB0TNSRY449C3GAXT7PKDSY0', 'THE FRIEND: Detective NPC — Sera Venn full profile + content pack', 'Production-level NPC for detective playthrough. Sera Venn — Commission field tech, bar regular, detective pre-existing contact. Full 10-axis profile, all relationship phases (trust > background data > pattern recognition > the question > contaminated trust). Full voice kit, greeting pool, trust-gated dialogue, routine, contradiction arc, monologue reactions, tells. Total ~75-100 authored lines. Contradiction: Sera always leaves when Torek arrives — she knows about smuggling via friend Hael but protects Hael by not reporting. Tests dual-lens on investigation chain. D-027 criterion #3. Owners: Paula (profile) + Mellanie (content). Proposed by: Mellanie, Paula, Gestalt, Ozzie. Workshop: content-gap-analysis v0.1 R2.', 'done', 'critical', 'paula', NULL, NULL, '2026-02-11 19:27:30', '2026-02-13 00:35:06', NULL, '019a405ecf7804d9c7c6660f7d331ab4', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRYDQVESF0HRKG5EP2R', 'story', '06FB0TNSRY449C3GAXT7PKDSY0', 'THE FRIEND: Smuggler NPC — Kael Davan full profile + content pack', 'Production-level NPC for smuggler playthrough. Kael Davan — dock worker, smuggler closest colleague, ring member. Full 10-axis profile, all relationship phases (comfort > first crack > observation > confrontation > new equilibrium). Full voice kit (15-20 lines), greeting pool (8-10), trust-gated dialogue (15-20), routine dialogue (10-12), contradiction dialogue (8-10), monologue reactions per PC (10-15 each), tell descriptions (5-8 per PC), post-discovery dialogue (5-8). Total ~75-100 authored lines. Contradiction: Kael meeting unknown person in restricted corridor — trying to exit ring to protect partner Hael. Tests entire content pipeline end-to-end. D-027 criterion #3. Owners: Paula (profile) + Mellanie (content). Proposed by: Mellanie, Paula, Gestalt, Ozzie. Workshop: content-gap-analysis v0.1 R2.', 'done', 'critical', NULL, NULL, NULL, '2026-02-11 19:27:29', '2026-02-13 00:35:06', NULL, '2e42cbc6a4b860cde67bae24a5aa3997', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZCWZ7Q3TQJ9QTPH50', 'story', '06FB0TNSRZYTPVEY4DHRKQEKWC', 'Interaction prompt — client extensible prompt system', 'Client-side interaction prompt designed for extensibility. v0.1: single context-sensitive E prompt. Architecture supports v0.2 multi-verb menu. Prompt system reads InteractionOptions from server state. Separate from #240 (Player interaction system and dispatcher) -- different team, different definition of done.', 'done', 'high', 'Stig', 'client', NULL, '2026-02-12 15:13:03', '2026-02-13 00:35:07', NULL, 'd3e2c045084728ca3bd7124c273e652f', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRY016P07VTKGZ06N1W', 'task', NULL, 'Integration test: tile type data in live server mode', 'Server ObserverSnapshot.visible_tiles sends {x, y, z, visibility} but no tile type (floor/wall/door). Client TileRenderer.update_tiles() requires a type field. Test mode fakes a separate tiles array with types, masking the gap. Add an integration test that connects a real client game loop to a live server and verifies tile type data is present and renderable. Should fail until #412 is resolved.', 'done', 'high', NULL, 'client', NULL, '2026-02-13 00:43:11', '2026-02-13 00:43:11', NULL, 'bd4de9349d1db9338aa0c0004539039d', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRYE6ZBQ4HBPWVMSW1C', 'bug', NULL, 'Server ObserverSnapshot missing tile type data for client rendering', 'ObserverSnapshot.visible_tiles contains {x, y, z, visibility} but no tile type field (floor/wall/door/object). The client TileRenderer needs tile types to render walls, floors, and doors. In test mode this was masked by SimBridge generating a fake tiles array with type data. In live mode (make game), no walls or floors render — only entity boxes visible. Server needs to include tile geometry type in the snapshot, either by adding a type field to VisibleTile or by sending a separate tile geometry array. Blocks #410.', 'done', 'high', NULL, 'server', NULL, '2026-02-13 00:43:12', '2026-02-13 00:43:12', NULL, '5ee8e254abd7cf8be7aa9f7829a4a1b6', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRXJHEK1F8VF8MTG8NW', 'task', NULL, 'Integration test: input roundtrip through live server', 'No test validates the full input path: keypress → InputMapper → SimBridge.send_input → TCP wire → server deserialize → movement system → new ObserverSnapshot → client render. Unit tests prove each side works in isolation but miss the integration seam. Add a test that starts a real server, connects via TCP (not test mode), sends movement inputs, and verifies the player entity position changes in the returned snapshot. Should cover: basic movement, interaction with target, and verify no silent deserialization failures.', 'done', 'high', 'Stig', 'client', NULL, '2026-02-13 00:43:12', '2026-02-13 00:43:12', NULL, '69bac89f66ac74b7d324e49ac32ddad7', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRYXH97PB9ETK19XSPR', 'task', '06FB0TNSRZYTPVEY4DHRKQEKWC', 'UI microcopy', '~50 strings: interaction prompt labels, knowledge panel labels, relationship state descriptors, HUD labels, tutorial text. YAML format at content/campaigns/main/_meta/ui-strings.yaml, loaded via content loader (D-042). Blocked by Stig UI element specs from Sprint 3.', 'done', 'medium', 'Stig', 'client', 'D-042', '2026-02-12 15:13:03', '2026-02-13 16:40:26', NULL, '8e8cb67514d8df258e9b489349ca851b', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRYGXPF5ZF9QK5SV2A0', 'task', '06FB0TNSRZYTPVEY4DHRKQEKWC', 'Pre-commit FactId typo check', 'Grep-based pre-commit check validating FactId references in YAML content files against canonical facts.yaml. Cheap v0.1 bridge until full cross-reference validation lands in C9 v0.2.', 'done', 'medium', 'Justine', 'ci', NULL, '2026-02-12 15:13:02', '2026-02-13 17:10:38', NULL, '41f45e2dafe225ba6f94ff9c9cfaa51c', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRW716HDFFRF15EHA7W', 'task', NULL, 'Add Interactable component to NPC spawn', NULL, 'done', 'critical', NULL, 'server', NULL, '2026-02-13 17:44:15', '2026-02-13 17:44:18', NULL, '3e14a2924ce9913dd4a54726fd1d2587', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRWGRZ5B5W9X509PSPC', 'task', NULL, 'Wire PlayerAction::Interact with target/verb data', NULL, 'done', 'high', NULL, 'server', NULL, '2026-02-13 17:44:15', '2026-02-13 17:44:18', NULL, '781045695950f3bfb5abe354e60442f5', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRYW46Q56ZPKFGK7MPM', 'story', NULL, 'Implement monologue pipeline end-to-end', NULL, 'done', 'critical', NULL, 'joint', NULL, '2026-02-13 17:44:15', '2026-02-13 17:44:18', NULL, 'f5f80e38b1e4df6f5027b4cc63a8005b', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_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', NULL, 'Workshop: Control & Interaction Scheme', NULL, 'backlog', 'critical', NULL, NULL, 'D-053', '2026-02-13 21:05:22', '2026-02-13 21:05:22', NULL, '348c8a3563d63eaedf13318298b3ce8f', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZWV2N60SGPYNP5PZG', 'story', '06FB0TNSRW1VJS6GTSSYHK63F8', 'Fog rendering visual spec — 4 states', 'Four-state fog rendering: visible (full detail), fog-edge (partial, sound indicators), hidden (no information), remembered (desaturated ghost, static snapshot, NPCs vanished — information decay). Owner: Araminta. Proposed by: Araminta. Workshop: content-gap-analysis v0.1 R2.', 'cancelled', 'medium', NULL, NULL, NULL, '2026-02-11 19:30:04', '2026-02-13 21:06:55', NULL, '52b2c4c3f8906630bd0817ba2c10988e', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZ31GF81GCJKSR2E60', 'task', '06FB0TNSRWYBGV0A6RBVS1NSP0', 'Resolve OQ-24: inventory capacity — 3 slots or 4 (lead call needed)', NULL, 'done', 'medium', NULL, 'server', NULL, '2026-02-13 21:07:01', '2026-02-13 21:11:00', NULL, 'ef3ac8cc0fdfa8bc0f58e482ce89cd67', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZJ8CDSVG2YSHH7B1G', 'task', '06FB0TNSRWYBGV0A6RBVS1NSP0', 'Implant auto-pause (SP) — PauseSimulation on insert open/close', NULL, 'cancelled', 'medium', NULL, 'server', 'D-058', '2026-02-13 21:09:38', '2026-02-13 21:12:07', NULL, 'f10d3c5103f7ddc61deb1844bd927f3d', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZ8EJEQQ2E90ZSJGJ8', 'task', '06FB0TNSRWYBGV0A6RBVS1NSP0', 'Resolve OQ-01: tile size in world units', NULL, 'done', 'high', NULL, 'server', NULL, '2026-02-13 21:06:59', '2026-02-13 21:12:35', NULL, '46633401b77a17967934c7284a93fdc5', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZ7KCJ2WWG7VSNFRT0', 'task', '06FB0TNSRWYBGV0A6RBVS1NSP0', 'Define 3 smuggler item specs — manifest copy, access token, comm log', NULL, 'done', 'high', NULL, 'copy', 'D-065', '2026-02-13 21:06:07', '2026-02-14 08:32:18', NULL, 'f0386e864263f9ec5fb1dcd6510c2e34', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRWY60RCSJHS0G16B5C', 'task', '06FB0TNSRWYBGV0A6RBVS1NSP0', 'Sprint interaction buffer suppression', NULL, 'done', 'high', NULL, 'server', 'D-055', '2026-02-13 21:05:28', '2026-02-14 14:57:44', NULL, '01fd31393cebb25868aadc879ff8f2ad', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZKJ3MDQ4YJDPPZ8TG', 'task', '06FB0TNSRWYBGV0A6RBVS1NSP0', 'MovementProfile component per archetype', NULL, 'done', 'high', NULL, 'server', 'D-053', '2026-02-13 21:05:27', '2026-02-14 14:57:44', NULL, '142849fa1de63b7a6ff242b9e0b996a3', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRYT5RFPF50MJEHD370', 'story', '06FB0TNSRWYBGV0A6RBVS1NSP0', 'Smuggler inventory — CarriedBy component, Take/Place verbs, info boundary', 'Inventory using CarriedBy component pattern. Items are world entities with CarriedBy(StableId) referencing the carrier. Query: all items WHERE CarriedBy == player. Two verbs: Take, Place. Carried items are PRIVATE behind info boundary. LEAD CALL (OQ-24 resolved): 3x3 grid inventory, 9 slots, ALL characters (not per-archetype capacity). Mapped to 1-9 number keys. Wire format: player_inventory field on ObserverSnapshot. D-065. Est: 2d.', 'done', 'critical', NULL, 'server', 'D-065', '2026-02-13 21:05:36', '2026-02-14 14:57:44', NULL, '4668da155180ba9eff4de909fffb57a4', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRWDSRRKRG547AW969M', 'story', '06FB0TNSRWYBGV0A6RBVS1NSP0', 'Stance system — Sprint/Walk/Careful/Crouch with tick-based movement', NULL, 'done', 'critical', NULL, 'server', 'D-053', '2026-02-13 21:05:26', '2026-02-14 14:57:44', NULL, '7eabcdc537fdb48e0264735a6f47bf08', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRYC1K3C8CT9PZ83MA0', 'task', '06FB0TNSRWYBGV0A6RBVS1NSP0', 'Sprint anomaly monologue — double-take survival', NULL, 'done', 'medium', NULL, 'server', 'D-055', '2026-02-13 21:05:41', '2026-02-14 14:57:44', NULL, 'ad948d319a71e181a8bbb3ecfdf01dca', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRYBP0V90BHXC7FE0Q8', 'task', '06FB0TNSRWYBGV0A6RBVS1NSP0', 'ObserverSnapshot v6 — add player_stance, player_inventory wire fields', NULL, 'done', 'critical', NULL, 'server', NULL, '2026-02-13 21:09:39', '2026-02-14 14:57:44', NULL, 'c9ac7f69227d4c5f948a616512bc65c7', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRYDQY8D1716WMN0YTM', 'story', '06FB0TNSRWYBGV0A6RBVS1NSP0', 'Two-phase verb computation — KG-gated Phase 2 observer filter', NULL, 'done', 'critical', NULL, 'server', 'D-057', '2026-02-13 21:05:31', '2026-02-14 14:57:44', NULL, 'd4aa53dcc3a8e7c3f2bf735788b5c2c2', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRWAS693AX0WXX8ACF0', 'task', '06FB0TNSRWYBGV0A6RBVS1NSP0', 'ObjectType component + verb sets per type', NULL, 'done', 'high', NULL, 'server', 'D-057', '2026-02-13 21:05:30', '2026-02-14 14:57:44', NULL, 'e14fa3b8c61d7303835fe298c524f88e', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRXSWASFJSXJNRFN06M', 'story', '06FB0TNSRWYBGV0A6RBVS1NSP0', 'Same-tile occupancy — TilePresence with posture layers', NULL, 'done', 'critical', NULL, 'server', 'D-054', '2026-02-13 21:05:29', '2026-02-14 14:57:44', NULL, 'ea4db0fe891a56e762f9752046e67838', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRYG3EKW0XYD3YYCYGM', 'story', '06FB0TNSRWYBGV0A6RBVS1NSP0', 'Fog shader rebuild — 5-layer, CanvasGroup Layer 5, animated noise', 'REBUILD from scratch. Replace current TileMapLayer-based fog_renderer.gd with CanvasGroup + fragment shader. 5 layers: clear (soft gradient 3-4 tiles), light fog (desaturated 40-50%%, Perlin noise 8-10s), deep fog (near-monochrome, zone temperature tint), unexplored+maps (wireframe #333340), unexplored (solid #12141a). Animated noise texture, smooth boundary interpolation, vision cone shape integration. Supersedes #113/#131 fog code — remove old TileMapLayer implementation. Performance: <1ms/frame. D-059. Est: 3-4d.', 'done', 'critical', NULL, 'client', 'D-059', '2026-02-13 21:05:47', '2026-02-15 22:41:02', NULL, '76fe9893731a6c438be164e49a96847f', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZ0RZRM20BY9M099KR', 'story', '06FB0TNSRWYBGV0A6RBVS1NSP0', 'Entity interaction vertical list — insert-styled, z-layer 6', NULL, 'done', 'critical', NULL, 'client', 'D-057', '2026-02-13 21:05:50', '2026-02-15 22:41:02', NULL, 'a100e62599f1629ec830eac85643c3ef', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRYG41JZY738W2T1MHG', 'story', '06FB0TNSRWYBGV0A6RBVS1NSP0', 'World radial menu — 2 spokes v0.1 (Observe + Insert)', 'Right-click world radial menu. v0.1: 2 spokes — Observe (eye icon) and Insert (phone icon). Drag-release for power users, click-click for newcomers. Insert-styled: geometric lines, thin spokes with icons, nearly transparent. Renders on z-layer 6. Acceptance criterion: when Insert spoke activates in SP, client sends PlayerAction::Pause; on close sends Unpause (~10 lines). D-058. Est: 1d.', 'done', 'high', NULL, 'client', 'D-058', '2026-02-13 21:05:51', '2026-02-15 22:41:02', NULL, 'aa296c746707846b2385f97660e9428b', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRX8QMWNJ7HHZHWTF0R', 'story', '06FB0TNSRWYBGV0A6RBVS1NSP0', 'Cursor state machine — 4 states, Araminta spec, 150ms transitions', NULL, 'done', 'critical', NULL, 'client', 'D-056', '2026-02-13 21:05:46', '2026-02-15 22:41:02', NULL, 'd916cc6ae7e68a6c0f975e68fd48062e', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRWS206173ERF4ANZ2G', 'task', '06FB0TNSRWYBGV0A6RBVS1NSP0', 'Stance toggle UI — keybind + HUD indicator', NULL, 'done', 'high', NULL, 'client', 'D-053', '2026-02-13 21:06:01', '2026-02-15 22:41:03', NULL, '2a98c137258e56fb1cb7b148a05e3d20', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRXPGPDMHWHCQAD05VM', 'task', '06FB0TNSRWYBGV0A6RBVS1NSP0', 'Inventory UI — 3x3 grid, 1-9 hotkeys', 'UPDATED per lead call (OQ-24): 3x3 grid inventory UI replacing pocket-icon design. All characters get 9 slots with 1-9 number key direct access. No empty slots displayed (icons appear when items carried). Bottom-right positioning. D-065. Est: 1d (increased from 0.5d — grid layout more complex than pocket icons).', 'done', 'high', NULL, 'client', 'D-065', '2026-02-13 21:06:00', '2026-02-15 22:41:03', NULL, '419942c11b6b313228914812928d1761', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRYVY5CS6PJJE81VVX0', 'task', '06FB0TNSRWYBGV0A6RBVS1NSP0', 'Resolve OQ-25: stance name — Careful or Sneak (lead call needed)', NULL, 'done', 'low', NULL, 'server', NULL, '2026-02-13 21:07:02', '2026-02-15 22:42:10', NULL, '4f09f8b078426b110b1b33dbb89d8ae5', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRWZP07C3NMGAAHDEG8', 'story', '06FB0TNSRWYBGV0A6RBVS1NSP0', 'Dialogue box — max 20% height, max-width, NPC speech + options + monologue', NULL, 'done', 'high', 'Stig', 'client', 'D-061', '2026-02-13 21:05:52', '2026-02-15 23:01:01', NULL, '6795a047010885a22f550dc0a43284bd', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZP34Z2SY4072W2FM4', 'task', '06FB0TNSRWYBGV0A6RBVS1NSP0', 'Archetype evidence presentation spec — detective case file vs smuggler notebook', NULL, 'done', 'low', NULL, 'copy', 'D-065', '2026-02-13 21:06:09', '2026-02-15 23:07:52', NULL, 'c3bac07ea2a96b6413b3760efd202637', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRXJZNGNM3DQASZB24R', 'story', '06FB0TNSRWYBGV0A6RBVS1NSP0', 'Cognitive delay system for fog recognition', NULL, 'done', 'high', NULL, 'server', 'D-060', '2026-02-13 21:05:35', '2026-02-15 23:37:22', NULL, 'b903235cade3399f659d3b8b3e67e43c', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZZT5TMYPG2FPJ6498', 'story', '06FB0TNSRXXVCGN5D35ZJ7M0MW', 'Line pool format specification — formal document', 'Standalone spec document formalizing the converged YAML format from workshop. Not buried in workshop output. Covers: file structure (content/templates/{site}/dialogue.yaml), all tag enums with descriptions, example entries, authoring workflow. Reference document for all content authors. Owner: Gestalt. Proposed by: Mellanie, Gestalt. Workshop: content-gap-analysis v0.1 R2.', 'done', 'high', NULL, NULL, NULL, '2026-02-11 19:28:36', '2026-02-15 23:37:25', NULL, '7037f217af923269696bb8f27083c6d2', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRXREVVMTA1Y51CY1NW', 'task', '06FB0TNSRWYBGV0A6RBVS1NSP0', 'InteractionMemory KG schema design', NULL, 'done', 'medium', NULL, 'server', 'D-064', '2026-02-13 21:06:08', '2026-02-15 23:37:26', NULL, '47cfed7db79817932986fa930fccf923', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZ44HC98BD317CRVPW', 'task', '06FB0TNSRWYBGV0A6RBVS1NSP0', 'ListeningFocus — eavesdrop positioning via stationary_ticks', NULL, 'done', 'medium', NULL, 'server', 'D-053', '2026-02-13 21:05:39', '2026-02-15 23:37:26', NULL, 'f5b722547680c385f609132996365b4f', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRX2J6HRP5CW5MKZ22W', 'story', '06FB0TNSRXXVCGN5D35ZJ7M0MW', 'YAML content loader — hot-reload for previewer', 'Rust system parsing content YAML files into indexed queryable line pools at startup. Must support hot-reload for previewer/authoring workflow. Shares code with line previewer (#193) and dialogue selection pipeline (#305). Owner: Dudley. Proposed by: Gestalt. Workshop: content-gap-analysis v0.1 R2.', 'done', 'medium', NULL, NULL, NULL, '2026-02-11 19:29:55', '2026-02-15 23:37:26', NULL, 'fe489ae7860626e55306b85678632da4', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRYCMM00SZ8R62HB0RW', 'story', '06FB0TNSRWYBGV0A6RBVS1NSP0', 'Fog entity visualization — sound pings, recognized/unrecognized, cognitive delay anim', NULL, 'done', 'high', NULL, 'client', 'D-059', '2026-02-13 21:05:48', '2026-02-16 00:24:34', NULL, '28efdff5099f62052a3649b0616e7c2d', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRXNHB7N4MB7ACM3WXR', 'task', '06FB0TNSRWYBGV0A6RBVS1NSP0', 'Dialogue response selection — max 3 visible, invisible locks', NULL, 'done', 'high', NULL, 'client', 'D-062', '2026-02-13 21:05:56', '2026-02-16 00:24:34', NULL, '44c7c3e02ae8fd9a1c33db00412e9c6d', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRXZ0FW0EM8A33300Q0', 'task', '06FB0TNSRWYBGV0A6RBVS1NSP0', 'Confrontation text styling — italic voice, monologue beat', NULL, 'done', 'medium', NULL, 'client', 'D-063', '2026-02-13 21:05:57', '2026-02-16 00:24:34', NULL, 'ad01eb66145402fd82464d8df4e92a6c', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRX5P88GHY40VB6X1MC', 'task', '06FB0TNSRWYBGV0A6RBVS1NSP0', 'Walk-away mechanic — WASD detect during dialogue, 300ms fade', NULL, 'done', 'medium', NULL, 'client', 'D-064', '2026-02-13 21:05:59', '2026-02-16 00:24:34', NULL, 'eaaff811eeb9372eacf1baf95a656515', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZXCJWSYV4QVZRFH1W', 'story', '06FB0TNSRZP5KQ8RHFQQZK1ZJ0', 'Client audio manager', 'Basic audio playback system for the Godot client. Spatial audio positioning for close-range sounds. Bridge between server-side sound events and client audio output. Blocks #124 (sound event system) and #125 (close-range audio). Source: Tyre R1 H-12.', 'done', 'high', 'tyre', 'client', NULL, '2026-02-11 00:03:14', '2026-02-16 22:23:39', NULL, '33291cfd24d07c15901238cdfb84684d', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRW9K3QF4XS0EXVP4BW', 'task', '06FB0TNSRXCH1ZHWN1V0NVNVT4', 'Fog byte value constants (VIS_HIDDEN/PERIPHERAL/FORWARD, EXP_UNEXPLORED/EXPLORED/VISIBLE)', 'Define 6 named constants for fog byte values in client code. Eliminates magic numbers, provides stable assertion targets for fog tests. See stig-round3.md and workshop-outcomes.md. Effort: 0.25d.', 'done', 'high', 'hoshe', 'client', NULL, '2026-02-17 12:58:13', '2026-02-17 12:58:13', NULL, '53a11ed8bf767606fb73be12c23e19f8', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZKT1Z55241CYSTD6M', 'task', '06FB0TNSRXCH1ZHWN1V0NVNVT4', 'Boundary value tests: GDScript encode-only (41 values)', 'Test all 41 MessagePack boundary values in GDScript: verify header byte + payload for each. 25 positive boundaries (0 to 2^63-1) + 16 negative boundaries (-1 to -2^63). Location: client/tests/test_msgpack_boundaries.gd. Also encode-decode roundtrip. Prevents Bug #4 class (format boundary encoding errors). See hoshe-round3.md Section 4 for full value matrix. Effort: 1d.', 'done', 'high', 'hoshe', 'client', NULL, '2026-02-17 12:58:13', '2026-02-17 12:58:13', NULL, '695ec695931ec998a11f7bf1503a4f7e', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZ7HMXAWR4JHZ6QGJG', 'task', '06FB0TNSRXCH1ZHWN1V0NVNVT4', 'Client P0 tests: monologue not lost on overwrite (Bug #5), camera static during pause (Bug #2)', '2 critical client regression tests. (1) Monologue text preserved when snapshot buffer drops one-shots (Bug #5). (2) Camera remains centered during pause state (Bug #2). Open question R2-OQ-11: client test headless stability (resolve during impl). See stig-round3.md. Effort: 0.5d.', 'done', 'high', 'hoshe', 'client', NULL, '2026-02-17 12:58:13', '2026-02-17 12:58:13', NULL, '6eda1f7a121719e28b2b46caa9fccc0a', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZ702775RF8FF7GS3C', 'task', '06FB0TNSRXCH1ZHWN1V0NVNVT4', 'Client P1 tests: fog shader state (4), entity lifecycle, pending recognition blob', '7 client tests. 4 fog shader tests: correct layer values for each visibility state. Entity lifecycle: entity added/removed correctly. Pending recognition blob: unrecognized entity renders as blob during cognitive delay. See stig-round3.md. Effort: 1d.', 'done', 'high', NULL, 'client', NULL, '2026-02-17 12:58:13', '2026-02-17 12:58:13', NULL, '7bfd7d68d462cdfcd99bcecba50bd5ca', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRYP1K4GP604A3Y1YH0', 'task', '06FB0TNSRXCH1ZHWN1V0NVNVT4', 'Server --test-mode and --port 0 flags', 'Add --test-mode flag: prints LISTENING:{port} to stdout after bind, all tracing to stderr, --port 0 for OS-assigned port (uses existing accept_on(listener)), --seed 42 default, exits after first client disconnect, setup_proof_room() extracted for both modes. Unblocks Layer 3 tests, test client binary, Gauntlet headless testing. See workshop-outcomes.md Section 2 and dudley-round3.md for full spec. Effort: 1d.', 'done', 'critical', 'tyre', 'server', NULL, '2026-02-17 12:58:13', '2026-02-17 15:22:23', NULL, 'ce3773b360cf91cdf85b2fca288ad584', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZ2PX91TXAN31DH9GR', 'task', '06FB0TNSRXCH1ZHWN1V0NVNVT4', 'Remaining pause guard tests (stance_toggle, interact, batch_discard, set_tick_rate)', 'Edge case pause guard tests: stance_toggle rejected while paused, interact rejected, batch_discard (all inputs in batch rejected), SetTickRate(Half) rejected while paused (4-line fix in input.rs, see workshop-outcomes.md Section 2). Open question R2-OQ-01: resolve during implementation. Effort: 0.5d.', 'done', 'high', NULL, 'server', NULL, '2026-02-17 12:58:13', '2026-02-17 15:29:26', NULL, '0bd16dc59a8095426d187e806fab7ed8', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZRJ03S7R4YG7A362G', 'task', '06FB0TNSRXCH1ZHWN1V0NVNVT4', 'Pause guard test: unpause_accepted_while_paused', 'Test that unpause command is accepted while paused (the only allowed action). Prevents Bug #3 class (pause state corruption). See hoshe-round3.md. Effort: 0.25d.', 'done', 'critical', NULL, 'server', NULL, '2026-02-17 12:58:13', '2026-02-17 15:29:26', NULL, '31048565b80a69f908c8062bbec1ff67', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRW3FKD28HJ39JP95H0', 'task', '06FB0TNSRXCH1ZHWN1V0NVNVT4', 'EntityRegistry lifecycle tests (stale mapping, register-after-unregister, unregister-unknown)', '3 tests for entity registry edge cases. Stale mapping detection, register-after-unregister correctness, unregister-unknown entity handling. Open question R2-OQ-02: entity respawn + bevy generation counter safety (safe per Dudley). See hoshe-round3.md. Effort: 0.5d.', 'done', 'high', NULL, 'server', NULL, '2026-02-17 12:58:13', '2026-02-17 15:29:26', NULL, '8b5c7dd3fe9653f0603e97fbcafc9e1e', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRX4KWYY3KG3JPQVR7G', 'task', '06FB0TNSRXCH1ZHWN1V0NVNVT4', 'malformed_input_in_batch_rejects_entire_batch test', 'Documents batch-failure behavior: when one input in a batch is malformed, the entire batch is rejected. Resolves open question UQ-01. See hoshe-round3.md. Effort: 0.25d.', 'done', 'high', NULL, 'server', NULL, '2026-02-17 12:58:13', '2026-02-17 15:29:26', NULL, 'ad86ace01564198620e31e27922837ea', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRXC1AV8F4CN9G02V80', 'task', '06FB0TNSRXCH1ZHWN1V0NVNVT4', 'Pause guard test: movement_discarded_while_paused', 'Test that movement input is rejected while game is paused. Prevents Bug #3 recurrence (player moves while paused). See hoshe-round3.md for test spec. Effort: 0.25d.', 'done', 'critical', NULL, 'server', NULL, '2026-02-17 12:58:13', '2026-02-17 15:29:26', NULL, 'b5f24b9e61692fe2c0554d61480e3fd5', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRWFS93QGPGFT6PR49M', 'task', '06FB0TNSRXCH1ZHWN1V0NVNVT4', 'Pause guard test: pause_unpause_roundtrip_with_movement', 'Full cycle: pause -> attempt move (rejected) -> unpause -> move (accepted). Prevents Bug #3 class (full cycle regression). See hoshe-round3.md. Effort: 0.25d.', 'done', 'critical', NULL, 'server', NULL, '2026-02-17 12:58:13', '2026-02-17 15:29:26', NULL, 'e489b7bac23b6a959a4c8ab9bee650c9', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRWV422Z0720KTQQNXM', 'task', '06FB0TNSRXCH1ZHWN1V0NVNVT4', 'Per-fix determinism unit tests (Fix A equidistant NPCs, Fix D same-tile movers)', 'Targeted unit tests for each determinism fix. Fix A: equidistant NPCs produce stable ordering. Fix D: same-tile movers resolve deterministically. See hoshe-round3.md. Effort: 0.5d.', 'done', 'high', 'tyre', 'server', NULL, '2026-02-17 12:58:13', '2026-02-17 15:29:26', NULL, 'f5c1430915464f1faef0309289bad770', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRYAHY18N97HW8V2B14', 'task', '06FB0TNSRXCH1ZHWN1V0NVNVT4', 'Boundary value tests: Rust encode-only + roundtrip', 'Test all 41 BV values as i64 in Rust: to_vec -> from_slice -> assert_eq. Location: server/tests/serialization.rs. Prevents Rust-side encoding regressions. See hoshe-round3.md Section 4. Effort: 0.5d.', 'done', 'high', NULL, 'server', NULL, '2026-02-17 12:58:13', '2026-02-17 15:29:26', NULL, 'f7451b24583a3060c37b2d2f6bf3c1cd', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZ8GR08BQA8S6CDFE8', 'task', '06FB0TNSRXCH1ZHWN1V0NVNVT4', 'Determinism regression test: gauntlet_deterministic_replay', 'Master determinism regression guard. Run same input sequence twice, compare snapshots byte-for-byte. Catches any non-determinism regression. Depends on all 3 determinism fixes. See hoshe-round3.md. Effort: 1d.', 'done', 'high', 'tyre', 'server', NULL, '2026-02-17 12:58:13', '2026-02-17 15:29:52', NULL, 'd09c6e9ed7b9522bd211c98e9b2d5877', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRWEN47VBJDTTXN1E0M', 'task', '06FB0TNSRXCH1ZHWN1V0NVNVT4', 'Determinism Fix B: Sort visible entities in snapshot by entity_id', 'Sort entities by entity_id in observer/mod.rs snapshot construction. 2 lines. Prevents non-deterministic golden file comparison. See workshop-outcomes.md Section 2 for full spec. Effort: 0.25d.', 'done', 'critical', NULL, 'server', NULL, '2026-02-17 12:58:13', '2026-02-17 15:33:41', NULL, '13ef0f921935e729ddb0c937aae6bc3e', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRWS09HFFA7VMTN55M4', 'task', '06FB0TNSRXCH1ZHWN1V0NVNVT4', 'Determinism Fix A: visible_ids HashSet -> BTreeSet + sort visible_tiles', 'Replace HashSet with BTreeSet for visible_positions/ids in query.rs and observer/mod.rs. Sort visible_tiles by (x,y). ~15 lines. Prevents Bug #1 class (state divergence) and non-deterministic sprint anomaly detection. After fix, run `make fixtures` and commit updated fixture files (two client tests reference visible_tiles[0] by index). See workshop-outcomes.md Section 2 for full spec. Effort: 0.5d.', 'done', 'critical', NULL, 'server', NULL, '2026-02-17 12:58:13', '2026-02-17 15:33:41', NULL, '2e70abe5a99c6e3c757755cb7aa2d701', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRX9WNG202KP4KET0HW', 'task', '06FB0TNSRXCH1ZHWN1V0NVNVT4', 'Determinism Fix D: Sort movers by Entity bits in validate_movement', 'Sort movers by Entity::to_bits() in movement.rs for deterministic collision resolution. ~5 lines. Prevents non-deterministic movement tie-breaking. See workshop-outcomes.md Section 2 for full spec. Effort: 0.25d.', 'done', 'critical', NULL, 'server', NULL, '2026-02-17 12:58:13', '2026-02-17 15:33:41', NULL, '5a22e5833ffbfebfa8b9a3a0163f9615', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRWT37XC3FB1C6TEN64', 'task', NULL, 'Add ContentSlug component for entity slug resolution', NULL, 'done', 'medium', NULL, 'server', 'D-041', '2026-02-15 23:58:51', '2026-02-17 15:33:41', NULL, '722f822e8a6f83209620851ede4f3779', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZKABN2ZZ72EXN414W', 'task', NULL, 'Wire RecognitionTrigger::Urgent to anomaly detection', NULL, 'done', 'medium', NULL, 'server', 'D-060', '2026-02-15 23:28:05', '2026-02-17 15:33:41', NULL, '85c24cd6b17f67b50b249bd5d25bd4ad', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZJPA5R0P3RG5V9RQR', 'task', '06FB0TNSRXCH1ZHWN1V0NVNVT4', 'gen_fixtures.rs boundary extension (14 raw + 5 snapshot fixtures)', 'Extend gen_fixtures.rs to generate 14 raw integer boundary fixtures and 5 snapshot fixtures at boundary tick values. These are Rust-generated fixtures consumed by GDScript decoder tests. See hoshe-round3.md Section 4. Effort: 0.5d.', 'done', 'high', NULL, 'server', NULL, '2026-02-17 12:58:13', '2026-02-17 15:34:11', NULL, '4c4a55da2546d8a33f6b7489d02d3874', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRXMWVV1795W80NS3JC', 'task', '06FB0TNSRXCH1ZHWN1V0NVNVT4', 'Encoding asymmetry tests: Rust decoder accepts GDScript-style signed encodings', '4 test cases: Rust rmp_serde decodes int_16(256), int_16(32767), int_32(65536), int_32(2^31-1) into u64 fields. Validates the encoding overlap zone (GDScript uses signed for 256-32767, Rust uses unsigned). Dudley traced rmp-serde 1.3.1: safe. Location: server/tests/serialization.rs. See hoshe-round3.md Section 4 ''Direction 2''. Effort: 0.5d.', 'done', 'high', NULL, 'server', NULL, '2026-02-17 12:58:13', '2026-02-17 15:36:01', NULL, 'f53521082756ecfbba10e29361630953', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRW6QWF5EWFN2HMW48C', 'story', '06FB0TNSRXXVCGN5D35ZJ7M0MW', 'Dialogue selection pipeline — 4-layer filtering engine', 'Core runtime system: 4-layer filtering engine for dialogue line selection. Layer 1 (access) = hard filter by access tier. Layer 2 (situation) = context filter from engine-tracked interaction state. Layer 3 (trust) = hard filter by trust progression level. Layer 4 (mood+topic) = weighted selection from eligible pool. Consumes YAML line pools (#168). Must handle access tier as list, trust as progressive enum. Includes line variety tracking to prevent repeats. Owner: Dudley. Proposed by: Gestalt. Workshop: content-gap-analysis v0.1 R2.', 'done', 'critical', NULL, 'server', NULL, '2026-02-11 19:27:38', '2026-02-17 16:38:35', NULL, '122417c40170117bd54dbaf2cdca9665', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRW43PG6WZJY3HV8FG8', 'task', '06FB0TNSRWYBGV0A6RBVS1NSP0', 'Walk-away KG recording — confrontation incompleteness', NULL, 'done', 'medium', NULL, 'server', 'D-064', '2026-02-13 21:05:40', '2026-02-17 16:38:35', NULL, '2b7fc6e14403cf239ffaad5b7ad32f47', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRYYGWENWGK7TWFR3QR', 'task', NULL, 'Monologue fires DURING cognitive delay window (D-060)', NULL, 'done', 'medium', NULL, 'server', 'D-060', '2026-02-15 23:28:05', '2026-02-17 16:38:35', NULL, 'dd1f3fa45d1190f20a882a7486bec93b', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRW562E0Z0R3TKA46H8', 'story', '06FB0TNSRWYBGV0A6RBVS1NSP0', '6 interaction audio assets — cursor hover, weapon mode, fog recognition, implant, dialogue, confrontation dip', NULL, 'done', 'medium', 'inigo', 'audio', 'D-059', '2026-02-13 21:06:05', '2026-02-18 00:26:48', NULL, '313b24d9f39214258eb0c58ec73480d6', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRXAMGXEQ1KX1BQ9960', 'task', '06FB0TNSRXCH1ZHWN1V0NVNVT4', 'Test client binary scaffolding + CLI (tooling/test-client/)', 'Separate workspace crate at tooling/test-client/. Imports bridge types from server crate (ObserverSnapshot, PlayerInput, read_framed, write_framed). CLI: --connect, --replay, --text, --json, --quiet, --golden, --ticks. Exit codes: 0=success, 1=golden mismatch, 2=connection error. Lead override: NOT server/src/bin/ — separate crate in tooling/. See workshop-outcomes.md Section 5 and tyre-round3.md. Effort: 0.5d.', 'done', 'high', NULL, 'server', NULL, '2026-02-17 12:58:13', '2026-02-18 00:41:18', NULL, 'f8b0ff96ade9b267fe1e634e7d634b56', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZFDJ917TBMC6ZD2GG', 'task', '06FB0TNSRXCH1ZHWN1V0NVNVT4', 'Text renderer library (server/src/bridge/text_renderer.rs)', 'format_snapshot_text(&ObserverSnapshot) -> String. Pub-exported from server crate for tooling/test-client/ consumption. Entity labels as kind:entity_id, sorted by distance, room name from room_at() constants. ~100 lines Rust. Unblocks human tester workflow and WRONG button. See tyre-round3.md for full implementation. Effort: 0.5-1d.', 'done', 'high', NULL, 'server', NULL, '2026-02-17 12:58:13', '2026-02-18 00:41:19', NULL, 'cc255af5f4bb9eec2ee78e7415c412b2', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRWQEXKCRN5QAZYBS4R', 'task', '06FB0TNSRXCH1ZHWN1V0NVNVT4', 'Encoding asymmetry tests: GDScript decoder accepts Rust-style unsigned encodings', '4 test cases: GDScript Messagepack.decode handles uint_16(256), uint_16(32767), uint_32(65536), uint_32(2^31-1). Validates cross-encoder compatibility. Location: client/tests/test_msgpack_boundaries.gd. See hoshe-round3.md Section 4 ''Direction 1''. Effort: 0.5d.', 'done', 'high', NULL, 'client', NULL, '2026-02-17 12:58:13', '2026-02-18 00:42:36', NULL, '54f2353368710126be4de964ee204b96', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRYZNBH80NXHZHG614C', 'task', '06FB0TNSRXCH1ZHWN1V0NVNVT4', 'make pre-pr target', 'Implement `make pre-pr` chain: lint -> build -> test -> content validation -> fixture staleness. Also branch-specific variants: pre-pr-server, pre-pr-client, pre-pr-content. Total runtime <3min. Fixture staleness is BLOCKER (exit 1 on stale). See hoshe-round3.md Section 5 for definitive Makefile spec. Effort: 0.5d.', 'done', 'critical', NULL, 'ci', NULL, '2026-02-17 12:58:13', '2026-02-18 01:02:27', NULL, '82603e0f125a1e24a65d6b23f1ba057a', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZ6CXRXBWBDKS9PX6C', 'task', '06FB0TNSRXCH1ZHWN1V0NVNVT4', 'Content cross-reference validation (9 checks)', 'Extend tooling/validate-content with cross-reference validation pass. 9 checks: canonical_id uniqueness, relationship target resolution, location slug resolution, dialogue location resolution, fact_id resolution (absorbs check-fact-ids), triangle membership, npc_count accuracy (warning), dialogue line_id uniqueness, bidirectional relationship (warning). Phase 1 (Sprint 8): checks #1-#6. Phase 2 (Sprint 8): checks #4,#5,#8. Phase 3 (Sprint 9): #7,#9. See hoshe-round3.md Section 2 for ContentIndex skeleton and all 9 check specs. Effort: 1.5d.', 'done', 'critical', NULL, 'ci', NULL, '2026-02-17 12:58:13', '2026-02-18 01:02:28', NULL, '9142a23c303e6891893129e395db73b5', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRW4Y7J3BAZQD4K9QKW', 'task', '06FB0TNSRXCH1ZHWN1V0NVNVT4', 'Fixture staleness check in make pre-pr', 'Add fixture staleness detection to pre-pr chain. Regenerates fixtures via gen_fixtures, checks git diff on client/tests/fixtures/. Exit 1 on stale (BLOCKER — stale fixtures = false positive client tests per Tyre''s argument). See hoshe-round3.md Section 5. Effort: 0.25d.', 'done', 'critical', NULL, 'ci', NULL, '2026-02-17 12:58:13', '2026-02-18 01:02:28', NULL, 'e6f000070cece3137927c595a265df6a', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRWAV0NYG7QBG4ZCCCC', 'bug', NULL, 'Fix MessagePack int_64 encoder dead code branch', NULL, 'done', 'medium', 'stig', 'client', NULL, '2026-02-17 16:32:40', '2026-02-18 01:19:53', NULL, '7008173a42f604c40a8bd0543c21c36f', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRYQP1TW36TRQBXC01W', 'task', '06FB0TNSRXCH1ZHWN1V0NVNVT4', 'Client P2 tests: remaining camera (5), entity alpha/color (4), UI (7)', '16 client tests. Camera: smoothing, zoom, viewport. Entity: alpha/color for visibility states. UI: monologue display, interaction panel, inventory HUD, dialogue overlay, pause indicator, recognition progress, minimap. Target: Sprint 9. See stig-round3.md. Effort: 2d.', 'done', 'high', 'stig', 'client', NULL, '2026-02-17 12:58:13', '2026-02-18 01:19:54', NULL, '3540a74546d3df24b7958a72dd209d32', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZ7P88X5S0Y5F552Z4', 'task', '06FB0TNSRXCH1ZHWN1V0NVNVT4', 'Client P3 tests: z-layer ordering (4), entity lerp (3), Tyre additions (5)', '12 client tests. Z-layer: correct render order for floors/walls/entities/UI. Entity lerp: smooth interpolation targets. Tyre additions: recognition transition timing. Target: Sprint 9. See stig-round3.md. Effort: 1.5d.', 'done', 'high', 'stig', 'client', NULL, '2026-02-17 12:58:13', '2026-02-18 01:19:54', NULL, '3b31eababfa9465ac74640a8dd604c12', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRYWN1T6RT4GYA7YH4M', 'task', '06FB0TNSRXCH1ZHWN1V0NVNVT4', 'Client anti-tedium tests: bug report capture, progress hidden when not gauntlet', 'Client regression tests for anti-tedium features: F12 bug report captures correctly, gauntlet progress UI hidden in non-gauntlet mode. Target: Sprint 9. See stig-round3.md. Effort: 0.5d.', 'done', 'high', NULL, 'client', NULL, '2026-02-17 12:58:13', '2026-02-18 01:19:55', NULL, '387a6f1485cdadab0ccdac8610dd7b14', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRX5TEH97VSNT42BSR0', 'task', '06FB0TNSRXCH1ZHWN1V0NVNVT4', 'make fixtures-client target (GDScript-generated fixtures for Rust)', 'New Makefile target: runs GDScript test that generates .msgpack files at server/tests/fixtures/gdscript/. Rust test verifies decode. Reverse-direction protocol validation (GDScript encoder -> Rust decoder). See hoshe-round3.md Section 4 ''Direction 4''. Effort: 0.5d.', 'done', 'high', NULL, 'ci', NULL, '2026-02-17 12:58:13', '2026-02-18 01:23:22', NULL, '0d582d3ae73154927724b3ce11cca24e', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRY58JCE3K0QKA34MH0', 'story', '06FB0TNSRXCH1ZHWN1V0NVNVT4', 'Room reset trigger mechanism', 'RoomResetTrigger component, RoomSnapshots resource (tick-0 state per room), execute_room_reset system. Resets: entity positions, entity KG, player KG (room refs only), fog (room tiles), inventory items from room, dialogue state. Does NOT reset other rooms, player position, session timer, global SimRng. 10-tick debounce. Test-mode only. Target: Sprint 9. See workshop-outcomes.md Section 8. Effort: 1d.', 'done', 'critical', NULL, 'server', NULL, '2026-02-17 12:58:13', '2026-02-18 01:26:38', NULL, '2ab52189ce57f10227abe82eb5cf5d98', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRXFYVF5NYGJKGX8RJG', 'task', '06FB0TNSRXCH1ZHWN1V0NVNVT4', 'Layer 3 subprocess test: server_subprocess_sends_snapshot_on_connect', 'Integration test at server/tests/layer3.rs. Spawns server with --test-mode --port 0, parses LISTENING:{port} from stdout, connects via TCP, sends input, reads snapshot, asserts version/tick/entities. ServerGuard drop pattern for cleanup. Catches: binary startup panic, subprocess I/O blocking (Bug #1), port binding, protocol version. Target: Sprint 9. See hoshe-round3.md Section 3 for full test code. Effort: 1d.', 'done', 'critical', NULL, 'server', NULL, '2026-02-17 12:58:13', '2026-02-18 01:26:38', NULL, '3909ecef803449f7ad132741758d0fd5', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRWMMF0ZAZRKPT7HQQG', 'story', '06FB0TNSRXCH1ZHWN1V0NVNVT4', 'Gauntlet first 3 rooms (Inventory Warehouse, Occlusion Corridor, Pause Chamber)', 'Implement first 3 Gauntlet rooms as hybrid YAML + Rust inject. Inventory Warehouse (30x28, 11 entities, D-065 inventory), Occlusion Corridor (42x22, 4 entities, D-035 LOS), Pause Chamber (16x16, 1 entity, D-031 pause). Plus Central Hub (24x24, 4 signs). StableId ranges per gestalt-round3.md. Additive-only constraint: existing rooms/entities never reordered. Target: Sprint 9. See workshop-outcomes.md Section 4. Effort: 2-3d.', 'done', 'critical', NULL, 'server', NULL, '2026-02-17 12:58:13', '2026-02-18 01:26:38', NULL, '5780ecafb280d4d9ed70f6f5047ef749', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRW8CFFGEBZJF4D3DMM', 'task', '06FB0TNSRXCH1ZHWN1V0NVNVT4', 'Content runtime validation: boot + tick 10 + snapshot', 'Test that content passes runtime validation: server boots, ticks 10 times, produces valid snapshot. Catches content that passes schema validation but panics at runtime. Target: Sprint 9. Effort: 0.5d.', 'done', 'critical', NULL, 'server', NULL, '2026-02-17 12:58:13', '2026-02-18 01:26:38', NULL, '660178760f485f979d5952b1113613a6', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRX54WCSSGH73763A2R', 'task', '06FB0TNSRXCH1ZHWN1V0NVNVT4', 'Test client golden file comparison (JSON diff)', 'JSON diff with sorted keys, pretty-printed. Recursive diff_json_values() comparison. Output on mismatch shows field-level diffs. Exit code 1 on mismatch. Location: tooling/test-client/. Target: Sprint 9. See tyre-round3.md. Effort: 0.5d.', 'done', 'critical', NULL, 'server', NULL, '2026-02-17 12:58:13', '2026-02-18 01:26:38', NULL, '7a7cd7e58745e244ea8484adff936c8c', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRYTDT3D145XBY715FW', 'task', '06FB0TNSRXCH1ZHWN1V0NVNVT4', 'Gauntlet room constants module (server/src/test_world/constants.rs)', 'GauntletRoom struct, GauntletEntity struct, 8 room constants, ROOMS array, room_at() lookup function. ~100 lines Rust. Provides stable coordinate references for all tests. Target: Sprint 9. See gestalt-round3.md. Effort: 0.5d.', 'done', 'critical', NULL, 'server', NULL, '2026-02-17 12:58:13', '2026-02-18 01:26:38', NULL, 'ed24c5e05cca823b08a41c14bd59e54f', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRW5WX78K5H4M0VDY24', 'task', '06FB0TNSRXCH1ZHWN1V0NVNVT4', 'Golden file test suite: gauntlet_tick_10_matches_golden', 'Run deterministic replay for 10 ticks, compare output snapshot against committed golden file. Catches any code change that alters snapshot output. Target: Sprint 9. See hoshe-round3.md. Effort: 0.5d.', 'done', 'critical', NULL, 'server', NULL, '2026-02-17 12:58:13', '2026-02-18 01:26:38', NULL, 'fc879467e67c4644fdaef2598acfb430', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRXBG9ZV1R707V2Q3FC', 'story', NULL, 'Revisit Sprint 7 UI audio assets — trim to target durations and iterate', NULL, 'done', 'medium', 'inigo', 'audio', NULL, '2026-02-16 00:21:46', '2026-02-18 10:07:47', NULL, '5034bd8908b9f4ae12c6f4df913d101d', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRXX7RRTPBKS97WC908', 'task', '06FB0TNSRXCH1ZHWN1V0NVNVT4', 'make golden-diff + make golden-update targets', 'Developer workflow targets for golden file management. golden-diff shows changes, golden-update regenerates and commits. Target: Sprint 9. Effort: 0.25d.', 'done', 'critical', NULL, 'ci', NULL, '2026-02-17 12:58:13', '2026-02-18 10:07:47', NULL, '651294b7dfeba5e63eebe4a0992fb412', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRWMM02TQAR8GM1NHVM', 'task', '06FB0TNSRXCH1ZHWN1V0NVNVT4', 'Checklist YAML schema + make checklist generation', 'Per-room checklist at content/gauntlet/rooms/{room_id}/checklist.yaml. Cross-room at content/gauntlet/cross_room_checks.yaml. 7 condition types: player_near, player_facing, entity+expected, expected_sector, perception_mode, fog counts, inventory_count, dialogue_active, monologue_contains. make checklist generates docs/qa/gauntlet-checklist.md. Target: Sprint 9. See stig-round3.md. Effort: 0.5d.', 'done', 'high', NULL, 'ci', NULL, '2026-02-17 12:58:13', '2026-02-18 10:07:47', NULL, '8e0667b49a4776b412d12e3e11865201', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRWPQXC3AB98P4N0HJ4', 'story', '06FB0TNSRXCH1ZHWN1V0NVNVT4', 'WRONG button (F12) MVP: snapshot + text render + description', 'Client-side Godot implementation. F12 -> pause -> one-line prompt -> save files -> unpause. Captures: ObserverSnapshot (JSON), text render output, tick/room/seed, tester description. Output: tests/bug-reports/gauntlet-t{tick}-{timestamp}/. bug_report.gd autoload ~80 lines. Target: Sprint 9. See ozzie-round3.md and stig-round3.md. Effort: 1.5d.', 'done', 'high', NULL, 'client', NULL, '2026-02-17 12:58:13', '2026-02-18 10:14:14', NULL, '3795412b3740b62d201a5870ef459795', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRXAJTBZGBGHDT6Y9WG', 'task', '06FB0TNSRXCH1ZHWN1V0NVNVT4', 'Room timer + personal bests', 'Display TIMER: 00:47 (PB: 00:38). Timer starts on room entry, resets on room reset. Stats persisted to tests/gauntlet-stats.json. Session summary on disconnect. Target: Sprint 9. See ozzie-round3.md. Effort: 0.5d.', 'done', 'high', NULL, 'client', NULL, '2026-02-17 12:58:13', '2026-02-18 10:14:14', NULL, '4b650181cd54f58d050dbc3c6fb62182', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRX62JDKJNCHBPCRD18', 'task', '06FB0TNSRXCH1ZHWN1V0NVNVT4', 'Bidirectional relationship consistency warning (Check 9 in content validation)', 'Phase 3 of content validation: warning when NPC A has relationship to NPC B but no reciprocal relationship exists. Advisory, non-blocking. Backlog. See hoshe-round3.md Section 2. Effort: 0.25d.', 'done', 'low', 'justine', 'ci', NULL, '2026-02-17 12:58:13', '2026-02-18 11:42:13', NULL, '195e5fe9111fb5c56d66532e8921cbda', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRXATMXBB0FWW0HH8GM', 'task', '06FB0TNSRXCH1ZHWN1V0NVNVT4', 'Performance baseline tooling (make perf-baseline)', 'Establish performance baselines: tick timing, memory usage, entity count scaling. make perf-baseline runs benchmark suite, outputs to tests/perf/. Enables performance regression detection. Target: Sprint 9. See justine-round3.md. Effort: 1d.', 'done', 'high', 'justine', 'ci', NULL, '2026-02-17 12:58:13', '2026-02-18 11:42:13', NULL, '82452ca7bf94b1415dded68bd83eaf6a', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRXJKT8TPQCQQS7YYQC', 'task', '06FB0TNSRWYBGV0A6RBVS1NSP0', 'Confrontation world response — server-side trigger (Tier 2 anim, monologue spike, topic narrowing)', 'D-063 specifies world responds when confrontation is delivered: (1) NPC shifts to Tier 2 animation (D-047 ambiguous animation tier), (2) entity D-033 relationship color may fade (relationship state change), (3) monologue frequency spikes during exchange, (4) available topics narrow post-confrontation. Client text styling (#436) is done. This ticket covers the server-side event that triggers these world changes: emit a ConfrontationDelivered event from the dialogue system, which perception systems consume to update NPC AnimationState and the KG relationship record. NPC routine change is downstream of the relationship shift.', 'done', 'medium', NULL, 'server', 'D-063', '2026-02-18 10:45:21', '2026-02-18 11:45:49', NULL, 'a43533f5c32eddcac41b910edc5d84e0', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRW0QVYJ41Z2SM4K16R', 'task', '06FB0TNSRXCH1ZHWN1V0NVNVT4', 'Hub teleport action (PlayerAction::TeleportToHub)', 'Server-side: move player to hub_spawn, clear dialogue/monologue/interaction buffer. Does NOT affect room state, inventory, game time, knowledge graph. Gauntlet-only (reject in non-Gauntlet maps). Target: Sprint 9. See workshop-outcomes.md Section 8. Effort: 0.5d.', 'done', 'critical', NULL, 'server', NULL, '2026-02-17 12:58:13', '2026-02-18 11:45:49', NULL, 'b0a3b488c1887372f5620841035c5eab', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRYARY2G4X39XJC551G', 'task', '06FB0TNSRWYBGV0A6RBVS1NSP0', 'Walk-away NPC reaction — server-side Phase 2 (animation shift, routine change)', 'D-064 three-phase walk-away consequences. Phase 1 (client fade, #437) and Phase 3 (KG recording, #427) are done. Phase 2 is missing: when the player walks away from dialogue, the server must: (1) trigger NPC animation shift (to Tier 2 ambiguous animation per D-047), (2) optionally trigger an NPC call-after line (short audio/text), (3) flag the NPC routine as potentially changed (downstream storyteller hook). Blocked by: #427 (KG incompleteness flag exists, can be the trigger). Blocks Phase 2 NPC behavior and second-approach dialogue differences.', 'done', 'medium', NULL, 'server', 'D-064', '2026-02-18 10:45:18', '2026-02-18 11:45:52', NULL, '34c84ec5a1e48da5bbcef25342850e3b', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRW7NMA3WFMXKSS3TJR', 'task', '06FB0TNSRXCH1ZHWN1V0NVNVT4', 'blocked_entities debug field on ObserverSnapshot', 'Add blocked_entities field showing LOS-blocked entities for debugging in test client. Feasible per R2-OQ-05: ~300 tile lookups/tick. Backlog. Feasibility confirmed. Effort: 0.5d.', 'done', 'medium', NULL, 'server', NULL, '2026-02-17 12:58:13', '2026-02-18 11:45:52', NULL, '4171056bc1bb3488376c8a54d31315ac', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRYKH6GH346JC0YFXHW', 'task', '06FB0TNSRXCH1ZHWN1V0NVNVT4', 'Test client replay loading + tick-scheduled sending', 'Test client loads JSONL replay file (one JSON array per tick), sends PlayerInput at correct tick timing. Unblocks scripted Gauntlet testing. Location: tooling/test-client/. Target: Sprint 9. Effort: 0.5d.', 'done', 'critical', NULL, 'server', NULL, '2026-02-17 12:58:13', '2026-02-18 11:45:52', NULL, '4dad2a5f179cff03276bc6b042170d2d', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZGJFM7A1KM98JNJFW', 'task', '06FB0TNSRXCH1ZHWN1V0NVNVT4', 'Content scaling test (baseline + extra NPC comparative)', 'Test content additions don''t break existing functionality. Baseline run + extra NPC pack comparative. Target: Sprint 9. Effort: 1d.', 'done', 'high', NULL, 'server', NULL, '2026-02-17 12:58:13', '2026-02-18 11:45:52', NULL, 'b68e5784ac915df69323c10fc1da11ca', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRYQTFA4V0MQ72BPNWW', 'story', '06FB0TNSRZP5KQ8RHFQQZK1ZJ0', 'Audio asset set — 8 minimum viable files via Stable Audio Open', '8 OGG Vorbis files via Stable Audio Open: (1) amb_station_base 60-90s station hum/span gate vibration, (2) amb_workplace_layer 45-60s cargo machinery, (3) amb_bar_layer 45-60s conversation murmur, (4) amb_corridor_layer 45-60s echoing footsteps/ventilation, (5) sfx_footstep_metal 0.3-0.5s walk, (6) sfx_footstep_metal_run 0.2-0.3s run, (7) sfx_monologue_chime 0.5-1.0s crystalline insight tone, (8) sfx_monologue_chime_urgent 0.5-1.0s sharper variant. Monologue chime is NON-NEGOTIABLE per Ozzie. Owners: TBD. Proposed by: Mellanie, Ozzie, Gestalt. Workshop: content-gap-analysis v0.1 R2.', 'done', 'high', NULL, NULL, NULL, '2026-02-11 19:29:55', '2026-02-18 11:54:02', NULL, '58d54c693db51b47105e4d3a5f0d60a2', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRXZ0RTH4YZ3CFVHST4', 'story', '06FB0TNSRXCH1ZHWN1V0NVNVT4', 'Gauntlet next 3-4 rooms (Interaction Gallery, Fog Theater, Crowd Plaza, Dialogue Room)', 'Implement rooms 1,4,6,7: Fog Theater (44x32, 4 entities, D-059), Interaction Gallery (24x20, 5 entities, D-057), Dialogue Room (28x20, 4 entities, D-041), Crowd Plaza (32x32, 15 entities, density stress). Target: Sprint 9. See workshop-outcomes.md Section 4. Effort: 2-3d.', 'done', 'high', NULL, 'server', NULL, '2026-02-17 12:58:13', '2026-02-18 11:56:20', NULL, 'b5ece76abc77fc3abf8a71e423bcdc79', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRY566JP7J4J75BXBCM', 'story', NULL, 'Client: mouse-relative facing and movement (D-054)', 'D-054 specifies: Mouse facing is a client-side float; the server receives the facing octant only. Currently WASD uses fixed cardinal directions (W=North, D=East, etc.) and facing comes from the server based on last movement direction. Scope: (1) Track mouse position relative to player sprite, compute continuous facing angle. (2) Derive 8-direction octant from mouse angle, send to server as player facing. (3) Remap WASD to be relative to mouse facing — W moves toward mouse, S away, A/D strafe. (4) Update entity_renderer facing indicator to use client-side mouse angle. (5) Update InputMapper to produce relative movement actions instead of absolute cardinal ones. Files: input_mapper.gd, game_state.gd, entity_renderer.gd, sim_bridge.gd', 'done', 'high', NULL, 'client', 'D-054', '2026-02-18 10:50:35', '2026-02-18 17:36:17', NULL, '21b52a3eaefc22a2cee1a9473884ce7b', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRY6237HX7Y1DCQ5F98', 'task', '06FB0TNSRXCH1ZHWN1V0NVNVT4', 'Auto-checklist progress tracking (client-side snapshot evaluation)', 'Client evaluates ObserverSnapshot against checklist conditions, auto-tracks verification items. Full tracking in test-client-only (lightweight overlay in Godot per R2-OQ-06). Target: Sprint 9. See stig-round3.md. Effort: 1d.', 'done', 'high', NULL, 'client', NULL, '2026-02-17 12:58:13', '2026-02-18 17:36:17', NULL, '84324fbd2ae141f46b733c2ee543a2ff', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRX2B477TX0X89N2ASC', 'task', '06FB0TNSRXCH1ZHWN1V0NVNVT4', 'Room reset client UX (reset plate tile, interaction verb, amber flash)', 'Client-side: amber reset_plate tile rendering, ''Reset Room'' interaction verb, 0.15s amber flash + monologue ''Systems recalibrated.'' on reset. Target: Sprint 9. See workshop-outcomes.md Section 8. Effort: 0.5d.', 'done', 'high', NULL, 'client', NULL, '2026-02-17 12:58:13', '2026-02-18 17:36:17', NULL, '9936968c92d927067460fc3c68bfe867', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRWKRPR9CPRJ0TJJREM', 'task', NULL, 'Introduce Michroma as game font', 'Install and integrate the Michroma font (https://fonts.google.com/specimen/Michroma) as the primary game font for The Settled Reach.
Acceptance criteria:
- Download Michroma font files from Google Fonts
- Add font files to the Godot client asset directory (client/assets/fonts/)
- Configure Michroma as the default theme font in Godot
- Update any existing label/text nodes to use the new font resource
- Verify rendering at key UI sizes (HUD, menus, dialogue)
Implementation notes — "Implant" styling:
- Wide-screen letter spacing: Increase tracking (letter-spacing) by ~5-10% to give the font a clinical, high-end neural overlay OS feel. Michroma looks best with room to breathe.
- Alpha pulse: Subtle opacity animation pulsing between 85-100% alpha to make the UI feel alive — connected to the character heartbeat or power supply.
- Color grading: Avoid pure white (#FFFFFF). Use a slight cyan-white (#E0F7FA) or pale amber (#FFF8E1) to mimic light projected through a lens or onto a retina.
NOTE: Alpha pulse and color grading are first-implementation specs — subject to revision in a future design workshop.', 'done', 'high', NULL, 'client', NULL, '2026-02-18 09:03:24', '2026-02-18 17:36:17', NULL, 'a7f392a326a873d122d0085f38be35f4', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRY3T0G2JAFF9JF1RFR', 'task', '06FB0TNSRWYBGV0A6RBVS1NSP0', 'Client: wire insert open/close to PauseSimulation command', 'The server pause system (50%/0% tick rate) exists in #406. D-058 (D-03 resolved) confirms auto-pause in SP when the implant UI is open. Ticket #448 was cancelled before client-side wiring was done. Implement: when the Insert spoke of the world radial menu (#433) is selected and the implant overlay opens, client sends PauseSimulation (50% tick rate). On close, client sends Unpause. Server-side pause infrastructure is complete (#406). References: D-058, #406, #433.', 'done', 'medium', NULL, 'client', 'D-058', '2026-02-18 10:44:51', '2026-02-18 17:36:17', NULL, 'd83c9d811525c6e4099d4b8dee1ccf72', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRX2RFK7ESNMPZJT924', 'task', '06FB0TNSRXCH1ZHWN1V0NVNVT4', 'Gauntlet dev teleport — Home key resets to hub spawn (test-only)', 'Gauntlet-only: Home key sends TeleportToHub, instant camera snap + 0.3s fade-to-black-and-back, clears dialogue/monologue buffers. Gated behind gauntlet_mode flag — NOT available in production gameplay. Production fast-travel is diegetic (see Q-012). Effort: 0.5d.', 'done', 'high', NULL, 'client', NULL, '2026-02-17 12:58:13', '2026-02-19 08:10:46', NULL, '254c8ffe3eab45405505e1b80481a829', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRY5N07WNVMVAT48SCG', 'task', '06FB0TNSRWYBGV0A6RBVS1NSP0', 'Confrontation D-033 color shift — client-side entity tint on confrontation delivered', 'D-063 specifies entity D-033 color may fade after confrontation is delivered. This is a client rendering concern: the ObserverSnapshot will carry updated relationship state (from #520 server-side trigger); the client must apply the D-033 color palette change to the entity sprite/overlay. The cursor entity-hover state also uses D-033 color (D-056) so both cursor tint and entity outline tint must update. Blocked by: #520 (server-side ConfrontationDelivered event that changes relationship state in snapshot).', 'done', 'medium', NULL, 'client', 'D-063', '2026-02-18 10:45:21', '2026-02-19 08:10:46', NULL, 'd53f9bd3eddcaee15609c9cd3567c0c1', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZZYEAMAY9J3FT0AKC', 'task', '06FB0TNSRXCH1ZHWN1V0NVNVT4', 'Content scaling stress test (100 ticks, max-NPC pack, tick budget)', 'Performance stress test: 100 ticks with maximum entity count, verify tick budget holds. Backlog. Effort: 1d.', 'done', 'medium', NULL, 'server', NULL, '2026-02-17 12:58:13', '2026-02-19 08:55:19', NULL, '22080b1f3ad592f1197f5c09c1ead0d3', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRYKVZWANWVPP5X3T14', 'story', '06FB0TNSRXCH1ZHWN1V0NVNVT4', 'WRONG button full captures (input history ring buffer, snapshot history, replay seed)', 'Full bug reproduction: 60-tick ring buffer, input history, replay seed, room metadata. Backlog. See ozzie-round3.md. Effort: 1.5d.', 'done', 'medium', NULL, 'client', NULL, '2026-02-17 12:58:13', '2026-02-19 11:38:22', NULL, '22c795203172c284ff6e4f12a06c428e', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRXW2S9W0KAZ8VAVZKC', 'story', '06FB0TNSRXCH1ZHWN1V0NVNVT4', 'Gauntlet rooms: Sprint Gauntlet, Eavesdrop Alcove, Confrontation Stage', '3 additional Gauntlet rooms focused on interaction combination coverage. Backlog. See workshop-outcomes.md Section 4. Effort: 3d.', 'done', 'medium', NULL, 'server', NULL, '2026-02-17 12:58:13', '2026-02-19 11:38:22', NULL, '30ad0e068761cf6c63487665135b110e', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRW4GQV9WJ6SQCTDKPR', 'task', '06FB0TNSRWYBGV0A6RBVS1NSP0', 'Contraband detection — NPC scan checks carried items + KG', NULL, 'done', 'medium', NULL, 'server', 'D-065', '2026-02-13 21:05:38', '2026-02-19 11:38:22', NULL, '3cbe9cace099530b2ebd4554373222e4', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRWE9QKVCFA206Z2GC0', 'task', '06FB0TNSRWYBGV0A6RBVS1NSP0', 'Resolve OQ-07: no-insert interaction behavior (diegetic test)', 'D-056 and D-057 both reference a diegetic test: labels (interaction prompts) should disappear if the insert is off, and render on z-layer 6 (insert overlay). OQ-07 asks: does a character WITHOUT an insert get NO interaction prompts? Or does the cursor still change shape? Decision needed: (a) cursor reverts to default shape only (no tooltip/verb labels), or (b) cursor does not change at all, or (c) prompts are available via non-insert fallback. Resolve and implement in the entity interaction vertical list (#432) and cursor state machine (#429).', 'done', 'low', NULL, 'client', 'D-056', '2026-02-18 10:45:24', '2026-02-19 11:38:22', NULL, '448b23d351ec277d3aad6cf2821c8b9a', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRX4YMQWZY8CF3KCNM4', 'task', '06FB0TNSRXCH1ZHWN1V0NVNVT4', 'Cross-room transition test scenarios (T1-T8 from Gestalt)', '8 cross-room transition tests: Sprint Exit, Inventory Interact, Pause Anywhere, etc. Tests system combination bugs at room boundaries. Backlog. See gestalt-round3.md. Effort: 2d.', 'done', 'medium', NULL, 'server', NULL, '2026-02-17 12:58:13', '2026-02-19 11:38:22', NULL, '7bfff6da2d164e50f0e72ed6a851e505', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZWAZVHV692V3XPGCM', 'task', '06FB0TNSRWYBGV0A6RBVS1NSP0', 'Resolve OQ-18: dialogue access tiers vs D-041 confidence hierarchy (same or layered)', 'D-028 defines 4 dialogue access layers (surface/real/secret/unprompted). D-041 defines 4 KG confidence tiers (Suspects/KnowsOf/KnowsDetails/Direct). OQ-18 asks: are Nigels dialogue access tiers (per character archetype) the same system as D-041 confidence hierarchy, or a layered system on top? The dialogue selection pipeline (#305) filters by confidence tier already. Decision needed: (a) same system - archetype access tiers map directly to KG confidence tiers, or (b) layered - archetype adds a second gating dimension (e.g., detective can always access surface regardless of KG confidence, smuggler needs KnowsOf minimum). Resolve and document, then update #305 if filtering logic changes.', 'done', 'medium', NULL, 'server', 'D-041', '2026-02-18 10:45:27', '2026-02-19 11:38:22', NULL, '98a47e2642d7e57f3ed827ecfb76c3f7', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRW20JG94GTGT091QSM', 'story', '06FB0TNSRXXVCGN5D35ZJ7M0MW', 'Knowledge state vocabulary for v0.1', 'List of knowledge flags for monologue prerequisites (e.g. knows:smuggling_operation, met:kael_davan, suspects:manifest_discrepancy). Hierarchy: suspects < knows_of < knows_details. Blocks monologue authoring — Mellanie cannot write lines with prerequisites referencing invented strings. Owners: Gestalt + Dudley. Proposed by: Mellanie, Gestalt. Workshop: content-gap-analysis v0.1 R2.', 'done', 'high', NULL, 'copy', NULL, '2026-02-11 19:28:37', '2026-02-19 12:00:31', NULL, 'ca9a71cd396ae9269f0283f987d600a8', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZFHAX1CBESJ10WYJ4', 'story', '06FB0TNSRWABN2YJ0SNKRW9D7G', 'Tier marker components', 'ActiveSim, BackgroundSim, StateSaved components. Tag-based tier identification.', 'done', 'critical', NULL, 'server', NULL, '2026-02-10 23:19:08', '2026-02-19 12:33:04', NULL, '12115e5a0f5d7be952d2048b8f5d25ca', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZ6DMXDM2M1VTPHM5C', 'story', '06FB0TNSRZP5KQ8RHFQQZK1ZJ0', 'Sound event system - server', 'Sound event system: SoundEventEmitter emits typed events (Footstep, Voice, Machinery, Alert, Ambient) with position, intensity, range_category (Close/Medium/Long). Client AudioAssetRegistry maps types to files; missing assets get visual indicator + monologue trigger. AmbientManager for location loops with crossfade. v0.1: 8 audio files. Scales from 0 to hundreds without structural changes. Source: Gestalt+Ozzie content-gap-analysis v0.1 R2.', 'done', 'high', NULL, 'server', NULL, '2026-02-10 23:20:58', '2026-02-19 12:33:05', NULL, 'd3899c3a41c4c843b574500872432e62', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRWQ3N199PQVDTEYSXM', 'task', '06FB0TNSRW1VJS6GTSSYHK63F8', 'Fix entity_renderer.gd field name bug (id vs entity_id)', 'Line 19 of entity_renderer.gd checks entity_data.has("id") but Protocol returns entity_id. This causes all entities to be silently dropped. Change check to entity_data.has("entity_id").\n\nEffort: XS\nCodebase: client\nSource: Architecture Review Audit 2026-02-11 (critical bug)\nSprint: 1', 'done', 'medium', NULL, 'client', NULL, '2026-02-11 20:27:17', '2026-02-19 13:53:18', NULL, '267504ddceeac995d8224e6b756ba310', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRWA9XAABTGAJ3EF628', 'story', '06FB0TNSRZP5KQ8RHFQQZK1ZJ0', 'Medium-range visual indicators', 'Fog-edge directional indicators. Arrow/icon at map edge. Triggers monologue description.', 'done', 'high', NULL, 'client', NULL, '2026-02-10 23:20:58', '2026-02-19 13:53:18', NULL, '2f2c8f612dd4937ae99f16c3cf094455', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRXBW7X8KQ29SGEGH78', 'task', '06FB0TNSRWYBGV0A6RBVS1NSP0', 'Resolve OQ-29: dialogue max-width pixel value', NULL, 'done', 'low', NULL, 'client', NULL, '2026-02-13 21:07:03', '2026-02-19 13:53:18', NULL, 'd75782ffb86aedc447ac9c395170842c', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRXQP0JFNRX4NJ3SFT0', 'story', '06FB0TNSRZP5KQ8RHFQQZK1ZJ0', 'Close-range stereo audio - client', 'Play 2D positional audio for events within LOS or near player. Maps to screen space for fixed camera.', 'done', 'high', NULL, 'client', NULL, '2026-02-10 23:20:58', '2026-02-19 13:53:18', NULL, 'fa11944b251bcd19cb4109c856cd6853', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRX80Y4P5CF160QKRW0', 'story', '06FB0TNSRW1VJS6GTSSYHK63F8', 'v0.1 Visual Grammar Document', 'Root dependency for all visual work. One-page document codifying: (1) Color palette — 3 zone palettes (logistics hub cool, bar warm, corridors neutral) with hex values, (2) Entity sizing/proportions, (3) Label conventions, (4) UI layer hierarchy, (5) Fog rendering spec (visible/fog-edge/hidden/remembered), (6) Character-specific player entity colors (detective cool, smuggler warm). Zero image files — everything procedural. Zero dependencies — can start immediately. Supersedes #252 (placeholder art spec). Owner: Araminta. Proposed by: Araminta, Ozzie. Workshop: content-gap-analysis v0.1 R2.', 'done', 'critical', NULL, 'visual', NULL, '2026-02-11 19:27:35', '2026-02-19 13:54:00', NULL, '499cb3767f4f380312d745e0cb79c392', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRXPQVE0QJ9ZSD7E8XW', 'story', '06FB0TNSRYSBCPK60TQ60MMRVM', 'Spatial layout: Logistics Hub (The Terminal)', 'Tile-level floor plan with sightline analysis for Sova Logistics Hub (The Terminal). Zones: scanner bays, main corridor (chokepoint), manifest processing, break room, supervisor office (window), restricted storage (smuggling ops). Serves Triangle 1 (Hub Power) and Triangle 2 (Worried Knowledge). Public/semi-private/private areas mapped to access tiers. Owner: Araminta. Proposed by: Paula, Araminta. Workshop: content-gap-analysis v0.1 R2.', 'done', 'high', NULL, 'visual', NULL, '2026-02-11 19:28:39', '2026-02-19 13:54:00', NULL, '512df07da225f59d89d3fb17e34c71ff', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZ2RWD51E8PK287F6W', 'story', '06FB0TNSRW1VJS6GTSSYHK63F8', 'Placeholder art specification', 'Define tile size, sprite dimensions, color palette, animation frame requirements for placeholder art. Unblocks #133 (placeholder art pipeline). Source: Tyre R1 H-13.', 'done', 'high', NULL, 'visual', NULL, '2026-02-11 00:02:37', '2026-02-19 13:54:00', NULL, '5f06fea5ec38b125bafafda42dacd630', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRW46CPWDWYDHSY2NN4', 'story', '06FB0TNSRYSBCPK60TQ60MMRVM', 'Spatial layout: Bar (The Last Shift)', 'Tile-level floor plan for The Last Shift bar. Irregular layout from converted maintenance staging area. Key elements: long bar counter (high visibility), corner booth (key observation position seeing bar + card table + entrance + back room), scattered tables, news ticker display, back room (alley exit). Serves Triangle 3 (Bar Tensions) and Triangle 4 (Worried Partner). Owner: Araminta. Proposed by: Paula, Araminta. Workshop: content-gap-analysis v0.1 R2.', 'done', 'high', NULL, 'visual', NULL, '2026-02-11 19:28:40', '2026-02-19 13:54:00', NULL, '5f602dac0b9da19ff1386588f4ad7305', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRX4MAGD07VXN8BZTP8', 'story', '06FB0TNSRYSBCPK60TQ60MMRVM', 'Spatial layout: Smuggling spaces and transition corridors', 'Smuggling spaces are NOT a separate building. Ring operates in: restricted storage (hub), maintenance corridors, dead-drop locations. Includes transition corridors between hub and bar district (40m chokepoint). Design principle: ring is invisible — meeting points have mundane purposes, function only apparent if you know what to look for. Same physical space, different player understanding. Owner: Araminta. Proposed by: Paula, Araminta. Workshop: content-gap-analysis v0.1 R2.', 'done', 'high', NULL, 'visual', NULL, '2026-02-11 19:28:41', '2026-02-19 13:54:00', NULL, 'e91765345cbe96aff0d84af3b04a4549', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZ93GH7R12BBCRTCP0', 'story', NULL, 'Add rng_seed field to ObserverSnapshot for deterministic replay', 'The WRONG button (#507) ring buffer captures inputs.jsonl and seed.txt for replay, but seed.txt currently writes ''unavailable'' because the server does not include rng_seed in ObserverSnapshot. Add rng_seed: u64 to ObserverSnapshot with serde default for backward compat. Client already parses this field. Enables deterministic replay from bug reports.', 'done', 'medium', NULL, 'ci', NULL, '2026-02-19 11:40:17', '2026-02-19 14:40:50', NULL, '230b509eecce221e79bf1f2f662184bb', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRW55EQ3RWEPENSWTNR', 'story', '06FB0TNSRWABN2YJ0SNKRW9D7G', 'Active tier simulation', 'Full behavior systems run at 10-20 ticks/sec for Active NPCs. Movement, perception, decision-making.', 'done', 'critical', NULL, 'server', NULL, '2026-02-10 23:19:08', '2026-02-19 14:40:50', NULL, '37dab004976aab4e86a59dadfb96651c', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRXF4NPQG9AX7Y8D15M', 'task', '06FB0TNSRXG2Z9ZAR42SQ9GNP4', 'System dependency graph debug command', 'Write print_system_graph debug command that dumps bevy_ecs schedule ordering and component access patterns. Run in CI and diff across commits to catch unintended system reordering.\n\nEffort: S\nCodebase: server\nSource: Architecture Review Audit 2026-02-11\nSprint: 2+', 'done', 'medium', NULL, 'ci', NULL, '2026-02-11 20:27:25', '2026-02-19 14:40:50', NULL, '3df08e470cb2d2d299bccacb5c12e7df', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZPZT0P5DGTGV652GC', 'story', '06FB0TNSRXVMATNG8QEJVVVCH0', 'Information tag schema', 'Define ObserverAccess tags. Public, OwnerOnly, FactionOnly, RelationshipGated, etc. Component metadata.', 'done', 'critical', NULL, 'server', NULL, '2026-02-10 23:21:35', '2026-02-19 14:40:50', NULL, '426c13f18c7c8954cfdcd940e6c73281', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRX7GHHRN0Y1SM8S514', 'task', '06FB0TNSRZ5AP28E96W00KB0R4', 'Ban HashMap in simulation crate via clippy', 'Add clippy::disallowed_types lint for std::collections::HashMap in simulation code. Use BTreeMap or IndexMap for deterministic iteration order. Critical for deterministic simulation.\n\nEffort: XS\nCodebase: server\nSource: Architecture Review Audit 2026-02-11\nSprint: 1', 'done', 'critical', NULL, 'ci', NULL, '2026-02-11 20:27:04', '2026-02-19 14:40:50', NULL, '7c36cb94be21b029d0800f9c0f60fe23', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRX2MF6BK4TCME7BZ1M', 'task', '06FB0TNSRZ5AP28E96W00KB0R4', 'Set up tracing crate infrastructure', 'Set up tracing crate for server instrumentation. Configure structured logging for:\n- Tick duration\n- Per-system timing\n- Bridge I/O metrics\n- Entity tier transitions\n\nOutput to stdout in development, file in production.\n\nEffort: S\nCodebase: server\nSource: Architecture Review Audit 2026-02-11\nSprint: 1', 'done', 'high', NULL, 'ci', NULL, '2026-02-11 20:27:09', '2026-02-19 14:40:50', NULL, '834c8572fa31618fc7878eadee62291d', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRX6X5GNFTE8TRQJD4W', 'story', '06FB0TNSRWABN2YJ0SNKRW9D7G', 'Tier transition logic', 'Promote StateSaved → Background → Active on player approach. Demote Active → Background → StateSaved on departure. ~2-5ms reactivation budget.', 'done', 'high', NULL, 'server', NULL, '2026-02-10 23:19:08', '2026-02-19 14:40:50', NULL, '914b58ba38144490ab8bbad81acaec56', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRXMG70XFP459RMTVTW', 'story', '06FB0TNSRY449C3GAXT7PKDSY0', 'Line previewer CLI - Tyre', 'CRITICAL AUTHORING TOOL. Rust CLI sharing code with dialogue pipeline. MVP: (1) Load YAML, (2) Set filter context via CLI, (3) Show matching lines, (4) Show selected line, (5) Explain mode, (6) Sequence mode for walk-throughs, (7) Coverage report, (8) Batch validation. Build AS the first dialogue pipeline implementation. Source: Gestalt+Mellanie+Ozzie content-gap-analysis v0.1 R2.', 'done', 'critical', NULL, 'server', NULL, '2026-02-10 23:25:57', '2026-02-19 14:40:50', NULL, 'd502cc53f7c37fd72545a0193c8a8828', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRWJPME1T6BJ3D96NAW', 'story', '06FB0TNSRXVMATNG8QEJVVVCH0', 'Component-level access control', 'Tag ECS components with observer access rules. Query filters respect tags.', 'done', 'critical', NULL, 'server', NULL, '2026-02-10 23:21:35', '2026-02-19 14:40:50', NULL, 'f4caebcf13a58bc7ecaecaa1245c1687', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZ1PBRSRBRK1JRCWN4', 'task', '06FB0TNSRXVMATNG8QEJVVVCH0', 'Knowledge vocabulary for v0.1 content (#309)', 'Content authoring vocabulary document from D-041 Appendix A. Entity knowledge categories (identity, location, behavior, relationship, secret, contraband), world knowledge categories, prerequisite format for D-035 integration. Unblocks content team ticket #309. Estimate: 0.5 day.', 'done', 'medium', NULL, 'copy', NULL, '2026-02-11 22:14:35', '2026-02-19 14:43:49', NULL, '030af67c4851ac911b320b0b70f41641', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRXED5R4YN30122XVSM', 'story', '06FB0TNSRXZK7C4X2DHQ6A0CKR', 'Diegetic insert flavor text — per character', 'Character-specific insert labels and notification strings. Smuggler: Msg from Kael, Drop point updated. Detective: Case file update: Subject Davan, Commission advisory. POI labels, status text different per character. Owners: Mellanie + Araminta. Proposed by: Ozzie. Workshop: content-gap-analysis v0.1 R2.', 'done', 'medium', NULL, 'copy', NULL, '2026-02-11 19:30:03', '2026-02-19 15:11:36', NULL, '2b01cd88037c5759d203e5bf6e7c3f0b', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRYPY3A0W8ZS0253TVG', 'story', '06FB0TNSRY449C3GAXT7PKDSY0', 'Environmental text content', 'Signs, terminals, documents, and readable objects in social sites. Provides world-building texture and investigation clues. Both characters can read them but interpret differently. Source: Gestalt R2 M-3.', 'done', 'medium', NULL, 'copy', NULL, '2026-02-11 00:03:49', '2026-02-19 15:11:36', NULL, '6072db6c8f4cc63669113fe503a2c50d', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRXN08MT2E7JXYEEKQ0', 'story', '06FB0TNSRY449C3GAXT7PKDSY0', 'Flat NPC memorable trait pass — 3 flat NPCs', '3 flat NPCs (Pael/maintenance tech, Ren/drifter, Tev/lookout) each need: one memorable trait, one seems-important-but-isnt line, visible routine. Without this, the 30/50/20 investigation noise floor collapses — flat NPCs must be indistinguishable from signal at first glance. Owners: Paula (traits) + Mellanie (lines). Proposed by: Ozzie. Workshop: content-gap-analysis v0.1 R2.', 'done', 'high', NULL, 'copy', NULL, '2026-02-11 19:28:35', '2026-02-19 15:11:36', NULL, '85a0cd3a9cb88feb9d3c589cf947cada', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZ2BXA2076G20HNSE8', 'story', '06FB0TNSRYWW5RMQFT9VNSFSZW', 'Span Gate Transit Schedule', 'How often the gate cycles, peak times, maintenance windows. The freight rhythm is the districts heartbeat — NPC routines depend on it, ring operational timing depends on it. Owner: Miri. Proposed by: Miri. Workshop: content-gap-analysis v0.1 R2.', 'done', 'medium', 'miri', 'copy', NULL, '2026-02-11 19:30:04', '2026-02-19 15:16:35', NULL, '26b8f7c237fb920d82931486bc6bda2e', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRXXYKE81H6F50XY388', 'story', '06FB0TNSRYWW5RMQFT9VNSFSZW', 'Contraband specification — lattice components + supply chain', 'Primary: unlicensed lattice components (aftermarket neural mods bypassing Commission regulation). Secondary: Severance counter-surveillance tech, off-manifest biologicals. Includes medical-grade neural replacements (humanitarian dimension). Supply chain: aftermarket manufacturers > freight networks > local distributors > end users. The ring is smuggling ACCESS not weapons — moral ambiguity core. Owner: Miri. Proposed by: Miri. Workshop: content-gap-analysis v0.1 R2.', 'done', 'high', 'miri', 'copy', NULL, '2026-02-11 19:29:48', '2026-02-19 15:16:35', NULL, '311ea1a9062c185210c69831a2fc8078', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRW87QVJF76P542XZB0', 'story', '06FB0TNSRYWW5RMQFT9VNSFSZW', 'Sova Station Profile — station beyond Transit District', 'Station beyond the Transit District. Type, population (~12,000), districts, governance. NPCs reference wider station — dialogue needs to know whats off-district. Owner: Miri. Proposed by: Miri. Workshop: content-gap-analysis v0.1 R2.', 'done', 'high', 'miri', 'copy', NULL, '2026-02-11 19:29:48', '2026-02-19 15:16:35', NULL, '8e679d607e9390fda83f12a25d18df94', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRWXQYFHW0T7EM44A5M', 'story', '06FB0TNSRY449C3GAXT7PKDSY0', 'Cultural generation guide - Miri', 'BLOCKING DEPENDENCY. Cultural voice variation guide. Sova Transit District in Krenn System is the FIRST CONCRETE INSTANCE — Miri Round 1 output IS the v0.1 slice. Includes naming conventions, economic texture, institutional presence. Needs formalization into standalone document. Workshop: content-gap-analysis v0.1 R2.', 'done', 'critical', 'miri', 'copy', NULL, '2026-02-10 23:25:57', '2026-02-19 15:16:35', NULL, 'd5ef256069ba4e636210ff8615518ee5', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRW4Q684Y5QNFXM83QM', 'story', '06FB0TNSRY449C3GAXT7PKDSY0', 'Sova Texture Appendix — slang glossary, idioms, sensory details', '1-page appendix to Sova setting brief. Covers: (1) Slang glossary 15-20 terms — do workers say shift or rotation, credits or local term, container or pod, (2) Informal decoration — graffiti, stickers, locker personalization, (3) The local complaint — ventilation in Sector 3, (4) Meridian self-censorship rules — what cant be said on public channels, (5) Food/drink specifics, (6) Additional sensory details. Blocks Mellanie environmental text and monologue authoring. Owner: Miri. Proposed by: Mellanie, Miri. Workshop: content-gap-analysis v0.1 R2.', 'done', 'critical', 'miri', 'copy', NULL, '2026-02-11 19:27:34', '2026-02-19 15:16:35', NULL, 'fe0a54f83a73546148ec7509a5b1b610', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRWRN4976CQMHZB76SG', 'story', '06FB0TNSRY449C3GAXT7PKDSY0', 'News ticker / Meridian feed content — 20-30 lines', '20-30 ticker lines for Sova Transit District. 3 types: Concord Assembly proceedings, freight market prices, Commission notices. Setting-consistent per Miri. Cheapest wow-per-word in the project. Dual-lens: same ticker triggers different monologue reactions. Owners: Mellanie + Miri. Proposed by: Mellanie, Paula, Ozzie. Workshop: content-gap-analysis v0.1 R2.', 'done', 'medium', NULL, 'copy', NULL, '2026-02-11 19:28:34', '2026-02-19 15:19:48', NULL, 'ae29a4ba1dcdd228c94c71a963fdf6ee', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZ8M4WMT71QGRRGTAM', 'story', '06FB0TNSRYWW5RMQFT9VNSFSZW', 'Meridian Coverage Map for Sova Transit', 'Where coverage is strong, where it degrades, dead spots the ring exploits. Affects detective investigation capability, smuggler operational planning, NPC behavior (off-Meridian communication in dead spots). Owner: Miri. Proposed by: Miri. Workshop: content-gap-analysis v0.1 R2.', 'done', 'medium', 'miri', 'copy', NULL, '2026-02-11 19:30:04', '2026-02-19 15:22:18', NULL, '4c19dcef7cb50a2cfbfd6aa0b4a27f42', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRWH1WD5Y8GARPF54N8', 'story', '06FB0TNSRY449C3GAXT7PKDSY0', 'Mirror moment design document — 10-15 paired observations', '10-15 scripted dual-perspective observation triggers. Same event, different character monologue creating dramatic irony on replay. 7 core mirrors designed: The Friends Routine, The Empty Corridor, The Worried Partner, The Spending, Sera Leaving, The Hum, The Commission Kiosk. Plus 3-5 organic mirrors discovered during content review. Owners: Paula + Mellanie. Proposed by: Mellanie, Paula. Workshop: content-gap-analysis v0.1 R2.', 'done', 'medium', NULL, 'copy', NULL, '2026-02-11 19:30:03', '2026-02-19 15:26:43', NULL, 'c9cef65596b3c53d9bd629ffd6048005', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRWTHEDFB0CD8967N54', 'story', '06FB0TNSRY449C3GAXT7PKDSY0', 'First 5 minutes experience design', 'Define each character opening: where they wake up, first diegetic objective, opening monologue lines, who they meet. Not a cutscene — systemic opening using existing systems. The hook that determines whether the player keeps playing. Opening hooks should draw from seed-selected pool of 3-4 per character. Source: Gestalt R2, Ozzie R1+R2 H-9, Nigel R2.', 'done', 'high', NULL, 'copy', NULL, '2026-02-11 00:03:37', '2026-02-19 15:26:43', NULL, 'ccba126459471edaaa2d224aa72a321c', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRWAV1STSA218DS3CE4', 'story', '06FB0TNSRY449C3GAXT7PKDSY0', 'Contradiction arc design document — reusable FRIEND pattern', 'Reusable pattern document from THE FRIEND implementation. Defines: 3+ relationship phases with distinct monologue registers, observable contradiction discoverable through observation not dialogue, sympathetic motivation, no clean resolution, dual-lens resonance, triangle integration, 3+ tell progressions, pre/post-discovery dialogue pools. Owner: Paula. Proposed by: Paula. Workshop: content-gap-analysis v0.1 R2.', 'done', 'medium', NULL, 'copy', NULL, '2026-02-11 19:30:03', '2026-02-19 15:26:43', NULL, 'e3fc6e69fddc8284612625810fc20f7a', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZ7Y0MW0M8TPJ06W1W', 'story', '06FB0TNSRXTSZECBWTKBV2JYNG', 'Divergent relationships', 'Smuggler: friends with criminals, neutral to law. Detective: backed by institution, adversarial to criminals. Same NPCs, different trust.', 'done', 'critical', NULL, 'copy', NULL, '2026-02-10 23:24:52', '2026-02-19 15:26:49', NULL, '40d4299cfebbbdb858f134a2f08c5990', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRY7BFGTH8YHD4RZ6CG', 'story', '06FB0TNSRXTSZECBWTKBV2JYNG', 'Divergent starting knowledge', 'Smuggler knows criminals, workplace gossip. Detective knows institutional info, case files. Inverted information sets.', 'done', 'critical', NULL, 'copy', NULL, '2026-02-10 23:24:52', '2026-02-19 15:26:49', NULL, '51ba4145341aa9e296d57400eea1bf50', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZ63MHC8XAGJ8M8RDW', 'story', '06FB0TNSRXTSZECBWTKBV2JYNG', 'Detective character build', 'Institutional investigator. Authority access. Analytical skills. Smuggling ring as investigation target. NEEDS DESIGN DISCUSSION.', 'done', 'critical', NULL, 'copy', NULL, '2026-02-10 23:24:52', '2026-02-19 15:26:49', NULL, '7d1b76391c6a7f5da041ad91a279dcb1', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRXQ03D98NJ5BREAWAW', 'story', '06FB0TNSRXTSZECBWTKBV2JYNG', 'Detective institutional chain of command', 'Who assigned the investigation, stated mandate, political pressures. Was the previous Commission liaison rotation routine or arranged? Affects detective narrative arc — who they report to and what constraints they operate under. Owner: Miri + Paula. Proposed by: Miri, Paula. Workshop: content-gap-analysis v0.1 R2.', 'done', 'high', NULL, 'copy', NULL, '2026-02-11 19:29:48', '2026-02-19 15:26:49', NULL, 'aff659f8764be9c51782affca0257736', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRXCSQTX4C15MJRM8YC', 'story', '06FB0TNSRXTSZECBWTKBV2JYNG', 'Smuggler character build', 'Logistics worker. Insider access to workplace and smuggling ring. Social camouflage. Criminal templates as daily life. NEEDS DESIGN DISCUSSION.', 'done', 'critical', NULL, 'copy', NULL, '2026-02-10 23:24:52', '2026-02-19 15:26:49', NULL, 'b19650c2e676ad7021dc9040af0c74ea', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRW5PD4CQKCZM7YKTE8', 'story', '06FB0TNSRXTSZECBWTKBV2JYNG', 'Character definition schema', 'Define character structure: background, starting knowledge, relationships, access permissions, skills. Smuggler vs Detective specs. NEEDS DESIGN DISCUSSION.', 'done', 'critical', NULL, 'copy', NULL, '2026-02-10 23:24:52', '2026-02-19 15:26:49', NULL, 'f228b3b9671fe3a39eca35710532fedd', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRYD5D372H86T9YZHAC', 'story', '06FB0TNSRY449C3GAXT7PKDSY0', 'Opening hook content per character', 'Authored content for character-specific opening moments. Smuggler: contact messages, obligation pull. Detective: case file, investigation pull. Seed-aware pool of 3-4 opening situations per character for replay variation. Source: Gestalt R2, Ozzie R2, Nigel R2.', 'done', 'high', NULL, 'copy', NULL, '2026-02-11 00:03:37', '2026-02-19 15:28:18', NULL, '75d676f87e6878c21b50764d1cfeff48', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRWKVSJT4TJ98BHD3M8', 'story', '06FB0TNSRW1VJS6GTSSYHK63F8', 'Monologue display system visual spec', 'Visual spec for monologue display per #315 (existing backlog ticket). Typography, positioning, fade animation, stacking rules (max 3 visible), priority system. Character-differentiated color (smuggler warmer, detective cooler). This ticket is #315 — assigning to visual team and sprint 13.', 'cancelled', 'high', NULL, 'visual', NULL, '2026-02-19 15:32:41', '2026-02-19 15:32:45', NULL, 'f44c1224c4b2abb5a7f2f9d19cc951ca', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZKASP1MKDP6NJ5MJR', 'story', '06FB0TNSRY449C3GAXT7PKDSY0', 'Workplace content pack - Mellanie', 'Role voice kits for cargo workers, supervisors. Situation scripts (shift change, cargo issues, break conversations). Monologue hooks. Trait transformation guide. ~165-210 lines.', 'done', 'critical', NULL, 'copy', NULL, '2026-02-10 23:25:57', '2026-02-19 15:43:27', NULL, '0234bf4708a05f57573aff8d5bfd4485', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRXMY2QPKXAPTAFR544', 'story', '06FB0TNSRY449C3GAXT7PKDSY0', 'Generation pass expansion', 'LLM-assisted generation: authored lines as style anchors, 4x expansion. Human writes 10, generates 40. Background filler.', 'done', 'high', NULL, 'copy', NULL, '2026-02-10 23:25:57', '2026-02-19 15:43:27', NULL, '3db31ffff7a45908afecd3932cf41440', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRW1XVBCXJ2HZXFPPAW', 'story', '06FB0TNSRY449C3GAXT7PKDSY0', 'Bar content pack - Mellanie', 'Role voice kits for bartender, regulars. Social dialogue (40% more lines than investigation). Gossip pools. Flirting, tension, comfort. ~210-280 lines.', 'done', 'critical', NULL, 'copy', NULL, '2026-02-10 23:25:57', '2026-02-19 15:43:27', NULL, '8d0dd160b229f9857ca0ebfab6eefc00', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRXTF3D1608RD6F29DG', 'story', '06FB0TNSRY449C3GAXT7PKDSY0', 'Smuggling ring content pack - Mellanie', 'Role voice kits for criminals. Trust-gated disclosure. Coded language, paranoia, loyalty tests. Investigation target dialogue. ~165-210 lines.', 'done', 'critical', NULL, 'copy', NULL, '2026-02-10 23:25:57', '2026-02-19 15:43:27', NULL, 'db2f3bd5e49c0f2993a70a9199169363', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZ033BR2BT0ZPY38A8', 'story', '06FB0TNSRW1VJS6GTSSYHK63F8', 'Monologue display system visual spec', 'Typography, positioning, fade animation, stacking rules (max 3 visible), priority system (observation > atmosphere > tutorial). Character-differentiated color (smuggler warmer, detective cooler). Max ~80 chars per line. Gives Mellanie display constraints. Owner: Araminta. Proposed by: Araminta, Paula. Workshop: content-gap-analysis v0.1 R2.', 'done', 'high', NULL, 'visual', NULL, '2026-02-11 19:29:48', '2026-02-19 16:07:32', NULL, 'a1a741768d27cbbb359ac0cc976f1cfd', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRX6GNCC99AA5AXP9T4', 'task', '06FB0TNSRZP5KQ8RHFQQZK1ZJ0', 'NPC conversation murmur asset — event-driven World SFX bus wiring', 'Per D-072: NPC proximity murmur is a separate event-driven asset played on the World SFX bus. Single universal murmur asset (not zone-specific). Zone ambient determines conspicuousness: bar ambient buries it, corridor ambient exposes it. Inigo to produce the murmur asset via Stable Audio Open. Client wiring (event-driven playback) is a separate client ticket blocked by this one.', 'done', 'medium', NULL, 'audio', 'D-072', '2026-02-19 15:32:31', '2026-02-19 16:11:31', NULL, 'd631dfcb380afc48aef465813e7c1267', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRX2ZA0FJY7T6JRRMC4', 'story', '06FB0TNSRXCH1ZHWN1V0NVNVT4', 'Gauntlet rooms: Sound Lab, Decay Observatory, Shift Change', '3 Gauntlet rooms requiring sound system and knowledge decay implementation. Audio + decay + stress coverage. Backlog. Depends on sound system and knowledge decay systems. Effort: 3d.', 'done', 'medium', NULL, 'server', NULL, '2026-02-17 12:58:13', '2026-02-19 17:37:36', NULL, '8555395413f854eda34eb0fe6611c804', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRX053HVP30PA617MXG', 'task', '06FB0TNSRWYBGV0A6RBVS1NSP0', 'Resolve OQ-09: zone temperature memory — server-tracked or client-only', 'D-059 specifies deep fog (previously explored) carries a ~10% zone temperature tint (bar=warm dark, hub=cool dark, corridor=neutral dark). OQ-09 asks whether this is server-tracked (server sends zone temperature per tile in ObserverSnapshot) or client-only (client remembers last-visited zone and applies tint locally). Architectural decision affects the ObserverSnapshot protocol and whether zone temperature is diegetically accurate or a client heuristic. Decide and implement. If server-tracked: add zone_temperature field to snapshot. If client-only: implement in fog shader layer 3 using local visited-zone memory.', 'done', 'low', NULL, 'server', 'D-059', '2026-02-18 10:45:25', '2026-02-19 17:37:37', NULL, '791707008e3000871c23e2a9b0ac9c3e', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRWM3NWPAWQYZPG1E3C', 'story', '06FB0TNSRZP5KQ8RHFQQZK1ZJ0', 'Zone crossfade implementation — 1.5-2s tween on zone_id change', 'Implement zone audio crossfades per D-073. AudioManager receives zone_id from ObserverSnapshot tile data. On zone_id change: start 1.5-2s tween crossfading from current ambient layer to new zone ambient layer. Hard boundary trigger at tile entry. Interruptible. Zones for v0.1: hub/workplace, bar, smuggling corridor. Blocked by AudioManager full implementation.', 'done', 'high', NULL, 'client', 'D-073', '2026-02-19 15:32:15', '2026-02-19 17:46:07', NULL, '2d97043323500994fc4f219fe1e818fe', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRWM8J9RDHQ2GHRDGKM', 'story', '06FB0TNSRZP5KQ8RHFQQZK1ZJ0', 'AudioManager full implementation — 5-bus setup, directory registry, volume sliders', 'Implement the full AudioManager GDScript autoload singleton per D-068. 5 buses: Music, Ambient, World SFX, Player Actions, UI Sounds. Directory-scan registry: scan res://audio/ on startup, map filenames to AudioStream resources. No hardcoded asset list. No-op fallback if assets missing. 5 player-facing volume slider bindings for settings UI. Confirm bus routing: NPC conversation murmur -> World SFX, monologue chimes -> UI Sounds. Replaces the Sprint 7 stub with production-ready implementation.', 'done', 'high', NULL, 'client', 'D-068', '2026-02-19 15:32:09', '2026-02-19 17:46:07', NULL, '715c9e84d211feedd672742bacca2fef', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRXXZFW18397EPNKJ00', 'story', '06FB0TNSRZP5KQ8RHFQQZK1ZJ0', 'Audio dip profiles — dialogue, confrontation, ListeningFocus boost', 'Implement 3 audio dip profiles per D-069. Dialogue dip: Ambient -6 to -8dB, 300ms ease-in, 500ms ease-out. Confrontation dip: Ambient -10 to -12dB + low-pass filter 20kHz->800Hz, World SFX -4 to -6dB graduated, 500ms ease-in, 1000ms ease-out with filter sweep. ListeningFocus boost: World SFX +2 to +3dB when player stationary 30+ ticks (D-071). All values proportional to player slider settings, not absolute. Dips interruptible on walk-away or stance change. No UI indicator (D-070: felt not computed).', 'done', 'high', NULL, 'client', 'D-069', '2026-02-19 15:32:20', '2026-02-19 17:46:07', NULL, 'afe0ca5ce7794599f06db8506b2fcc87', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRYF8VKMDXXZYHXFSPG', 'story', '06FB0TNSRZP5KQ8RHFQQZK1ZJ0', 'Recognition chime — fires at cognitive delay onset (D-067)', 'Wire the recognition chime per D-067. Chime fires at ONSET of cognitive delay (D-060), not at completion. Duration 300-400ms, overlapping with start of 0.6s delay. Full sequence: (1) entity detected in fog -> (2) chime plays -> (3) cognitive delay begins -> (4) monologue text appears during delay -> (5) blob transitions to D-033 color + silhouette -> (6) recognition complete. Chime asset: monologue chime from D-038 assets 7-8, routed to UI Sounds bus. Client detects RecognitionTrigger in ObserverSnapshot and triggers the chime + delay sequence.', 'done', 'high', NULL, 'client', 'D-067', '2026-02-19 15:32:27', '2026-02-19 17:46:08', NULL, 'ad9c2e7d259de741857415831398ba6a', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRYEK8GP86CR8ATJGZG', 'task', '06FB0TNSRZP5KQ8RHFQQZK1ZJ0', 'Wire NPC conversation murmur to World SFX bus — event-driven playback', 'Client-side wiring for NPC conversation murmur per D-072. AudioManager plays murmur asset on World SFX bus when SimBridge receives conversation events from ObserverSnapshot. Single universal asset (produced by audio team, #532). Zone ambient provides natural conspicuousness: bar = buried, corridor = exposed. No zone-specific variants needed. Blocked by #532 (murmur asset).', 'done', 'medium', NULL, 'client', 'D-072', '2026-02-19 15:32:37', '2026-02-19 17:46:08', NULL, 'eae4c04f1daed0a47b13b36cc12f38e3', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRXJQAC0B1TCNPZMTQG', 'story', '06FB0TNSRW1VJS6GTSSYHK63F8', 'Text display hierarchy spec — 4 content pipelines', 'How dialogue, monologue, observation, overheard conversation, and environmental text each render distinctly. Four pipelines, four visual treatments. Dialogue: max ~100 chars in panel. Environmental: 8-40 char labels, up to 200 for terminals. News ticker: single scrolling line, ~60 char window. Owner: Araminta. Proposed by: Araminta. Workshop: content-gap-analysis v0.1 R2.', 'done', 'high', NULL, 'visual', NULL, '2026-02-11 19:29:48', '2026-02-20 17:49:05', NULL, '2c692f416e0e7adc8d1c0d3b0f4604dc', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRWHYR7G03JAGT4MXE0', 'story', '06FB0TNSRZP5KQ8RHFQQZK1ZJ0', 'Sound indicator visual design — fog-edge pulse', 'Fog-edge pulse indicators for the three-range sound model (D-018). Complementary to audio, not replacement. Color-coded: neutral #c8d0e0, voices #e8c547, danger #d45d5d. Shows sound direction — audio communicates something there, visuals communicate where. Owner: Araminta. Proposed by: Araminta. Workshop: content-gap-analysis v0.1 R2.', 'done', 'high', NULL, 'visual', NULL, '2026-02-11 19:29:48', '2026-02-20 17:49:05', NULL, '2cb6f5623b890faf7569ff511fba1cc2', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRX9S7MR707V6P0JZC0', 'story', '06FB0TNSRW1VJS6GTSSYHK63F8', 'Environmental text visual standards', 'How signage, terminals, news tickers render in-world. Bilingual treatment per Miri (Concordat Standard + Krenn vernacular). Character limits per format. Owner: Araminta. Proposed by: Araminta. Workshop: content-gap-analysis v0.1 R2.', 'done', 'medium', NULL, 'visual', NULL, '2026-02-11 19:30:04', '2026-02-20 17:49:05', NULL, '371f1dec2718f64f77eed3459a64e1fc', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZFSXSVYQ52ENGZ318', 'story', '06FB0TNSRW1VJS6GTSSYHK63F8', 'Tell visual/behavioral expression', 'Define how NPC behavioral tells manifest in the top-down renderer. Movement hesitation before entering rooms, route changes, grouping behavior, interaction changes. The visible starting point for the observation chain — without visual tells, the observation mechanic has no entry point. Source: Paula R1+R2 H-7, Ozzie R2.', 'done', 'high', NULL, 'visual', NULL, '2026-02-11 00:02:37', '2026-02-20 17:49:05', NULL, '37b64bc7da301eba0e468e60c4e19263', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRY2SC90Z82FMTAV9VR', 'story', '06FB0TNSRW1VJS6GTSSYHK63F8', 'THE FRIEND visual treatment spec', 'How THE FRIEND NPC looks different from other NPCs — through EARNED visual detail, not special marking. Phase 1: identical to other friendly NPCs (green rectangle), attachment built through monologue frequency and spatial proximity. Phase 2: color shift green to amber on contradiction discovery (0.5s fade) — should be FIRST relationship color change in session. Phase 3 (future): unique sprite, behavioral animations, memory echo. Owner: Araminta. Proposed by: Araminta. Workshop: content-gap-analysis v0.1 R2.', 'done', 'high', NULL, 'visual', NULL, '2026-02-11 19:29:48', '2026-02-20 17:49:05', NULL, '4554d235855d4b5dc88f38093885ac80', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZB2Q845VRMBY6PSV0', 'story', '06FB0TNSRW1VJS6GTSSYHK63F8', 'Entity Color System Spec — relationship-to-player mapping', 'Formal spec for approved color model: relationship states map to colors (unknown=teal #4a9ebb, known/friendly=green #6bc9a6, person-of-interest=amber #e8c547, hostile=red #d45d5d, static objects=grey #8b8ba0). Transition animations (0.5s fade). Edge cases (relationship change mid-observation). Key principle: red means danger TO YOUR CHARACTER, not abstract danger. Same NPC different color per character = asymmetric information rendered visually. Owner: Araminta. Proposed by: Araminta. Workshop: content-gap-analysis v0.1 R2.', 'done', 'critical', NULL, 'visual', NULL, '2026-02-11 19:27:37', '2026-02-20 17:49:05', NULL, 'de88f1f18b2fed7e93ebab97b76d6b9d', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRWWQ8NRQ78XBXWB83M', 'story', '06FB0TNSRXXVCGN5D35ZJ7M0MW', 'Tagged line pool structure', 'CONVERGED in workshop. YAML format with 6 structural tags (id, text, role, access, trust, situation) + 3 selection tags (topic, mood, freeform) + 2 authoring-only (dual_lens, notes). Monologue adds: character (hard partition), trigger (9 types), prerequisite. Access=list<enum>(public,insider,authority,peer,hostile). Trust=surface/real/secret. 13 situations, 9 topics, 8 moods. Location/type are directory/file-level. Source: Gestalt+Mellanie+Paula content-gap-analysis v0.1 R2.', 'done', 'high', NULL, 'copy', NULL, '2026-02-10 23:24:25', '2026-02-20 17:58:35', NULL, '1f3b8e7e0bbbc99590cb1968186ccba5', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRW530HGQS63CYT6Z70', 'story', '06FB0TNSRXXVCGN5D35ZJ7M0MW', 'Access tier shift design document', 'How access tiers change during gameplay. Per social site: 2-3 most likely tier transitions per character with triggers. E.g. Smuggler at hub: insider>hostile when cover blown. Detective at bar: public>insider after 3-4 visits. Content packs need lines for both starting AND shifted states. Owners: Paula + Gestalt. Proposed by: Paula, Gestalt. Workshop: content-gap-analysis v0.1 R2.', 'done', 'high', NULL, 'copy', NULL, '2026-02-11 19:29:55', '2026-02-20 17:58:35', NULL, '2611bfa19d962a5aa20006a930a7f1d1', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZQTMCVMNFT7EPVJHR', 'story', '06FB0TNSRWBH6313PF00570RGR', 'Character voice variation', 'Personality-driven line selection. Background-dependent phrasing (Guardian vs Senator vs Worker). Mood influence.', 'done', 'high', NULL, 'copy', NULL, '2026-02-10 23:20:40', '2026-02-20 17:58:35', NULL, '5f79e8102a77d591738add62c9e82bdd', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZN5WJGJZH23A67PWW', 'story', '06FB0TNSRXXVCGN5D35ZJ7M0MW', 'NPC-to-NPC overheard dialogue line pool', 'Write the line pool for NPC-to-NPC conversations that the player can overhear, per D-078. Lines must work both at full clarity and under partial occlusion (dropped words should not destroy meaning — prefer short declarative sentences, front-load key information). Requirements: (1) Minimum 40 exchange pairs covering social/work/gossip registers. (2) Each exchange is tagged with: speaker role, topic, relationship_type (colleague, friend, hostile, romantic), and knowledge payload (what the player could infer if they heard it clearly). (3) Lines must be self-contained per-turn — no exchanges that only make sense with both halves audible. (4) Avoid pronouns as sentence-openers (occlusion drops first word; pronoun loss breaks reference). Source: D-078.', 'done', 'high', NULL, 'copy', NULL, '2026-02-19 18:34:05', '2026-02-20 17:58:35', NULL, 'd19d002a7ccb86da1adfd3663d61678e', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZ3C19T8AAAP0J2H9M', 'story', '06FB0TNSRWBH6313PF00570RGR', 'Monologue line pool system', 'Categorized line pools: perception, atmosphere, tutorial, observation. Tag-based line selection.', 'done', 'high', NULL, 'copy', NULL, '2026-02-10 23:20:40', '2026-02-20 17:58:35', NULL, 'ea3b908f856983a8091acf1b003351dd', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRYQSX8A78C0YMQSP88', 'story', '06FB0TNSRWBH6313PF00570RGR', 'Monologue content architecture', 'Define monologue line pool structure, category tags, and authoring requirements. Identity-driven interpretation: monologue queries character interpretive frame (cares about, fears, responsible for), not just knowledge state. Includes tone progression tracking based on cumulative discoveries. Source: Gestalt R2 H-10, Paula R1 monologue tone progression, Gore R2 interpretive framing.', 'done', 'high', NULL, 'copy', NULL, '2026-02-11 00:02:40', '2026-02-20 17:58:35', NULL, 'fdfc011c02f69244bcd9b5c035e36711', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRYF23Q1ER9R7EWDYQG', 'story', '06FB0TNSRZG2K6AEST2W0ZVV3G', 'Routine execution system', 'Schedule-driven NPC movement. Location transitions at scheduled times. Activity state management.', 'done', 'high', NULL, 'server', NULL, '2026-02-10 23:19:21', '2026-02-20 18:31:35', NULL, '344ea8051641917d18856c91d896cf42', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZ9XTW1PKAC56W3WPR', 'story', '06FB0TNSRYTX3A5XSWREQ03KQW', 'NPC mood state machine', 'NPCs need mood component that changes based on simulation events (triangle pressure, time of day, recent interactions). Mood drives Layer 4 dialogue selection + tell system. 8 moods for v0.1: neutral, happy, tired, annoyed, nervous, defensive, friendly, cautious. Owner: Dudley. Proposed by: Gestalt. Workshop: content-gap-analysis v0.1 R2.', 'done', 'high', NULL, 'server', NULL, '2026-02-11 19:29:48', '2026-02-20 18:31:36', NULL, '0813c176347a3ea5db0cb5b2d3f7048c', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRWVMH15E45RTS4TPNR', 'story', '06FB0TNSRZG2K6AEST2W0ZVV3G', 'Relationship dynamics', 'Relationship values change over time. Interaction effects, decay, reinforcement. Trust modification.', 'done', 'high', NULL, 'server', NULL, '2026-02-10 23:19:21', '2026-02-20 18:31:36', NULL, '0a4434bebc051339004d89b801296bc9', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZ8XNVYWMN5XTNF974', 'story', '06FB0TNSRYTX3A5XSWREQ03KQW', 'Trust progression system', 'Engine tracks trust level per player-NPC pair. Progression: surface > real > secret. Advances based on interaction quality and frequency. Must be observable (player senses trust improving). Feeds Layer 3 dialogue filtering. Owner: Dudley. Proposed by: Gestalt. Workshop: content-gap-analysis v0.1 R2.', 'done', 'high', NULL, 'server', NULL, '2026-02-11 19:29:55', '2026-02-20 18:31:36', NULL, '2236b1c69a5811c84df18e9e8bd63e95', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRY94H3ZSG1RG44H9J0', 'story', '06FB0TNSRWBH6313PF00570RGR', 'Monologue display - client', 'Text display area in HUD. Timed display, queue management. Readable but non-intrusive.', 'done', 'high', NULL, 'client', NULL, '2026-02-10 23:20:40', '2026-02-20 18:31:36', NULL, '2d4712f0e0edca7126ce8cf519f1ac22', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRYHCA80NJX3RM11CEG', 'story', '06FB0TNSRYTX3A5XSWREQ03KQW', 'Interaction tracking component', 'Per-NPC-pair counter: interaction_count, last_interaction_time, notable_events log. Drives Layer 2 situation activation (first_meeting requires count==0, repeated_visit requires count>=3). Owner: Dudley. Proposed by: Gestalt. Workshop: content-gap-analysis v0.1 R2.', 'done', 'high', NULL, 'server', NULL, '2026-02-11 19:29:55', '2026-02-20 18:31:36', NULL, 'a531dd8f2552b1509c214b09d1bebb4d', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRW60B8V86GD5WTC1GM', 'task', '06FB0TNSRXCH1ZHWN1V0NVNVT4', 'Map-agnostic invariant tests (36 invariants from Gestalt)', '36 invariants across 4 categories: structural (8), perception (5), population (8), simulation (8). Must hold for ANY valid map. Backlog. Depends on dynamic map system. See workshop-outcomes.md Appendix D. Effort: 3d.', 'done', 'medium', NULL, 'server', NULL, '2026-02-17 12:58:13', '2026-02-20 18:31:36', NULL, 'b89a7641c501e5d32238968bdfd1e057', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZCE1YPSYCB49S5DFR', 'story', '06FB0TNSRZG2K6AEST2W0ZVV3G', 'NPC-to-NPC conversation system', 'NPCs engage in conversations with each other that the player can observe and overhear. Generates sound events for the sound propagation model. Observable social interactions feed the observation pipeline. Source: Gestalt R2 H-4.\n\nD-078 scope addition: Emit conversation events to the client with full metadata. Each ConversationEvent on ObserverSnapshot must carry: occluded_line: String (the NPC dialogue line with dropped words replaced by "..."), speaker_id: EntityId, target_id: EntityId, speaker_name: String, target_name: String. The server computes per-word occlusion before emission — the client receives pre-occluded text and renders it as-is.\n\nPer-word occlusion algorithm (server-side, D-078 amendment): iterate the dialogue line word by word. For each word, perform an independent Bernoulli trial using a seedable RNG (seeded per tick for deterministic replay, D-010). The per-word drop probability is derived from three inputs at the moment of emission: (a) tile distance from player to the speaking NPC — linear decay from 0.0 drop probability at 0 tiles to 1.0 at the Voice sound range boundary; (b) ambient noise level at the player position (already tracked in ObserverSnapshot.ambient_noise) — adds up to 0.3 to drop probability; (c) whether the player entity has ListeningFocus stance active — subtracts 0.2 from drop probability (clamped to [0.0, 1.0]). Words that fail the trial are replaced with "..." in occluded_line. The client receives only occluded_line and renders it verbatim — no stochastic logic on the client.\n\nWhen a conversation ends (NPC departs zone or duration expires), emit a conversation_end event with the same pair IDs so the client can dismiss the panel. Trigger witness_interaction on the player observation pipeline whenever the player receives any conversation event (regardless of occlusion level).\n\nNo dialogue content needed in this ticket — content is sourced from the NPC-to-NPC line pool (#536, copy team, Sprint 14).\n\nDelivery: NpcConversation state component, run_npc_conversations system, Voice SoundEvent emission, ConversationEvent struct with occluded_line on ObserverSnapshot, conversation_end event, per-word occlusion function with seedable RNG, tests: npc_conversation_emits_voice_event_when_in_range, npc_conversation_terminates_when_apart, occlusion_drops_words_with_distance, occlusion_suppressed_by_listening_focus, occlusion_deterministic_with_same_seed. Blocks #535 (client).', 'done', 'high', NULL, 'server', NULL, '2026-02-11 00:02:28', '2026-02-20 18:31:36', NULL, 'd49ce4b59ca7786b863445867d923319', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRWNZKPD7R22ATR6ACM', 'task', '06FB0TNSRXCH1ZHWN1V0NVNVT4', 'F3 debug overlay (deferred — WRONG button covers same data)', 'Real-time debug overlay. Deferred indefinitely per Stig recommendation — WRONG button captures same data on demand without per-frame performance cost. Backlog. Effort: 1.5d.', 'done', 'medium', NULL, 'client', NULL, '2026-02-17 12:58:13', '2026-02-20 18:43:55', NULL, 'bbefdf68bfa2192585c23790f55ffca0', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRW0761103B7SRKWM64', 'story', '06FB0TNSRXXVCGN5D35ZJ7M0MW', 'Passive dialogue panel — overheard NPC conversation display', 'Render overheard NPC-to-NPC conversations in the dialogue panel in passive (read-only) mode. Consumes ConversationEvent from ObserverSnapshot (added by server #247). Requirements per D-078 (amended — occlusion is server-authoritative):\n\n(1) Speaker attribution: Display header as "Speaker → Target" (e.g. "Kael → Mira") using speaker_name and target_name from the event. Use the same attribution label slot as player conversation NPC-name display — no new layout region needed.\n\n(2) Pre-occluded text renderer: Render occluded_line as-is. The server has already performed per-word Bernoulli drops and replaced dropped words with "...". The client performs no stochastic logic — no clarity_score, no randf(), no per-word processing. Display the received string directly in the passive panel.\n\n(3) Read-only mode: The dialogue box must suppress response options and player input when displaying a passive conversation. No response list, no input capture. Player can still move freely.\n\n(4) Dismissal: On conversation_end event (or if player moves far enough that no ConversationEvent arrives for the NPC pair), dismiss via the standard 300ms fade (same Tween as walk-away fade, #437 done).\n\n(5) Monologue isolation: Monologue display (#122, z-layer 6) is unaffected. Do not route conversation text through the monologue display. The server triggers witness_interaction which may produce a monologue — that arrives separately via current_monologue and is rendered by #122 normally.\n\nBlocked by #247 — ConversationEvent struct must exist on ObserverSnapshot before this can be wired. Start with a stub event type and placeholder renderer if #247 is not yet landed.\n\nDelivery: passive mode in client/scripts/ui/dialogue_box.gd (or a new passive_dialogue.gd sibling), verbatim occluded_line render, speaker attribution header, conversation_end dismissal. Tests via Hoshe gdUnit4 harness: attribution renders correctly, occluded_line with "..." tokens renders verbatim, panel does not show response options in passive mode, dismisses on conversation_end.', 'done', 'high', NULL, 'client', NULL, '2026-02-19 18:33:58', '2026-02-20 19:11:36', NULL, '7f146d5db504fdf28d1bdfe0e138c708', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZPRKVBWAGJ1YQK0N4', 'story', '06FB0TNSRY449C3GAXT7PKDSY0', 'Opening hook content — smuggler first 5 minutes', 'First 10-15 tightly sequenced monologue lines for smuggler. Diegetic tutorial: teaches movement, fog, sound, NPC interaction, insert. Sets character voice. Establishes motivation. Opening sequence: station hum playing, NPCs already moving, first named NPC encounter (Kael), first news ticker glance, first environmental text read. The most important content in the game — blocks all playtest feedback. Owner: Mellanie. Proposed by: Mellanie, Paula, Ozzie. Workshop: content-gap-analysis v0.1 R2.', 'done', 'critical', NULL, 'copy', NULL, '2026-02-11 19:27:31', '2026-02-21 13:04:30', NULL, 'f9bc8501699335e968a8b67ed5f28a67', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRXNRRPPXATWKN36P7G', 'story', '06FB0TNSRXXVCGN5D35ZJ7M0MW', 'Layer 1: Access tier filtering', 'Insider/outsider/authority/peer filters. Every line tagged. Basic conversation gating.', 'done', 'high', NULL, NULL, NULL, '2026-02-10 23:24:25', '2026-02-21 13:04:31', NULL, '0181764e0ba8a901e1cff58216a2a9cf', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRY70CNK7T122YKPAEM', 'story', '06FB0TNSRY449C3GAXT7PKDSY0', 'Opening hook content — detective first 5 minutes', 'First 10-15 tightly sequenced monologue lines for detective. Different emotional register and tutorial pathway from smuggler. Detective arrives into established rhythm (mid-morning). First NPC contact mediated by institutional insert. Sets analytical voice, institutional backing, outsider perspective. Blocks all playtest feedback. Owner: Mellanie. Proposed by: Mellanie, Paula, Ozzie. Workshop: content-gap-analysis v0.1 R2.', 'done', 'critical', NULL, 'copy', NULL, '2026-02-11 19:27:32', '2026-02-21 13:04:31', NULL, '95f7f798754d49e45170fc5beef58b4a', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRY5YQCZ9X24658PMP8', 'story', '06FB0TNSRXXVCGN5D35ZJ7M0MW', 'Layer 2: Relationship history', 'Interaction log per NPC pair. Modifies greeting, topic selection. First meeting vs established vs tense.', 'done', 'high', NULL, NULL, NULL, '2026-02-10 23:24:25', '2026-02-21 13:04:32', NULL, 'a9babf4e0b9a25e76379767700ba35d3', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZE7GWEHDNZCJ7ZJW0', 'story', '06FB0TNSRXSR76QBJBBXKVGCQM', 'Entity sprite system', 'Sprite rendering for dynamic entities (characters, NPCs). Position sync from snapshot data.', 'done', 'critical', NULL, 'client', NULL, '2026-02-10 23:18:12', '2026-02-21 13:08:49', NULL, '7cff033ece16718b4dc85c74f97b5397', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRYK1KVB0FAC3PVPRH8', 'story', '06FB0TNSRXSR76QBJBBXKVGCQM', 'Tilemap rendering system', 'TileMap node setup, tile atlas management, multi-layer support for floors/walls/objects.', 'done', 'critical', NULL, 'client', NULL, '2026-02-10 23:18:12', '2026-02-21 13:08:49', NULL, '9039566e4ea988ce34718016f13be4be', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZN57PG5JGEJX1NQ1G', 'story', '06FB0TNSRXSR76QBJBBXKVGCQM', 'Input capture system', 'Keyboard/mouse input → semantic actions (MoveNorth, Interact, etc). Input buffer for network send.', 'done', 'critical', NULL, 'client', NULL, '2026-02-10 23:18:12', '2026-02-21 13:08:50', NULL, '4605115a15b78883679025840761022a', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRW74PFFWXCYT10Z6WG', 'story', '06FB0TNSRXSR76QBJBBXKVGCQM', 'Basic UI framework', 'HUD structure, text display areas for monologue, placeholder for insert/minimap.', 'done', 'high', NULL, 'client', NULL, '2026-02-10 23:18:12', '2026-02-21 13:08:50', NULL, 'e252b7ccf9addf5fe4a6365fbeab49d9', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRWX31BPHTXTBZN4660', 'story', '06FB0TNSRY3PA3E31NAVQHR5GC', 'Smooth camera movement', 'Interpolation for character movement. No jarring snaps. Configurable smoothing.', 'done', 'high', NULL, 'client', NULL, '2026-02-10 23:20:20', '2026-02-21 13:08:51', NULL, '29f813efb1d947b142920513654162f0', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRYFMAA9CG89KDN3C7G', 'story', '06FB0TNSRYTX3A5XSWREQ03KQW', 'NPC generation pipeline', 'Procedural NPC generator. Takes template role, produces fully-populated NPC entity. Constraint validation.', 'done', 'high', NULL, 'server', NULL, '2026-02-10 23:18:49', '2026-02-23 14:43:15', NULL, '17ecad43db6d8f5f9a2bcd19a653ea6b', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRYHAQVDRH43Y4C4534', 'story', '06FB0TNSRZ202MPMFH0EDH2BT4', 'Routine deviation detection', 'Server-side system: compare NPC current position/action vs known routine pattern. Emit RoutineDeviation trigger events when NPCs break their established daily patterns. Core detective mechanic. Feeds into observation event generator. Also covers absence detection (expected NPC not observed at known location). Source: Ozzie R1+R2, Paula R1 absence detection, Gestalt R2.', 'done', 'high', NULL, 'server', NULL, '2026-02-11 00:01:55', '2026-02-23 14:43:15', NULL, '3e5e4f6c86aad4de4845944c737cf0ca', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRYSJFQCTT9TCM7FVVW', 'task', '06FB0TNSRWABN2YJ0SNKRW9D7G', 'Define SpatialIndex trait with naive Vec implementation', 'Create SpatialIndex trait with methods: entities_in_range(position, radius), entities_at(position), update(entity_id, position). Implement naive Vec-based backend for Sprint 1. Grid/quadtree optimization deferred to Sprint 2.\n\nEffort: XS\nCodebase: server\nSource: Architecture Review Audit 2026-02-11\nSprint: 1', 'done', 'critical', NULL, 'server', NULL, '2026-02-11 20:26:47', '2026-02-23 14:43:15', NULL, '99599b17a07ad1004aa29a926d21d5e0', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRXA75F3E1JA7V8HYNW', 'story', '06FB0TNSRWBH6313PF00570RGR', 'Monologue event generation - server', 'Trigger monologue on perception events, environment changes, NPC proximity. Context tagging (location, situation, character state).', 'done', 'high', NULL, 'server', NULL, '2026-02-10 23:20:40', '2026-02-23 14:43:15', NULL, 'ac7a56d718ab74ff0a1a91e42cd7149a', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZNS6A5KWPF0FNVRTG', 'story', '06FB0TNSRZ202MPMFH0EDH2BT4', 'Follow mechanic', 'Player designates target NPC to follow. System tracks distance and LOS. NPC suspicion increases if player is too close too long (feeds NPC vision #115). Observation events fire at higher frequency while following. Success: target reaches destination. Failure: target enters fog, or detects player. Source: Gestalt R2 H-1. Required by D-027 criterion 4.', 'done', 'high', NULL, 'server', NULL, '2026-02-11 00:01:51', '2026-02-23 14:43:15', NULL, 'b4940fa3edba313d0ba5308448af3467', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRX81M1366HGZYWPA2C', 'story', '06FB0TNSRZG2K6AEST2W0ZVV3G', 'Tolerance threshold triggers', 'Monitor for threshold violations. Trigger reactions when tolerance exceeded. Behavioral state changes.', 'done', 'high', NULL, 'server', NULL, '2026-02-10 23:19:21', '2026-02-23 14:43:15', NULL, 'c1c688189b89d9db1bb93b672e8b0bc2', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRWCW9NC97M2AZ52H5W', 'story', '06FB0TNSRYTX3A5XSWREQ03KQW', 'Personality & tell system', 'PersonalityTraits (2-3 traits). TellSystem with 5 categories: nervous, angry, friendly, guarded, routine deviation. v0.1 renderer is MONOLOGUE TEXT not visual animation. Tell state derived from NPC axis values (Secret+Tolerance=nervous, low Contentment=frustrated). Source: Gestalt+Araminta+Ozzie content-gap-analysis v0.1 R2.', 'done', 'high', NULL, 'server', NULL, '2026-02-10 23:18:49', '2026-02-23 14:43:15', NULL, 'd9b3dcdb4f3e3ef4014a56bee7dffbc7', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRWTKSJ7WKGY6Z5KYR8', 'task', NULL, 'Arch: Move dialogue systems from BridgePlugin to NpcPlugin', 'BridgePlugin registers process_talk_interaction, process_walk_away, process_confrontation_response — game logic that depends on NPC-layer resources (TrustEventQueue, KnowledgeGraph). Should be in NpcPlugin. BridgePlugin should own wire protocol only. Found during Sprint 15 QA: game_loop test needed manual TrustEventQueue init.', 'done', 'medium', NULL, 'server', NULL, '2026-02-21 11:32:38', '2026-02-23 18:51:53', NULL, '9fceef782567295bc42e31a89bf372b6', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZP42M3Q9E92KT52M4', 'story', '06FB0TNSRXXVCGN5D35ZJ7M0MW', 'Line variety tracker — prevent repeat dialogue', 'Prevents same line firing repeatedly. Tracks recently-used line IDs per NPC per session. Selects from eligible pool excluding recent history. Critical for 30-minute sessions where player enters same location 4-5 times. Owner: Dudley. Proposed by: Gestalt. Workshop: content-gap-analysis v0.1 R2.', 'done', 'medium', NULL, 'server', NULL, '2026-02-11 19:30:04', '2026-02-23 18:51:54', NULL, '388b10995ec61d05c3271d564d17b180', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRXT3Y847QQ5R19ZAD4', 'story', '06FB0TNSRXXVCGN5D35ZJ7M0MW', 'Layer 3: Trust-gated gossip', 'Three disclosure tiers per role: surface/real/secret. Trust threshold determines tier access. Progressive revelation.', 'done', 'high', NULL, 'server', NULL, '2026-02-10 23:24:25', '2026-02-23 18:51:54', NULL, '3f3053bb96202db5b18ccb360f02d9e4', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZA6YSNFQY2SN9HWER', 'task', '06FB0TNSRXXVCGN5D35ZJ7M0MW', 'Server: implement DialogueResponse verb handler', 'The client sends DialogueResponse interact when the player picks a dialogue option, but no server system processes it. Currently only Talk verb is handled (process_talk_interaction in dialogue.rs). Need: a system that receives DialogueResponse with response_id, looks up the NPC''s dialogue tree, and generates a follow-up line + new options (or ends the conversation). Without this, dialogue options 1-2 (non-confrontation) do nothing and option 3 (confrontation) only triggers a client-side monologue beat.', 'done', 'medium', NULL, 'server', NULL, '2026-02-21 12:11:02', '2026-02-23 18:51:55', NULL, '0c2b74f873d6bfb6d7374da01e6f4ba5', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZ7WAJTAEE05D2M9DW', 'story', '06FB0TNSRW1VJS6GTSSYHK63F8', '3D sprite render pipeline setup', 'Establish the offline 3D sprite render pipeline: Camera3D configuration, lighting rig, export process for entity/object/wall sprites. Prerequisite for all camera-angle and sprite re-render work (see #540, D-019). Pipeline must produce 64x64 tile-grid-aligned sprites at configurable camera angles.', 'done', 'medium', NULL, 'visual', NULL, '2026-02-21 12:36:34', '2026-02-23 19:28:08', NULL, '15d64f6807d7f7dff4809f84f36a1f3c', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZGME1AXAQ91TE3QER', 'story', NULL, 'Optimize zone_id extraction from O(N) tile scan to O(1) dictionary lookup', 'game_state.gd apply_snapshot() currently does a linear scan across visible_tiles on every snapshot to extract zone_id for the player''s current tile position. At v0.1 bounded map sizes (~150x150, D-012) this is acceptable, but will degrade when the chunk system lands and visible_tiles grows with view radius.
Fix: when visible_tiles is parsed into visible_positions in the same apply_snapshot() call, populate a _tile_by_coord Dictionary at the same time and use O(1) lookup for zone_id. Net-zero-complexity change since the loop is already there.
Flagged by Tyre in PR #54 review (T3). Pre-existing code, not introduced by Sprint 15.', 'done', 'medium', NULL, 'client', NULL, '2026-02-21 13:30:38', '2026-02-23 20:02:35', NULL, 'c07c9dcbe7c9e177dead7a6ca442dced', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZ5XF37BJC1JSX8NE0', 'story', '06FB0TNSRW1VJS6GTSSYHK63F8', 'Adjust sprite camera to D-019 angle (~15-20° from vertical)', 'Integrate rendered sprites from #541 into the Godot client. The 3D render pipeline already produces sprites at D-019 angle (-72.5° from horizontal). Remaining work:
1. Load PNG sprites from client/assets/sprites/ (npc_generic_*_64.png, wall_structural_*_64.png)
2. Replace programmatic draw_rect placeholders in entity_renderer.gd with Sprite2D using the rendered PNGs
3. Switch entity y-sort anchor from center to bottom-anchor (ENTITY_OFFSET_Y comment already notes this migration)
4. Verify 24x32 footprint within 64x64 tile matches D-044 visual hierarchy
5. Test z-sorting with real sprites (y-based sort must still work correctly)
Ref: decisions/perception.md D-019, D-043, D-044.', 'done', 'medium', NULL, 'client', NULL, '2026-02-21 12:36:26', '2026-02-23 20:02:35', NULL, 'f84891cc672f2d47f490775153199b41', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZG96QCSMQRV4R93G0', 'story', NULL, 'Migrate line IDs from location-scoped to NPC-scoped namespace', 'D-035 Sprint 15 Amendment: Line ID prefix changes from {location_slug} to {npc-slug}.
Current: the-terminal_d_039 (shared across all NPCs at The Terminal — collisions already occurring)
New: kael-davan_d_001, sera-venn_d_001, dock-worker_d_001 (each NPC independent)
Work items:
1. Update schema description fields in dialogue-pool.schema.json, monologue-pool.schema.json, dialogue-line.schema.json (regex pattern already accepts the new format)
2. Rename all existing line IDs in ~20 dialogue YAML files under content/.../dialogue/
3. Rename all existing line IDs in monologue pool YAML files under content/.../monologue/
4. Update any server code that parses or references specific line IDs
5. Update content authoring docs and voice guides that reference the old convention
6. Verify no golden test snapshots reference old IDs
This is a mechanical rename — no content changes. Each NPC file gets its own sequence starting at _001. The 999-line ceiling per NPC is generous vs 999 per location.
Rationale: Location-scoped IDs require cross-file coordination and already caused a collision (the-terminal_d_039) with only 15 hand-authored NPCs. Will not scale to procedurally generated populations (D-029: hundreds of NPCs).', 'done', 'medium', NULL, 'copy', NULL, '2026-02-21 13:25:38', '2026-02-23 20:57:37', NULL, '5732a972e68666959e6a1ea0f48ce6ec', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRWSKNDS08FTYJN9N60', 'story', '06FB0TNSRXZK7C4X2DHQ6A0CKR', 'Insert/HUD wireframe and spec — dual character variants', 'The lattice overlay design with dual-character variants. Smuggler: social contacts as dots (relationship color), casual labels (The Last Shift, Kaels usual spot). Detective: POI as amber diamonds, evidence squares, institutional labels (Licensed establishment District 7, POI: K. Davan). One parameterized system with lattice_profile parameter — Stig builds one framework not two. Owner: Araminta. Proposed by: Araminta. Workshop: content-gap-analysis v0.1 R2.', 'done', 'high', NULL, 'visual', NULL, '2026-02-11 19:28:42', '2026-02-24 10:26:29', NULL, 'a812f6f081ac884acf740958e696fddf', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRX7ATTWFVA1E28YMC4', 'story', '06FB0TNSRXZK7C4X2DHQ6A0CKR', 'Time display on insert HUD', 'Show current game time on the diegetic insert display. Player needs to know the time for routine-based investigation. Source: Tyre R1 M-7.', 'done', 'medium', NULL, 'client', NULL, '2026-02-11 00:04:28', '2026-02-24 10:45:56', NULL, '50bdee3d764e10b72ed2d15573fb3d89', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRWXEWF625DRAD205NW', 'task', NULL, 'UX: E-Talk overlay feels pointless during proximity', 'Playtester feedback (gauntlet-t2414): the E-Talk interaction overlay does not communicate enough value. When adjacent to an NPC, the overlay appears but does not convey what talking will accomplish. Consider: showing preview of conversation topic, visual hint of NPC mood, or suppressing overlay when already in range.', 'done', 'low', NULL, 'client', NULL, '2026-02-21 11:32:37', '2026-02-24 10:45:57', NULL, 'd151d90b0a637cbbc36e5ceb601abb99', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRWPQRY99X91945T8N8', 'story', '06FB0TNSRY449C3GAXT7PKDSY0', 'Diegetic tutorial monologue lines — per character', '8-10 monologue lines per character that teach mechanics diegetically: movement, fog, sound, NPC interaction, insert usage. Fires on first-time events. Part of opening experience but distinct from opening hook (which sets voice/motivation). Owners: Mellanie. Proposed by: Paula, Gestalt. Workshop: content-gap-analysis v0.1 R2.', 'done', 'medium', NULL, 'copy', NULL, '2026-02-11 19:30:03', '2026-02-24 11:15:14', NULL, '285b9ece5172db07d0c904d6c828fc7e', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRY4A2NYBWQ9QM9PE54', 'task', NULL, 'Author contradiction monologue lines — Sera/Kael FRIEND arc', 'Author source-named contradiction monologue lines for the Sera/Kael FRIEND arc per D-083 and Paula Round 2 Mellanie spec. Cognitive-dissonance-not-accusation tone. Lines must name the source entity (e.g. ''Sera said Kael was at the dock. I just saw him in B-7.''). Both detective and smuggler variants needed. Can be authored against spec in parallel with #550 mechanical implementation.', 'done', 'high', NULL, 'copy', NULL, '2026-02-24 01:07:49', '2026-02-24 11:15:14', NULL, '2d0b47bc7849c52f327f8374ce617d6b', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRW7EXKK5FXEE7XPDAC', 'task', '06FB0TNSRXVMATNG8QEJVVVCH0', 'KnowledgeGrant schema + ContentEntityRegistry', 'Replace KnowledgeGrant struct in server/src/content/types.rs with untagged enum supporting Fact { fact_id, confidence } and Entity { entity_ref, attributes, confidence } variants. Add disclosure_blocked: bool field to FactKnowledge. Create server/src/knowledge/content_registry.rs implementing ContentEntityRegistry resource (BTreeMap<String, StableId>). Wire NPC spawn sites to call content_registry.register(content_id, sid). Content index validation: parse confidence strings, validate entity_refs resolve in registry. D-079.\n\nEst: ~120 lines. Blocks all downstream knowledge work (Tickets B-G).', 'done', 'critical', NULL, 'server', NULL, '2026-02-23 23:24:45', '2026-02-24 11:58:44', NULL, '0afc037dde27cce4a45d4aa50eb95295', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZ8K30B9Z8C83KVT3M', 'story', '06FB0TNSRXXVCGN5D35ZJ7M0MW', 'Trait modifier system', 'Trait modifier system for unprompted disclosure — two-stage filter spec (D-081).\n\nStage 1 — candidate pool filter (WHAT):\n- Cautious: remove candidates with confidence < KnowsDetails; remove ToldBy-source facts (will not pass on rumors)\n- Gossipy: include Suspects-confidence candidates (normally excluded)\n- Loyal: remove facts linked to entities with trust_level >= Real in NPC Relationships\n- Talkative: override witness inhibition gate; include candidates at all confidence levels\nTraits map to filter predicates via content-authorable YAML config (not hard-coded enum dispatch).\n\nStage 2 — line pool scoring (HOW):\n- Trait tags in IndexedDialogueLine.tags matched by Layer 4 line selection\n- Tag examples: cautious_delivery, gossip_delivery, professional_delivery\n- Same candidate fact can have multiple authored line variants with different trait delivery tags\n\ndisclosure_eligible / disclosure_blocked field:\n- disclosure_blocked: bool on FactKnowledge (default false)\n- Set true for Major secrets with survival stakes (e.g. Kael ring membership)\n- Never enters candidate pool regardless of trust tier or trait\n\nImplemented as part of Ticket #551 (~40 lines for trait filter predicates + YAML schema).\nDecision refs: D-081.', 'done', 'high', NULL, 'server', NULL, '2026-02-10 23:24:25', '2026-02-24 11:58:44', NULL, '1fd99b18d479049df45b87b5c4f87f20', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRWY4KADAVWRXZ85SKM', 'task', '06FB0TNSRXVMATNG8QEJVVVCH0', 'KnowledgeGranted event + process_knowledge_events handler', 'Add KnowledgeEventType::KnowledgeGranted variant in server/src/knowledge/events.rs with ProcessedKnowledgeGrant enum (Fact and Entity subtypes). Add match arm handler. Add TryFrom<&str> for KnowledgeConfidence in server/src/knowledge/types.rs. Wire knowledge_grant field in process_talk_interaction (server/src/simulation/dialogue.rs) after line selection. Runtime NPC KG guardrail: if granting NPC KG does not contain the fact, drop grant with tracing::warn!. Implements D-079 grant mechanism.\n\nEst: ~150 lines. Depends on #545 (Ticket A schema). Blocks: Ticket D (#548), Ticket F (#549), Ticket G (#550), and ticket #141.', 'done', 'high', NULL, 'server', NULL, '2026-02-23 23:24:52', '2026-02-24 11:58:44', NULL, '3ad7e1d0ffe84ad62c711c6f2e4ef569', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRY5BK7XVN1GSH4A0PC', 'task', '06FB0TNSRXVMATNG8QEJVVVCH0', 'ContradictionClaim struct + detection in observe_entity', 'Add ContradictionClaim struct and CONTRADICTION_WINDOW_TICKS: u64 = 600 constant in server/src/knowledge/types.rs. Add contradicted_claim: Option<ContradictionClaim> to EntityKnowledge with #[serde(skip_serializing_if = "Option::is_none")] and #[serde(default)] (backward-compatible, zero migration required). Implement pre-overwrite contradiction check in observe_entity() in server/src/knowledge/graph.rs: if existing entry has ToldBy source, positions differ, and |current_tick - told_tick| < CONTRADICTION_WINDOW_TICKS, set entry.state = Contradicted, populate contradicted_claim, push ContradictionDetected event. Both ToldBy and DirectObservation entries receive Contradicted state (epistemic neutrality — engine does not determine which is wrong). Add ContradictionDetected event variant in server/src/knowledge/events.rs. Tests: location contradiction, time window boundary, no false positive for non-ToldBy sources. Implements D-083. Closes Q-026.\n\nEst: ~120 lines + ~40 lines tests. Depends on #545 (Ticket A). Blocks: Ticket F (#549).', 'done', 'high', NULL, 'server', NULL, '2026-02-23 23:25:01', '2026-02-24 11:58:44', NULL, '4b198685f95095b3a75128de84f5aa09', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRYYBGVDWR3M4ZWEZH4', 'story', '06FB0TNSRXZK7C4X2DHQ6A0CKR', 'POI discovery system', 'Learn POIs via: character background, NPC tips, research, physical discovery. Discovery events.', 'done', 'high', NULL, 'server', NULL, '2026-02-10 23:22:17', '2026-02-24 11:58:44', NULL, '4d00699e758cdaf161092cbf10cecc82', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRXV3P38W5YXR4SVE0G', 'task', '06FB0TNSRXVMATNG8QEJVVVCH0', 'tell_state.rs KG awareness — MVP information boundary (#142)', 'In server/src/npc/tell_state.rs, add Option<&KnowledgeGraph> to derive_tell_state query. Replace Friendly-tell relationships.entries direct read with kg.relationship_with(&entity_sid) for OTHER-entity relationship state. Self-axis components (Secret, Contentment, Tolerance, Mood) remain as ground-truth reads — information boundary applies to external knowledge only. None KG falls through to current axis-based behavior — existing tests continue passing. Scoped to Active NPCs with KnowledgeGraph component (With<ActiveSim>). Fallback on missing KG entry: fall through to ground truth with tracing::debug! structured logging. Implements D-082 MVP (ticket #142 Sprint 17 deliverable, step 1 of 2).\n\nEst: ~35 lines. No dependencies, no blockers. Standalone improvement.', 'done', 'high', NULL, 'server', NULL, '2026-02-23 23:25:21', '2026-02-24 11:58:44', NULL, '71cff12dde7f97be73abfcf23d3ce8ee', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRYTA2795F5ATJZTKHC', 'task', '06FB0TNSRXVMATNG8QEJVVVCH0', 'NPC-to-NPC knowledge transfer system (transfer_npc_knowledge)', 'Create server/src/simulation/npc_knowledge_transfer.rs implementing transfer_npc_knowledge Bevy system. System ordering: after(run_npc_conversations). Dual-mutable KG access via kg_query.get_many_mut([entity_a, entity_b]). Transfer fires once per conversation at conversation start. Rate: rng.random_range(1..=3) facts drawn from eligible entries sorted by last_updated_tick descending. Trust-tier eligibility: None/trust<0 = no transfer; Surface 0-3 = Active facts at KnowsOf+ only; Real 3-7 = facts at any confidence + entity observations; Secret 7-10 = all Active entries. Confidence cap: min(source_confidence, KnowledgeConfidence::KnowsOf). Facts with disclosure_blocked: true never transferred. Source: KnowledgeSource::ToldBy { source_id: speaker_sid, tick: time.tick }. Player overheard grant: within VOICE_RANGE_TILES (8), player gains entity-level KG entries at Suspects confidence with KnowledgeSource::Heard { tick, range: Medium }. Implements D-080. Closes Q-024.\n\nEst: ~160 lines. Depends on #545 (Ticket A) + #546 (Ticket B). Blocks: Ticket F (#549, ToldBy entries needed for contradiction), Ticket G (#550, NPC KGs need meaningful content).', 'done', 'high', NULL, 'server', NULL, '2026-02-23 23:25:13', '2026-02-24 11:58:44', NULL, '7c61c6a0058ce731112527dce8057540', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRWC7N6BRWNE4RJ7CT4', 'task', '06FB0TNSRXVMATNG8QEJVVVCH0', 'DisclosureCandidates + unprompted disclosure', 'Create server/src/npc/disclosure.rs: DisclosureCandidates component {candidates: Vec<FactId>, computed_tick: u64}; DisclosureCooldown component {per_fact_history: BTreeSet<FactId>, npc_cooldown_until: u64}; derive_disclosure_candidates system (recomputes every 30 ticks, Active NPCs only — filter by Active state, confidence >= KnowsOf trait-adjusted, not in per_fact_history, disclosure_blocked != true, trust rough-gate); process_unprompted_disclosure system with trigger gates (trust >= Surface; mood != Hostile; contentment >= -10; candidates not empty; per-NPC 300-tick cooldown clear; global 1/10-tick rate limit, StableId-ordered for determinism; witness inhibition — no non-trusted NPCs within 5 tiles OR Secret trust OR Talkative trait; location privacy — disclosure_context vs zone type); global rate limit resource. Trait Stage 1 filter predicates: Cautious (requires KnowsDetails+, removes ToldBy-source facts); Gossipy (includes Suspects candidates); Loyal (suppresses entity-linked facts where entity trust >= Real); Talkative (overrides witness inhibition, all confidence levels). Candidate list capped at 10, sorted by confidence desc then last_updated_tick desc. In server/src/simulation/dialogue.rs, Layer 4 reads DisclosureCandidates for NPC-initiated line selection. System ordering: derive_disclosure_candidates.after(process_knowledge_events), process_unprompted_disclosure.after(derive_disclosure_candidates). Implements D-081, D-082 step 2, tickets #172 + #173.\n\nEst: ~220 lines. Depends on #546 (B) + #548 (D) for meaningful NPC KG content.', 'done', 'high', NULL, 'server', 'D-081', '2026-02-23 23:25:47', '2026-02-24 11:58:44', NULL, 'bdef5670f641221d02c8367617abf48c', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZ3N4V75HGWR954RT8', 'story', '06FB0TNSRXZK7C4X2DHQ6A0CKR', 'POI data model', 'PointOfInterest component. Name, location, category, discovery source, visibility rules.', 'done', 'high', NULL, 'server', NULL, '2026-02-10 23:22:17', '2026-02-24 11:58:44', NULL, 'c44c3dd63e3a2970835d4404819afafe', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZFQZXQH4PM8VX26S4', 'task', '06FB0TNSRXNT4SCS3MEPCKGPXG', 'Create protocol versioning scheme', 'Version field in messages. Compatibility checking. Migration strategy.', 'done', 'high', NULL, 'server', NULL, '2026-02-10 23:27:49', '2026-02-24 12:03:16', NULL, 'afcb761562956f7ed3f45f1864b47168', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRXYG0NY23KBWJ3JA74', 'task', '06FB0TNSRXVMATNG8QEJVVVCH0', 'Contradiction monologue + event chain completion', 'In server/src/simulation/monologue.rs, add EntityRegistry + Query<&NpcName> to system signature; add resolve_name helper; add match arm for ContradictionDetected. In server/src/knowledge/events.rs, ContradictionDetected processing: call relationship shift for ToldBy source entity (-> PersonOfInterest); pre-resolve source_display_name and subject_display_name via EntityRegistry + NpcName into event struct (monologue system is a pure string consumer). Content (separate Mellanie ticket): generic fallback template line + hand-authored FRIEND-specific lines for Sera/Kael contradiction phases. Integration test: full THE FRIEND arc sequence — Tick T1 grant creates ToldBy EntityKnowledge -> Tick T2 observation triggers ContradictionClaim -> monologue fires with correct names -> Sera/Kael shift to PersonOfInterest -> AnomalyMarker set. Downstream consumers (anomaly.rs, D-033 pipeline) already built and tested. Implements D-083 event chain.\n\nEst: ~90 lines. Depends on #545 (A), #546 (B), #547 (C), #548 (D). No downstream blockers.', 'done', 'high', NULL, 'server', 'D-083', '2026-02-23 23:25:34', '2026-02-24 12:03:17', NULL, 'ff34c68444e344f84bd8911f764921ee', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZDR53DFK36QEBJTPW', 'story', '06FB0TNSRXVMATNG8QEJVVVCH0', 'Knowledge-based information gating', 'POI discovery wiring via KnowledgeGranted event (D-079). When player enters a POI trigger zone, push KnowledgeGranted { fact_id: FactId("poi.*"), confidence, source: DirectObservation { tick } } to KnowledgeEventQueue. filter_by_access -> KnowledgeGated("poi.dock_7_restricted") already gates content on this fact (graph.rs:299-302). No new access control code; no new types; no new systems beyond the shared KnowledgeGranted event. Primarily content authoring for POI definitions.\n\nWorkshop scope note (2026-02-24): grant mechanism is KnowledgeEventType::KnowledgeGranted unified event type — no separate event type for POI discovery. Implementation: ~20 lines on top of #546 infrastructure.\n\nDepends on: #546 (KnowledgeGranted event + handler).\nDecision refs: D-079.', 'done', 'high', NULL, 'server', NULL, '2026-02-10 23:21:35', '2026-02-24 12:03:28', NULL, '6f537133bee2ecb8c839e1f3662e2745', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRXAE5PR0QQ34GBVP98', 'story', '06FB0TNSRXVMATNG8QEJVVVCH0', 'NPC information boundaries', 'NPC information boundaries — MVP scope (D-082). Sprint 17 deliverables:\n\n1. tell_state.rs KG awareness (#549): derive_tell_state adds Option<&KnowledgeGraph>; uses KG for OTHER-entity relationship reads; falls back to axis components for self-state and when KG absent. ~35 lines.\n\n2. DisclosureCandidates component + derive_disclosure_candidates system (see #551): Active NPCs derive candidate pool from own KG every 30 ticks. ~part of 220-line Ticket G.\n\n3. process_unprompted_disclosure system stub (#551): trigger gates operational; content-authored lines sparse for Sprint 17.\n\nExplicitly OUT OF Sprint 17 scope:\n- Conversation partner KG-awareness check (Sprint 18)\n- Routine KG awareness (v0.2+)\n- Pathfinding KG integration (not planned — unresolvable failure mode)\n\nNPCs check only their own KG (not player KG) — diegetically correct per D-082, creates dramatic irony when NPC says things player already knows.\n\nDepends on: #549 (tell_state), #546 (B), #548 (D) for full delivery.\nDecision refs: D-082.', 'done', 'high', NULL, 'server', NULL, '2026-02-10 23:21:35', '2026-02-24 12:03:29', NULL, 'a49ba9ec03c01770b08229684670d286', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRXSB1NG1GXFEW59TSR', 'story', '06FB0TNSRXXVCGN5D35ZJ7M0MW', 'Layer 4: Unprompted disclosure', 'Unprompted disclosure — full mechanical specification (D-081).\n\nNew components (server/src/npc/disclosure.rs):\n- DisclosureCandidates { candidates: Vec<FactId>, computed_tick: u64 }\n- DisclosureCooldown { per_fact_history: BTreeSet<FactId>, npc_cooldown_until: u64 }\n\nderive_disclosure_candidates system: runs every tick for Active NPCs; recomputes when time.tick - computed_tick > 30. Filters NPC own KG: Active state; confidence >= KnowsOf (trait-adjusted); not in per_fact_history; disclosure_blocked \!= true; trust rough-gate. Candidate list capped at 10; sorted by confidence desc, last_updated_tick desc.\n\nprocess_unprompted_disclosure system: trigger gates (ALL must pass): trust >= Surface; mood \!= Hostile; contentment >= -10; candidates not empty; per-NPC 300-tick cooldown clear; global 1/10-tick rate limit (StableId-ordered for determinism per D-010); witness inhibition (no non-trusted NPCs within 5 tiles OR Secret trust OR Talkative trait override); location privacy (disclosure_context tag vs current zone type).\n\nTrait Stage 1 (candidate pool filter): Cautious = requires KnowsDetails+, removes ToldBy-source facts; Gossipy = includes Suspects candidates; Loyal = suppresses entity-linked facts where entity trust >= Real; Talkative = overrides witness inhibition. Implemented via Ticket #551.\n\nNPCs check only their own KG — creates dramatic irony (NPC praises Kael after player found discrepancies).\nDecision refs: D-081.', 'done', 'high', NULL, 'server', NULL, '2026-02-10 23:24:25', '2026-02-24 12:03:29', NULL, 'd7d4c7257920288a778c4cf6388f7bfd', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRY59DPMR0HRJVJC2YM', 'story', '06FB0TNSRXZK7C4X2DHQ6A0CKR', 'Minimap rendering - client', 'Small map overlay. Show nearby POIs as dots. Distant POIs as border arrows with direction.', 'done', 'high', NULL, 'client', NULL, '2026-02-10 23:22:17', '2026-02-25 08:48:01', NULL, '29290bc92e913fa435037f7a28593c9f', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZE5QRWW20PAD8YSGW', 'story', '06FB0TNSRXXVCGN5D35ZJ7M0MW', 'Dialogue UI - client', 'Superseded by #434 (Dialogue box, D-061) from Control & Interaction workshop. Workshop spec: max 20% screen height, max-width (not percentage), NPC speech top, player options below, left-aligned, NO portraits, monologue floats above on z-layer 7, walk-away via WASD with 300ms fade. Original description retained for reference: Conversation interface. Topic selection, response display, NPC portrait/name. Relationship indicator.', 'done', 'high', NULL, 'client', NULL, '2026-02-10 23:24:25', '2026-02-25 08:48:02', NULL, '66d453e7addb285d19cb4311fdcdb7bf', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRXG3NHGZHVG0PFHPSW', 'story', '06FB0TNSRXZK7C4X2DHQ6A0CKR', 'Knowledge/journal display', 'Client UI for reviewing accumulated information inventory (#89). Shows provenance via CauseChain: how and when information was learned. Source: Tyre R1 M-4.', 'done', 'medium', NULL, 'client', NULL, '2026-02-11 00:04:28', '2026-02-25 08:48:03', NULL, 'a6c6756df72cd141b578d40cd13e14a4', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRX5C13ZKR79AHXTHNG', 'story', '06FB0TNSRW1K4QJHAVSJF2ECSC', 'Tier 1 drama module schema', 'Define drama module structure: entry conditions, NPC requirements, event sequences, outcomes. Pool format.', 'done', 'medium', NULL, 'copy', NULL, '2026-02-10 23:23:54', '2026-02-25 08:55:09', NULL, 'e9385b172cd40f0bd96eea0a8b0ec8cb', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRW0QNRKMP08W34N65R', 'task', NULL, 'Design: collision-resistant line IDs for auto-generated NPCs', 'Current line ID scheme uses NPC slug as prefix (kael-davan_d_001). Hand-authored NPCs have unique slugs, but auto-generated populations (D-029: hundreds of NPCs) will produce collisions. Need a collision-resistant ID scheme that stays human-readable for authored content. Options: short UUID suffix, entity UUID prefix, slug registry, or composite key. Cross-refs: D-035, D-029, D-024.', 'done', 'medium', NULL, 'copy', NULL, '2026-02-23 20:56:23', '2026-02-25 08:55:10', NULL, 'f9a68fb397631fa6336ad4e1f8ee8031', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRYR0PBPR9TP97JN5VG', 'story', '06FB0TNSRZ202MPMFH0EDH2BT4', 'NPC player-awareness behavior', 'NPCs react when they detect the player observing or following them. Feeds into suspicion mechanics for the follow verb. Uses NPC vision system (#115) to detect player proximity and attention. Source: Gestalt R2 H-5.', 'done', 'high', NULL, 'server', NULL, '2026-02-11 00:01:55', '2026-02-25 09:09:00', NULL, '6988749e67be2bea24c1b86b2a902305', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRYF4KX5Z02T65GYQVC', 'story', '06FB0TNSRZP48TDBTW18P88WNW', 'Save state data model', 'Define serialization format for full game state. Shares architecture with #96 (state serialization system). Covers entity state, relationship graph, knowledge inventories, game clock position. Source: Tyre R1 H-14.', 'done', 'high', NULL, 'server', NULL, '2026-02-11 00:03:27', '2026-02-25 09:09:00', NULL, '74ece5b78b99a1af42e6aff91501df11', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRW6GAVBQPDHM9RASWM', 'story', '06FB0TNSRZG2K6AEST2W0ZVV3G', 'Player-action social propagation', 'Player actions toward one NPC ripple through relationship graph. First-order strong/immediate, second-order weaker/delayed, third-order ambient. Topology varies per seed, so same action produces different cascades. Anti-metagaming property. Source: Paula R1+R2, Nigel R2.', 'done', 'high', NULL, 'server', NULL, '2026-02-11 00:02:28', '2026-02-25 09:09:00', NULL, '95521ec3edaa43ef82b06ef6b72d4cb7', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRXKGYF4QRJR955BRCG', 'story', '06FB0TNSRWABN2YJ0SNKRW9D7G', 'Background tier state machines', 'Four state machines: schedule, mood, relationships, job. Tick at 1/game-minute for Background NPCs.', 'done', 'high', NULL, 'server', NULL, '2026-02-10 23:19:08', '2026-02-25 09:09:00', NULL, 'b23ad546eed1f4c789b3c20c937d4048', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRW6BQVPWC2X81QDSJR', 'story', '06FB0TNSRYTX3A5XSWREQ03KQW', 'Skill system & combat flag', 'SkillSet component with named skills. Combat-trained flag triggers CombatCapability component addition.', 'done', 'medium', NULL, 'server', NULL, '2026-02-10 23:18:49', '2026-02-25 09:09:00', NULL, 'b33fb9a18cc4a3f8f62b1d51c1780f10', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRYH3A2NAMCBBE3VD5W', 'story', '06FB0TNSRYTX3A5XSWREQ03KQW', 'Tell state derivation system', 'System that reads NPC axis values and outputs observable tell states consumed by monologue trigger system. Secret + low Tolerance = nervous. Low Contentment = frustrated. Connects NPC internal state to player-observable behavior. Owner: Dudley. Proposed by: Gestalt. Workshop: content-gap-analysis v0.1 R2.', 'done', 'medium', NULL, 'server', NULL, '2026-02-11 19:30:04', '2026-02-25 09:09:00', NULL, 'c96eedcc7f0832634c6d7227a3361f6c', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRYXFSF18YVYAKW05J4', 'story', '06FB0TNSRZ202MPMFH0EDH2BT4', 'Examine mechanic', 'Player uses interact on entity/object at close range. Returns detail information filtered through character knowledge (#138-142). Generates detailed ObservationEvent with low uncertainty. Character-specific: smuggler and detective see different details on same object. Source: Gestalt R2 H-2.', 'done', 'high', NULL, 'server', NULL, '2026-02-11 00:01:54', '2026-02-25 09:09:00', NULL, 'dce778165080c3be5f4a0afdd2fee9fb', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRXZAB9DC94DDB69C6W', 'story', '06FB0TNSRZG2K6AEST2W0ZVV3G', 'Character goal/pressure framework', 'Define systemic pressures per character: smuggler faces relationship maintenance + exposure pressure; detective faces institutional + moral pressure. Pressures modulate monologue tone and observation salience. Not scripted arcs — emergent from system interaction. Source: Gestalt R2 H-8, Paula R2 character arcs.', 'done', 'high', NULL, 'server', NULL, '2026-02-11 00:02:28', '2026-02-25 09:09:00', NULL, 'e98e15cf4c66f2c357c750c6611b89ef', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRXA289Z8FBPZSMMMNG', 'story', '06FB0TNSRWCSXFAG1E4TS7HAB4', 'NPC vision system', 'NPCs use same LOS system. NPC memory of player location. Inference (saw you enter building).', 'done', 'high', NULL, 'server', NULL, '2026-02-10 23:19:52', '2026-02-25 09:09:00', NULL, 'fcc53f29372ccce9e724496128517246', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRYQQM068K2QH4PCQW4', 'story', '06FB0TNSRWABN2YJ0SNKRW9D7G', 'State serialization system', 'Serialize/deserialize NPC state to frozen structs (~1-2KB each). Save to file or memory.', 'done', 'high', NULL, 'server', NULL, '2026-02-10 23:19:08', '2026-02-25 11:45:52', NULL, '212263b79b41dbf93f32d65a713e5724', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZP1X1WZF47FYDZV5W', 'task', '06FB0TNSRXNT4SCS3MEPCKGPXG', 'Protocol version handshake: server', 'Server side of protocol handshake split from #339. Server sends protocol_version in the initial IPC message (already present as PROTOCOL_VERSION const in bridge/types.rs = 14). Ensure the first message sent after subprocess spawn includes this field so the client can validate. Fail fast with a clear error log if handshake is not completed within N ticks. Source: Architecture Review Audit 2026-02-11, split from #339.', 'done', 'critical', NULL, 'server', NULL, '2026-02-25 10:21:32', '2026-02-25 11:45:52', NULL, '263f9f4a559879d6e8cb2985ff23f3e1', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZKJFQ0JTX65AM4XWG', 'story', '06FB0TNSRWABN2YJ0SNKRW9D7G', 'Timestamp-based eviction', 'LastInteraction timestamp on all NPCs. LRU priority queue. Evict to lower tier when sim-space pressure.', 'done', 'high', NULL, 'server', NULL, '2026-02-10 23:19:08', '2026-02-25 11:45:53', NULL, '5fc4764716a06fcfe59035651d6f252d', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRXH8G4WZ14B8GJA7Y4', 'story', '06FB0TNSRZ5AP28E96W00KB0R4', 'Test module organization', 'External test modules. Separate from production code. Minimal coupling. Clear test entry points.', 'done', 'high', 'hoshe', 'server', NULL, '2026-02-10 23:26:24', '2026-02-25 11:45:54', NULL, '395e3a651869e075bbc5b2c1ceb5bac1', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZ1V65RZ69H3QCNZ3C', 'story', '06FB0TNSRWABN2YJ0SNKRW9D7G', 'Scope tag system', 'Scope tags: neighborhood, active-quest, colleague, known-contact. Tagged NPCs stay in Active tier.', 'done', 'high', NULL, 'server', NULL, '2026-02-10 23:19:08', '2026-02-25 11:45:54', NULL, 'a2b2753e1225efb920706cdf9645b3a9', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRW0DBHHSJ89MGZMBPW', 'story', '06FB0TNSRZP48TDBTW18P88WNW', 'Save/load: server ECS extraction', 'Server side of save/load split from #257. Extract ECS world state into SaveStateV1 (data model done in #256). Serialize to MessagePack and write to file. Inject SaveStateV1 back into ECS on load — rebuild entities from NpcSaveState, restore KnowledgeGraph, RelationshipGraph, SimulationTime, and RNG seed. Per-game save directory path received from client via IPC (client owns D-085 directory structure). MessagePack via rmp_serde (D-020). Source: Team Leader Sprint 19, split from #257.', 'done', 'high', NULL, 'server', NULL, '2026-02-25 10:20:45', '2026-02-25 11:45:55', NULL, '65fba204c8db2505194ef854bd90e8fd', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRX5XD07SFXDTKH07KC', 'story', '06FB0TNSRWYX9HMVEXES6GHXPW', 'Information boundary negative test suite', 'Verify that information DOES NOT leak. Entity X CANNOT see component Y. Highest-value integration test in the project — proves the core asymmetric information claim. Source: Hoshe R1, Tyre R2 T-1.', 'done', 'high', 'hoshe', 'server', NULL, '2026-02-11 00:05:00', '2026-02-25 11:45:55', NULL, '99f53ba954791b30a50bf3842b2c4f94', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRYTECS371XQHY2TJHW', 'story', '06FB0TNSRYDYTDC36V3EPDD7VR', 'Scene testing utilities', 'Load test scenes, manipulate nodes, assert on state. Scene validation.', 'done', 'high', 'oscar', 'client', NULL, '2026-02-10 23:26:33', '2026-02-25 12:07:29', NULL, '38b8252059c6c02c8bbfaf5e85cf45fd', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZR22GMG7VPZ1DSGTW', 'story', '06FB0TNSRYDYTDC36V3EPDD7VR', 'GDScript test framework setup', 'GUT (Godot Unit Test) or similar. Test scene organization. Automated test runner.', 'done', 'high', 'oscar', 'client', NULL, '2026-02-10 23:26:33', '2026-02-25 12:07:29', NULL, 'd3b5ba2836d310b09c050ed631f48833', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRYRMC84NCTPYQ5R278', 'story', '06FB0TNSRYDYTDC36V3EPDD7VR', 'Debug visualization overlay', 'Godot debug overlay (dev tool only) showing:\n- Pathfinding waypoints\n- Line-of-sight rays\n- Vision cones\n- Information state tags\n- Tick timing graph\n\nToggle with F3 key.\n\nEffort: M\nCodebase: client\nSource: Architecture Review Audit 2026-02-11\nSprint: 2+', 'done', 'medium', NULL, 'client', NULL, '2026-02-11 20:27:36', '2026-02-25 12:07:30', NULL, 'd1b49e913d2abdff8d9ad55ce2b7910b', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZNPJX7B2VN181SV6R', 'story', '06FB0TNSRZP48TDBTW18P88WNW', 'Game session management', 'Start/save/resume flow for play sessions. New Game creates per-game save directory (D-085). Loading screen shows game directories sorted by last-modified with most recent save per game. Resume loads most recent save. Quit prompts save-before-exit. Source: Tyre R1 M-6, Team Leader Sprint 19.', 'done', 'medium', NULL, 'client', NULL, '2026-02-11 00:03:27', '2026-02-25 12:07:30', NULL, 'f4a5ae020980898acd05a87db4103174', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRXPKRF27AF00G3TQ2R', 'task', '06FB0TNSRXNT4SCS3MEPCKGPXG', 'Protocol version handshake: client', 'Client side of protocol handshake split from #339. Client reads protocol_version from the first IPC message after server process starts. Compares against Protocol.PROTOCOL_VERSION (currently 14). If mismatch: show error message and shut down gracefully. Implements the version validation stub that already exists in protocol.gd decode_snapshot(). Source: Architecture Review Audit 2026-02-11, split from #339.', 'done', 'critical', NULL, 'ci', NULL, '2026-02-25 10:21:42', '2026-02-25 12:10:31', NULL, '0620904c3bb51a4e614bc119786f2b1f', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZAQ07D21BP4E00JYW', 'story', '06FB0TNSRZ5AP28E96W00KB0R4', 'IPC serialization fixture files', 'Layer 1 test data: pre-generated ObserverSnapshot, PlayerInput, and malformed .msgpack files. Cross-language verification: Rust writes fixtures, GDScript reads and verifies. Source: Hoshe R1, Tyre R2.', 'done', 'high', NULL, 'ci', NULL, '2026-02-11 00:04:56', '2026-02-25 12:10:31', NULL, '40b0092b71943b06e7e3c570266c07fb', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRW2YQKTRH952PP4JHW', 'task', '06FB0TNSRWYX9HMVEXES6GHXPW', 'IPC round-trip timing benchmark', 'Sprint 1 exit criterion. Measure complete round-trip latency:\n- rmp_serde::to_vec (server)\n- pipe write (server)\n- GDScript read + decode (client)\n- scene update (client)\n\nFlag if total latency exceeds 5ms. Report p50/p95/p99.\n\nEffort: S\nCodebase: server + client\nSource: Architecture Review Audit 2026-02-11\nSprint: 1', 'done', 'critical', NULL, 'ci', NULL, '2026-02-11 20:26:58', '2026-02-25 12:10:31', NULL, 'b656c6ebdf090dc02ecc402ada64d46b', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZXZW1JC5DEBFJ2XWG', 'story', '06FB0TNSRZ5AP28E96W00KB0R4', 'Test runner bash scripts', 'Create test/run-rust, run-godot, run-ipc-fixtures, run-ipc-protocol, run-ipc-integration, run-all. Each script: exit code 0/non-zero, structured JSON stdout, accepts filter arguments, no interactive input. Whitelistable for Claude Code agents. Source: Tyre R1+R2.', 'done', 'high', NULL, 'ci', NULL, '2026-02-11 00:04:56', '2026-02-25 12:10:31', NULL, 'c77e2600f347093a22b8130c4a84b79b', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZWTVV37X72078C8W4', 'story', '06FB0TNSRZP48TDBTW18P88WNW', 'Save/load: client UI', 'Client side of save/load split from #257. F5 = quicksave, F6 = quickload mapped in InputMapper. Loading screen lists game directories (user://saves/) sorted by last-modified, shows most recent save per game per D-085. Send SavePath IPC message to server with the target file path. Receive SaveComplete/LoadComplete responses. MessagePack format (D-020). Display loading screen during load. Source: Team Leader Sprint 19, split from #257.', 'done', 'high', NULL, 'client', NULL, '2026-02-25 10:21:12', '2026-02-25 15:54:38', NULL, '4ca0564307408b136d00d45c690ab3c9', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZJFK0CH0DSR6GJ9V4', 'story', '06FB0TNSRY5H0R4JCAJ6MY4X44', 'Station district layout design', 'Map design: workplace hub, bar location, smuggling ring hideout. Gate corridor cluster. Spatial relationships. NEEDS DESIGN. NEEDS DESIGN DISCUSSION.', 'done', 'critical', NULL, 'planning', NULL, '2026-02-10 23:22:44', '2026-02-25 20:08:57', NULL, 'e3777f49fd9d892e57ea2a5b8826af88', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRW6B0NHPW10GM5WBC8', 'story', '06FB0TNSRXF7E7101000E124X0', 'Triangle escalation system', 'Periodic state updates push triangle tensions toward breaking points. Observable events when triangles enter crisis. Consequences when triangles resolve. Different tolerance thresholds per seed = different escalation timing = different 30-min arcs. Source: Gestalt R2 H-3, Paula R1 triangle escalation, Ozzie R1 triangle escalation events.', 'done', 'high', 'server', NULL, NULL, '2026-02-11 00:02:32', '2026-02-25 21:35:20', NULL, '01bccfd0616385be8c8bf7f196b89a9c', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRY0W8VYF1ZVJC6TRKW', 'story', '06FB0TNSRXF7E7101000E124X0', 'Triangle definition schema', 'Define triangle structure: 3 NPCs, conflicting interests, relationship constraints. Template specification format.', 'done', 'high', 'server', NULL, NULL, '2026-02-10 23:19:37', '2026-02-25 21:35:20', NULL, '1bfdb2b0572c23c37bc8924767163920', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRXV9S6NC3QJ8G6JRSM', 'story', '06FB0TNSRXF7E7101000E124X0', 'Intra-template triangle generation', 'Generate 2+ triangles within single social site. Role-based conflict patterns. Constraint satisfaction.', 'done', 'high', 'server', NULL, NULL, '2026-02-10 23:19:37', '2026-02-25 21:35:20', NULL, '28af6e6c9c45a1e11099fcc38272b387', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRWHGA72W02XHD93QA0', 'story', '06FB0TNSRW5FXRP4KGCC3CBMAW', 'Single-ownership model', 'NPCs owned by one template. Reference links to other templates carry relationship metadata. Lifecycle coordination.', 'done', 'high', 'server', NULL, NULL, '2026-02-10 23:24:06', '2026-02-25 21:35:20', NULL, '7138ddf322da6e04280f8185651561d8', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRXEVG43WV5F56PS9VG', 'story', '06FB0TNSRW5FXRP4KGCC3CBMAW', 'Role definition schema', 'Define template roles: required traits, skills, relationships, routines. Role constraint system.', 'done', 'high', 'server', NULL, NULL, '2026-02-10 23:24:06', '2026-02-25 21:35:20', NULL, 'c1bc695807756acf428dfaf404cd7f28', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRYFESWS0ANXYFK5P28', 'story', '06FB0TNSRW5FXRP4KGCC3CBMAW', 'Spatial requirement specification', '15-40 tile space definitions. Sightline maps, privacy zones, traffic patterns. Authored or generated.', 'done', 'high', 'server', NULL, NULL, '2026-02-10 23:24:06', '2026-02-25 21:35:20', NULL, 'e199dde9e20def86934cf218fc92839b', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZKMXK0R1KY3SHC45R', 'story', NULL, 'Refactor: game_state.gd derived state in apply_snapshot()', 'Code review finding: apply_snapshot() computes stationary_ticks and derives current_zone_id from tile iteration. These are behavior-driving computations, not pure state storage per D-020. Move to server-side snapshot fields or extract to a client-side derived state helper.', 'done', 'low', NULL, 'client', NULL, '2026-02-25 11:23:02', '2026-02-25 21:42:33', NULL, '5aa9b58a2f41563a7198e53b30ae9425', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRYWJR0Z4C197XFNH5W', 'story', NULL, 'Refactor: dialogue_box.gd direct GameState mutation and AudioManager coupling', 'Code review finding: dialogue_box.gd sets GameState.dialogue_active from a UI component (3 call sites) and calls AudioManager.apply_dip() directly. Should use signals and let a coordinator manage state. Audio transitions should be signal-driven.', 'done', 'low', NULL, 'client', NULL, '2026-02-25 11:23:03', '2026-02-25 21:42:33', NULL, 'cd1b245807eb288d3e5a4d1db84a36ec', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRWQ4ARGVV29S194RCW', 'story', NULL, 'Refactor: main.gd god coordinator — extract SnapshotEventRouter', 'Code review finding: main.gd (517 lines) dispatches to 15+ child nodes. The consume methods all follow the same pattern. Extract into a SnapshotEventRouter object.', 'done', 'low', NULL, 'client', NULL, '2026-02-25 11:23:04', '2026-02-25 21:42:34', NULL, '2f63d9da94b95e43f595ca88f4f1d8a9', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRWBA71BA39BXDGWQZR', 'story', NULL, 'Refactor: unify duplicate YAML parsers', 'Code review finding: checklist_evaluator.gd contains its own YAML parser that partially duplicates ui_strings.gd._parse_yaml(). Unify into a shared utility.', 'done', 'low', 'stig', 'client', NULL, '2026-02-25 11:23:05', '2026-02-25 21:42:34', NULL, '7fc24c3d04605df3be206b575f6d3cc4', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZ4VCQ4R6CW3QBEN78', 'story', '06FB0TNSRXX5X1PDENVXC4DRJ4', 'Generator architecture workshop — district/block/chunk pipeline', 'Workshop brief: docs/workshops/generator-architecture/workshop-brief.md. Design workshop to establish the top-down generator pipeline architecture. Cities Skylines model: geography → infrastructure → amenities → population → zoning → block fill → chunk fill. Covers: chunk/block/district spatial hierarchy (reference #153 D-record), sub-chunk quarter system for building variety, multi-block structures (stations, government buildings, parks, stadiums), district skeleton as generator output (Q-036), v0.1/generator boundary (Q-037). Output: D-record defining generator architecture primitives + implementation tickets. Participants: Gestalt, Tyre, Miri, Araminta, Nigel.', 'done', 'medium', NULL, 'planning', NULL, '2026-02-25 17:35:23', '2026-02-27 09:19:42', NULL, 'cbff4339325ba012a47f2a1f6fde094b', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRX5SS6DV67K3A300V8', 'story', '06FB0TNSRZP48TDBTW18P88WNW', 'Save/load game flow', 'Client-side save/load integration. Save-to-file and load-from-file UI flow. Implements loading screen (wireframe TBD). F5/F6 mapped to quicksave/quickload. Per-game save directory structure per D-085. Quick-and-dirty MessagePack format for v0.1 (long-term format tracked in Q-029). Source: Tyre R1 M-5, Team Leader Sprint 19.\n\nSPLIT (Sprint 19): Split into #553 (server ECS extraction, team: server) and #554 (client UI, team: client). Do not assign this ticket to any sprint.', 'done', 'medium', NULL, 'client', NULL, '2026-02-11 00:03:27', '2026-02-27 10:07:14', NULL, '0809bc013d342a86e4a8480e80716678', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRY9PJ7HB77BY1TTR5W', 'story', NULL, 'Housekeeping: move debug_overlay.gd to ui/ directory', 'Code review finding: debug_overlay.gd lives at scripts/ui/ while all 17 other UI components are in ui/. Move for consistency or document the distinction.', 'done', 'low', NULL, 'client', NULL, '2026-02-25 11:23:06', '2026-02-27 10:07:15', NULL, 'f325c0bbc64b329de24fc161eef78d1e', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZEGGF5NN0VSKVH7M4', 'story', '06FB0TNSRW1K4QJHAVSJF2ECSC', 'Tier 2 template definition format', 'Social site template specification: roles, spaces, triangles, dialogue pools, routines. YAML or structured markdown.', 'done', 'high', NULL, 'server', NULL, '2026-02-10 23:23:54', '2026-02-27 16:47:00', NULL, 'a6d5250096ca0a54bacbe7488415117f', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRX1KC56T4WHXE8CM6W', 'story', '06FB0TNSRZMGXXPB99F23GMH68', 'Error handling & recovery', 'Handle simulation crashes, protocol errors, desync detection. Graceful degradation.', 'done', 'high', NULL, 'server', NULL, '2026-02-10 23:18:35', '2026-02-27 16:47:00', NULL, 'd19658cbcbae7d230a4f67ffe1874fee', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZA4JS4CAVHQ1XJ4AC', 'story', '06FB0TNSRW1K4QJHAVSJF2ECSC', 'Template instantiation engine', 'Take template definition, generate NPCs, assign relationships, place in world. Instance lifecycle management.', 'done', 'high', NULL, 'server', NULL, '2026-02-10 23:23:54', '2026-02-27 16:59:53', NULL, '47f2d3f656ad1da9e7be4b03ae85fead', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRW92JE4JBWB75P59SG', 'story', '06FB0TNSRW5FXRP4KGCC3CBMAW', 'Template-to-instance mapping', 'Instantiate template: spawn NPCs in roles, generate triangles, place in functional cluster space. Validation.', 'done', 'high', NULL, 'server', NULL, '2026-02-10 23:24:06', '2026-02-27 16:59:53', NULL, '5eae4e4f93398540a92afe6294f2616b', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRWXM2EFX6X34DD8NQ4', 'story', '06FB0TNSRZ202MPMFH0EDH2BT4', 'Basic environmental interaction', 'Doors (open/close), examinable objects, usable terminals. Environmental entities with Interactable components routed through the interaction dispatcher. Source: Gestalt R2 M-2.', 'done', 'medium', NULL, 'server', NULL, '2026-02-11 00:02:14', '2026-02-27 18:28:26', NULL, '099914e5426217b9398b102abb9a1fae', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZAD82R44N6TR9ZZ34', 'task', NULL, 'Move connector scripts from db/connectors/ to tooling/db/', 'Move sqlite_connector.py, qdrant_connector.py, config.json, and all wrapper scripts (sqlite-query, sqlite-exec, sqlite-init, sqlite-seed, qdrant-search, qdrant-index, qdrant-health, qdrant-count) from db/connectors/ to tooling/db/. Update all references in CLAUDE.md, docs/DEVOPS.md, agent briefings, skill files, and any scripts that reference the old paths.', 'done', 'medium', NULL, 'ci', NULL, '2026-02-11 00:36:38', '2026-02-27 18:28:26', NULL, '0fef24e140743894559f36dc937b1a57', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRX79T4J74GCFA4ZHG4', 'story', '06FB0TNSRXF7E7101000E124X0', 'Cross-template triangle generation', 'Generate 1+ triangle spanning multiple social sites. Reference link creation. Shared NPC coordination.', 'done', 'medium', NULL, 'server', NULL, '2026-02-10 23:19:37', '2026-02-27 18:28:26', NULL, '2b2aadcd52797a9dad520e90430027d5', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZGBQZ2G969G5GB9YW', 'story', '06FB0TNSRXF7E7101000E124X0', 'Triangle validation', 'Verify conflict viability, relationship coherence, interest divergence. Quality checks.', 'done', 'medium', NULL, 'server', NULL, '2026-02-10 23:19:37', '2026-02-27 18:28:26', NULL, '3b78da4e48f0556afd1b0ec149a9554f', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZV5NAYAW25V6MJAJ0', 'story', '06FB0TNSRXAPVCJAZ0ZKGESCP4', 'Fog shader too opaque — tune alpha for semi-transparent layers per D-059', 'The fog shader (client/shaders/fog.gdshader) renders Layer 2 (peripheral) and Layer 3 (deep fog) at alpha values that feel too opaque in practice. Per D-059, Layer 2 should be desaturated 40-50% and Layer 3 should show zone temperature tint through the fog. Tune alpha constants so fog reads as limited visibility, not a dark wall. Verify D-066 gradient edge (6-8 sim tiles = 3-4 visual tiles) is preserved. Acceptance: Fog Theater gauntlet room — entities behind peripheral fog dimmed but identifiable, deep fog shows zone tint, vision cone edge is soft.', 'done', 'high', NULL, 'visual', 'D-059,D-011,D-066', '2026-02-26 18:22:23', '2026-02-27 20:52:20', NULL, '24a064a7d6d327aae8a2e0287ff42a21', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRWJFRT1H565W77J508', 'story', '06FB0TNSRYSBCPK60TQ60MMRVM', 'Shared NPC coordination', 'NPCs with roles in multiple templates. Bartender knows smugglers. Worker is courier. 20-30 total NPCs across 3 templates.', 'done', 'high', NULL, NULL, NULL, '2026-02-10 23:25:13', '2026-02-28 11:21:19', NULL, '4e01d67f454da5f9349263aeffca476a', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZN4KD1Z427RV3AQA8', 'story', '06FB0TNSRYSBCPK60TQ60MMRVM', 'Social venue template - bar', 'Template definition: bartender, regulars, transients. Social hub, gossip nexus. Overlap with workplace and smuggling NPCs. 4-6 NPCs.', 'done', 'critical', NULL, NULL, NULL, '2026-02-10 23:25:13', '2026-02-28 11:21:19', NULL, '74ab5554d7a0d3cdee7f505b6bb90185', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRXSXH1Q8FYT96QTCR8', 'story', '06FB0TNSRYSBCPK60TQ60MMRVM', 'Smuggling ring template', 'Template definition: organizer, couriers, lookout, fence. Hidden operations, trust network. Embedded in workplace. 5-7 NPCs.', 'done', 'critical', NULL, NULL, NULL, '2026-02-10 23:25:13', '2026-02-28 11:21:19', NULL, '951f08190477fbe61c80a2aff5e65925', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRXDW7Y95Q395BWYEH8', 'task', NULL, 'Document MobileChunk Idle state as stationary installation primitive', 'D-111: Add documentation to D-108 MobileChunk specification noting that the Idle movement state is the canonical primitive for player-owned stationary installations (space stations, orbital platforms, parked vessels as bases). No code change — documentation of design intent to prevent future over-engineering. Update relevant briefings.', 'done', 'low', NULL, 'planning', 'D-111', '2026-02-27 10:05:43', '2026-02-28 11:32:03', NULL, 'a615d68da4e9caf47f454e5632823d9f', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRXZWJCYZ1XDH5CEBBC', 'story', '06FB0TNSRW1K4QJHAVSJF2ECSC', 'Storyteller module activation', 'Sprint 23 implementation scope. The StorytellerPlugin (server/src/storyteller/mod.rs) reads ContaminationActive (from ticket #254) to gate all activation logic. This is the post-contamination pacing layer: D-023 stipulates the storyteller activates Tier 1 modules based on player proximity and engagement, not timers.
**Why this is interesting:** The player never sees engagement scores. They just notice that after spending real time with Kael — watching him, talking to him, having monologue moments — things start happening around Kael. Organic play shapes which mystery thread escalates. Same contamination trigger, different activation per playthrough.
Implementation steps:
1. Gate check: read ContaminationActive component; no activation runs until contamination is active. Poll on a 10-tick cadence — no activation bus needed, just a system that no-ops until the gate opens.
2. Proximity query: collect all Active-tier NPCs within the player character''s last-N-tick movement path. Parameter name: ENGAGEMENT_WINDOW_TICKS (suggested starting value: 3000 = ~5 real minutes at 10 tps). Query the movement history buffer (#571) for NPC co-presence events within that window.
3. Engagement scoring: compute a score per NPC from three inputs with suggested weights:
- conversation_count * 2.0 (direct interaction; cappable — consider capping at 5 conversations to prevent dialogue-spam gaming)
- observation_time_ticks * 0.005 (sustained attention; 200 ticks ≈ 20 real seconds ≈ 1 point)
- monologue_triggers * 8.0 (richest signal — the character''s internal voice noticed something; weight heavily)
Formula: score = min(conversation_count, 5) * 2.0 + observation_time_ticks * 0.005 + monologue_triggers * 8.0
Source data: EngagementRecord component (#570) per entity.
4. Unentangled-NPC routing: if the highest-scoring NPC is from the mundane 50% (D-029), use D-025 reference links to find a connected active triangle and route activation through that NPC. The storyteller does not waste player investment — it weaponizes it. Fallback: if no reference links exist, use the highest-scoring Active-tier NPC.
5. Module selection: among active TriangleState forks, activate the fork containing the highest-scoring NPC (or routed NPC from step 4). SelectionStrategy enum: HighestScore (v0.1 default), WeightedRandom (future). Tie-breaking: SimRng (seeded, per D-010/D-030 determinism). Edge cases:
- No NPC has any engagement score: fall back to proximity-only (nearest Active-tier NPC).
- No active TriangleState forks: log warning, hold, retry on next 10-tick check.
6. Activation event: emit TriangleActivated { triangle_id } for downstream consumers:
- Tell system (D-024 NPC axis 9): escalate tell behavior frequency
- Routine scheduler: activated triangle NPCs may deviate from routine
- Monologue system (D-016): unlock situation-tagged lines for triangle_activated context
- FRIEND arc phase manager (D-034): if activated triangle contains THE FRIEND, advance to next relationship phase
- Activation produces subtle behavioral shifts, not announcements. The player discovers through observation. See Q-052 for the full parallel hint delivery channel model.
7. Lifecycle: see #572 for multi-activation, cooldown, and resolution rules.
System interaction chain:
ContaminationActive (#254) → gates → StorytellerPlugin.activation_pass() every 10 ticks
→ reads EngagementRecord (#570) signals → scores NPCs
→ routes through unentangled NPCs if needed (D-025 reference links)
→ selects TriangleState fork → emits TriangleActivated { triangle_id }
→ consumed by: tell system, routine scheduler, monologue pool, FRIEND arc manager
→ hint delivery via parallel diegetic channels (Q-052)
Prerequisites:
- #254 (contamination pacing layer, Sprint 22 server) — hard blocker
- #570 (EngagementRecord component) — data layer for step 3
- #571 (MovementHistoryBuffer) — data layer for step 2
- #572 (lifecycle rules) — multi-activation/cooldown spec for step 7
- Q-052 (hint delivery channels) — post-activation player nudging
D-023: storyteller activates Tier 1 modules based on player proximity and engagement, not timers.', 'done', 'high', NULL, 'server', 'D-023', '2026-02-10 23:23:54', '2026-02-28 12:00:18', NULL, '30290f676c139f6817ba500c38a571e2', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRYDHZBR7AWWQPGRKPW', 'task', NULL, 'Fix signed z-level addressing: base_z u8 → i8', 'D-110: Change base_z from u8 to i8 in MultiBlockReservation, FloorZone.z_level, and all structs that reference a z-level position (not a count). z_levels counts remain u8. Propagate through ~20 structs. Add documentation comment on DistrictSkeleton clarifying the distinction: base_z (i8, lowest floor, can be negative) vs z_levels (u8, count, always positive). Mechanically trivial type change — cascades through struct definitions but no logic changes.', 'done', 'high', NULL, 'server', 'D-110', '2026-02-27 10:05:42', '2026-02-28 12:56:03', NULL, 'd78c113d16d5d5c8fc17caeac93d6b2b', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZ49ZGKXKERTJP9YR8', 'story', NULL, 'Fog shader too opaque — tune alpha for semi-transparent layers per D-059', '## Problem
The fog shader (client/shaders/fog.gdshader) renders fog layers nearly opaque, obscuring the underlying world. Deep fog (layer 3) uses alpha 0.78-0.90 and light fog (layer 2) uses alpha 0.25-0.55. D-059 specifies:
- Light fog (peripheral): Desaturated 40-50%, brightness -30% — implies world visible through a colour/brightness filter, not hidden behind opaque overlay
- Deep fog (explored): Near-monochrome with ~10% zone temperature tint — world should be visible but heavily desaturated, not masked
Current behaviour makes fog feel like a wall rather than a perceptual filter. This hurts test gameplay because players cannot see previously explored areas at all.
## Acceptance Criteria
- Light fog (layer 2): world content visible through desaturation + dimming, not alpha blending to near-opaque
- Deep fog (layer 3): world content visible but near-monochrome, zone tint applied as colour shift not opaque overlay
- Unexplored (layer 5): remains fully opaque (correct as-is)
- Fog still breathes with Perlin noise animation per D-059
## Files
- client/shaders/fog.gdshader — primary change
- client/scripts/rendering/fog_shader.gd — may need uniform additions
- docs/architecture/fog-shader-spec.md — update if approach changes
## Design References
- D-059: Fog — shader-based, five layers, knowledge-graph-driven
- D-011: Fog of perception is non-negotiable
- D-066: Dual-scale grid (sim tile to visual tile mapping)', 'done', 'high', NULL, 'visual', 'D-059, D-011, D-066', '2026-02-26 18:21:13', '2026-02-28 13:12:20', NULL, 'a3c11bd7f89d7cec1d8f197fdf789c4f', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRYBX7C9X51JJSEKJ70', 'story', '06FB0TNSRXYZC8QDKK423KFSKC', 'Seed-based variation', 'Per-world-seed entanglement parameters. Prevent player calibration across playthroughs.', 'done', 'high', NULL, 'client', NULL, '2026-02-10 23:24:37', '2026-02-28 13:25:32', NULL, '818f378403918e5e8ba55a6093848937', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRYE1T6N6K9N7Z829PG', 'story', '06FB0TNSRXYZC8QDKK423KFSKC', 'Entanglement ratio configuration', '30/50/20 flat/mundane/intrigue split. Variable per seed. Configuration system.', 'done', 'high', NULL, 'client', NULL, '2026-02-10 23:24:37', '2026-02-28 13:25:32', NULL, '906d72c2811cf6f56bdfbb24fa8ee52c', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZTDDYABJ14AJ9VW40', 'bug', NULL, 'Fix fog system: blocky edges and zero visibility in explored areas', '## Problem
The fog/vision cone system has been iteratively modified and is now in a regressed state. Two persistent visual issues:
1. Blocky stair-stepped edges at the vision cone boundary — the transition from clear vision to fog shows hard tile-sized steps instead of a smooth gradient
2. Zero visibility in explored fog — tiles the player has previously seen appear as near-black instead of showing the underlying art with a light fog overlay. The player should always be able to see furniture, walls, NPCs etc that they have already discovered, just dimmed.
## Desired behavior (spec)
Three visual states, with smooth transitions between them:
### 1. Forward cone (120 deg arc, clear vision)
- Tiles currently in the player line of sight within the 120 deg forward cone
- Nearly transparent — world art fully visible
- Soft gradient edge at the cone boundary (6-8 tile fade, NOT tile-stepped)
### 2. Explored fog (light overlay)
- Tiles the player has previously seen but are not currently in the forward cone
- Light fog overlay (~25-30% opacity) — ALL underlying art, sprites, furniture, NPCs remain visible
- Just indicates not currently looking — NOT deep fog, NOT obscured
- Subtle animated noise for atmosphere (breathing, 8-10s cycle)
- Exploration memory is permanent: once seen, always shown in this state (never reverts to unexplored)
### 3. Unexplored (solid black)
- Tiles never seen — no information, solid near-black (#12141a)
- Smooth transition at the boundary with explored tiles
### Key constraints
- Explored tiles MUST preserve art and information — the fog is a translucent overlay, not an opaque mask
- No hard pixel boundaries between states — all transitions must be smooth gradients
- Exploration texture bounds must only grow, never shrink (tiles behind the player stay in the texture)
- Exploration data must survive texture resizes (copy old data into new buffer)
## Current state (failed initial QA)
Changes were made to server vision_cone.rs (simplified to Forward-only, removed Peripheral sector), fog.gdshader (simplified to 3-layer continuous blend), and fog_state.gd (grow-only bounds, exploration preservation). Server tests pass (1048+). But visual QA shows the two issues above persist — the shader math for the smooth gradient and the explored-tile overlay alpha are not producing the intended result. These changes are uncommitted on main.
## Files involved
- server/src/perception/vision_cone.rs — cone classification (simplified, tests pass)
- client/shaders/fog.gdshader — fog shader (needs work on gradient + alpha)
- client/scripts/autoloads/fog_state.gd — fog texture state (grow-only bounds in place)
- decisions/perception.md D-015, D-059 — design spec
## Acceptance criteria
- Forward cone edge has a smooth 6-8 tile gradient (no visible tile stepping)
- Explored tiles outside the cone show underlying art at ~25-30% fog overlay
- Explored tiles never revert to unexplored black
- Unexplored tiles are solid near-black
- Transitions between all three states are smooth (no hard edges)
- Server tests remain green', 'done', 'high', NULL, 'client', 'D-059', '2026-02-27 22:48:58', '2026-02-28 13:25:32', NULL, 'd852f41239026ffc450e909d7a0fc24f', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRXSE99G6TTTDXRC8X0', 'story', '06FB0TNSRXYZC8QDKK423KFSKC', 'NPC pool generation', 'Generate NPC population according to ratio. Flat (routine+greeting), mundane triangles, intrigue-entangled.', 'done', 'high', NULL, 'server', NULL, '2026-02-10 23:24:37', '2026-02-28 15:30:47', NULL, '9503cb8afc0ec21f2733fb8604ad2978', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRWH1DTWF6EF4Z8DKMM', 'task', '06FB0TNSRXCH1ZHWN1V0NVNVT4', 'Fuzzy tests for dynamic/procedural maps', 'Randomized testing of procedurally generated maps against invariants. Backlog. Depends on dynamic map system. Effort: 1d.', 'done', 'medium', NULL, 'server', NULL, '2026-02-17 12:58:13', '2026-02-28 15:31:02', NULL, '0191a756922d7da609a9934e474e6b68', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRZAGE8NNEN69N6DNW4', 'story', '06FB0TNSRXCH1ZHWN1V0NVNVT4', 'Zone Gate room implementation', 'Gauntlet room for testing zone transitions. Backlog. Depends on multi-map system. Effort: 1d.', 'done', 'medium', NULL, 'server', NULL, '2026-02-17 12:58:13', '2026-02-28 15:31:02', NULL, 'ce258471570cad3d854d0ed2433c919a', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRY9W3GZW9WEF8EQQ0R', 'story', '06FB0TNSRYSBCPK60TQ60MMRVM', 'Triangle instantiation', '2+ triangles per template. 1 cross-template triangle. Conflicting interests, relationship tensions. Authored constraints.', 'done', 'high', NULL, 'server', NULL, '2026-02-10 23:25:13', '2026-02-28 15:31:26', NULL, '890d9780c138fceb2e0369ef624d85e3', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRY26H1VTP08E56BTX0', 'story', '06FB0TNSRW1K4QJHAVSJF2ECSC', 'Contamination activation mechanic', 'Simplified v0.1 storyteller: even a timer-based trigger gives the 30-min session shape. Activates escalation events to prevent flat daily-life experience. Bridges gap until full storyteller (Q-010). Source: Gestalt R2 H-11, Ozzie R2 promotion of #162.', 'done', 'high', NULL, 'server', NULL, '2026-02-11 00:02:44', '2026-02-28 15:31:26', NULL, 'fcb06dc091bd4830cb30b41fdb116dee', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRXW8REF1Y5AA8RZJW4', 'task', NULL, 'remove db/connectors symlink (Sprint 22)', 'Remove the db/connectors → tooling/db/ backwards-compat symlink added in #274. Before removal: (1) update whatsinagame/ templates that still use db/connectors/ as canonical path — note these are kit templates and need their own path config, (2) grep all worktree branches for remaining db/connectors/ references and update them. The symlink was marked ''remove after Sprint 22'' in PR #274.', 'done', 'medium', NULL, 'ci', NULL, '2026-02-27 16:50:24', '2026-02-28 22:16:55', NULL, '9b2fb7d1494c2b8117aa0bc171eb4baf', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERT INTO tickets (record_id, type, parent_record_id, title, description, status, priority, assigned_to, team, decision_ref, created_at, updated_at, deleted_at, hash, canonical_version) VALUES ('06FB0TNSRXQR9Y9E36HVHA5RDR', 'task', NULL, 'Add modifications: Vec<Modification> stub on chunk and MobileChunk entities', 'DLC scope stub (D-111/D-112): Add a modifications: Vec<Modification> field (initially empty Vec) to both static chunk entities and MobileChunk entities. This is the entry point for the future player construction system. The stub must exist early so player-modified spaces round-trip through save/load. Define the Modification enum/struct with at minimum: position, modification_type, timestamp. Implementation of actual construction mechanics is DLC scope — this ticket covers only the data model stub.', 'done', 'medium', NULL, 'server', 'D-112', '2026-02-27 10:05:45', '2026-02-28 22:57:19', NULL, '4f15ee56df4cf179d6566706b7f1589c', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);