docs(diagrams): add decision diagrams across all domains

16 d2 diagrams covering architecture (IPC bridge, system tiers,
testability, audio bus), data flow (perception, dialogue, eavesdrop
pipelines), entity (knowledge graph, NPC generation, dialogue tags),
state (simulation tiers, movement stances, knowledge confidence), and
UI (HUD layout, interaction flow, fog layers). PNG output for universal
viewer compatibility. Removes test SVG from font debugging.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-02-23 11:57:07 +01:00
co-authored by Claude Opus 4.6
parent 08dfadb863
commit 1e556ccca2
33 changed files with 2153 additions and 97 deletions
@@ -0,0 +1,171 @@
# Dialogue Pipeline — D-028, D-062, D-063, D-064, D-075
# Four relational layers, two-phase verb computation, invisible locks,
# confrontation weight, walk-away consequences.
vars: {
color-bg: "#2a3040"
color-stroke: "#333340"
color-text: "#c8d0e0"
color-accent: "#c8d8f0"
color-dim: "#1a1e24"
}
direction: down
player_action: Player Initiates Interaction {
shape: oval
style.fill: ${color-bg}
style.stroke: ${color-accent}
style.font-color: ${color-text}
}
verb_phase1: Phase 1 — Simulation\n(no KnowledgeGraph read) {
style.fill: ${color-bg}
style.stroke: ${color-stroke}
style.font-color: ${color-text}
style.border-radius: 4
object_type: ObjectType component\n→ max possible verb set {
style.fill: ${color-dim}
style.stroke: ${color-stroke}
style.font-color: ${color-text}
}
}
verb_phase2: Phase 2 — Observer\n(reads KnowledgeGraph) {
style.fill: ${color-bg}
style.stroke: ${color-accent}
style.font-color: ${color-text}
style.border-radius: 4
kg_filter: Filter by KG confidence\n(Confront requires KnowsDetails+) {
style.fill: ${color-dim}
style.stroke: ${color-accent}
style.font-color: ${color-text}
}
poi_flip: POI priority flip\n+ contradiction markers {
style.fill: ${color-dim}
style.stroke: ${color-stroke}
style.font-color: ${color-text}
}
archetype_filter: Archetype filter rules\n(same crate: smuggler→Stash · detective→Flag) {
style.fill: ${color-dim}
style.stroke: ${color-stroke}
style.font-color: ${color-text}
}
}
layer_filter: Four Relational Layers (D-028) {
style.fill: ${color-dim}
style.stroke: ${color-stroke}
style.font-color: ${color-text}
l1: Layer 1 — Access Tier\n(RelationshipState only) {
style.fill: ${color-bg}
style.stroke: ${color-stroke}
style.font-color: ${color-text}
}
l2: Layer 2 — Relationship History\n(interaction log: greeting + topic) {
style.fill: ${color-bg}
style.stroke: ${color-stroke}
style.font-color: ${color-text}
}
l3: Layer 3 — Trust-gated Gossip\n(RelationshipState AND KnowledgeConfidence — D-075) {
style.fill: ${color-bg}
style.stroke: ${color-accent}
style.font-color: ${color-text}
}
l4: Layer 4 — Unprompted Disclosure\n(weighted by trust + mood) {
style.fill: ${color-bg}
style.stroke: ${color-stroke}
style.font-color: ${color-text}
}
}
invisible_locks: Invisible Locked Options (D-062) {
style.fill: ${color-bg}
style.stroke: ${color-stroke}
style.font-color: ${color-text}
style.border-radius: 4
rule: Locked options = completely invisible\nNo grayed-out · no lock icons · no hints {
style.fill: ${color-dim}
style.stroke: ${color-stroke}
style.font-color: ${color-text}
}
reveal: New options appearing on repeat visits\n= the reward (dopamine) {
style.fill: ${color-dim}
style.stroke: ${color-accent}
style.font-color: ${color-text}
}
}
confrontation: Confrontation Weight (D-063) {
style.fill: ${color-bg}
style.stroke: ${color-accent}
style.font-color: ${color-text}
style.border-radius: 4
voice: Written in character's internal voice\n(italicized first-person) {
style.fill: ${color-dim}
style.stroke: ${color-stroke}
style.font-color: ${color-text}
}
monologue_beat: Pre-delivery monologue beat\n1-2s: "No taking it back." {
style.fill: ${color-dim}
style.stroke: ${color-stroke}
style.font-color: ${color-text}
}
world_reacts: World reacts\n(NPC Tier 2 anim · D-033 fade · monologue spikes) {
style.fill: ${color-dim}
style.stroke: ${color-stroke}
style.font-color: ${color-text}
}
}
walk_away: Walk-away (D-064)\nWASD during conversation {
shape: diamond
style.fill: ${color-bg}
style.stroke: ${color-accent}
style.font-color: ${color-text}
}
walk_away_phases: Walk-away Consequences {
style.fill: ${color-dim}
style.stroke: ${color-stroke}
style.font-color: ${color-text}
immediate: 1 — Dialogue fades 300ms\n(no close button) {
style.fill: ${color-bg}
style.stroke: ${color-stroke}
style.font-color: ${color-text}
}
npc_reacts: 2 — NPC reacts\n(animation · may call after player) {
style.fill: ${color-bg}
style.stroke: ${color-stroke}
style.font-color: ${color-text}
}
kg_record: 3 — KG records incompleteness\n(per-seed tolerance: no universal safe-to-leave rules) {
style.fill: ${color-bg}
style.stroke: ${color-accent}
style.font-color: ${color-text}
}
}
player_action -> verb_phase1
verb_phase1 -> verb_phase2: "max verb set" { style.stroke: ${color-accent} }
verb_phase2 -> layer_filter: "filtered verb set" { style.stroke: ${color-accent} }
layer_filter.l1 -> layer_filter.l2
layer_filter.l2 -> layer_filter.l3
layer_filter.l3 -> layer_filter.l4
layer_filter -> invisible_locks: "visible options only\n(max 3 shown)" {
style.stroke: ${color-accent}
}
invisible_locks -> confrontation: "if Confront option present" {
style.stroke: ${color-stroke}
style.stroke-dash: 4
}
invisible_locks -> walk_away
walk_away -> walk_away_phases.immediate
walk_away_phases.immediate -> walk_away_phases.npc_reacts
walk_away_phases.npc_reacts -> walk_away_phases.kg_record
Binary file not shown.

