Section 1

Visual Specification Template

Every visualisation in the system must be specified using this template. These are the required and optional fields that define how a chart is rendered.

Required Fields

FieldTypeDescription
viz_idVARCHARUnique identifier (e.g., VIZ-D06-NEBULA) — Dashboard number + short name
viz_nameVARCHARHuman-readable name (e.g., “C-Space Nebula”)
dashboardINTEGERWhich dashboard this belongs to (1–29)
panelENUMWORKING (“Is it working?”) or DOING (“What is it doing?”)
chart_typeENUMThe visualisation type (from the Chart Type Library)
libraryENUMThe rendering library (from the Approved Library List)
data_sourceVARCHARWhere the data comes from (API endpoint, Knowledge Graph query, database table)
refresh_rateENUMHow often the visualisation updates (from the Refresh Rate Classes)
data_mappingJSONWhich data fields map to which visual dimensions (x, y, z, colour, size, opacity, label)
interaction_modelJSONWhat happens on click, hover, zoom, drag (from the Interaction Patterns)
actionable_linksJSON ARRAYWhat clicking a data point triggers (navigation, filter, search, escalation)
determinismJSONFor projections/layouts: fixed seeds, recalculation schedule, caching rules
thresholdsJSONColour breakpoints, alert triggers, zone boundaries
responsiveVARCHARHow the viz adapts to smaller screens (collapse, scroll, simplify)

Optional Fields

FieldTypeDescription
annotationsJSON ARRAYStatic labels, reference lines, zone labels overlaid on the chart
empty_stateVARCHARWhat to show when there is no data yet
error_stateVARCHARWhat to show when the data source is unavailable
performance_budgetVARCHARMaximum render time
Section 2

Chart Type Library

Every visualisation must use one of these approved chart types. This ensures consistency across dashboards and limits the number of rendering patterns developers must implement.

Status & KPI Charts (for “Is it working?” panels)

Chart TypeWhen To UseExampleLibrary
Traffic LightSingle overall health status (GREEN/YELLOW/RED)System Health indicatorCustom HTML/CSS
GaugeSingle metric with min/max/threshold zonesBudget remaining, verification pass rateChart.js (doughnut)
Metric CardSingle number with trend arrow and sparkline“Packets completed today: 14 ↑”Custom HTML + Recharts sparkline
Status GridMultiple components each with health indicatorComponent Health Grid (10 items)Custom HTML/CSS grid
Progress BarCompletion percentage for a single dimensionPhase completion: 67%Custom HTML/CSS
Multi-ProgressMultiple progress bars stacked verticallyPhase 0–10 progress barsCustom HTML/CSS

Operational Charts (for “What is it doing?” panels)

Chart TypeWhen To UseExampleLibrary
Pipeline BarSequential status flow with counts at each stageQUEUED → EXECUTING → VERIFYING → COMPLETEDCustom HTML/CSS
Data TableStructured records that need sorting/filtering/clickingLive Packet Tracker, Proof Object RegistryReact Table or custom
Gantt TimelineTime-based activity with parallel tracksExecution Timeline (packets over 24 hours)D3.js
Line ChartTrend over time (single or multi-series)30-day spending history, failure rate trendRecharts
Stacked BarComposition breakdown over timeDaily cost by agent typeRecharts
Pie / DonutProportion of a whole (max 6 segments)Failure type distributionRecharts
Heatmap2D matrix with colour intensityPhase × Status matrix, Symbol × Timeframe gridD3.js
Bubble Chart3 dimensions on 2D plane (x, y, size)4-Quadrant Concept HeatmapPlotly
3D ScatterHigh-dimensional data projected to 3DC-Space Nebula (UMAP projection)Plotly
Network GraphRelationships between entitiesDependency graph, Knowledge Graph explorerD3.js force layout
Sparkline GridMany small trend lines in a gridPer-symbol feed health, per-operator RAR trendRecharts (inline)
HistogramDistribution of a single variableConfidence score distribution, latency distributionRecharts
Sankey DiagramFlow between categoriesPacket flow through pipeline stagesD3.js

Alert & Action Charts

Chart TypeWhen To UseExampleLibrary
Alert FeedScrollable timestamped event listActive Alerts, Chief Engineer Activity LogCustom HTML/CSS
Action CardDecision required with option buttonsEscalation Queue itemsCustom HTML/CSS
Countdown / TimerTime since event or time remaining“HARD_HALT active for 2h 14m”Custom HTML/JS
Section 3

Approved Rendering Libraries

All dashboards must use these libraries. No others permitted without Architect review. Rule: use the simplest library that achieves the visualisation.

LibraryVersionUse ForRationale
RechartsLatest stableLine, bar, area, pie, sparklinesReact-native, lightweight, good for standard 2D charts
D3.jsv7Gantt, heatmap, network, Sankey, custom layoutsMost flexible for custom visualisations
PlotlyLatest stable3D scatter, bubble, surface plotsBest 3D interactivity without Three.js complexity
Chart.jsv4Gauges (doughnut variant), simple chartsLightweight for single-metric displays
Three.jsr128Only if Plotly 3D is insufficientHeavy — avoid unless genuinely needed
Custom HTML/CSSN/ATraffic lights, status grids, pipeline bars, metric cards, progress barsNo library needed for simple status indicators
Section 4

