Two-round workshop producing D-041 (Knowledge Graph Data Model): - Round 1: independent analyses from Dudley, Gestalt, SI, Tyre, Paula - Round 2: synthesis resolving debates + Gestalt mechanics validation Key decisions: - 4-level confidence hierarchy (Suspects < KnowsOf < KnowsDetails < Direct) - BTreeMap for deterministic iteration (D-010 principle 4) - Per-entity Component model, not centralized Resource - StableEntityId + EntityRegistry for save/load stability (partial Q-019) - Sprint 2 stub: structs + direct observation + basic decay (~6.5 dev-days) Resolved Q-016 (knowledge hierarchy), raised Q-024/Q-025/Q-026. Created tickets #361-#368 under epic #351, reconciled #49 children. Updated sprint 2 briefings, agent briefings, and decision files. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
26 KiB
Knowledge Graph & Information Boundaries Workshop — Round 1: SI (Project Management)
Author: SI (Project Manager, Scrum Master) Date: 2026-02-11 Focus: Ticket landscape, dependency mapping, work breakdown preview, sprint impact, risk assessment
Executive Summary
The Knowledge Graph Workshop (Epic #351) sits at a critical junction in our project architecture. It blocks the Observer Snapshot Pipeline Workshop (#352), intersects directly with Sprint 2's critical path through #112, and affects 9 scattered backlog tickets that need consolidation. The server team has run ahead on #110 (shadowcasting) while blocked by Q-018 — manageable risk, but signals urgency pressure.
Critical finding: #112 (Observer visibility query) claims to "respect information boundaries" but the knowledge graph doesn't exist yet. This is a specification gap, not an implementation blocker — the workshop must define what "respects information boundaries" means in code.
Minimum viable knowledge graph for Sprint 2: What does visibility filtering need? Not the full gossip/inference/decay system — just the query interface that #112 can call. Workshop must identify the MVP boundary.
1. Current State: Ticket Inventory
1.1 Workshop Epics
| ID | Title | Status | Priority | Blocks |
|---|---|---|---|---|
| #351 | Workshop: Knowledge Graph & Information Boundaries | backlog | critical | #352 |
| #352 | Workshop: Observer Snapshot Pipeline | backlog | critical | (none tracked) |
Gap: #352 doesn't have explicit blockers beyond #351, but Sprint 2 completion (#357) depends on observer snapshot generation working. Implicit dependency chain not captured in tickets.
1.2 Sprint 2 Tickets (14 total)
| ID | Title | Status | Priority | Owner | Blocks |
|---|---|---|---|---|---|
| Design Track | |||||
| #359 | Resolve Q-018: shadowcasting algorithm | ready | critical | server | #110 |
| #358 | Design ObserverSnapshot v2 schema | ready | critical | joint | #112, #113, #25 |
| #360 | Resolve Q-019: entity ID stability | ready | high | joint | #130 |
| Server Track | |||||
| #110 | Shadowcasting algorithm - server | in_progress | critical | server | #111 |
| #111 | Vision cone implementation | ready | critical | server | #112 |
| #112 | Observer visibility query | ready | critical | server | #113, #356 |
| #25 | Game clock and day-phase system | ready | high | server | #357 |
| Client Track | |||||
| #116 | Camera lock to character | ready | critical | client | #357 |
| #129 | Tile rendering engine | ready | critical | client | (none) |
| #130 | Entity sprite management | ready | critical | client | (none) |
| #131 | Fog overlay rendering | ready | critical | client | (none) |
| #113 | Fog rendering - client | ready | critical | client | #356 |
| Integration Track | |||||
| #356 | Fog data through bridge | ready | critical | joint | #357 |
| #357 | Sprint 2 proof: fog of perception | ready | critical | joint | (none) |
Status: 13 ready, 1 in_progress. Server team working ahead on #110 despite Q-018 blocker.
1.3 Knowledge-Related Backlog Tickets (10 total, not in any sprint)
| ID | Title | Type | Status | Priority | Parent | Notes |
|---|---|---|---|---|---|---|
| #49 | Information Boundary System | epic | backlog | critical | #31 (Map & Nav) | Parent epic with 6 children |
| #138 | Information tag schema | story | backlog | critical | #49 | Child of #49 |
| #139 | Component-level access control | story | backlog | critical | #49 | Child of #49 |
| #140 | Entity visibility filtering | story | backlog | critical | #49 | Child of #49 |
| #141 | Knowledge-based information gating | story | backlog | high | #49 | Child of #49 |
| #142 | NPC information boundaries | story | backlog | high | #49 | Child of #49 |
| #269 | CauseChain component | story | backlog | high | #49 | Child of #49 (implemented, ticket status stale) |
| #89 | Information inventory | story | backlog | high | #39 (NPC Data) | Standalone, blocks #90 |
| #182 | Divergent starting knowledge | story | backlog | critical | #57 (PCs) | Content-side ticket |
| #264 | Knowledge/journal display | story | backlog | medium | (unlisted) | UI ticket |
| #272 | Information boundary negative test suite | story | backlog | high | (unlisted) | Test infrastructure |
| #309 | Knowledge state vocabulary for v0.1 | story | backlog | high | #55 (Dialogue) | Content blocker |
Key observation: Epic #49 (Information Boundary System) has 6 children. #89 (Information inventory) is standalone under NPC Data. These should be reconciled — either #89 becomes a child of #49, or #351 subsumes both.
CauseChain note (#269): The audit report and D-030 indicate CauseChain is already implemented (server/src/cause_chain.rs). Ticket status is stale. Should be marked done or retitled as integration work.
2. Dependency Mapping
2.1 Sprint 2 Critical Path to Proof (#357)
Blocking relationships (from ticket_deps table):
#359 (Q-018 decision) ──► #110 (shadowcast)
▼
#111 (vision cone)
▼
#358 (snapshot v2) ────────► #112 (observer query) ──┬─► #113 (fog render) ──┐
│ │ │ │
├─────────────────────────┴──► #356 (bridge) ◄─┘ │
│ │ │
└──► #25 (time) ──────────────┬────┘ │
│ │
#116 (camera lock) ──────────────────┴─────────────────────────────────────┬──┘
│
▼
#357 (proof)
Critical path (longest):
#359 → #110 → #111 → #112 → #356 → #357 (6 tickets serial)
Parallel tracks:
#358 → #25 → #357(3 tickets, merges at #357)#116 → #357(independent, merges at #357)- Client rendering (#129, #130, #131, #113) mostly independent until #113 waits on #112
Observation: #358 (ObserverSnapshot v2) gates three parallel tracks (#112, #113, #25). This is a design-blocker bottleneck. Joint team must resolve #358 early in sprint to unblock all three.
2.2 Knowledge Graph Workshop Dependencies
Architecture Audit (2026-02-11)
Consensus Rec #12: "Knowledge graph workshop NOW"
│
▼
#351 (Knowledge Graph Workshop) ◄──── implicitly affects ──── #112 (observer query)
│ │
│ "respects info boundaries"
│ │
└──► blocks ──► #352 (Observer Snapshot Pipeline) │
│
#49 (Info Boundary System epic) ◄─── overlaps ──────────────────┘
├─► #138 (tag schema)
├─► #139 (access control)
├─► #140 (entity visibility filtering) ◄───── related to #112
├─► #141 (knowledge-based gating)
├─► #142 (NPC info boundaries)
└─► #269 (CauseChain) [already implemented]
#89 (Information inventory) ◄─── overlaps with #351 ─── replaces Vec<String> placeholder
#309 (Knowledge vocab for v0.1) ◄─── content-side dependency ─── needs knowledge model
Gap identified: Epic #49 predates the workshop but covers overlapping scope. Post-workshop, #49 should either:
- Be consolidated under #351 as implementation tickets, OR
- Be re-scoped as the client-facing information system (UI, tags, access control) while #351 owns the knowledge graph data model
Recommendation: Treat #351 as the architecture/data model workshop, and #49's children (#138-#142) as implementation stories that depend on #351's outputs.
3. Gap Analysis: #112 "Respects Information Boundaries"
3.1 The Problem
Ticket #112 (Observer visibility query) description:
"Given observer entity, return visible entities and tiles. Respects information boundaries. Feeds ObserverSnapshot."
Question: What does "respects information boundaries" mean in code?
From D-010 principle 2:
"Every piece of game state is tagged with who knows it."
From current implementation (server/src/npc/mod.rs lines 46-48):
#[derive(Component, Debug, Clone, Serialize, Deserialize)]
pub struct InformationInventory {
pub known_facts: Vec<String>,
}
The gap: #112 needs to query "what does entity A know about entity B" but the knowledge graph is a Vec<String> placeholder. The observer query can't "respect information boundaries" until the knowledge model exists.
3.2 Is This a Blocker?
No — it's a specification gap, not an implementation blocker.
For Sprint 2's "fog of perception" proof, visibility is primarily geometric (LOS + vision cone). The full knowledge graph (gossip, inference, memory decay) isn't needed yet.
Minimum viable implementation for #112:
- Observer can see entities within LOS range
- Vision cone modulates range (forward = full, peripheral = reduced, behind = blind)
- Walls block vision (read from WalkabilityMap)
- No knowledge-based filtering for Sprint 2
Knowledge-based filtering comes later:
- "Can you identify this person?" (knows vs unknown)
- "Do you know what they're carrying?" (requires prior observation)
- "Do you know their secret?" (requires dialogue/investigation)
Recommendation: Workshop should define the query interface (#112 needs) even if full implementation is deferred. Sprint 2 uses geometric visibility only; Sprint 3+ adds knowledge filtering.
4. Work Breakdown Preview
4.1 Expected Workshop Outputs (from brief)
- Decision: D-0XX — Knowledge Graph Data Model — Rust struct definitions
- Decision: Resolution of Q-016 — Knowledge hierarchy (suspects < knows_of < knows_details)
- Design document: Knowledge flow specification
- Tickets: Implementation tasks broken down from design
- Performance budget: Memory/query time targets at 80 NPCs
4.2 Anticipated Ticket Structure Post-Workshop
Epic #351 will likely spawn:
| Type | Title (projected) | Priority | Notes |
|---|---|---|---|
| story | Implement KnowledgeGraph component | critical | Replace Vec<String> with structured graph |
| story | Knowledge confidence/hierarchy system | critical | Resolves Q-016 |
| task | Observer knowledge query interface | critical | What #112 calls to filter entities |
| story | Knowledge propagation: observation | high | How seeing something adds knowledge |
| story | Knowledge propagation: told/gossip | high | How NPCs share knowledge |
| story | Knowledge decay over time | medium | D-011 "fog returns when you leave" |
| task | Spatial indexing for knowledge queries | medium | Performance at 80 NPCs |
| story | Knowledge-based entity identification | medium | "Who is this person?" vs "unknown person" |
| task | Knowledge graph unit tests | high | Known scenarios, deterministic outcomes |
| story | Integrate knowledge into dialogue system | high | D-028 tagged line pools need knowledge prereqs |
Consolidation opportunity: Tickets #138 (tag schema), #140 (entity visibility filtering), #141 (knowledge gating), #142 (NPC boundaries) should become children of workshop output stories.
4.3 Integration with Existing Tickets
| Existing Ticket | Relationship to #351 |
|---|---|
| #89 (Information inventory) | DUPLICATE — subsume into #351 knowledge graph story |
| #138 (Information tag schema) | CHILD — becomes implementation task for knowledge tags |
| #140 (Entity visibility filtering) | CHILD — becomes implementation of observer query interface |
| #141 (Knowledge-based gating) | CHILD — uses knowledge graph for access control |
| #142 (NPC information boundaries) | CHILD — NPC knowledge = KnowledgeGraph component per entity |
| #269 (CauseChain) | RELATED — provenance system (already done per audit) |
| #309 (Knowledge vocab for v0.1) | DEPENDS ON — content team needs knowledge model first |
| #272 (Info boundary test suite) | DEPENDS ON — tests require implemented knowledge system |
Post-workshop ticket reconciliation required.
5. Sprint 2 Impact Assessment
5.1 Does #351 Block Sprint 2 Completion?
Short answer: No, but it creates technical debt.
Sprint 2 proof (#357): "Walk into a room and see the fog" — visibility-driven, not knowledge-driven. The geometric perception system (#110, #111, #112) can ship without full knowledge graph.
What Sprint 2 needs from #351:
- Query interface design: What does #112 call to ask "what can this observer see?" Even if the answer is always "everything in LOS" for Sprint 2, the interface contract must exist.
- Stub implementation path: #112 can call
KnowledgeGraph::can_observe(observer, target) -> boolthat returnstruefor Sprint 2. Full logic comes later.
What Sprint 2 does NOT need:
- Knowledge propagation (gossip, inference)
- Knowledge decay over time
- Knowledge confidence levels
- NPC-to-NPC knowledge sharing
5.2 Risk: Rework if Workshop Runs Long
If #351 isn't resolved before Sprint 2 starts, the server team will implement #112 with placeholder logic. Risk of rework if workshop produces incompatible interface design.
Mitigation: Workshop Round 1 (this round) runs concurrent with Sprint 2 kickoff. Round 2 synthesis should complete before #112 implementation starts (currently blocked by #111 anyway).
5.3 Critical Path Timing
Current sprint state:
- #110 (shadowcasting) is in_progress despite blocked by #359 (Q-018)
- #359 (Q-018) is a decision ticket (algorithm selection) — fast resolution possible
- #358 (ObserverSnapshot v2) is a design ticket — joint team bottleneck
Timeline pressure:
Week 1: #359 (Q-018) resolved, #110 continues
Week 1-2: #358 (snapshot v2) design — CRITICAL BOTTLENECK
Week 2: #111 (vision cone) starts after #110 done
Week 2-3: #112 (observer query) — needs knowledge interface from #351
Week 3: Integration (#356, #357)
Recommendation: Workshop Round 2 synthesis must complete by end of Week 1 to provide #112 with interface spec.
6. Risk Assessment
6.1 RISK: Server Team Running Ahead on #110
Status: #110 (shadowcasting) is in_progress, blocked by #359 (Q-018 decision).
Analysis:
- Q-018: "symmetric shadowcasting vs recursive shadowcasting"
- This is an algorithm selection decision, not a knowledge graph dependency
- Server team working ahead signals they're confident Q-018 will resolve quickly
- Risk: If Q-018 reverses their choice, rework required
Severity: LOW. Q-018 is a technical benchmarking question, not a design debate. Tyre and Dudley can resolve this in Round 1 with perf data.
Action: No intervention needed. Track #359 status. If blocked >3 days, escalate.
6.2 RISK: #112 Says "Respects Information Boundaries" But No Model Exists
Covered in Section 3. Summary:
- Not a Sprint 2 blocker (geometric visibility sufficient)
- Workshop must define query interface even if full implementation deferred
- Risk of rework if #112 implements placeholder that conflicts with workshop output
Severity: MEDIUM. Mitigated by workshop timeline (Round 2 before #112 starts).
Action: Workshop participants must explicitly address "What query interface does #112 need?" in Round 1 analyses.
6.3 RISK: #358 (ObserverSnapshot v2) as Design Bottleneck
Status: #358 blocks 3 parallel tracks (#112, #113, #25). Joint team (Tyre) must design expanded schema.
Dependencies:
- Needs visibility data structure (tiles? bitmap? fog states?)
- Needs time data format (tick? game_time? day_phase?)
- Needs facing direction representation (angle? cardinal? sector?)
Timeline: Must complete Week 1 to unblock Week 2 work.
Severity: HIGH if delayed. Currently ready status = no blocker.
Action: Prioritize #358 at sprint kickoff. Joint team (Tyre + Oscar) design session.
6.4 RISK: Scattered Backlog Tickets Create Duplicate Work
Issue: Epic #49 (Information Boundary System) and workshop #351 overlap significantly. Both are critical priority, neither in a sprint.
Risk scenarios:
- Workshop produces design that conflicts with #49's child ticket assumptions
- Implementation team picks up #49 children before #351 workshop completes
- Post-workshop, unclear which tickets are superseded vs still valid
Severity: MEDIUM. Organizational risk (confusion, duplicate work) not technical risk.
Action: Post-workshop ticket reconciliation required. Mark duplicates, reparent children, update dependencies.
6.5 RISK: Performance Budget Unvalidated
From audit: At 80 Active NPCs, each with knowledge about ~50 entities, naive implementation = O(N^2) queries.
Workshop must produce:
- Memory budget: How much RAM for 80 NPCs × 50 knowledge entries?
- Query time budget: How fast must
can_observe()return to stay within 100ms tick budget? - Spatial indexing strategy: Grid-based cache? Dirty flagging?
Severity: LOW for Sprint 2 (15 NPCs). HIGH for full Active tier (80 NPCs).
Action: Workshop Round 1 (Tyre) should include back-of-envelope calculations. Round 2 validates or revises.
6.6 RISK: Knowledge Vocabulary (#309) Blocks Content Authoring
Issue: Content team needs knowledge flags (knows:smuggling_operation, suspects:manifest) to write monologue prerequisites. Can't author until vocabulary exists.
Dependencies: #309 blocks #299 (smuggler opening) and #300 (detective opening).
Severity: MEDIUM. Content isn't Sprint 2 blocker, but it's a vertical slice blocker (Sprint 4-5).
Action: Workshop should produce initial vocabulary list. Doesn't need to be exhaustive — content team can extend it — but needs the taxonomy structure (prefix:subject format, hierarchy levels).
7. Recommendations for Round 2
7.1 Questions for Workshop Participants
For Tyre (architecture lead):
- What is the query interface that #112 (observer visibility query) needs?
- Can Sprint 2 ship with a stub implementation (
can_observe() -> true) or does the real logic need to exist? - Performance budget: memory and query time at 80 NPCs.
For Gestalt (mechanics):
- What are the knowledge hierarchy levels for Q-016? (suspects < knows_of < knows_details)
- How does knowledge confidence decay over time? (D-011 "fog returns")
- What gameplay-visible behaviors require knowledge filtering vs geometric visibility?
For Paula (narrative):
- What initial knowledge vocabulary is needed for v0.1 monologue authoring? (addresses #309)
- How does divergent starting knowledge (#182) manifest in the knowledge graph?
- Does THE FRIEND pattern require special knowledge graph behavior?
For Dudley (implementation):
- Can
InformationInventory { Vec<String> }survive Sprint 2 as-is, or does it need replacement now? - What does bevy_ecs entity-to-entity knowledge storage look like? (Component per entity? Resource with HashMap?)
- How is CauseChain (#269, already implemented) integrated with knowledge provenance?
For Qatux (docs):
- Post-workshop: which decisions need briefing updates?
- Are there implicit dependencies in existing decisions that this workshop exposes?
For SI (this analysis):
- What tickets are duplicates vs distinct work?
- What's the post-workshop ticket reconciliation plan?
7.2 Required Outputs for Sprint 2 Unblocking
Minimum workshop outputs to unblock #112:
- Query interface spec: Function signature for "can observer see target?"
- Stub implementation strategy: What does Sprint 2 return? (always true? geometric only?)
- Data structure sketch: Even if not fully implemented, what replaces
Vec<String>?
Without these, #112 will implement placeholder logic that may conflict with final design.
7.3 Ticket Reconciliation Plan (Post-Workshop)
After workshop produces decisions and tickets:
-
Review Epic #49 children (#138, #139, #140, #141, #142):
- Mark duplicates of workshop output as
cancelledor consolidate - Reparent distinct work under appropriate workshop stories
- Update all blocking relationships
- Mark duplicates of workshop output as
-
Consolidate #89 (Information inventory):
- If duplicate of knowledge graph story → mark
cancelled, reference workshop ticket - If distinct (UI component) → update dependencies
- If duplicate of knowledge graph story → mark
-
Resolve #269 (CauseChain) status:
- Audit says implemented (
server/src/cause_chain.rs) - Mark
doneor retitle as integration task
- Audit says implemented (
-
Update Sprint 2 ticket dependencies:
- Add explicit dependency: #351 blocks #112 (or workshop output ticket blocks #112)
- Update #112 description with interface contract once defined
-
Propagate to content tickets:
- #309 (knowledge vocab) depends on #351 output
- #182 (divergent starting knowledge) depends on knowledge model
- Update blocking relationships
8. Dependency Graph Summary
8.1 Before Workshop
Scattered tickets, overlapping scope:
#49 (Info Boundary System epic)
├─ #138, #139, #140, #141, #142, #269
#89 (Information inventory)
#351 (Knowledge Graph Workshop) ────► blocks ────► #352 (Observer Snapshot)
#112 (observer query) ────► implicit dependency ────► ???
8.2 After Workshop (projected)
#351 (Knowledge Graph Workshop)
│
├─► D-0XX (Knowledge Graph Data Model decision)
├─► D-0XX (Resolution of Q-016)
│
├─► Story: Implement KnowledgeGraph component
│ ├─► Task: Observer knowledge query interface ◄──── #112 depends on this
│ ├─► Task: Knowledge tag schema (was #138)
│ └─► Unit tests
│
├─► Story: Knowledge propagation (observation, gossip, inference)
│ ├─► Task: Observation adds knowledge
│ ├─► Task: NPC knowledge sharing (was #142)
│ └─► Integration tests
│
├─► Story: Knowledge decay over time
│ └─► Task: Spatial/temporal decay rules
│
└─► Story: Knowledge-based information gating (was #141)
├─► Task: Entity identification filtering (was #140)
├─► Task: Component access control (was #139)
└─► Negative test suite (was #272)
#89 (Information inventory) ────► consolidate into KnowledgeGraph story
#309 (Knowledge vocab) ◄──── depends on ──── Knowledge model
#182 (Divergent starting knowledge) ◄──── depends on ──── Knowledge model
#351 ────► blocks ────► #352 (Observer Snapshot Pipeline Workshop)
9. Sprint Impact Scorecard
| Factor | Score | Notes |
|---|---|---|
| Blocks Sprint 2 completion? | NO | Geometric visibility sufficient for proof |
| Affects Sprint 2 tickets? | YES | #112 interface design needed |
| Requires ticket rework? | MEDIUM | If #112 starts before workshop done |
| Creates sprint delay risk? | LOW | Workshop Round 2 aligns with #112 timeline |
| Organizational complexity? | HIGH | 10 backlog tickets need reconciliation |
| Technical debt if deferred? | HIGH | Placeholder will calcify, rework expensive |
Conclusion: Workshop is correctly prioritized as CRITICAL. Timeline allows Sprint 2 to proceed with stub implementation, full knowledge system delivers Sprint 3+.
10. Summary: What SI Needs from Round 2
- Query interface spec — concrete function signature for #112 to call
- Sprint 2 stub strategy — what does
can_observe()return for fog proof? - Ticket inventory — which workshop output tickets supersede which backlog tickets?
- Performance budget — memory/query time targets for Active tier (80 NPCs)
- Knowledge vocabulary taxonomy — structure for #309 to populate
- Timeline confirmation — can workshop Round 2 complete before #112 implementation starts (Week 2)?
With these inputs, SI can:
- Create implementation tickets from workshop design
- Reconcile/close duplicate backlog tickets
- Update Sprint 2 dependencies if needed
- Scope Sprint 3 knowledge system work
- Unblock content team (#309, #182)
Appendix: Ticket Queries for Round 2 Synthesis
All knowledge-related backlog tickets
SELECT id, title, type, status, priority, parent_id
FROM tickets
WHERE status = 'backlog'
AND (title LIKE '%knowledge%' OR title LIKE '%information%' OR title LIKE '%boundary%')
ORDER BY priority DESC, id;
Epic #49 full tree
WITH RECURSIVE tree AS (
SELECT id, title, type, parent_id, 0 as depth FROM tickets WHERE id = 49
UNION ALL
SELECT t.id, t.title, t.type, t.parent_id, tree.depth + 1
FROM tickets t JOIN tree ON t.parent_id = tree.id
)
SELECT * FROM tree ORDER BY depth, id;
All tickets blocking Sprint 2 proof (#357)
WITH RECURSIVE blockers AS (
SELECT blocker_id as id FROM ticket_deps WHERE blocked_id = 357
UNION
SELECT td.blocker_id FROM ticket_deps td JOIN blockers b ON td.blocked_id = b.id
)
SELECT DISTINCT t.id, t.title, t.status FROM tickets t
JOIN blockers b ON t.id = b.id
ORDER BY t.id;
Result: 9 tickets in critical path (#359, #358, #110, #111, #112, #113, #356, #116, #25)
End of Round 1 Analysis — SI