After

Width:  |  Height:  |  Size: 856 KiB

@@ -0,0 +1,162 @@
# Eavesdrop Pipeline — D-071, D-072, D-078
# Overheard NPC-to-NPC conversation: occlusion filter (server-authoritative),
# ListeningFocus boost, passive dialogue panel, dual-channel principle.
vars: {
color-bg: "#2a3040"
color-stroke: "#333340"
color-text: "#c8d0e0"
color-accent: "#c8d8f0"
color-dim: "#1a1e24"
}
direction: down
npc_convo: NPC-to-NPC Conversation\n(authored at full fidelity by copy team) {
shape: oval
style.fill: ${color-bg}
style.stroke: ${color-accent}
style.font-color: ${color-text}
}
murmur: Universal Murmur Asset (D-072)\nsingle asset plays everywhere {
shape: package
style.fill: ${color-bg}
style.stroke: ${color-stroke}
style.font-color: ${color-text}
}
zone_ambient: Zone Ambient Level {
shape: diamond
style.fill: ${color-bg}
style.stroke: ${color-stroke}
style.font-color: ${color-text}
}
conspicuousness: Conversation Conspicuousness {
style.fill: ${color-dim}
style.stroke: ${color-stroke}
style.font-color: ${color-text}
bar: Bar (high ambient)\nhidden in murmur, needs proximity {
style.fill: ${color-bg}
style.stroke: ${color-stroke}
style.font-color: ${color-text}
}
workplace: Workplace (moderate)\nsemi-conspicuous, distance-dependent {
style.fill: ${color-bg}
style.stroke: ${color-stroke}
style.font-color: ${color-text}
}
corridor: Corridor (low ambient)\nconspicuous, audible from distance {
style.fill: ${color-bg}
style.stroke: ${color-accent}
style.font-color: ${color-text}
}
}
server_occlusion: Server-side Occlusion Filter (D-078)\nper-word probability roll {
style.fill: ${color-bg}
style.stroke: ${color-accent}
style.font-color: ${color-text}
style.border-radius: 4
factors: Factors: distance · ambient noise\n· ListeningFocus stance {
style.fill: ${color-dim}
style.stroke: ${color-stroke}
style.font-color: ${color-text}
}
stochastic: Stochastic per word\n(same scene can yield different fragments) {
style.fill: ${color-dim}
style.stroke: ${color-accent}
style.font-color: ${color-text}
}
seeded: Seedable RNG per tick\n→ deterministic replay (D-010) {
style.fill: ${color-dim}
style.stroke: ${color-stroke}
style.font-color: ${color-text}
}
}
listen_focus: ListeningFocus Boost (D-071)\nWorld SFX +2 to +3dB\nstationary 30+ ticks {
style.fill: ${color-bg}
style.stroke: ${color-accent}
style.font-color: ${color-text}
style.border-radius: 4
}
no_ambient_dip: No Ambient Dip for Eavesdrop\n(opposite of direct conversation dip) {
style.fill: ${color-dim}
style.stroke: ${color-stroke}
style.font-color: ${color-text}
style.stroke-dash: 4
}
occluded_text: Pre-occluded text\n(words → "..." per roll) {
shape: page
style.fill: ${color-dim}
style.stroke: ${color-stroke}
style.font-color: ${color-text}
}
passive_panel: Passive Dialogue Panel (D-078)\n(D-061 box, read-only) {
style.fill: ${color-bg}
style.stroke: ${color-accent}
style.font-color: ${color-text}
style.border-radius: 4
speaker_label: Speaker format (e.g. Kael to Mira) {
style.fill: ${color-dim}
style.stroke: ${color-stroke}
style.font-color: ${color-text}
}
reduced_opacity: Reduced opacity (0.9)\nvs active dialogue {
style.fill: ${color-dim}
style.stroke: ${color-stroke}
style.font-color: ${color-text}
}
no_responses: No response options {
style.fill: ${color-dim}
style.stroke: ${color-stroke}
style.font-color: ${color-text}
}
}
monologue_channel: Monologue Channel\n(D-016 — separate pipeline) {
style.fill: ${color-dim}
style.stroke: ${color-stroke}
style.font-color: ${color-text}
witness_trigger: witness_interaction trigger\n→ character's reaction {
style.fill: ${color-bg}
style.stroke: ${color-stroke}
style.font-color: ${color-text}
}
separate: Character reaction\n(thought · never quoted speech) {
style.fill: ${color-bg}
style.stroke: ${color-stroke}
style.font-color: ${color-text}
}
}
kg_entry: KnowledgeGraph entry\n(KnowsOf confidence unless\nListeningFocus + proximity → KnowsDetails) {
shape: cylinder
style.fill: ${color-bg}
style.stroke: ${color-accent}
style.font-color: ${color-text}
}
npc_convo -> murmur: "audio" { style.stroke: ${color-stroke} }
npc_convo -> zone_ambient: "text goes through" { style.stroke: ${color-accent} }
murmur -> zone_ambient: "conspicuousness shaped by" { style.stroke: ${color-stroke} }
zone_ambient -> conspicuousness
zone_ambient -> server_occlusion: "noise penalty" { style.stroke: ${color-stroke} }
listen_focus -> server_occlusion: "probability curve shift" { style.stroke: ${color-accent} }
no_ambient_dip -> listen_focus: "instead of dip" { style.stroke: ${color-stroke}; style.stroke-dash: 4 }
server_occlusion -> occluded_text: "pre-occluded text sent to client" { style.stroke: ${color-accent} }
occluded_text -> passive_panel: "client renders exactly what it receives" { style.stroke: ${color-accent} }
passive_panel -> monologue_channel: "triggers witness_interaction" {
style.stroke: ${color-stroke}
style.stroke-dash: 4
}
passive_panel -> kg_entry: "overheard info enters KG" { style.stroke: ${color-accent} }
Binary file not shown.

