# khansharafraz/k8sgames architecture

> Architecture diagram of the GitHub repository khansharafraz/k8sgames, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-05-13). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/khansharafraz/k8sgames
- Repository: https://github.com/khansharafraz/k8sgames

## Overview

1. **Overall shape**
   - This is a **client-side browser application** with no application server in the repo.
   - The site is served as static files (`index.html`, `draw.html`, `style.css`, `js/**`) and deployed with `vercel.json`.
   - The architecture is split into two top-level experiences: **game/play mode** and **K8s Draw** (`/draw`), both running in the browser.

2. **Entry points and page-level boundaries**
   - `index.html` is the main interactive simulator entry.
   - `draw.html` is the diagramming-focused entry with no game progression logic.
   - The README’s “play now” and “draw” split is reflected in the file structure: the same codebase supports both a **simulation game** and a **whiteboard/diagram editor**.

3. **Core simulation engine**
   - `js/engine/GameEngine.js` is the central coordinator for the game experience.
   - `ClusterState.js` holds the current Kubernetes cluster model: resources, relationships, status, and likely selection/interaction state.
   - `SimulationTick.js` and `IncidentEngine.js` drive time-based progression: incidents, state changes, and cluster behavior over time.
   - `ScoringEngine.js` computes performance/quality metrics for sandbox and challenge-style evaluation.

4. **Game modes as orchestration layers**
   - `js/modes/CampaignMode.js`, `ChallengeMode.js`, `ChaosMode.js`, and `SandboxMode.js` define different rulesets and progression styles.
   - These modes likely plug into the same core engine but alter:
     - level/incident sequencing,
     - success/failure conditions,
     - scoring pressure,
     - starting resources and constraints.
   - `js/data/CampaignLevels.js`, `IncidentDefs.js`, and `Achievements.js` provide mode-specific content and progression data.

5. **Cluster resource model**
   - The `js/resources/**` folder is the domain model for Kubernetes objects.
   - `ResourceBase.js` likely defines shared behavior, while specialized files split resources by category:
     - `ClusterResources.js`, `ConfigResources.js`, `NetworkResources.js`, `RBACResources.js`,
     - `StorageResources.js`, `WorkloadResources.js`.
   - This separation matters architecturally because it mirrors Kubernetes domains: workload ownership, networking, storage, and access control.

6. **Rendering pipeline**
   - `js/rendering/ClusterRenderer.js` is the main visual renderer for the 3D cluster.
   - Supporting modules render different visual layers:
     - `ConnectionLines.js` for ownership/network edges,
     - `ParticleTraffic.js` for animated flow/traffic,
     - `ResourceMeshes.js` for the per-resource 3D shapes.
   - The app uses **Three.js** for the 3D scene; visual state is derived from cluster state rather than stored separately.

7. **UI layer and interaction surfaces**
   - `js/ui/**` contains the browser UI overlays around the 3D scene:
     - `HUD.js` for top-level status,
     - `InspectorPanel.js` for selected resource details/YAML/describe output,
     - `ContextMenu.js` for resource actions,
     - `CommandBar.js` for kubectl-style commands,
     - `MetricsDashboard.js`, `Minimap.js`, `SettingsPanel.js`, and `IncidentPanel.js`.
   - These panels sit above the renderer and act as controllers for user actions that mutate cluster state.

8. **Primary data flow**
   - User input enters through the UI layers: click, drag, context menu, keyboard commands.
   - UI actions update `ClusterState` through the engine.
   - The engine advances simulation, evaluates incidents/scoring, then the renderer redraws the 3D cluster and overlays.
   - This is a classic **state-driven render loop**: state changes originate from user actions or simulation ticks, and rendering is a projection of that state.

9. **Kubernetes-specific semantics**
   - The app is not just a generic 3D scene; it models real K8s concepts:
     - ownership chains such as Deployment → ReplicaSet → Pod,
     - service selection and connectivity,
     - storage and RBAC objects,
     - incidents like CrashLoopBackOff, ImagePullBackOff, DNS failures, PVC issues, and node problems.
   - This is why the architecture separates resource definitions, incident logic, and rendering: each layer needs to understand Kubernetes semantics.