Refresh Rate Classes

How often each visualisation updates. Real-time for things that change every second. Session-load for things that change slowly. Daily for computationally expensive projections.

ClassFrequencyMechanismUse For
REALTIMEEvery 1–5 secondsWebSocket pushAgent status, active build progress, system health indicators
FREQUENTEvery 30–60 secondsPolling (setInterval)Pipeline status, queue depth, budget remaining
PERIODICEvery 5–15 minutesPollingCode quality metrics, template registry status, canary results
SESSIONOn page load + manual refreshHTTP GETHistorical data, trend charts, proof object registry
DAILYOnce per day (scheduled)Batch computationUMAP projections, clustering analysis, 30-day aggregates
Section 5

Interaction Patterns

Every interactive element must use one of these standard patterns.

PatternTriggerBehaviourExample
Drill-downClick on data pointNavigate to a detail view for that entityClick packet in pipeline → full execution history
FilterClick on categoryFilter the current view to show only that categoryClick “FAILED” in pipeline bar → show only failed packets
TooltipHover over data pointShow detail card with key fieldsHover over agent in pool → show agent_id, current packet, uptime
Cross-highlightHover in one chartHighlight related data in adjacent chartsHover over phase 3 bar → highlight Phase 3 packets in tracker
ZoomScroll wheel or pinchZoom into a region of the chartZoom into a cluster in the C-Space Nebula
PanClick-dragMove the viewportPan across the execution timeline
ToggleClick button/checkboxShow/hide a data layerToggle “Show drift trails” in the Nebula
ActionClick buttonTrigger a system action“Approve Repair” button in Escalation Queue
Link-outClick badgeNavigate to a different pageClick section badge → navigate to genesis.html
Section 6

Colour Standards

Consistent colour usage across all dashboards. Never use rainbow colour maps — they are perceptually non-uniform and mislead human interpretation.

Zone Colours (from dashboard-architecture.html)

ZonePrimaryBackgroundUse For
Blue#185FA5#E6F1FBData & Awareness dashboards
Teal#0F6E56#E1F5EEDiscovery & Intelligence dashboards
Green#3B6D11#EAF3DEPortfolio & Quality dashboards
Amber#854F0B#FAEEDAExecution & Cost dashboards
Purple#534AB7#EEEDFEGovernance & Configuration dashboards
Coral#993C1D#FAECE7Risk & Failure dashboards
Grey#5F5E5A#F1EFE8System & Infrastructure dashboards

Semantic Colours (for data encoding)

ColourHexMeaningUse For
Success Green#16a34aPass, healthy, completeHealth checks, test passes, completed phases
Warning Amber#d97706Caution, degraded, approaching thresholdBudget warnings, slow responses, stale canary
Failure Red#dc2626Fail, broken, haltFailed tests, HARD_HALT, unresponsive agents
Active Blue#2563ebIn progress, executing, busyCurrently building, currently verifying
Neutral Grey#6b7280Not started, inactive, no dataFuture phases, idle agents, empty states
Info Purple#7c3aedDiagnostic, analysis, governanceChief Engineer activity, escalation events

Continuous Colour Ramps

RampUse ForLibrary Reference
ViridisProductivity scores, performance metrics (low = purple → high = yellow)Plotly: colorscale='Viridis', D3: d3.interpolateViridis
RdYlGnHealth/quality (red = bad → green = good)Recharts: custom gradient, D3: d3.interpolateRdYlGn
BluesDensity, concentration (light = sparse → dark = dense)D3: d3.interpolateBlues
Section 7

Determinism Requirements

The dashboard must look the same if you refresh the page. If a human builds spatial memory, the visualisation must not break that memory on refresh.

RequirementSpecification
UMAP projectionsrandom_state=42. Recalculate DAILY only (not on each page load). Cache the projection result in Redis.
DBSCAN clusteringDeterministic (no random seed needed). But input data order must be consistent — sort by entity_id before clustering.
D3 force layoutsUse d3.forceSimulation().alphaTarget(0) with a fixed number of iterations (300). Cache final positions. Recompute only when underlying data changes.
Network graph layoutsCache node positions after initial layout. Only recompute when nodes are added or removed.
Colour assignmentCategorical colours assigned by deterministic mapping (entity_id → colour index), not by render order.
Section 8

Performance Budgets

Every visualisation has a maximum render time. If exceeded, it must degrade gracefully — reduce point count rather than freeze the browser.

Dashboard ComplexityMax Render TimeMax Data PointsStrategy
Simple (gauges, status grids, metric cards)< 100msN/ADirect DOM rendering
Standard (tables, line charts, bar charts)< 300ms1,000 rowsPagination for tables, windowed rendering
Complex (heatmaps, bubble charts, Gantt)< 500ms5,000 pointsCanvas rendering, requestAnimationFrame
Heavy (3D scatter, network graphs)< 1,000ms10,000 pointsWebGL (Plotly/Three.js), level-of-detail
Massive (full C-Space with all operators)< 2,000ms50,000 pointsWebGL + server-side pre-computation + progressive loading
Section 9