After

Width:  |  Height:  |  Size: 826 KiB

@@ -0,0 +1,185 @@
# Perception Pipeline — D-011, D-017, D-018, D-019, D-059, D-060, D-067
# From simulation ECS through to rendered fog and monologue.
# Covers: fog of perception, LOS (D-035), perception modes, three-range sound,
# fog layers, cognitive delay, recognition chime.
vars: {
color-bg: "#2a3040"
color-stroke: "#333340"
color-text: "#c8d0e0"
color-accent: "#c8d8f0"
color-dim: "#1a1e24"
}
direction: down
world: ECS World State {
shape: hexagon
style.fill: ${color-bg}
style.stroke: ${color-accent}
style.font-color: ${color-text}
}
los: LOS System\n(Albert Ford symmetric shadowcasting — D-035) {
style.fill: ${color-bg}
style.stroke: ${color-accent}
style.font-color: ${color-text}
style.border-radius: 4
fov: compute_fov(is_opaque, origin, range, z)\n→ VisibilityMap {
style.fill: ${color-dim}
style.stroke: ${color-stroke}
style.font-color: ${color-text}
}
symmetry: Symmetry guarantee:\nif A sees B → B sees A {
style.fill: ${color-dim}
style.stroke: ${color-stroke}
style.font-color: ${color-text}
}
}
perception_modes: Perception Modes (D-017) {
style.fill: ${color-dim}
style.stroke: ${color-stroke}
style.font-color: ${color-text}
natural: Natural Vision\n(walls block, cone model) {
style.fill: ${color-bg}
style.stroke: ${color-accent}
style.font-color: ${color-text}
}
thermal: Thermal\n(heat through walls, no identity) {
style.fill: ${color-bg}
style.stroke: ${color-stroke}
style.font-color: ${color-text}
style.stroke-dash: 4
}
camera: Camera Feeds\n(remote, spoofable) {
style.fill: ${color-bg}
style.stroke: ${color-stroke}
style.font-color: ${color-text}
style.stroke-dash: 4
}
unisphere: Unisphere Tracking\n(known inserts, maskable) {
style.fill: ${color-bg}
style.stroke: ${color-stroke}
style.font-color: ${color-text}
style.stroke-dash: 4
}
audio_analysis: Audio Analysis\n(signatures, no visual) {
style.fill: ${color-bg}
style.stroke: ${color-stroke}
style.font-color: ${color-text}
style.stroke-dash: 4
}
}
sound: Sound System (D-018)\nThree-Range Model {
style.fill: ${color-dim}
style.stroke: ${color-stroke}
style.font-color: ${color-text}
close: Close (in/near LOS)\nHigh accuracy · stereo audio {
style.fill: ${color-bg}
style.stroke: ${color-accent}
style.font-color: ${color-text}
}
medium: Medium (outside LOS)\nVisual indicators at fog edge + monologue {
style.fill: ${color-bg}
style.stroke: ${color-stroke}
style.font-color: ${color-text}
}
long: Long (across map)\nInsert notifications · spoofable {
style.fill: ${color-bg}
style.stroke: ${color-stroke}
style.font-color: ${color-text}
style.stroke-dash: 4
}
}
snapshot: ObserverSnapshot {
shape: queue
style.fill: ${color-dim}
style.stroke: ${color-accent}
style.font-color: ${color-text}
}
kg_read: KnowledgeGraph read\n(per-character — what THIS observer knows) {
shape: cylinder
style.fill: ${color-bg}
style.stroke: ${color-accent}
style.font-color: ${color-text}
}
fog: Fog Rendering (D-059)\n5-layer shader system {
style.fill: ${color-dim}
style.stroke: ${color-accent}
style.font-color: ${color-text}
clear: Clear (vision cone)\nsoft gradient 6-8 sim tiles {
style.fill: ${color-bg}
style.stroke: ${color-accent}
style.font-color: ${color-text}
}
light_fog: Light Fog (peripheral)\ndesaturated 40-50%, Perlin noise {
style.fill: ${color-bg}
style.stroke: ${color-stroke}
style.font-color: ${color-text}
}
deep_fog: Deep Fog (explored)\nnear-monochrome + zone tint {
style.fill: ${color-bg}
style.stroke: ${color-stroke}
style.font-color: ${color-text}
}
unexplored_maps: Unexplored (has maps)\ngeometric wireframe outlines {
style.fill: ${color-bg}
style.stroke: ${color-stroke}
style.font-color: ${color-text}
}
unexplored_dark: Unexplored (no maps)\nsolid near-black {
style.fill: ${color-dim}
style.stroke: ${color-stroke}
style.font-color: ${color-text}
}
}
recognition: Fog Entity Recognition {
style.fill: ${color-dim}
style.stroke: ${color-stroke}
style.font-color: ${color-text}
chime: Recognition chime fires (D-067)\nat ONSET of cognitive delay {
style.fill: ${color-bg}
style.stroke: ${color-accent}
style.font-color: ${color-text}
}
delay: Cognitive delay (D-060)\n0.6s base · 0.3s for anomaly {
style.fill: ${color-bg}
style.stroke: ${color-stroke}
style.font-color: ${color-text}
}
monologue_fire: Monologue fires DURING delay\n"Those footsteps... that's Kael's walk" {
style.fill: ${color-bg}
style.stroke: ${color-stroke}
style.font-color: ${color-text}
}
transition: Grey blob → D-033 color\n+ silhouette over 0.3s {
style.fill: ${color-bg}
style.stroke: ${color-stroke}
style.font-color: ${color-text}
}
}
world -> los: "entity positions + opaque tiles" { style.stroke: ${color-accent} }
world -> sound: "sound events" { style.stroke: ${color-stroke} }
los -> perception_modes: "VisibilityMap" { style.stroke: ${color-accent} }
perception_modes -> snapshot: "observer query result\n(what this sensor reveals)" {
style.stroke: ${color-accent}
}
sound -> snapshot: "sound events" { style.stroke: ${color-stroke} }
kg_read -> snapshot: "per-entity recognition data" { style.stroke: ${color-accent} }
snapshot -> fog: "visible entities + fog state" { style.stroke: ${color-accent} }
snapshot -> recognition: "heard/sensed entity not in LOS" { style.stroke: ${color-stroke} }
recognition.chime -> recognition.delay: "concurrent" { style.stroke: ${color-accent} }
recognition.delay -> recognition.monologue_fire
recognition.delay -> recognition.transition
Binary file not shown.

After

Width:  |  Height:  |  Size: 912 KiB