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
+108
View File
@@ -0,0 +1,108 @@
# Fog System — Five Layers + Entity Rendering in Fog — D-059
# Shader-based, knowledge-graph-driven. Covers all five fog states
# and the entity types rendered within fogged areas.
vars: {
color-screen: "#1a1e24"
color-panel: "#2a3040"
color-text: "#c8d0e0"
color-nav: "#c8d8f0"
color-stroke: "#333340"
}
direction: right
kg_read: KnowledgeGraph\n(per character — D-041) {
shape: cylinder
style.fill: ${color-panel}
style.stroke: ${color-nav}
style.font-color: ${color-text}
}
fog_layers: Five Fog Layers {
style.fill: ${color-screen}
style.stroke: ${color-nav}
style.font-color: ${color-text}
l1: Layer 1 — Clear (vision cone)\nSoft gradient edge 6-8 sim tiles\n(= 3-4 visual tiles per D-066)\nNo hard line · Darkwood approach {
style.fill: ${color-panel}
style.stroke: ${color-nav}
style.font-color: ${color-text}
style.bold: true
}
l2: Layer 2 — Light Fog (peripheral)\nDesaturated 40-50% · brightness -30%\nAnimated Perlin noise (8-10s cycle)\nD-033 entity colors visible but reduced {
style.fill: ${color-panel}
style.stroke: ${color-stroke}
style.font-color: ${color-text}
}
l3: Layer 3 — Deep Fog (explored)\nNear-monochrome + ~10% zone tint\n(bar=warm dark · hub=cool dark)\nMore pronounced noise (15-20s cycle)\nzone_id from ObserverSnapshot (D-077) {
style.fill: ${color-panel}
style.stroke: ${color-stroke}
style.font-color: ${color-text}
}
l4: Layer 4 — Unexplored (has maps)\nGeometric wireframe outlines\nInsert data aesthetic {
style.fill: ${color-panel}
style.stroke: ${color-stroke}
style.font-color: ${color-text}
}
l5: Layer 5 — Unexplored (no maps)\nSolid near-black\nInformation zero {
style.fill: ${color-screen}
style.stroke: ${color-stroke}
style.font-color: ${color-text}
}
}
fog_entities: Entities in Fog {
style.fill: ${color-screen}
style.stroke: ${color-stroke}
style.font-color: ${color-text}
sound_ping: Sound Ping\n2-3 concentric expanding rings\n(sonar-style · insert white-blue)\nLoud=3 rings bright · quiet=1 ring faint\nFade over 1.5s {
style.fill: ${color-panel}
style.stroke: ${color-nav}
style.font-color: ${color-text}
}
recognized: Recognized Entity\nD-033 color glow + silhouette feature\n(e.g. identifying clothing detail)\n0.8s breathing pulse\n+/-0.5 tile position drift {
style.fill: ${color-panel}
style.stroke: ${color-nav}
style.font-color: ${color-text}
}
unrecognized: Unrecognized Entity\nneutral grey blob\nno silhouette · no identity {
style.fill: ${color-panel}
style.stroke: ${color-stroke}
style.font-color: ${color-text}
}
}
divergence: "Same fog, different information per character\nSmuggler: recognizes dock workers = green icons\nDetective: same entities = grey blobs\n\nFog is not darkness —\nit is the absence of your attention." {
shape: page
style.fill: ${color-screen}
style.stroke: ${color-nav}
style.font-color: ${color-text}
style.italic: true
}
perf: Performance Budget\n<1ms/frame total\nVision cone = PointLight2D\nFog = CanvasGroup noise shader (Layer 5)\nSound pings = 0-5 sprites\nEntity ghosts = 0-10 sprites typical {
shape: package
style.fill: ${color-screen}
style.stroke: ${color-stroke}
style.font-color: ${color-text}
}
kg_read -> fog_layers: "determines entity recognition\n(which observer sees which entities)" {
style.stroke: ${color-nav}
}
kg_read -> fog_entities.recognized: "KnowsOf+ → recognized" {
style.stroke: ${color-nav}
}
kg_read -> fog_entities.unrecognized: "Suspects / none → blob" {
style.stroke: ${color-stroke}
}
fog_layers -> fog_entities: "entities rendered within fog state" {
style.stroke: ${color-stroke}
}
fog_layers -> divergence: "same shader, per-character KG" {
style.stroke: ${color-nav}
style.stroke-dash: 4
}
fog_layers -> perf
Binary file not shown.