Empty & Error States

Every visualisation must handle two non-happy-path states. Never show a blank space or a loading spinner that never resolves.

StateDisplayExample
EmptyGrey placeholder with contextual message explaining why there is no data and what will make data appear“No operators in C-Space yet. Operators will appear here after the Genesis Process (Phase 7) produces its first generation.”
ErrorRed-bordered placeholder with the error source and a retry button“Cannot reach Knowledge Graph (last attempt: 14:32:05). The C-Space Nebula requires Knowledge Graph access. [Retry] [View Health Check]”
Section 10

Responsive Behaviour

Screen WidthBehaviour
≥ 1200pxFull 2-column dashboard grid. All charts at full size.
860–1199pxSingle column. Charts maintain aspect ratio but fill width.
< 860pxSingle column. Complex charts (3D, Gantt, heatmap) collapse to summary cards with a “View Full Chart” link. Tables switch to card layout.
Section 11

Reference Example: C-Space Nebula (VIZ-D06-NEBULA)

This is the reference implementation. All future visual specifications should follow this format.

// ===== C-SPACE NEBULA VISUAL SPECIFICATION ===== viz_id: "VIZ-D06-NEBULA" viz_name: "C-Space Nebula" dashboard: 6 // Operator Concept Space panel: "DOING" // "What is it doing?" panel chart_type: "3D Scatter" library: "Plotly" data_source: { endpoint: "/api/operators/cspace" fields: ["operator_id", "embedding_vector", "rar_score", "generation", "creation_method", "engine_id", "symbol", "status", "trade_count"] projection: "Server-side UMAP (3D) applied to embedding_vector" } refresh_rate: { class: "DAILY" projection_recalculation: "Once per day at 00:00 UTC" point_metadata: "SESSION (refreshed on page load)" cache: "Redis key: cspace:umap:3d, TTL: 24 hours" } data_mapping: { x: "umap_component_0" y: "umap_component_1" z: "umap_component_2" colour: "engine_id" // categorical — deterministic mapping size: "rar_score" // continuous — range [2, 12] pixels // formula: 2 + (rar_score / max_rar) * 10 opacity: "trade_count" // continuous — range [0.3, 1.0] // formula: 0.3 + min(trade_count / 100, 1.0) * 0.7 label: "operator_id (shown on hover only)" } determinism: { umap_random_state: 42 umap_n_neighbors: 15 umap_min_dist: 0.1 recalculate_trigger: "Daily cron OR population change > 10%" cache_ttl: "24 hours" } interaction_model: { hover: "Tooltip: operator_id, RAR, generation, creation_method, engine_id, trade_count" click: "Navigate to /operator/{operator_id} detail page" zoom: "Plotly scroll-zoom (continuous)" pan: "Plotly click-drag orbit (3D rotation)" toggle_fog: "Checkbox: show/hide fog-of-war isosurfaces" toggle_trails: "Checkbox: show/hide drift trail lines" } annotations: [ { type: "isosurface", label: "Fog of War", description: "Semi-transparent surfaces around engine cluster centroids. Radius = 2 * std_dev of cluster. Colour = engine colour at 15% opacity." }, { type: "line", label: "Drift Trails", description: "Line from operator's position 30 days ago to current position. Colour gradient from grey (old) to engine colour (current). Only shown for operators with > 30 days history." }, { type: "label", label: "Zone Labels", description: "Floating text labels at engine cluster centroids: 'Engine {engine_id} ({count} operators)'. Semi-transparent background." } ] thresholds: { overcrowded: "Engine cluster with > 50 operators in radius 0.5 UMAP units — highlight boundary in orange" sparse: "Region with 0 operators within radius 2.0 UMAP units — mark as 'Unexplored' with grey label" drifting: "Operator with drift trail > 3.0 UMAP units in 30 days — highlight trail in red" } actionable_links: [ { trigger: "Click empty region", action: "Suggest genesis exploration in that C-Space region" }, { trigger: "Click overcrowded cluster", action: "Navigate to engine detail with retirement candidates" }, { trigger: "Click sparse region", action: "Navigate to archetype library for similar archetypes" } ] empty_state: "No operators in C-Space yet. Operators will appear here after the Genesis Process (Phase 7) produces its first generation." error_state: "Cannot reach Knowledge Graph (last attempt: {timestamp}). The C-Space Nebula requires Knowledge Graph access. [Retry] [View Health Check]" performance_budget: { target: "< 2,000ms initial render" max_points: 50000 degradation_strategy: "If > 10,000 operators: subsample to 10,000 (top RAR per engine). If > 50,000: server-side pre-render to static image with hover overlays only." } responsive: { desktop: "Full 3D interactive Plotly chart" tablet: "2D projection (UMAP components 0 and 1 only), Plotly 2D scatter" mobile: "Summary card: '{count} operators across {engine_count} engines. Top RAR: {top_rar}. View full chart on desktop.'" }