10. **Diagramming mode (`/draw`)**
   - The draw experience is a specialized editor for K8s architecture diagrams.
   - It reuses the resource catalog and 3D rendering primitives, but removes incident/scoring/game loops.
   - The README indicates support for:
     - drag-drop resource placement,
     - connection lines,
     - property editing,
     - auto-layout,
     - YAML/PNG export,
     - shareable URLs.
   - Architecturally, this is a second product mode built on the same visualization foundation.

11. **Content and progression data**
   - `js/data/**` contains static game content:
     - achievements,
     - campaign levels,
     - incident definitions.
   - These files are the content boundary between the engine and authored gameplay. The engine interprets the data; the data files define what scenarios exist.

12. **Deployment and runtime constraints**
   - The repo is intentionally **dependency-light** and **build-free**: vanilla ES modules, Three.js, and CDN-hosted Tailwind per README.
   - That makes the deployment model simple: static hosting only, with no backend APIs visible in this repo.
   - `robots.txt`, `og-image.html`, and `vercel.json` support public site hosting, social previews, and routing/hosting configuration.

13. **What to show in an architecture diagram**
   - A good diagram would place the **browser runtime** at the center, with:
     - input/UI controls feeding the engine,
     - engine updating cluster state,
     - renderer consuming state to draw the 3D scene,
     - mode modules selecting rules and progression,
     - data files supplying levels/incidents/achievements,
     - draw mode branching off as a simpler editor path.
   - The main boundary is between **state/logic** and **presentation**, with Kubernetes resource definitions acting as the domain model that connects them.

