Design (frontend-design skill, following the existing /paper/sim + fleet-table pattern
instead of the ad-hoc fieldset markup):
- selection TABLE with an explicit TYPE column (semantic chips: Crypto / Equities & macro)
in the fleet skin, so it reflows to stacked cards on mobile
- verdict banner (the cockpit trust-anchor), .card/.stat metric tiles, token-themed Plotly
curve + heatmap, marginal table with pos/neg colouring
- live htmx update on change (no Run button), matching Backtest
SSOT consolidation (was 3 name sources + no type resolver):
- display_names.py is now THE resolver: absorbs SLEEVE_DISPLAY_NAMES so display_name()
covers sleeves AND strategies, and adds asset_class() (the Type column) derived from the
registry field via a prefix rule — no hand-kept per-edge map
- both registered as Jinja globals -> every page reads names/types consistently
- bybit_book_eval._SLEEVE_DISPLAY_NAMES re-exports from the SSOT (no duplicate data)
- registry display_names made concise; the rename propagates to Overview/Paper/detail
(crypto_tstrend had no name at all and rendered as a raw id)
Removed Manual weights: the Book allocator COMPUTES the weights (inverse-vol -> cap ->
vol-target + Kelly). Empty inputs the user must fill implied they set the sizing, which is
backwards — a control that misleads is worse than no control. Drops the explicit/
combine_returns branch, w_<edge> parsing, and the method param.
62 tests green (portfolio, SSOT guard, dashboard-service, web, crypto book eval).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>