After

Width:  |  Height:  |  Size: 766 KiB

+146
View File
@@ -0,0 +1,146 @@
# HUD Layout and Z-Stack — D-049, D-048, D-061, D-076
# 8-layer z-stack, insert overlay, dialogue box constraints.
# Dual-scale grid context: 64x64px visual tiles (D-066).
vars: {
color-screen: "#1a1e24"
color-panel: "#2a3040"
color-text: "#c8d0e0"
color-nav: "#c8d8f0"
color-stroke: "#333340"
}
direction: down
zstack: Rendering Z-Stack (D-049)\n8 layers — bottom to top {
style.fill: ${color-screen}
style.stroke: ${color-nav}
style.font-color: ${color-text}
l0: Layer 0 — Floor Tiles\n(zone identity · movement surface) {
style.fill: ${color-panel}
style.stroke: ${color-stroke}
style.font-color: ${color-text}
}
l1: Layer 1 — Floor Objects\n(cosmetic · walked over) {
style.fill: ${color-panel}
style.stroke: ${color-stroke}
style.font-color: ${color-text}
}
l2: Layer 2 — Furniture / Placed Objects\n(y-sorted with entities) {
style.fill: ${color-panel}
style.stroke: ${color-stroke}
style.font-color: ${color-text}
}
l3: Layer 3 — Entity Sprites\n(y-sorted · D-033 relationship color\n24x32px footprint in 64x64 tile) {
style.fill: ${color-panel}
style.stroke: ${color-nav}
style.font-color: ${color-text}
}
l4: Layer 4 — Overhead / Wall Tops\n(pipes · ducts · fixtures · signage\nsemi-transparent partial occlusion) {
style.fill: ${color-panel}
style.stroke: ${color-stroke}
style.font-color: ${color-text}
}
l5: Layer 5 — Fog of Perception\n(vision cone mask · fog shader\naffects layers 0-4) {
style.fill: ${color-panel}
style.stroke: ${color-nav}
style.font-color: ${color-text}
}
l6: Layer 6 — Insert Overlay\n(lattice HUD · bloom-rendered\nNOT affected by fog\nInteraction labels render here) {
style.fill: ${color-panel}
style.stroke: ${color-nav}
style.font-color: ${color-text}
}
l7: Layer 7 — Monologue / UI\n(always visible · top of stack\nDialogue box and response options) {
style.fill: ${color-panel}
style.stroke: ${color-nav}
style.font-color: ${color-text}
style.bold: true
}
}
insert_overlay: Insert Overlay Design (D-048) {
style.fill: ${color-screen}
style.stroke: ${color-nav}
style.font-color: ${color-text}
bloom: Soft bloom shader\n~2-3px gaussian · ~40% blend {
style.fill: ${color-panel}
style.stroke: ${color-stroke}
style.font-color: ${color-text}
}
smuggler_overlay: Smuggler\nthinner · sparser (baseline lattice) {
style.fill: ${color-panel}
style.stroke: ${color-stroke}
style.font-color: ${color-text}
}
detective_overlay: Detective\ndenser · crisper (augmented lattice) {
style.fill: ${color-panel}
style.stroke: ${color-nav}
style.font-color: ${color-text}
}
insert_off: Insert OFF behavior (OQ-07)\nCursor shape changes\nInteraction labels hidden {
style.fill: ${color-panel}
style.stroke: ${color-stroke}
style.font-color: ${color-text}
style.stroke-dash: 4
}
}
dialogue_box: Dialogue Box (D-061, D-076) {
style.fill: ${color-screen}
style.stroke: ${color-nav}
style.font-color: ${color-text}
position: Bottom of screen\nmax 20% height {
style.fill: ${color-panel}
style.stroke: ${color-stroke}
style.font-color: ${color-text}
}
max_width: Max-width 1200px\n(centered · ~62% of 1920px) {
style.fill: ${color-panel}
style.stroke: ${color-stroke}
style.font-color: ${color-text}
}
log: Unified conversation log\n(active + overheard — chronological) {
style.fill: ${color-panel}
style.stroke: ${color-nav}
style.font-color: ${color-text}
}
speaker_format: Speaker to Target format\nper-character name colours {
style.fill: ${color-panel}
style.stroke: ${color-stroke}
style.font-color: ${color-text}
}
responses: Response options below log\nmax 3 visible {
style.fill: ${color-panel}
style.stroke: ${color-stroke}
style.font-color: ${color-text}
}
no_portraits: No portraits\n(NPC is on screen) {
style.fill: ${color-panel}
style.stroke: ${color-stroke}
style.font-color: ${color-text}
}
timeout: Entry timeout\n15s + 3s fade (configurable) {
style.fill: ${color-panel}
style.stroke: ${color-stroke}
style.font-color: ${color-text}
}
}
monologue_position: Monologue floats ABOVE dialogue box\n(z-layer 7 — spatial separation\ncharacter thinks while NPC speaks) {
style.fill: ${color-panel}
style.stroke: ${color-nav}
style.font-color: ${color-text}
style.border-radius: 4
}
zstack.l5 -> insert_overlay: "does NOT affect" {
style.stroke: ${color-nav}
style.stroke-dash: 4
}
zstack.l6 -> insert_overlay: "rendered at" { style.stroke: ${color-nav} }
zstack.l7 -> dialogue_box: "rendered at" { style.stroke: ${color-nav} }
dialogue_box -> monologue_position: "monologue above" { style.stroke: ${color-nav} }
Binary file not shown.

