export type ParamSpec = { name: string; type: "int" | "float" | "bool" | "choice"; default: unknown; min?: number | null; max?: number | null; step?: number | null; choices?: unknown[] | null; description?: string; }; export type StrategyMeta = { name: string; label: string; family: string; hypothesis: string; universe_note: string; experimental: boolean; allows_short: boolean; min_bars: number; params: ParamSpec[]; failure_modes: string[]; references: string[]; }; export type OverviewSymbol = { symbol: string; last: number | null; change_pct: number | null; bid: number | null; ask: number | null; volume: number | null; spread_bps: number | null; age_s: number | null; stale: boolean; rv_7d_annualized: number | null; hourly_bars: number; }; export type SystemStatus = { mode: "offline" | "paper" | "live"; live_trading_enabled: boolean; env: string; version: string; universe: string[]; intervals: number[]; timescale: boolean; credentials: { data_key: boolean; trade_key: boolean; withdrawal: string }; preflight: Record | null; kraken: { status: string; timestamp?: string; rtt_ms?: number; clock_drift_s?: number; error?: string }; stream: { connected: boolean; last_msg_age: number | null; reconnects: number; checksum_failures: number; messages: number; counts: Record; ts: number } | null; }; export type Candle = { ts: number; open: number; high: number; low: number; close: number; vwap: number; volume: number; count: number; closed: boolean }; export type Book = { symbol: string; bids: [number, number][]; asks: [number, number][]; best_bid: number | null; best_ask: number | null; spread: number | null; spread_bps: number | null; imbalance: number; timestamp: string | null; valid: boolean; received_at?: number; age_s?: number; }; export type Trade = { trade_id: number; ts: number; price: number; volume: number; side: "buy" | "sell"; order_type: string }; export type Pair = { pair_id: string; altname: string; wsname: string; base: string; quote: string; status: string; ordermin: number; costmin: number; tick_size: number; pair_decimals: number; lot_decimals: number; in_universe: boolean }; export type Quality = { symbol: string; interval_min: number; bars: number; first_ts: number; last_ts: number; gaps: number; missing_bars: number; lag_bars: number; stale: boolean; coverage_days: number }; export type Gap = { symbol: string; interval_min: number; gap_start: number; gap_end: number; missing_bars: number; detected_at: string }; export type RiskLimits = { max_order_notional: number; max_position_notional: number; max_gross_exposure: number; max_net_exposure: number; max_concentration: number; daily_loss_limit: number; max_drawdown_limit: number; min_cash: number; max_open_orders: number; max_participation: number; max_price_deviation: number; stale_data_seconds: number; max_clock_drift_seconds: number; var_limit_95: number | null; }; export type KillSwitch = { active: boolean; reason?: string | null; since?: number | null }; export type RiskStatus = { limits: RiskLimits; kill_switch: KillSwitch; mode: string; recent_events: { ts: string; action: string; details: Record }[] }; export type AuditItem = { id: number; ts: string; actor: string; action: string; entity: string | null; details: Record; cid: string | null; hash: string }; export type RunRow = { id: string; created_at: string; finished_at: string | null; status: string; strategy: string; symbol: string; interval_min: number; params: Record; label: string | null; error: string | null; start_ts: number | null; end_ts: number | null; sharpe: string | null; total_return: string | null; max_drawdown: string | null; n_trades: string | null; }; export type EquityPoint = { ts: number; equity: number; drawdown: number; exposure: number; price: number }; export type Metrics = Record & { bootstrap?: { sharpe_ci: [number | null, number | null]; cagr_ci: [number | null, number | null]; n_boot: number; block?: number }; deflated_sharpe?: { dsr: number | null; sr0_annual?: number | null; n_trials?: number }; }; export type TradeRec = { ts: number; side: string; qty: number; price: number; ref_price: number; fee: number; slippage_cost: number; notional: number; reason: string; strategy_target: number; partial: boolean }; export type Artifacts = { equity: EquityPoint[]; rolling_sharpe: { ts: number; sharpe: number }[]; trades: TradeRec[]; rejected: { ts: number; side: string; qty: number; reasons: string[] }[]; benchmarks: Record; stress: Record>; shuffled_trades: { n: number; max_dd_p50?: number; max_dd_p95?: number; max_dd_worst?: number; total_pnl?: number }; walk_forward: { folds: { fold: number; train: [number, number]; test: [number, number]; best_params: Record; is_sharpe: number | null; oos_sharpe: number | null; oos_return: number | null; oos_max_dd: number | null }[]; anchored?: boolean; n_trials?: number; grid?: Record; embargo_bars?: number; stitched_oos?: { sharpe: number | null; total_return: number | null; bars: number }; error?: string } | null; sensitivity: { x: { name: string; values: unknown[] }; y: { name: string; values: unknown[] }; metric: string; z: (number | null)[][] } | null; holdout: { start_ts: number; metrics: Metrics; equity: EquityPoint[] } | null; features_tail: Record[]; }; export type Run = RunRow & { cost_model: Record; metrics: Metrics | null; provenance: Record | null; artifacts: Artifacts | null; };