Main entry points: [`js/engine/GameEngine.js`](https://github.com/khansharafraz/k8sgames/blob/main/js/engine/GameEngine.js) (Game engine), [`js/resources/ResourceBase.js`](https://github.com/khansharafraz/k8sgames/blob/main/js/resources/ResourceBase.js) (Resource base), [`js/rendering/ClusterRenderer.js`](https://github.com/khansharafraz/k8sgames/blob/main/js/rendering/ClusterRenderer.js) (Cluster renderer), [`js/engine/ClusterState.js`](https://github.com/khansharafraz/k8sgames/blob/main/js/engine/ClusterState.js) (Cluster state)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_g_runtime["Browser App"]
  node_n_index["Play page<br/>entrypoint<br/>[index.html]"]
  node_n_draw["Draw page<br/>entrypoint<br/>[draw.html]"]
  node_n_styles["Static assets<br/>hosting<br/>[style.css]"]
end

subgraph group_g_logic["Simulation Core"]
  node_n_engine["Game engine<br/>orchestrator<br/>[GameEngine.js]"]
  node_n_state[("Cluster state<br/>state model<br/>[ClusterState.js]")]
  node_n_tick(("Simulation tick<br/>time loop<br/>[SimulationTick.js]"))
  node_n_incidents{{"Incident engine<br/>rules engine<br/>[IncidentEngine.js]"}}
  node_n_scoring["Scoring engine<br/>evaluation<br/>[ScoringEngine.js]"]
end

subgraph group_g_domain["Kubernetes Domain"]
  node_n_base["Resource base<br/>domain base<br/>[ResourceBase.js]"]
  node_n_clusterres["Cluster resources<br/>domain set"]
  node_n_configres["Config resources<br/>domain set<br/>[ConfigResources.js]"]
  node_n_networkres["Network resources<br/>domain set"]
  node_n_rbacres["RBAC resources<br/>domain set<br/>[RBACResources.js]"]
  node_n_storageres["Storage resources<br/>domain set"]
  node_n_workloadres["Workload resources<br/>domain set"]
end

subgraph group_g_view["Presentation"]
  node_n_renderer["Cluster renderer<br/>3D renderer<br/>[ClusterRenderer.js]"]
  node_n_meshes["Resource meshes<br/>visual layer<br/>[ResourceMeshes.js]"]
  node_n_lines["Connection lines<br/>visual layer<br/>[ConnectionLines.js]"]
  node_n_traffic["Particle traffic<br/>visual layer<br/>[ParticleTraffic.js]"]
  node_n_hud["HUD<br/>ui overlay<br/>[HUD.js]"]
  node_n_inspector["Inspector<br/>ui overlay<br/>[InspectorPanel.js]"]
  node_n_commandbar["Command bar<br/>ui control<br/>[CommandBar.js]"]
  node_n_context["Context menu<br/>ui control<br/>[ContextMenu.js]"]
  node_n_metrics["Metrics<br/>ui overlay"]
  node_n_minimap["Minimap<br/>ui overlay<br/>[Minimap.js]"]
  node_n_settings["Settings<br/>ui overlay<br/>[SettingsPanel.js]"]
  node_n_incidentpanel["Incident panel<br/>ui overlay<br/>[IncidentPanel.js]"]
end

subgraph group_g_content["Modes & Data"]
  node_n_campaign["Campaign mode<br/>[CampaignMode.js]"]
  node_n_challenge["Challenge mode<br/>[ChallengeMode.js]"]
  node_n_chaos["Chaos mode<br/>[ChaosMode.js]"]
  node_n_sandbox["Sandbox mode<br/>[SandboxMode.js]"]
  node_n_levels["Campaign levels<br/>content<br/>[CampaignLevels.js]"]
  node_n_defs["Incident defs<br/>content<br/>[IncidentDefs.js]"]
  node_n_achievements["Achievements<br/>content<br/>[Achievements.js]"]
end

node_n_index -->|"loads"| node_n_engine
node_n_draw -->|"loads"| node_n_renderer
node_n_engine -->|"owns"| node_n_state
node_n_engine -->|"advances"| node_n_tick
node_n_tick -->|"applies"| node_n_incidents
node_n_engine -->|"evaluates"| node_n_scoring
node_n_engine -->|"selects"| node_n_campaign
node_n_engine -->|"selects"| node_n_challenge
node_n_engine -->|"selects"| node_n_chaos
node_n_engine -->|"selects"| node_n_sandbox
node_n_campaign -->|"uses"| node_n_levels
node_n_campaign -->|"uses"| node_n_defs
node_n_challenge -->|"uses"| node_n_defs
node_n_chaos -->|"uses"| node_n_defs
node_n_sandbox -->|"uses"| node_n_achievements
node_n_state -->|"contains"| node_n_base
node_n_base -->|"specializes"| node_n_clusterres
node_n_base -->|"specializes"| node_n_configres
node_n_base -->|"specializes"| node_n_networkres
node_n_base -->|"specializes"| node_n_rbacres
node_n_base -->|"specializes"| node_n_storageres
node_n_base -->|"specializes"| node_n_workloadres
node_n_state -->|"feeds"| node_n_renderer
node_n_renderer -->|"renders"| node_n_meshes
node_n_renderer -->|"renders"| node_n_lines
node_n_renderer -->|"renders"| node_n_traffic
node_n_engine -->|"updates"| node_n_hud
node_n_engine -->|"updates"| node_n_inspector
node_n_engine -->|"handles"| node_n_commandbar
node_n_engine -->|"handles"| node_n_context
node_n_engine -->|"updates"| node_n_metrics
node_n_engine -->|"updates"| node_n_minimap
node_n_engine -->|"configures"| node_n_settings
node_n_engine -->|"updates"| node_n_incidentpanel

click node_n_index "https://github.com/khansharafraz/k8sgames/blob/main/index.html"
click node_n_draw "https://github.com/khansharafraz/k8sgames/blob/main/draw.html"
click node_n_styles "https://github.com/khansharafraz/k8sgames/blob/main/style.css"
click node_n_engine "https://github.com/khansharafraz/k8sgames/blob/main/js/engine/GameEngine.js"
click node_n_state "https://github.com/khansharafraz/k8sgames/blob/main/js/engine/ClusterState.js"
click node_n_tick "https://github.com/khansharafraz/k8sgames/blob/main/js/engine/SimulationTick.js"
click node_n_incidents "https://github.com/khansharafraz/k8sgames/blob/main/js/engine/IncidentEngine.js"
click node_n_scoring "https://github.com/khansharafraz/k8sgames/blob/main/js/engine/ScoringEngine.js"
click node_n_base "https://github.com/khansharafraz/k8sgames/blob/main/js/resources/ResourceBase.js"
click node_n_clusterres "https://github.com/khansharafraz/k8sgames/blob/main/js/resources/ClusterResources.js"
click node_n_configres "https://github.com/khansharafraz/k8sgames/blob/main/js/resources/ConfigResources.js"
click node_n_networkres "https://github.com/khansharafraz/k8sgames/blob/main/js/resources/NetworkResources.js"
click node_n_rbacres "https://github.com/khansharafraz/k8sgames/blob/main/js/resources/RBACResources.js"
click node_n_storageres "https://github.com/khansharafraz/k8sgames/blob/main/js/resources/StorageResources.js"
click node_n_workloadres "https://github.com/khansharafraz/k8sgames/blob/main/js/resources/WorkloadResources.js"
click node_n_renderer "https://github.com/khansharafraz/k8sgames/blob/main/js/rendering/ClusterRenderer.js"
click node_n_meshes "https://github.com/khansharafraz/k8sgames/blob/main/js/rendering/ResourceMeshes.js"
click node_n_lines "https://github.com/khansharafraz/k8sgames/blob/main/js/rendering/ConnectionLines.js"
click node_n_traffic "https://github.com/khansharafraz/k8sgames/blob/main/js/rendering/ParticleTraffic.js"
click node_n_hud "https://github.com/khansharafraz/k8sgames/blob/main/js/ui/HUD.js"
click node_n_inspector "https://github.com/khansharafraz/k8sgames/blob/main/js/ui/InspectorPanel.js"
click node_n_commandbar "https://github.com/khansharafraz/k8sgames/blob/main/js/ui/CommandBar.js"
click node_n_context "https://github.com/khansharafraz/k8sgames/blob/main/js/ui/ContextMenu.js"
click node_n_metrics "https://github.com/khansharafraz/k8sgames/blob/main/js/ui/MetricsDashboard.js"
click node_n_minimap "https://github.com/khansharafraz/k8sgames/blob/main/js/ui/Minimap.js"
click node_n_settings "https://github.com/khansharafraz/k8sgames/blob/main/js/ui/SettingsPanel.js"
click node_n_incidentpanel "https://github.com/khansharafraz/k8sgames/blob/main/js/ui/IncidentPanel.js"
click node_n_campaign "https://github.com/khansharafraz/k8sgames/blob/main/js/modes/CampaignMode.js"
click node_n_challenge "https://github.com/khansharafraz/k8sgames/blob/main/js/modes/ChallengeMode.js"
click node_n_chaos "https://github.com/khansharafraz/k8sgames/blob/main/js/modes/ChaosMode.js"
click node_n_sandbox "https://github.com/khansharafraz/k8sgames/blob/main/js/modes/SandboxMode.js"
click node_n_levels "https://github.com/khansharafraz/k8sgames/blob/main/js/data/CampaignLevels.js"
click node_n_defs "https://github.com/khansharafraz/k8sgames/blob/main/js/data/IncidentDefs.js"
click node_n_achievements "https://github.com/khansharafraz/k8sgames/blob/main/js/data/Achievements.js"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_n_index,node_n_draw,node_n_styles toneBlue
class node_n_engine,node_n_state,node_n_tick,node_n_incidents,node_n_scoring toneAmber
class node_n_base,node_n_clusterres,node_n_configres,node_n_networkres,node_n_rbacres,node_n_storageres,node_n_workloadres toneMint
class node_n_renderer,node_n_meshes,node_n_lines,node_n_traffic,node_n_hud,node_n_inspector,node_n_commandbar,node_n_context,node_n_metrics,node_n_minimap,node_n_settings,node_n_incidentpanel toneRose
class node_n_campaign,node_n_challenge,node_n_chaos,node_n_sandbox,node_n_levels,node_n_defs,node_n_achievements toneIndigo
```

## Components

### Browser App

Static client-side runtime and page entrypoints

- [Play page](https://github.com/khansharafraz/k8sgames/blob/main/index.html): entrypoint · Main simulator entrypoint · `index.html`
- [Draw page](https://github.com/khansharafraz/k8sgames/blob/main/draw.html): entrypoint · Diagram editor entrypoint · `draw.html`
- [Static assets](https://github.com/khansharafraz/k8sgames/blob/main/style.css): hosting · Shared CSS and deployment config · `style.css`

### Simulation Core

Game loop, cluster state, incidents, and scoring

- [Game engine](https://github.com/khansharafraz/k8sgames/blob/main/js/engine/GameEngine.js): orchestrator · Coordinates game loop, UI actions, and mode logic · `js/engine/GameEngine.js`
- [Cluster state](https://github.com/khansharafraz/k8sgames/blob/main/js/engine/ClusterState.js): state model · Current cluster resources and interaction state · `js/engine/ClusterState.js`
- [Simulation tick](https://github.com/khansharafraz/k8sgames/blob/main/js/engine/SimulationTick.js): time loop · Advances simulation over time · `js/engine/SimulationTick.js`
- [Incident engine](https://github.com/khansharafraz/k8sgames/blob/main/js/engine/IncidentEngine.js): rules engine · Applies failures and incident behavior · `js/engine/IncidentEngine.js`
- [Scoring engine](https://github.com/khansharafraz/k8sgames/blob/main/js/engine/ScoringEngine.js): evaluation · Computes performance and challenge metrics · `js/engine/ScoringEngine.js`

### Kubernetes Domain

Resource model split by Kubernetes concerns

- [Resource base](https://github.com/khansharafraz/k8sgames/blob/main/js/resources/ResourceBase.js): domain base · Shared Kubernetes resource behavior · `js/resources/ResourceBase.js`
- [Cluster resources](https://github.com/khansharafraz/k8sgames/blob/main/js/resources/ClusterResources.js): domain set · Cluster-level Kubernetes objects · `js/resources/ClusterResources.js`
- [Config resources](https://github.com/khansharafraz/k8sgames/blob/main/js/resources/ConfigResources.js): domain set · ConfigMaps and related config objects · `js/resources/ConfigResources.js`
- [Network resources](https://github.com/khansharafraz/k8sgames/blob/main/js/resources/NetworkResources.js): domain set · Services and networking objects · `js/resources/NetworkResources.js`
- [RBAC resources](https://github.com/khansharafraz/k8sgames/blob/main/js/resources/RBACResources.js): domain set · Roles, bindings, and access control · `js/resources/RBACResources.js`
- [Storage resources](https://github.com/khansharafraz/k8sgames/blob/main/js/resources/StorageResources.js): domain set · PVCs, volumes, and storage objects · `js/resources/StorageResources.js`
- [Workload resources](https://github.com/khansharafraz/k8sgames/blob/main/js/resources/WorkloadResources.js): domain set · Deployments, pods, and workload objects · `js/resources/WorkloadResources.js`

### Presentation

3D rendering and browser UI overlays

- [Cluster renderer](https://github.com/khansharafraz/k8sgames/blob/main/js/rendering/ClusterRenderer.js): 3D renderer · Draws the cluster scene in Three.js · `js/rendering/ClusterRenderer.js`
- [Resource meshes](https://github.com/khansharafraz/k8sgames/blob/main/js/rendering/ResourceMeshes.js): visual layer · 3D shapes for resource types · `js/rendering/ResourceMeshes.js`
- [Connection lines](https://github.com/khansharafraz/k8sgames/blob/main/js/rendering/ConnectionLines.js): visual layer · Renders ownership and connectivity edges · `js/rendering/ConnectionLines.js`
- [Particle traffic](https://github.com/khansharafraz/k8sgames/blob/main/js/rendering/ParticleTraffic.js): visual layer · Animated flow and activity effects · `js/rendering/ParticleTraffic.js`
- [HUD](https://github.com/khansharafraz/k8sgames/blob/main/js/ui/HUD.js): ui overlay · Top-level status and game information · `js/ui/HUD.js`
- [Inspector](https://github.com/khansharafraz/k8sgames/blob/main/js/ui/InspectorPanel.js): ui overlay · Selected resource details and YAML · `js/ui/InspectorPanel.js`
- [Command bar](https://github.com/khansharafraz/k8sgames/blob/main/js/ui/CommandBar.js): ui control · Kubectl-style command entry · `js/ui/CommandBar.js`
- [Context menu](https://github.com/khansharafraz/k8sgames/blob/main/js/ui/ContextMenu.js): ui control · Resource actions and shortcuts · `js/ui/ContextMenu.js`
- [Metrics](https://github.com/khansharafraz/k8sgames/blob/main/js/ui/MetricsDashboard.js): ui overlay · Charts and operational summaries · `js/ui/MetricsDashboard.js`
- [Minimap](https://github.com/khansharafraz/k8sgames/blob/main/js/ui/Minimap.js): ui overlay · Scene overview and navigation · `js/ui/Minimap.js`
- [Settings](https://github.com/khansharafraz/k8sgames/blob/main/js/ui/SettingsPanel.js): ui overlay · App preferences and toggles · `js/ui/SettingsPanel.js`
- [Incident panel](https://github.com/khansharafraz/k8sgames/blob/main/js/ui/IncidentPanel.js): ui overlay · Active incident status and actions · `js/ui/IncidentPanel.js`

### Modes & Data

Gameplay modes and authored scenario content

- [Campaign mode](https://github.com/khansharafraz/k8sgames/blob/main/js/modes/CampaignMode.js): mode · Story progression and authored levels · `js/modes/CampaignMode.js`
- [Challenge mode](https://github.com/khansharafraz/k8sgames/blob/main/js/modes/ChallengeMode.js): mode · Goal-driven challenge rules · `js/modes/ChallengeMode.js`
- [Chaos mode](https://github.com/khansharafraz/k8sgames/blob/main/js/modes/ChaosMode.js): mode · High-disruption ruleset · `js/modes/ChaosMode.js`
- [Sandbox mode](https://github.com/khansharafraz/k8sgames/blob/main/js/modes/SandboxMode.js): mode · Open-ended practice ruleset · `js/modes/SandboxMode.js`
- [Campaign levels](https://github.com/khansharafraz/k8sgames/blob/main/js/data/CampaignLevels.js): content · Authored campaign scenarios · `js/data/CampaignLevels.js`
- [Incident defs](https://github.com/khansharafraz/k8sgames/blob/main/js/data/IncidentDefs.js): content · Incident templates and parameters · `js/data/IncidentDefs.js`
- [Achievements](https://github.com/khansharafraz/k8sgames/blob/main/js/data/Achievements.js): content · Progress and reward definitions · `js/data/Achievements.js`

## Connections

- Play page → Game engine: loads · Play page boots the simulation engine
- Draw page → Cluster renderer: loads · Draw page boots the visualization stack
- Game engine → Cluster state: owns · Engine coordinates the mutable cluster model
- Game engine → Simulation tick: advances · Engine steps simulation forward
- Simulation tick → Incident engine: applies · Ticks trigger incident evolution
- Game engine → Scoring engine: evaluates · Engine computes scores and outcomes
- Game engine → Campaign mode: selects · Mode changes game flow
- Game engine → Challenge mode: selects · Mode changes game flow
- Game engine → Chaos mode: selects · Mode changes game flow
- Game engine → Sandbox mode: selects · Mode changes game flow
- Campaign mode → Campaign levels: uses · Campaign mode consumes authored levels
- Campaign mode → Incident defs: uses · Campaign scenarios reference incident definitions
- Challenge mode → Incident defs: uses · Challenge mode pulls incident definitions
- Chaos mode → Incident defs: uses · Chaos mode pulls incident definitions
- Sandbox mode → Achievements: uses · Sandbox progression can surface achievements
- Cluster state → Resource base: contains · Cluster state is built from resource objects
- Resource base → Cluster resources: specializes · Shared base behavior for cluster objects
- Resource base → Config resources: specializes · Shared base behavior for config objects
- Resource base → Network resources: specializes · Shared base behavior for network objects
- Resource base → RBAC resources: specializes · Shared base behavior for access-control objects
- Resource base → Storage resources: specializes · Shared base behavior for storage objects
- Resource base → Workload resources: specializes · Shared base behavior for workload objects
- Cluster state → Cluster renderer: feeds · Renderer projects cluster state into visuals
- Cluster renderer → Resource meshes: renders · Resource geometry is rendered through meshes
- Cluster renderer → Connection lines: renders · Relationships are rendered as lines
- Cluster renderer → Particle traffic: renders · Animated activity is rendered as traffic
- Game engine → HUD: updates · UI overlays reflect engine state
- Game engine → Inspector: updates · Selected resource details come from state
- Game engine → Command bar: handles · Commands mutate cluster state through engine
- Game engine → Context menu: handles · Context actions route through engine
- Game engine → Metrics: updates · Metrics dashboard reflects scoring and state
- Game engine → Minimap: updates · Minimap reflects current scene
- Game engine → Settings: configures · Settings affect runtime behavior
- Game engine → Incident panel: updates · Incident panel tracks active failures