After

Width:  |  Height:  |  Size: 678 KiB

+153
View File
@@ -0,0 +1,153 @@
# Interaction UI Flow — D-056, D-057, D-058
# Cursor states, entity interaction list, world radial menu.
# All insert-styled: geometric, bloom, diegetic.
vars: {
color-screen: "#1a1e24"
color-panel: "#2a3040"
color-text: "#c8d0e0"
color-nav: "#c8d8f0"
color-stroke: "#333340"
}
direction: down
cursor: Cursor States (D-056)\n(insert's own interface element · z-layer 7) {
style.fill: ${color-screen}
style.stroke: ${color-nav}
style.font-color: ${color-text}
default_cursor: Default\n4 thin inward ticks + bloom\nWhite-blue · barely visible {
style.fill: ${color-panel}
style.stroke: ${color-stroke}
style.font-color: ${color-text}
}
entity_hover: Entity Hover\nTicks expand outward (150ms)\nCorner brackets · D-033 relationship color\nVerb tooltip in insert styling {
style.fill: ${color-panel}
style.stroke: ${color-nav}
style.font-color: ${color-text}
}
object_hover: Object Hover\nTicks rotate 45° → X-shape\nMuted grey (amber if flagged) {
style.fill: ${color-panel}
style.stroke: ${color-stroke}
style.font-color: ${color-text}
}
weapon_aim: Weapon Aim\nTicks extend · center gap widens\nLines 1 to 2px · warm white\nNO bloom · D-033 tint on target {
style.fill: ${color-panel}
style.stroke: ${color-nav}
style.font-color: ${color-text}
}
}
cursor_rules: Cursor Rules {
style.fill: ${color-screen}
style.stroke: ${color-stroke}
style.font-color: ${color-text}
los_trigger: Changes on LOS · not just proximity {
style.fill: ${color-panel}
style.stroke: ${color-stroke}
style.font-color: ${color-text}
}
range: Interaction range ~2 sim tiles (= 1m) {
style.fill: ${color-panel}
style.stroke: ${color-stroke}
style.font-color: ${color-text}
}
weapon_suppress: Weapon mode suppresses interaction prompts\n(unless Shift held) {
style.fill: ${color-panel}
style.stroke: ${color-stroke}
style.font-color: ${color-text}
}
insert_off: Insert OFF: cursor shape still changes\n(body reacts) · verb labels hidden\n(insert doesn't process targets) {
style.fill: ${color-panel}
style.stroke: ${color-stroke}
style.font-color: ${color-text}
style.stroke-dash: 4
}
}
entity_list: Entity Interaction List (D-057)\n(left-click on entity) {
style.fill: ${color-screen}
style.stroke: ${color-nav}
style.font-color: ${color-text}
format: Compact vertical list\nanchored to entity position\n2-4 options max {
style.fill: ${color-panel}
style.stroke: ${color-stroke}
style.font-color: ${color-text}
}
new_glow: New options: gradient glow background\n(knowledge change signal) {
style.fill: ${color-panel}
style.stroke: ${color-nav}
style.font-color: ${color-text}
}
z_layer: Labels on z-layer 6\n(insert data — hidden if insert off) {
style.fill: ${color-panel}
style.stroke: ${color-stroke}
style.font-color: ${color-text}
}
phase1: Phase 1 (simulation): max verb set\nfrom ObjectType component {
style.fill: ${color-panel}
style.stroke: ${color-stroke}
style.font-color: ${color-text}
}
phase2: Phase 2 (observer): filter by KG\narchetype variation · POI flip {
style.fill: ${color-panel}
style.stroke: ${color-nav}
style.font-color: ${color-text}
}
}
world_menu: World Radial Menu (D-058)\n(right-click) {
style.fill: ${color-screen}
style.stroke: ${color-nav}
style.font-color: ${color-text}
v01_spokes: v0.1: 2 spokes\nObserve (eye) · Insert (phone) {
style.fill: ${color-panel}
style.stroke: ${color-nav}
style.font-color: ${color-text}
style.bold: true
}
future_spokes: Future: up to 6 spokes\n+ Comms (signal) · Wait (clock) {
style.fill: ${color-panel}
style.stroke: ${color-stroke}
style.font-color: ${color-text}
style.stroke-dash: 4
}
input: Drag-release (power users)\nClick-click (newcomers) {
style.fill: ${color-panel}
style.stroke: ${color-stroke}
style.font-color: ${color-text}
}
why_radial: Fixed categories → spatial memory\n(unlike entity verbs which vary by knowledge) {
style.fill: ${color-panel}
style.stroke: ${color-stroke}
style.font-color: ${color-text}
}
}
cursor.default_cursor -> cursor.entity_hover: "entity in LOS\n+ proximity" {
style.stroke: ${color-nav}
}
cursor.default_cursor -> cursor.object_hover: "object in LOS\n+ proximity" {
style.stroke: ${color-stroke}
}
cursor.entity_hover -> cursor.weapon_aim: "weapon selected" {
style.stroke: ${color-nav}
}
cursor.weapon_aim -> cursor.entity_hover: "weapon deselected" {
style.stroke: ${color-stroke}
style.stroke-dash: 4
}
cursor.entity_hover -> entity_list: "left-click\n→ shows interaction list" {
style.stroke: ${color-nav}
}
cursor.default_cursor -> world_menu: "right-click\n→ opens radial" {
style.stroke: ${color-nav}
}
cursor -> cursor_rules
entity_list.phase1 -> entity_list.phase2: "filtered" { style.stroke: ${color-nav} }
Binary file not shown.

After

Width:  |  Height:  |  Size: 868 KiB