# Sprint 2 Impact Summary — Knowledge Graph Workshop **Date:** 2026-02-11 **Author:** SI (Project Manager) **Source:** Workshop synthesis (round2-synthesis.md) --- ## Executive Summary The Knowledge Graph Workshop (#351) has been reconciled into Sprint 2 scope. **8 new tickets added** to Sprint 2, all under epic #351. Sprint scope expands from 14 to 22 tickets, adding approximately **6.5 developer-days** of work. **Critical path impact:** New tickets #361, #362, and #366 block #112 (Observer visibility query), which is already on the critical path. Knowledge graph work is now **part of Sprint 2's critical path**, not parallel to it. **Risk level:** MEDIUM. Knowledge graph stub must ship with Sprint 2 proof (#357), but full implementation (gossip, inference, contradiction detection) is correctly deferred to Sprint 3+. --- ## New Tickets Added (8 total) All tickets created as children of #351 (Knowledge Graph Workshop epic), assigned to Sprint 2. | # | Title | Type | Priority | Team | Estimate | Blocks | |---|-------|------|----------|------|----------|--------| | #361 | Implement KnowledgeGraph component + types (D-041) | story | critical | server | 1 day | #112 | | #362 | StableEntityId component + EntityRegistry resource | story | critical | server | 1 day | #112, #360 | | #363 | KnowledgeEventQueue + processing system | story | high | server | 0.5 day | #112 | | #364 | Direct observation knowledge flow | story | critical | server | 0.5 day | #112 | | #365 | Basic knowledge decay system | story | high | server | 0.5 day | - | | #366 | Observer snapshot knowledge integration | task | critical | joint | 1 day | #358, #356 | | #367 | Knowledge graph unit test suite | task | high | server | 1 day | - | | #368 | Knowledge vocabulary for v0.1 content | task | high | content | 0.5 day | #309 | **Total added effort:** ~6.5 developer-days (per synthesis Part 7) --- ## Backlog Ticket Reconciliation ### Tickets Cancelled | # | Title | Reason | |---|-------|--------| | #89 | Information inventory | Subsumed by #361 (KnowledgeGraph component). The `Vec` placeholder is replaced by the full knowledge graph data model. | ### Tickets Marked Done | # | Title | Reason | |---|-------|--------| | #269 | CauseChain component | Already implemented per audit report (`server/src/cause_chain.rs`). Integration with knowledge system is Sprint 3+ work. | ### Tickets Requiring Reparenting (SQL Updates Needed) The following tickets are children of #49 (Information Boundary System epic) but should be reparented under #351 or updated with new dependencies: | # | Current Parent | Action Required | Rationale | |---|----------------|-----------------|-----------| | #138 | #49 | Reparent to #351 | Information tag schema = KnowledgeConfidence + FactId system (D-041) | | #139 | #49 | Reparent to #351, defer to Sprint 3 | Component-level access control depends on knowledge system | | #140 | #49 | Reparent to #351, merge into #366 | Entity visibility filtering IS the observer snapshot integration | | #141 | #49 | Reparent to #351, defer to Sprint 3 | Knowledge-based gating requires dialogue system + knowledge queries | | #142 | #49 | Reparent to #351, defer to Sprint 3 | NPC boundaries = KnowledgeGraph per NPC, but enforcement is Sprint 3 | **SQL commands required:** ```sql UPDATE tickets SET parent_id = 351 WHERE id IN (138, 139, 140, 141, 142); UPDATE tickets SET status = 'backlog', sprint_id = NULL WHERE id IN (139, 141, 142); -- Defer to Sprint 3 UPDATE tickets SET status = 'cancelled' WHERE id = 140; -- Merged into #366 ``` ### Tickets With New Dependencies | # | Title | New Dependency | Reason | |---|-------|----------------|--------| | #309 | Knowledge state vocabulary for v0.1 | Unblocked by #368 | D-041 Appendix A provides the vocabulary taxonomy | | #182 | Divergent starting knowledge | Depends on #361 | Starting knowledge = `KnowledgeGraph::with_background()` | | #360 | Resolve Q-019: entity ID stability | Partially resolved by #362 | Server-side stable IDs now defined, client mapping remains open | **SQL commands required:** ```sql -- Add blocking relationships INSERT INTO ticket_deps (blocker_id, blocked_id) VALUES (361, 112); -- KnowledgeGraph blocks observer query INSERT INTO ticket_deps (blocker_id, blocked_id) VALUES (362, 112); -- StableEntityId blocks observer query INSERT INTO ticket_deps (blocker_id, blocked_id) VALUES (362, 360); -- StableEntityId partially resolves Q-019 INSERT INTO ticket_deps (blocker_id, blocked_id) VALUES (366, 358); -- Snapshot integration blocked by schema design INSERT INTO ticket_deps (blocker_id, blocked_id) VALUES (366, 356); -- Snapshot integration blocks bridge ticket INSERT INTO ticket_deps (blocker_id, blocked_id) VALUES (368, 309); -- Vocabulary document unblocks content ticket INSERT INTO ticket_deps (blocker_id, blocked_id) VALUES (361, 182); -- KnowledgeGraph blocks divergent starting knowledge ``` --- ## Updated Sprint 2 Critical Path ### Before Workshop ``` #359 (Q-018) → #110 (shadowcast) → #111 (vision cone) → #112 (observer query) → #356 (bridge) → #357 (proof) ``` **Critical path length:** 6 tickets serial ### After Workshop ``` #359 (Q-018) → #110 (shadowcast) → #111 (vision cone) → ↓ #361 (KnowledgeGraph) → #362 (StableEntityId) → #363 (EventQueue) → #364 (Direct obs) → ↓ #366 (Snapshot integration) → #112 (observer query) → ↓ #356 (bridge) → #357 (proof) ``` **Critical path length:** 10 tickets serial (4 new knowledge tickets added to critical path) ### Parallel Tracks (Unchanged) - Client rendering: #116, #129, #130, #131, #113 (mostly independent until #113 waits on #112) - Time system: #358 → #25 → #357 - Knowledge testing/docs: #367, #368 (can run parallel to implementation) --- ## Sprint Scope Assessment ### Baseline Sprint 2 Scope (Before Workshop) - **14 tickets** across 3 tracks (server, client, joint) - **Critical path:** 6 tickets serial - **Estimated effort:** ~10-12 developer-days (not explicitly estimated pre-workshop) ### New Sprint 2 Scope (After Workshop) - **22 tickets** (+8 knowledge graph tickets) - **Critical path:** 10 tickets serial (+4 on critical path) - **Estimated effort:** ~16-18 developer-days (+6.5 from knowledge graph) ### Sprint Capacity Analysis **Assumption:** 2-week sprint, 2 full-time developers (Dudley + Oscar on server, Stig on client) - **Available capacity:** ~20 developer-days (2 devs × 10 days, assuming 50% utilization for blockers/reviews/overhead) - **Estimated work:** ~16-18 developer-days - **Buffer:** ~2-4 days **Verdict:** Sprint scope is achievable but TIGHT. No room for scope creep. Knowledge graph stub must ship as-is — no feature additions beyond Sprint 2 scope. --- ## Risks and Mitigations ### RISK 1: Critical Path Extended by 4 Tickets **Severity:** HIGH **Impact:** Knowledge graph tickets #361, #362, #363, #364 are now serially dependent and block #112. If any knowledge ticket slips, #112 slips, and the entire sprint slips. **Mitigation:** - Prioritize #361 (KnowledgeGraph) as first sprint task (day 1-2) - #362 (StableEntityId) starts immediately after #361 (day 2-3) - #363 and #364 are smaller (0.5 day each) and can be parallelized across team members - #366 (snapshot integration) is joint ticket — assign to Oscar (networking) to avoid blocking Dudley on server work **Owner:** SI (sprint tracking), Dudley (server lead) --- ### RISK 2: #112 Interface Contract Not Defined Until Week 2 **Severity:** MEDIUM **Impact:** #112 (Observer visibility query) needs the knowledge graph query interface from #361. If #361 is delayed or incomplete, #112 cannot start. **Mitigation:** - D-041 synthesis Part 5 defines the interface contract explicitly (lines 219-269) - #112 implementation can reference the synthesis while #361 is in progress - Interface is simple: `knows_entity()`, `relationship_with()`, `known_entities_iter()` — low risk of misinterpretation **Status:** Mitigated by synthesis clarity. No blocker expected. --- ### RISK 3: Stub vs Full Implementation Scope Creep **Severity:** MEDIUM **Impact:** Knowledge graph has many deferred features (gossip, inference, contradiction detection). Risk that developers implement more than Sprint 2 scope during #361. **Mitigation:** - Synthesis Part 7 explicitly defines Sprint 2 scope: data structures + direct observation + basic decay. No gossip, no inference. - #361 ticket description references D-041 Part 3 (structs) — implementation is struct definition, not full systems - Sprint 2 success criteria: `observe_entity()` works, relationship color appears in snapshot, remembered entities render as ghosts. That's it. **Owner:** Dudley (server), SI (scope enforcement) --- ### RISK 4: Testing Effort Underestimated **Severity:** LOW **Impact:** #367 (unit tests) is 1 day estimate, but knowledge graph has complex state (confidence levels, decay, serialization). 1 day may not be enough. **Mitigation:** - D-041 synthesis explicitly calls out test scenarios: CRUD, decay, confidence ordering, serialization roundtrip - If #367 slips, move to Sprint 3 — knowledge graph ships without full test coverage initially - Integration testing via Sprint 2 proof (#357) provides baseline validation **Owner:** Dudley (implementation + tests) --- ## Sprint Completion Criteria (Updated) Sprint 2 is **DONE** when: 1. Player character moves on screen (Sprint 1 baseline, maintained) ✓ 2. Camera follows the player character (no panning) (#116) ✓ 3. Tiles render from snapshot data (floor + walls visible) (#129) ✓ 4. Entities appear/disappear based on line-of-sight (#110, #111, #112) ✓ 5. Fog covers areas outside the vision cone (#131, #113) ✓ 6. Walking behind a wall hides what's on the other side (#110, #112) ✓ 7. Walking around a corner reveals what's there (#110, #112) ✓ 8. **[NEW]** Entity color reflects relationship state from knowledge graph (#361, #366) ✓ 9. **[NEW]** Remembered (not visible) entities appear as ghosts with faded color (#361, #366) ✓ **Knowledge graph proof:** Observe an NPC, walk away, return. The NPC appears as a ghost at last-known position while not in LOS. Color shifts based on relationship state (green = known, amber = person of interest). --- ## Open Questions (Not Sprint 2 Blockers) From synthesis Part 9: | Question | Description | Sprint Impact | |----------|-------------|---------------| | Q-024 | Gossip propagation timing (immediate vs queued) | Sprint 3+ decision | | Q-025 | Knowledge graph cap and eviction policy | Sprint 3+ optimization | | Q-026 | Contradiction detection algorithm | Sprint 3+ (THE FRIEND arc) | **None of these block Sprint 2.** Defer to Sprint 3 planning. --- ## Recommendations ### For Sprint Planning 1. **Prioritize #361 as first sprint task.** Everything depends on the KnowledgeGraph struct existing. Start day 1. 2. **Assign #366 (snapshot integration) to Oscar.** Dudley is overloaded on server critical path. Oscar can handle joint ticket after #358 (snapshot schema) is done. 3. **Defer #367 (tests) if needed.** If sprint runs tight, ship #361-#366 without full test coverage. Tests can be Sprint 3 follow-up. 4. **Track critical path daily.** With 10 serial tickets, 1-day slip = sprint slip. Daily standup must surface blockers immediately. ### For Epic #49 (Information Boundary System) Epic #49 now overlaps significantly with #351 (Knowledge Graph Workshop). Post-sprint, consolidate: - Mark #49 as superseded by #351, OR - Re-scope #49 as "client-facing information UI" (journal, knowledge display) while #351 owns the data model **Owner:** SI (post-sprint cleanup), Tyre (architecture reconciliation) --- ## Files Updated - **New tickets:** #361-#368 created, assigned to Sprint 2 - **Cancelled tickets:** #89 (information inventory) - **Done tickets:** #269 (CauseChain) - **Reparenting needed:** #138, #139, #140, #141, #142 (SQL updates required) - **New dependencies:** See "Tickets With New Dependencies" section above --- ## SQL Updates Required (Permission Denied — Manual Execution Needed) The following SQL commands need to be executed manually (ticket CLI does not support reparenting or dependency addition): ```sql -- Reparent information boundary tickets under #351 UPDATE tickets SET parent_id = 351, updated_at = datetime('now') WHERE id IN (138, 139, 140, 141, 142); -- Defer Sprint 3+ tickets UPDATE tickets SET status = 'backlog', sprint_id = NULL, updated_at = datetime('now') WHERE id IN (139, 141, 142); -- Cancel #140 (merged into #366) UPDATE tickets SET status = 'cancelled', updated_at = datetime('now') WHERE id = 140; -- Add ticket descriptions for new tickets UPDATE tickets SET description = 'Full KnowledgeGraph component with BTreeMap and BTreeMap. 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.', updated_at = datetime('now') WHERE id = 361; UPDATE tickets SET description = '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.', updated_at = datetime('now') WHERE id = 362; UPDATE tickets SET description = 'Event-driven knowledge updates. KnowledgeEventQueue resource + processing system drains queue per tick. Decouples perception from knowledge writes. Estimate: 0.5 day.', updated_at = datetime('now') WHERE id = 363; UPDATE tickets SET description = '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.', updated_at = datetime('now') WHERE id = 364; UPDATE tickets SET description = '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.', updated_at = datetime('now') WHERE id = 365; UPDATE tickets SET description = '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.', updated_at = datetime('now') WHERE id = 366; UPDATE tickets SET description = 'Unit tests for CRUD operations, decay mechanics, confidence ordering, serialization roundtrip, relationship state transitions. Estimate: 1 day.', updated_at = datetime('now') WHERE id = 367; UPDATE tickets SET description = '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.', updated_at = datetime('now') WHERE id = 368; -- Add blocking dependencies INSERT INTO ticket_deps (blocker_id, blocked_id) VALUES (361, 112); -- KnowledgeGraph blocks observer query INSERT INTO ticket_deps (blocker_id, blocked_id) VALUES (362, 112); -- StableEntityId blocks observer query INSERT INTO ticket_deps (blocker_id, blocked_id) VALUES (362, 360); -- StableEntityId partially resolves Q-019 INSERT INTO ticket_deps (blocker_id, blocked_id) VALUES (366, 358); -- Snapshot integration blocked by schema design INSERT INTO ticket_deps (blocker_id, blocked_id) VALUES (366, 356); -- Snapshot integration blocks bridge ticket INSERT INTO ticket_deps (blocker_id, blocked_id) VALUES (368, 309); -- Vocabulary document unblocks content ticket INSERT INTO ticket_deps (blocker_id, blocked_id) VALUES (361, 182); -- KnowledgeGraph blocks divergent starting knowledge ``` **Execute via:** `db/connectors/sqlite-exec ""` for each UPDATE/INSERT statement (requires bash permission restoration) --- ## Next Steps 1. **Execute SQL updates** (requires manual intervention — bash permission denied during reconciliation) 2. **Update sprint briefings** with new ticket IDs (#361-#368) 3. **Communicate critical path changes** to team (standup: knowledge graph is now on critical path) 4. **Begin #361 implementation** immediately (day 1 of sprint) 5. **Schedule daily critical path reviews** (10 serial tickets = daily tracking required) --- **End of Sprint 2 Impact Summary** **Files referenced:** - `/var/home/jeroenschweitzer/Projects/settled-reach/planning/docs/workshops/knowledge-graph-information-boundaries/round2-synthesis.md` - `/var/home/jeroenschweitzer/Projects/settled-reach/planning/docs/sprints/sprint-2/server.md` - `/var/home/jeroenschweitzer/Projects/settled-reach/planning/docs/sprints/sprint-2/joint.md` - `/var/home/jeroenschweitzer/Projects/settled-reach/planning/docs/sprints/sprint-2/client.md` - `/var/home/jeroenschweitzer/Projects/settled-reach/planning/db/connectors/ticket` (CLI used for ticket operations)