Relationships
Every observable cross-module link in the SPA. Each card shows the source, the target, the verb, where the relationship is anchored in code, and how load-bearing it is.
Filters
Finished calibration runs become candidates for promotion. MLops queries MLflow for the symbol's runs and surfaces them for explicit promote/unpromote.
MLopsPanel.tsx → getPromotedExperiments() / promoteExperiment()Trading refuses to start an algorithm whose backing experiment isn't promoted in MLops. The wizard calls validateExperiment() on the user-selected run before allowing the Confirm step.
TradingWizardContainer.tsx — validateExperiment() before startEach trading session emits real-time analytics that Analytics consumes via SSE. After session close, the same data is available as a one-shot fetch.
AnalyticsPanel.tsx → useLiveTimeSeries(sessionId) → SSE streamCompleted backtests are pulled into the same chart families as live sessions — distribution, P&L curve, latency — so reconciliation is byte-identical.
AnalyticsPanel.tsx → getBacktestResults(id)Backtest can either use the promoted production parameters for a symbol, or a specific calibration run id selected from the wizard.
BacktestWizard → config.calibration_run_idAlgorithm configuration needs per-symbol metadata (tick size, lot size, calendar). The trading wizard loads it once at the symbol-select step.
TradingWizard → getInstrument(symbol) for tick/lot/calendarSame instrument metadata is required by Backtest to set the engine's quoting constraints before replay.
BacktestWizard → getInstrument(symbol)Services owns the GatewayHealthBanner component — it sits above every route, polling /infrastructure/summary to surface degraded backend components.
Header.tsx → <GatewayHealthBanner/>External service launches (MLflow, pgAdmin, Grafana) are gated on `services.open` — a capability admin owns and trader/mlops inherit.
ControlPanel.tsx — services.open capability gateDashboard aggregates per-engine state and offers a click path into the Trading shell to drill into the running session.
Dashboard.tsx → engine cards click → /tradingThe Dashboard Pipeline modal is the first-time-user education flow — it walks Calibrate → Promote → Trade in one diagram with deep-links into each tab.
PipelineVisualization.tsx + PipelineModal.tsxAlthough the standalone Simulator tab is deprecated, its synthesizer is still callable from PaperSessionLauncher when a paper session needs fabricated market data.
PaperSessionLauncher → startSimulator() (still callable)All operational surfaces depend on an authenticated session. Admin owns the auth flow and the SessionTimer / SessionWarningModal.
LoginPage → JWT issuance → useStore.auth.accessTokenCalibration launches docker containers via the backend. Services owns the Infrastructure panel that reports whether Docker is reachable + healthy.
startCalibrationRun → backend docker_runner.pyMLops's promotion logic reads from the MLflow tracking server. Services surfaces MLflow health and a launch link to the MLflow UI.
MLopsPanel → MLflow backend (PostgreSQL + artifacts)The SSE stream uses the same nginx route the dashboard is served behind. If the SSE proxy buffering is misconfigured, live charts freeze.
useLiveTimeSeries → /session-analytics/{id}/stream (proxied through nginx)The host-side Trading Engine talks to the QSE gateway. Services renders gateway health so an operator can correlate engine misbehaviour with broker downtime.
trading-engine ↔ QSE gateway (STOMP over TLS)Every trading.live.write action (start real, stop real, promote, unpromote) is journaled into the audit log. Admin renders it; Trading triggers it.
AuditLogPanel.tsx ← /audit (backend audit table)The Dashboard hero cards include a compact infrastructure tile sourced from the same endpoint that powers the full Services panel.
Dashboard.tsx → fetchInfrastructure()